1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.scxml2.model;
18
19 /**
20 * The class in this SCXML object model that corresponds to the
21 * <state> SCXML element.
22 *
23 */
24 public class State extends TransitionalState {
25
26 /**
27 * Serial version UID.
28 */
29 private static final long serialVersionUID = 2L;
30
31 /**
32 * The id of the initial child of this composite, corresponding with the state initial attribute
33 */
34 private String first;
35
36 /**
37 * A child which identifies initial state for state machines that
38 * have substates.
39 */
40 private Initial initial;
41
42 /**
43 * Constructor.
44 */
45 public State() {
46 }
47
48 /**
49 * Get the initial state.
50 *
51 * @return Initial Returns the initial state.
52 */
53 public final Initial getInitial() {
54 return initial;
55 }
56
57 /**
58 * Set the initial state.
59 *
60 * @param target
61 * The target to set.
62 */
63 public final void setInitial(final Initial target) {
64 this.first = null;
65 this.initial = target;
66 target.setParent(this);
67 }
68
69 /**
70 * Get the initial state's ID.
71 *
72 * @return The initial state's string ID.
73 */
74 public final String getFirst() {
75 return first;
76 }
77
78 /**
79 * Set the initial state by its ID string.
80 *
81 * @param target
82 * The initial target's ID to set.
83 */
84 public final void setFirst(final String target) {
85 this.first = target;
86 SimpleTransition t = new SimpleTransition();
87 t.setNext(target);
88 Initial ini = new Initial();
89 ini.setGenerated();
90 ini.setTransition(t);
91 ini.setParent(this);
92 this.initial = ini;
93 }
94
95 /**
96 * {@inheritDoc}
97 * @return Returns true if this State has no children
98 */
99 public final boolean isAtomicState() {
100 return getChildren().isEmpty();
101 }
102
103 /**
104 * Check whether this is a simple (leaf) state (UML terminology).
105 *
106 * @return true if this is a simple state, otherwise false
107 */
108 public final boolean isSimple() {
109 return isAtomicState();
110 }
111
112 /**
113 * Check whether this is a composite state (UML terminology).
114 *
115 * @return true if this is a composite state, otherwise false
116 */
117 public final boolean isComposite() {
118 return !isSimple();
119 }
120
121 /**
122 * Checks whether it is a region state (directly nested to parallel - UML
123 * terminology).
124 *
125 * @return true if this is a region state, otherwise false
126 * @see Parallel
127 */
128 public final boolean isRegion() {
129 return getParent() instanceof Parallel;
130 }
131
132 /**
133 * Adds an EnterableState (State, Final or Parallel) child
134 * @param es the child to add
135 */
136 @Override
137 public final void addChild(final EnterableState es) {
138 super.addChild(es);
139 }
140 }
141