| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.commons.scxml.model; |
| |
| import java.io.Serializable; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * An abstract base class for elements in SCXML that can serve as a |
| * <target> for a <transition>, such as State or Parallel. |
| * |
| */ |
| public abstract class TransitionTarget implements Serializable, Observable { |
| |
| /** |
| * Identifier for this transition target. Other parts of the SCXML |
| * document may refer to this <state> using this ID. |
| */ |
| private String id; |
| |
| /** |
| * Optional property holding executable content to be run upon |
| * entering this transition target. |
| */ |
| private OnEntry onEntry; |
| |
| /** |
| * Optional property holding executable content to be run upon |
| * exiting this transition target. |
| */ |
| private OnExit onExit; |
| |
| /** |
| * Optional property holding the data model for this transition target. |
| */ |
| private Datamodel datamodel; |
| |
| /** |
| * A list of outgoing Transitions from this state, by document order. |
| */ |
| private List<Transition> transitions; |
| |
| /** |
| * The parent of this transition target (may be null, if the parent |
| * is the SCXML document root). |
| */ |
| private TransitionTarget parent; |
| |
| /** |
| * List of history states owned by a given state (applies to non-leaf |
| * states). |
| */ |
| private List<History> history; |
| |
| /** |
| * Constructor. |
| */ |
| public TransitionTarget() { |
| super(); |
| onEntry = new OnEntry(); //empty defaults |
| onEntry.setParent(this); |
| onExit = new OnExit(); //empty defaults |
| onExit.setParent(this); |
| transitions = new ArrayList<Transition>(); |
| parent = null; |
| history = new ArrayList<History>(); |
| } |
| |
| /** |
| * Get the identifier for this transition target (may be null). |
| * |
| * @return Returns the id. |
| */ |
| public final String getId() { |
| return id; |
| } |
| |
| /** |
| * Set the identifier for this transition target. |
| * |
| * @param id The id to set. |
| */ |
| public final void setId(final String id) { |
| this.id = id; |
| } |
| |
| /** |
| * Get the onentry property. |
| * |
| * @return Returns the onEntry. |
| */ |
| public final OnEntry getOnEntry() { |
| return onEntry; |
| } |
| |
| /** |
| * Set the onentry property. |
| * |
| * @param onEntry The onEntry to set. |
| */ |
| public final void setOnEntry(final OnEntry onEntry) { |
| this.onEntry = onEntry; |
| this.onEntry.setParent(this); |
| } |
| |
| /** |
| * Get the onexit property. |
| * |
| * @return Returns the onExit. |
| */ |
| public final OnExit getOnExit() { |
| return onExit; |
| } |
| |
| /** |
| * Set the onexit property. |
| * |
| * @param onExit The onExit to set. |
| */ |
| public final void setOnExit(final OnExit onExit) { |
| this.onExit = onExit; |
| this.onExit.setParent(this); |
| } |
| |
| /** |
| * Get the data model for this transition target. |
| * |
| * @return Returns the data model. |
| */ |
| public final Datamodel getDatamodel() { |
| return datamodel; |
| } |
| |
| /** |
| * Set the data model for this transition target. |
| * |
| * @param datamodel The Datamodel to set. |
| */ |
| public final void setDatamodel(final Datamodel datamodel) { |
| this.datamodel = datamodel; |
| } |
| |
| /** |
| * Get the list of all outgoing transitions from this state, that |
| * will be candidates for being fired on the given event. |
| * |
| * @param event The event |
| * @return List Returns the candidate transitions for given event |
| */ |
| public final List<Transition> getTransitionsList(final String event) { |
| List<Transition> matchingTransitions = null; // since we returned null upto v0.6 |
| for (Transition t : transitions) { |
| if ((event == null && t.getEvent() == null) |
| || (event != null && event.equals(t.getEvent()))) { |
| if (matchingTransitions == null) { |
| matchingTransitions = new ArrayList<Transition>(); |
| } |
| matchingTransitions.add(t); |
| } |
| } |
| return matchingTransitions; |
| } |
| |
| /** |
| * Add a transition to the map of all outgoing transitions for |
| * this state. |
| * |
| * @param transition |
| * The transitions to set. |
| */ |
| public final void addTransition(final Transition transition) { |
| transitions.add(transition); |
| transition.setParent(this); |
| } |
| |
| /** |
| * Get the outgoing transitions for this state as a java.util.List. |
| * |
| * @return List Returns the transitions list. |
| */ |
| public final List<Transition> getTransitionsList() { |
| return transitions; |
| } |
| |
| /** |
| * Get the parent TransitionTarget. |
| * |
| * @return Returns the parent state |
| * (null if parent is <scxml> element) |
| */ |
| public final TransitionTarget getParent() { |
| return parent; |
| } |
| |
| /** |
| * Set the parent TransitionTarget. |
| * |
| * @param parent The parent state to set |
| */ |
| public final void setParent(final TransitionTarget parent) { |
| this.parent = parent; |
| } |
| |
| /** |
| * Get the parent State. |
| * |
| * @return The parent State |
| */ |
| public final State getParentState() { |
| TransitionTarget tt = this.getParent(); |
| if (tt == null) { |
| return null; |
| } else { |
| if (tt instanceof State) { |
| return (State) tt; |
| } else { //tt is Parallel |
| return tt.getParentState(); |
| } |
| } |
| } |
| |
| /** |
| * This method is used by XML digester. |
| * |
| * @param h |
| * History pseudo state |
| * |
| * @since 0.7 |
| */ |
| public final void addHistory(final History h) { |
| history.add(h); |
| h.setParent(this); |
| } |
| |
| /** |
| * Does this state have a history pseudo state. |
| * |
| * @return boolean true if a given state contains at least one |
| * history pseudo state |
| * |
| * @since 0.7 |
| */ |
| public final boolean hasHistory() { |
| return (!history.isEmpty()); |
| } |
| |
| /** |
| * Get the list of history pseudo states for this state. |
| * |
| * @return a list of all history pseudo states contained by a given state |
| * (can be empty) |
| * @see #hasHistory() |
| * |
| * @since 0.7 |
| */ |
| public final List<History> getHistory() { |
| return history; |
| } |
| |
| } |
| |