001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.scxml.model;
018
019 import java.util.ArrayList;
020 import java.util.List;
021 import java.util.Map;
022
023 /**
024 * The class in this SCXML object model that corresponds to the
025 * <transition> SCXML element. Transition rules are triggered
026 * by "events" and conditionalized via
027 * "guard-conditions".
028 *
029 */
030 public class Transition extends Executable
031 implements NamespacePrefixesHolder {
032
033 /**
034 * Serial version UID.
035 */
036 private static final long serialVersionUID = 2L;
037
038 /**
039 * Property that specifies the trigger for this transition.
040 */
041 private String event;
042
043 /**
044 * Optional guard condition.
045 */
046 private String cond;
047
048 /**
049 * Optional property that specifies the new state(s) or parallel
050 * element to transition to. May be specified by reference or in-line.
051 * If multiple state(s) are specified, they must belong to the regions
052 * of the same parallel.
053 */
054 private List targets;
055
056 /**
057 * The transition target ID (used by XML Digester only).
058 */
059 private String next;
060
061 /**
062 * The path(s) for this transition, one per target, in the same order
063 * as <code>targets</code>.
064 * @see Path
065 */
066 private List paths;
067
068 /**
069 * The current XML namespaces in the SCXML document for this action node,
070 * preserved for deferred XPath evaluation.
071 */
072 private Map namespaces;
073
074 /**
075 * Constructor.
076 */
077 public Transition() {
078 super();
079 this.targets = new ArrayList();
080 this.paths = new ArrayList();
081 }
082
083 /**
084 * Get the guard condition (may be null).
085 *
086 * @return Returns the cond.
087 */
088 public final String getCond() {
089 return cond;
090 }
091
092 /**
093 * Set the guard condition.
094 *
095 * @param cond The cond to set.
096 */
097 public final void setCond(final String cond) {
098 this.cond = cond;
099 }
100
101 /**
102 * Get the event that will trigger this transition (pending
103 * evaluation of the guard condition in favor).
104 *
105 * @return Returns the event.
106 */
107 public final String getEvent() {
108 return event;
109 }
110
111 /**
112 * Set the event that will trigger this transition (pending
113 * evaluation of the guard condition in favor).
114 *
115 * @param event The event to set.
116 */
117 public final void setEvent(final String event) {
118 this.event = event;
119 }
120
121 /**
122 * Get the XML namespaces at this action node in the SCXML document.
123 *
124 * @return Returns the map of namespaces.
125 */
126 public final Map getNamespaces() {
127 return namespaces;
128 }
129
130 /**
131 * Set the XML namespaces at this action node in the SCXML document.
132 *
133 * @param namespaces The document namespaces.
134 */
135 public final void setNamespaces(final Map namespaces) {
136 this.namespaces = namespaces;
137 }
138
139 /**
140 * Get the transition target (may be null).
141 *
142 * @return Returns the target as specified in SCXML markup.
143 * <p>Remarks: Is <code>null</code> for "stay" transitions.
144 * Returns parent (the source node) for "self" transitions.</p>
145 *
146 * @deprecated A transition may have multiple targets,
147 * use getTargets() instead.
148 */
149 public final TransitionTarget getTarget() {
150 if (targets.size() > 0) {
151 return (TransitionTarget) targets.get(0);
152 }
153 return null;
154 }
155
156 /**
157 * Get the list of transition targets (may be an empty list).
158 *
159 * @return Returns the target(s) as specified in SCXML markup.
160 * <p>Remarks: Is <code>empty</code> for "stay" transitions.
161 * Contains parent (the source node) for "self" transitions.</p>
162 *
163 * @since 0.7
164 */
165 public final List getTargets() {
166 return targets;
167 }
168
169 /**
170 * Get the runtime transition target, which always resolves to
171 * a TransitionTarget instance.
172 *
173 * @return Returns the actual target of a transition at runtime.
174 * <p>Remarks: For both the "stay" and "self"
175 * transitions it returns parent (the source node). This method should
176 * never return <code>null</code>.</p>
177 *
178 * @deprecated A transition may have multiple targets,
179 * use getRuntimeTargets() instead.
180 */
181 public final TransitionTarget getRuntimeTarget() {
182 return (TransitionTarget) getRuntimeTargets().get(0);
183 }
184
185 /**
186 * Get the list of runtime transition target, which always contains
187 * atleast one TransitionTarget instance.
188 *
189 * @return Returns the actual targets of a transition at runtime.
190 * <p>Remarks: For both the "stay" and "self"
191 * transitions it returns parent (the source node). This method should
192 * never return an empty list or <code>null</code>.</p>
193 *
194 * @since 0.7
195 */
196 public final List getRuntimeTargets() {
197 if (targets.size() == 0) {
198 List runtimeTargets = new ArrayList();
199 runtimeTargets.add(getParent());
200 return runtimeTargets;
201 }
202 return targets;
203 }
204
205 /**
206 * Set the transition target.
207 *
208 * @param target The target to set.
209 * @deprecated Use setTargets(List) instead.
210 */
211 public final void setTarget(final TransitionTarget target) {
212 this.targets.add(0, target);
213 }
214
215 /**
216 * Get the ID of the transition target (may be null, if, for example,
217 * the target is specified inline).
218 *
219 * @return String Returns the transition target ID
220 * (used by SCXML Digester only).
221 * @see #getTargets()
222 */
223 public final String getNext() {
224 return next;
225 }
226
227 /**
228 * Set the transition target by specifying its ID.
229 *
230 * @param next The the transition target ID (used by SCXML Digester only).
231 */
232 public final void setNext(final String next) {
233 this.next = next;
234 }
235
236 /**
237 * Get the path of this transiton.
238 *
239 * @see Path
240 * @return Path returns the transition path
241 * @deprecated Use getPaths() instead.
242 */
243 public final Path getPath() {
244 return (Path) getPaths().get(0);
245 }
246
247 /**
248 * Get the path(s) of this transiton.
249 *
250 * @see Path
251 * @return List returns the list of transition path(s)
252 *
253 * @since 0.7
254 */
255 public final List getPaths() {
256 if (paths.size() == 0) {
257 if (targets.size() > 0) {
258 for (int i = 0; i < targets.size(); i++) {
259 paths.add(i, new Path(getParent(),
260 (TransitionTarget) targets.get(i)));
261 }
262 } else {
263 paths.add(new Path(getParent(), null));
264 }
265 }
266 return paths;
267 }
268 }
269