You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ra...@apache.org on 2007/04/25 22:50:30 UTC
svn commit: r532478 - in
/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io:
ModelUpdater.java SCXMLParser.java SCXMLSerializer.java
Author: rahul
Date: Wed Apr 25 13:50:29 2007
New Revision: 532478
URL: http://svn.apache.org/viewvc?view=rev&rev=532478
Log:
Feb '07 WD conformance changes for the IO package:
- Update parser to support <final>, changed usage of <parallel>
- Make static nested classes private
- Add a Commons SCXML namespace to support implementation specific actions
- Eliminate use of deprecated APIs
Modified:
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/ModelUpdater.java
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLParser.java
jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLSerializer.java
Modified: jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/ModelUpdater.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/ModelUpdater.java?view=diff&rev=532478&r1=532477&r2=532478
==============================================================================
--- jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/ModelUpdater.java (original)
+++ jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/ModelUpdater.java Wed Apr 25 13:50:29 2007
@@ -61,21 +61,24 @@
String initialstate = scxml.getInitialstate();
//we have to use getTargets() here since the initialState can be
//an indirect descendant
- // Concern marked by one of the code reviewers: better type check,
- // now ClassCastException happens for Parallel
- // Response: initial should be a State, for Parallel, it is implicit
- State initialState = (State) scxml.getTargets().get(initialstate);
- if (initialState == null) {
+ TransitionTarget initialTarget = (TransitionTarget) scxml.getTargets().
+ get(initialstate);
+ if (initialTarget == null) {
// Where do we, where do we go?
logAndThrowModelError(ERR_SCXML_NO_INIT, new Object[] {
initialstate });
}
- scxml.setInitialState(initialState);
+ scxml.setInitialTarget(initialTarget);
Map targets = scxml.getTargets();
- Map states = scxml.getStates();
- Iterator i = states.keySet().iterator();
+ Map children = scxml.getChildren();
+ Iterator i = children.keySet().iterator();
while (i.hasNext()) {
- updateState((State) states.get(i.next()), targets);
+ TransitionTarget tt = (TransitionTarget) children.get(i.next());
+ if (tt instanceof State) {
+ updateState((State) tt, targets);
+ } else {
+ updateParallel((Parallel) tt, targets);
+ }
}
}
@@ -170,7 +173,7 @@
Transition trn = (Transition) t.get(i);
updateTransition(trn, targets);
}
- Parallel p = s.getParallel();
+ Parallel p = s.getParallel(); //TODO: Remove in v1.0
Invoke inv = s.getInvoke();
if ((inv != null && p != null)
|| (inv != null && !c.isEmpty())
@@ -216,7 +219,7 @@
*/
private static void updateParallel(final Parallel p, final Map targets)
throws ModelException {
- Iterator i = p.getStates().iterator();
+ Iterator i = p.getChildren().iterator();
while (i.hasNext()) {
updateState((State) i.next(), targets);
}
@@ -322,7 +325,7 @@
return false; // One per region
}
}
- if (regions.size() != p.getStates().size()) {
+ if (regions.size() != p.getChildren().size()) {
return false; // Must represent all regions
}
return true;
Modified: jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLParser.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLParser.java?view=diff&rev=532478&r1=532477&r2=532478
==============================================================================
--- jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLParser.java (original)
+++ jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLParser.java Wed Apr 25 13:50:29 2007
@@ -34,7 +34,6 @@
import org.apache.commons.digester.SetNextRule;
import org.apache.commons.digester.SetPropertiesRule;
import org.apache.commons.logging.LogFactory;
-
import org.apache.commons.scxml.PathResolver;
import org.apache.commons.scxml.SCXMLHelper;
import org.apache.commons.scxml.env.URLResolver;
@@ -49,6 +48,7 @@
import org.apache.commons.scxml.model.Executable;
import org.apache.commons.scxml.model.Exit;
import org.apache.commons.scxml.model.ExternalContent;
+import org.apache.commons.scxml.model.Final;
import org.apache.commons.scxml.model.Finalize;
import org.apache.commons.scxml.model.History;
import org.apache.commons.scxml.model.If;
@@ -68,11 +68,9 @@
import org.apache.commons.scxml.model.Transition;
import org.apache.commons.scxml.model.TransitionTarget;
import org.apache.commons.scxml.model.Var;
-
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-
import org.xml.sax.Attributes;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
@@ -98,6 +96,16 @@
private static final String NAMESPACE_SCXML =
"http://www.w3.org/2005/07/scxml";
+ /**
+ * The namespace that defines any custom actions defined by the Commons
+ * SCXML implementation. Any document that intends to use these custom
+ * actions needs to ensure that they are in the correct namespace. Use
+ * of actions in this namespace makes the document non-portable across
+ * implementations.
+ */
+ private static final String NAMESPACE_COMMONS_SCXML =
+ "http://jakarta.apache.org/commons/scxml";
+
//---------------------- PUBLIC METHODS ----------------------//
/**
* <p>API for standalone usage where the SCXML document is a URL.</p>
@@ -486,19 +494,23 @@
/** <state> children of root <scxml> element. */
private static final String XP_SM_ST = "scxml/state";
+ /** <state> children of root <scxml> element. */
+ private static final String XP_SM_PAR = "scxml/parallel";
+
+ /** <final> children of root <scxml> element. */
+ private static final String XP_SM_FIN = "scxml/final";
+
//// Universal matches, prefixed by XPU_
// State
/** <state> children of <state> elements. */
private static final String XPU_ST_ST = "!*/state/state";
+ /** <final> children of <state> elements. */
+ private static final String XPU_ST_FIN = "!*/state/final";
+
/** <state> children of <parallel> elements. */
private static final String XPU_PAR_ST = "!*/parallel/state";
- /** <state> children of transition <target> elements. */
- private static final String XPU_TR_TAR_ST = "!*/transition/target/state";
-
- //private static final String XPU_ST_TAR_ST = "!*/state/target/state";
-
// Parallel
/** <parallel> child of <state> elements. */
private static final String XPU_ST_PAR = "!*/state/parallel";
@@ -557,22 +569,13 @@
/** <transition> child element. */
private static final String XPF_TR = "/transition";
- /** <target> child element. */
- private static final String XPF_TAR = "/target";
-
- /** <exit> child element. */
+ /** <exit> child element, a Commons SCXML custom action. */
private static final String XPF_EXT = "/exit";
// Actions
- /** <var> child element. */
- private static final String XPF_VAR = "/var";
-
/** <assign> child element. */
private static final String XPF_ASN = "/assign";
- /** <log> child element. */
- private static final String XPF_LOG = "/log";
-
/** <send> child element. */
private static final String XPF_SND = "/send";
@@ -585,6 +588,13 @@
/** <else> child element. */
private static final String XPF_ELS = "/else";
+ // Custom Commons SCXML actions
+ /** <var> child element. */
+ private static final String XPF_VAR = "/var";
+
+ /** <log> child element. */
+ private static final String XPF_LOG = "/log";
+
//// Other constants
// Error messages
/**
@@ -673,21 +683,27 @@
//// States
// Level one states
- addStateRules(XP_SM_ST, scxmlRules, customActions, scxml, pr, 0);
- scxmlRules.add(XP_SM_ST, new SetNextRule("addState"));
+ addStateRules(XP_SM_ST, scxmlRules, customActions, scxml, pr);
+
// Nested states
- addStateRules(XPU_ST_ST, scxmlRules, customActions, scxml, pr, 1);
- scxmlRules.add(XPU_ST_ST, new SetNextRule("addChild"));
+ addStateRules(XPU_ST_ST, scxmlRules, customActions, scxml, pr);
- // Parallel states
- addStateRules(XPU_PAR_ST, scxmlRules, customActions, scxml, pr, 1);
- scxmlRules.add(XPU_PAR_ST, new SetNextRule("addState"));
- // Target states
- addStateRules(XPU_TR_TAR_ST, scxmlRules, customActions, scxml, pr, 2);
- scxmlRules.add(XPU_TR_TAR_ST, new SetNextRule("setTarget"));
+ // Orthogonal states
+ addStateRules(XPU_PAR_ST, scxmlRules, customActions, scxml, pr);
//// Parallels
- addParallelRules(XPU_ST_PAR, scxmlRules, pr, customActions, scxml);
+ // Level one parallels
+ addParallelRules(XP_SM_PAR, scxmlRules, customActions, scxml, pr);
+
+ // Parallel children of composite states
+ addParallelRules(XPU_ST_PAR, scxmlRules, customActions, scxml, pr);
+
+ //// Finals
+ // Level one finals
+ addFinalRules(XP_SM_FIN, scxmlRules, customActions, scxml, pr);
+
+ // Final children of composite states
+ addFinalRules(XPU_ST_FIN, scxmlRules, customActions, scxml, pr);
//// Ifs
addIfRules(XPU_IF, scxmlRules, pr, customActions);
@@ -713,23 +729,21 @@
* to be able to process
* @param scxml The parent SCXML document (or null)
* @param pr The PathResolver
- * @param parent The distance between this state and its parent
- * state on the Digester stack
*/
private static void addStateRules(final String xp,
final ExtendedBaseRules scxmlRules, final List customActions,
- final SCXML scxml, final PathResolver pr, final int parent) {
+ final SCXML scxml, final PathResolver pr) {
scxmlRules.add(xp, new ObjectCreateRule(State.class));
addStatePropertiesRules(xp, scxmlRules, customActions, pr, scxml);
addDatamodelRules(xp + XPF_DM, scxmlRules, scxml, pr);
addInvokeRules(xp + XPF_INV, scxmlRules, customActions, pr, scxml);
addInitialRules(xp + XPF_INI, scxmlRules, customActions, pr, scxml);
addHistoryRules(xp + XPF_HIST, scxmlRules, customActions, pr, scxml);
- addParentRule(xp, scxmlRules, parent);
addTransitionRules(xp + XPF_TR, scxmlRules, "addTransition",
pr, customActions);
addHandlerRules(xp, scxmlRules, pr, customActions);
scxmlRules.add(xp, new UpdateModelRule(scxml));
+ scxmlRules.add(xp, new SetNextRule("addChild"));
}
/**
@@ -744,12 +758,28 @@
* @param scxml The parent SCXML document (or null)
*/
private static void addParallelRules(final String xp,
- final ExtendedBaseRules scxmlRules, final PathResolver pr,
- final List customActions, final SCXML scxml) {
+ final ExtendedBaseRules scxmlRules, final List customActions,
+ final SCXML scxml, final PathResolver pr) {
addSimpleRulesTuple(xp, scxmlRules, Parallel.class, null, null,
- "setParallel");
+ "addChild");
+ addDatamodelRules(xp + XPF_DM, scxmlRules, scxml, pr);
+ addHandlerRules(xp, scxmlRules, pr, customActions);
+ scxmlRules.add(xp, new UpdateModelRule(scxml));
+ }
+
+ /**
+ * Add Digester rules for all <final> elements.
+ *
+ * @param xp The Digester style XPath expression of the parent
+ * XML element
+ * @param scxmlRules The rule set to be used for digestion
+ */
+ private static void addFinalRules(final String xp,
+ final ExtendedBaseRules scxmlRules, final List customActions,
+ final SCXML scxml, final PathResolver pr) {
+ addSimpleRulesTuple(xp, scxmlRules, Final.class, null, null,
+ "addChild");
addHandlerRules(xp, scxmlRules, pr, customActions);
- addParentRule(xp, scxmlRules, 1);
scxmlRules.add(xp, new UpdateModelRule(scxml));
}
@@ -767,8 +797,7 @@
private static void addStatePropertiesRules(final String xp,
final ExtendedBaseRules scxmlRules, final List customActions,
final PathResolver pr, final SCXML scxml) {
- scxmlRules.add(xp, new SetPropertiesRule(new String[] {"id", "final"},
- new String[] {"id", "isFinal"}));
+ scxmlRules.add(xp, new SetPropertiesRule());
scxmlRules.add(xp, new DigestSrcAttributeRule(scxml,
customActions, pr));
}
@@ -896,34 +925,6 @@
new String[] {"id"}));
scxmlRules.add(xp, new DigestSrcAttributeRule(scxml, customActions,
pr));
- addParentRule(xp, scxmlRules, 1);
- }
-
- /**
- * Add Digester rule for all setting parent state.
- *
- * @param xp The Digester style XPath expression of the parent
- * XML element
- * @param scxmlRules The rule set to be used for digestion
- * @param parent The distance between this state and its parent
- * state on the Digester stack
- */
- private static void addParentRule(final String xp,
- final ExtendedBaseRules scxmlRules, final int parent) {
- if (parent < 1) {
- return;
- }
- scxmlRules.add(xp, new Rule() {
- // A generic version of setTopRule
- public void body(final String namespace, final String name,
- final String text) throws Exception {
- TransitionTarget t = (TransitionTarget) getDigester().peek();
- TransitionTarget p = (TransitionTarget) getDigester().peek(
- parent);
- // CHANGE - Moved parent property to TransitionTarget
- t.setParent(p);
- }
- });
}
/**
@@ -946,8 +947,10 @@
new String[] {"event", "cond", "target"},
new String[] {"event", "cond", "next"}));
scxmlRules.add(xp, new SetCurrentNamespacesRule());
- scxmlRules.add(xp + XPF_TAR, new SetPropertiesRule());
addActionRules(xp, scxmlRules, pr, customActions);
+
+ // Add <exit> custom action rule in Commons SCXML namespace
+ scxmlRules.setNamespaceURI(NAMESPACE_COMMONS_SCXML);
scxmlRules.add(xp + XPF_EXT, new Rule() {
public void end(final String namespace, final String name) {
Transition t = (Transition) getDigester().peek(1);
@@ -956,6 +959,8 @@
t.getTargets().add(exitState);
}
});
+ scxmlRules.setNamespaceURI(NAMESPACE_SCXML);
+
scxmlRules.add(xp, new SetNextRule(setNextMethod));
}
@@ -994,14 +999,21 @@
private static void addActionRules(final String xp,
final ExtendedBaseRules scxmlRules, final PathResolver pr,
final List customActions) {
+ // Actions in SCXML namespace
addActionRulesTuple(xp + XPF_ASN, scxmlRules, Assign.class);
scxmlRules.add(xp + XPF_ASN, new SetPathResolverRule(pr));
- addActionRulesTuple(xp + XPF_VAR, scxmlRules, Var.class);
- addActionRulesTuple(xp + XPF_LOG, scxmlRules, Log.class);
addSendRulesTuple(xp + XPF_SND, scxmlRules);
addActionRulesTuple(xp + XPF_CAN, scxmlRules, Cancel.class);
+ addActionRulesTuple(xp + XPF_LOG, scxmlRules, Log.class);
+
+ // Actions in Commons SCXML namespace
+ scxmlRules.setNamespaceURI(NAMESPACE_COMMONS_SCXML);
+
+ addActionRulesTuple(xp + XPF_VAR, scxmlRules, Var.class);
addActionRulesTuple(xp + XPF_EXT, scxmlRules, Exit.class);
- //addCustomActionRules(xp, scxmlRules, customActions);
+
+ // Reset namespace
+ scxmlRules.setNamespaceURI(NAMESPACE_SCXML);
}
/**
@@ -1160,10 +1172,8 @@
* These include: <br>
* 1) Updation of the SCXML object's global targets Map <br>
* 2) Obtaining a handle to the SCXML object's NotificationRegistry <br>
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class UpdateModelRule extends Rule {
+ private static class UpdateModelRule extends Rule {
/**
* The root SCXML object.
@@ -1174,7 +1184,7 @@
* Constructor.
* @param scxml The root SCXML object
*/
- public UpdateModelRule(final SCXML scxml) {
+ UpdateModelRule(final SCXML scxml) {
super();
this.scxml = scxml;
}
@@ -1194,15 +1204,13 @@
/**
* Custom digestion rule for setting Executable parent of Action elements.
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class SetExecutableParentRule extends Rule {
+ private static class SetExecutableParentRule extends Rule {
/**
* Constructor.
*/
- public SetExecutableParentRule() {
+ SetExecutableParentRule() {
super();
}
@@ -1226,15 +1234,13 @@
* <code>ExternalContent</code> elements.
*
* @see ExternalContent
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class ParseExternalContentRule extends NodeCreateRule {
+ private static class ParseExternalContentRule extends NodeCreateRule {
/**
* Constructor.
* @throws ParserConfigurationException A JAXP configuration error
*/
- public ParseExternalContentRule()
+ ParseExternalContentRule()
throws ParserConfigurationException {
super();
}
@@ -1254,10 +1260,8 @@
/**
* Custom digestion rule for parsing bodies of <data> elements.
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class ParseDataRule extends NodeCreateRule {
+ private static class ParseDataRule extends NodeCreateRule {
/**
* The PathResolver used to resolve the src attribute to the
@@ -1288,7 +1292,7 @@
* @param pr The <code>PathResolver</code>
* @throws ParserConfigurationException A JAXP configuration error
*/
- public ParseDataRule(final PathResolver pr)
+ ParseDataRule(final PathResolver pr)
throws ParserConfigurationException {
super();
this.pr = pr;
@@ -1343,10 +1347,8 @@
/**
* Custom digestion rule for external sources, that is, the src attribute of
* the <state> element.
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class DigestSrcAttributeRule extends Rule {
+ private static class DigestSrcAttributeRule extends Rule {
/**
* The PathResolver used to resolve the src attribute to the
@@ -1375,10 +1377,8 @@
*
* @see PathResolver
* @see CustomAction
- *
- * TODO: Remove in v1.0
*/
- public DigestSrcAttributeRule(final List customActions,
+ DigestSrcAttributeRule(final List customActions,
final PathResolver pr) {
super();
this.customActions = customActions;
@@ -1395,7 +1395,7 @@
* @see PathResolver
* @see CustomAction
*/
- public DigestSrcAttributeRule(final SCXML root,
+ DigestSrcAttributeRule(final SCXML root,
final List customActions, final PathResolver pr) {
super();
this.root = root;
@@ -1455,10 +1455,10 @@
Initial ini = new Initial();
ini.setTransition(t);
s.setInitial(ini);
- Map children = externalSCXML.getStates();
+ Map children = externalSCXML.getChildren();
Object[] ids = children.keySet().toArray();
for (int i = 0; i < ids.length; i++) {
- s.addChild((State) children.get(ids[i]));
+ s.addChild((TransitionTarget) children.get(ids[i]));
}
s.setDatamodel(externalSCXML.getDatamodel());
}
@@ -1466,10 +1466,8 @@
/**
* Custom digestion rule for setting PathResolver for runtime retrieval.
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class SetPathResolverRule extends Rule {
+ private static class SetPathResolverRule extends Rule {
/**
* The PathResolver to set.
@@ -1483,7 +1481,7 @@
*
* @see PathResolver
*/
- public SetPathResolverRule(final PathResolver pr) {
+ SetPathResolverRule(final PathResolver pr) {
super();
this.pr = pr;
}
@@ -1501,10 +1499,8 @@
/**
* Custom digestion rule for setting state parent of finalize.
- *
- * @deprecated Will be removed in version 1.0
*/
- public static class UpdateFinalizeRule extends Rule {
+ private static class UpdateFinalizeRule extends Rule {
/**
* @see Rule#begin(String, String, Attributes)
@@ -1522,7 +1518,6 @@
/**
* Custom digestion rule for attaching a snapshot of current namespaces
* to SCXML actions for deferred XPath evaluation.
- *
*/
private static class SetCurrentNamespacesRule extends Rule {
Modified: jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLSerializer.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLSerializer.java?view=diff&rev=532478&r1=532477&r2=532478
==============================================================================
--- jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLSerializer.java (original)
+++ jakarta/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml/io/SCXMLSerializer.java Wed Apr 25 13:50:29 2007
@@ -100,10 +100,15 @@
if (dm != null) {
serializeDatamodel(b, dm, INDENT);
}
- Map s = scxml.getStates();
- Iterator i = s.keySet().iterator();
+ Map c = scxml.getChildren();
+ Iterator i = c.keySet().iterator();
while (i.hasNext()) {
- serializeState(b, (State) s.get(i.next()), INDENT);
+ TransitionTarget tt = (TransitionTarget) c.get(i.next());
+ if (tt instanceof State) {
+ serializeState(b, (State) tt, INDENT);
+ } else {
+ serializeParallel(b, (Parallel) tt, INDENT);
+ }
}
b.append("</scxml>\n");
return b.toString();
@@ -142,7 +147,7 @@
for (int i = 0; i < t.size(); i++) {
serializeTransition(b, (Transition) t.get(i), indent + INDENT);
}
- Parallel p = s.getParallel();
+ Parallel p = s.getParallel(); //TODO: Remove in v1.0
Invoke inv = s.getInvoke();
if (p != null) {
serializeParallel(b, p, indent + INDENT);
@@ -173,7 +178,7 @@
serializeTransitionTargetAttributes(b, p);
b.append(">\n");
serializeOnEntry(b, p, indent + INDENT);
- Set s = p.getStates();
+ Set s = p.getChildren();
Iterator i = s.iterator();
while (i.hasNext()) {
serializeState(b, (State) i.next(), indent + INDENT);
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org