Author: rahul
Date: Sun Jul 12 23:00:53 2009
New Revision: 793428
URL: http://svn.apache.org/viewvc?rev=793428&view=rev
Log:
Implement the In() predicate and the Data() function for the JavaScript
evaluator and remove some public methods (its unreleased code).
Added a state to test the In() predicate in the example.
Modified:
commons/proper/scxml/branches/J6/src/main/java/org/apache/commons/scxml/env/javascript/JSEvaluator.java
commons/proper/scxml/branches/J6/src/test/java/org/apache/commons/scxml/env/javascript/example-01.xml
Modified:
commons/proper/scxml/branches/J6/src/main/java/org/apache/commons/scxml/env/javascript/JSEvaluator.java
URL:
http://svn.apache.org/viewvc/commons/proper/scxml/branches/J6/src/main/java/org/apache/commons/scxml/env/javascript/JSEvaluator.java?rev=793428&r1=793427&r2=793428&view=diff
==============================================================================
---
commons/proper/scxml/branches/J6/src/main/java/org/apache/commons/scxml/env/javascript/JSEvaluator.java
(original)
+++
commons/proper/scxml/branches/J6/src/main/java/org/apache/commons/scxml/env/javascript/JSEvaluator.java
Sun Jul 12 23:00:53 2009
@@ -17,19 +17,17 @@
package org.apache.commons.scxml.env.javascript;
-import java.util.Map;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
+
import org.apache.commons.scxml.Builtin;
import org.apache.commons.scxml.Context;
import org.apache.commons.scxml.Evaluator;
import org.apache.commons.scxml.SCXMLExpressionException;
-import org.apache.commons.scxml.SCXMLHelper;
import org.w3c.dom.Node;
/**
@@ -58,8 +56,10 @@
// CONSTANTS
- private static final Pattern XPATH =
-
Pattern.compile("Data\\s*\\(\\s*(\\w+)\\s*,\\s*((?:'.*?')|(?:\".*?\"))\\s*\\)");
+ /** Pattern for recognizing the SCXML In() special predicate. */
+ private static final Pattern IN_FN = Pattern.compile("In\\(");
+ /** Pattern for recognizing the Commons SCXML Data() builtin function. */
+ private static final Pattern DATA_FN = Pattern.compile("Data\\(");
// INSTANCE VARIABLES
@@ -72,8 +72,7 @@
*/
public JSEvaluator() {
factory = new ScriptEngineManager();
-
- factory.put("xpath",this);
+ factory.put("_builtin", new Builtin());
}
// INSTANCE METHODS
@@ -106,24 +105,18 @@
@Override
public Object eval(Context context,String expression) throws
SCXMLExpressionException {
try {
- // ... initialise
- Matcher matcher = XPATH.matcher (expression);
- StringBuffer buffer = new StringBuffer();
+ // ... initialize
ScriptEngine engine = factory.getEngineByName("JavaScript");
Bindings bindings = engine.getBindings
(ScriptContext.ENGINE_SCOPE);
- // ... replace Data() functions
-
- while (matcher.find()) {
-
matcher.appendReplacement(buffer,"xpath.evaluate(_ALL_NAMESPACES," +
matcher.group(1) + "," + matcher.group(2) + ")");
- }
-
- matcher.appendTail(buffer);
+ // ... replace built-in functions
+ String jsExpression =
IN_FN.matcher(expression).replaceAll("_builtin.isMember(_ALL_STATES, ");
+ jsExpression =
DATA_FN.matcher(jsExpression).replaceAll("_builtin.data(_ALL_NAMESPACES, ");
// ... evaluate
+ return engine.eval(jsExpression,new JSBindings(context,bindings));
- return engine.eval(buffer.toString(),new
JSBindings(context,bindings));
} catch (Exception x) {
throw new SCXMLExpressionException("Error evaluating ['" +
expression + "'] " + x);
}
@@ -171,24 +164,19 @@
@Override
public Node evalLocation(Context context,String expression) throws
SCXMLExpressionException {
try {
- // ... initialise
-
- Matcher matcher = XPATH.matcher (expression);
- StringBuffer buffer = new StringBuffer();
- ScriptEngine engine = factory.getEngineByName("JavaScript");
- Bindings bindings =
engine.getBindings(ScriptContext.ENGINE_SCOPE);
- // ... replace Data() function
-
- if (matcher.find()) {
-
matcher.appendReplacement(buffer,"xpath.node(_ALL_NAMESPACES," +
matcher.group(1) + "," + matcher.group(2) + ")");
- }
+ // ... initialize
+ ScriptEngine engine = factory.getEngineByName("JavaScript");
+ Bindings bindings = engine.getBindings
(ScriptContext.ENGINE_SCOPE);
- matcher.appendTail(buffer);
+ // ... replace built-in functions
+ String jsExpression =
IN_FN.matcher(expression).replaceAll("_builtin.isMember(_ALL_STATES, ");
+ jsExpression =
DATA_FN.matcher(jsExpression).replaceFirst("_builtin.dataNode(_ALL_NAMESPACES,
");
+ jsExpression =
DATA_FN.matcher(jsExpression).replaceAll("_builtin.data(_ALL_NAMESPACES, ");
// ... evaluate
+ return (Node) engine.eval(jsExpression,new
JSBindings(context,bindings));
- return (Node) engine.eval(buffer.toString(),new
JSBindings(context,bindings));
} catch (Exception x) {
throw new SCXMLExpressionException("Error evaluating ['" +
expression + "'] " + x);
}
@@ -213,43 +201,5 @@
return eval(ctx, script);
}
- /**
- * Implementation of Javascript function equivalent for the Data()
function when
- * used in an SCXML <code>expr</code> attribute.
- * <p>
- * NOTE: Only declared public for access by script engine - not intended
to be
- * used by anything else.
- *
- * @param namespaces SCXML namespace map.
- * @param node Data() function root node.
- * @param query Data() function expression.
- *
- * @return Value stored at SCXML data model node represented by the
<code>query</code>
- * expression or <code>null</code>.
- */
- @SuppressWarnings("unchecked")
- public Object evaluate(Map namespaces,Object node,String query) {
- return SCXMLHelper.getNodeValue(node(namespaces,node,query));
- }
-
- /**
- * Implementation of Javascript function equivalent for the Data()
function when used
- * in an SCXML <code>location</code> attribute.
- * <p>
- * NOTE: Only declared public for access by script engine - not intended
to be
- * used by anything else.
- *
- * @param namespaces SCXML namespace map.
- * @param node Data() function root node.
- * @param query Data() function expression.
- *
- * @return Node at SCXML data model node represented by the
<code>query</code>
- * expression or <code>null</code>.
- */
- @SuppressWarnings("unchecked")
- public Node node(Map namespaces,Object node,String query) {
- return Builtin.dataNode(namespaces,node,query);
- }
-
}
Modified:
commons/proper/scxml/branches/J6/src/test/java/org/apache/commons/scxml/env/javascript/example-01.xml
URL:
http://svn.apache.org/viewvc/commons/proper/scxml/branches/J6/src/test/java/org/apache/commons/scxml/env/javascript/example-01.xml?rev=793428&r1=793427&r2=793428&view=diff
==============================================================================
---
commons/proper/scxml/branches/J6/src/test/java/org/apache/commons/scxml/env/javascript/example-01.xml
(original)
+++
commons/proper/scxml/branches/J6/src/test/java/org/apache/commons/scxml/env/javascript/example-01.xml
Sun Jul 12 23:00:53 2009
@@ -144,11 +144,20 @@
<onentry>
<my:eventdatamaptest />
</onentry>
- <transition target='end' event='ok' >
+ <transition target='in.test' event='ok' >
<log expr='"_eventdatamap[ok]=\"" + _eventdatamap.get("ok") + "\""' />
</transition>
</state>
+ <!-- In() FUNCTION USAGE -->
+
+ <state id='in.test'>
+ <transition cond="In('foo.bar')" /> <!-- stay -->
+ <transition target='end' cond="!In('foo.bar')" >
+ <log label="In(foo.bar)" expr='In("foo.bar")' />
+ </transition>
+ </state>
+
<!-- DONE -->
<state id='end' final='true' >