blob: 9977160d854329de01d218048106cfdfe3afe05f [file] [log] [blame]
/*
* 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 &lt;scxml&gt; 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;
}
}