summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-05-12 19:44:16 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-05-12 19:44:16 (GMT)
commit9a9afb6aaf314a68901cce3463e91512c261bd7a (patch)
tree20e7f888da47c67272cfd2c1c16d62e9189ed6c5 /contrib
parent363250f8a9e33dc3f198f114fdfccd100b55ca12 (diff)
downloaduscxml-9a9afb6aaf314a68901cce3463e91512c261bd7a.zip
uscxml-9a9afb6aaf314a68901cce3463e91512c261bd7a.tar.gz
uscxml-9a9afb6aaf314a68901cce3463e91512c261bd7a.tar.bz2
Started with JavaScript DM in Java (Rhino)
Diffstat (limited to 'contrib')
-rw-r--r--contrib/java/.classpath1
-rw-r--r--contrib/java/src/js.jarbin0 -> 1134765 bytes
-rw-r--r--contrib/java/src/org/uscxml/ECMAScriptDataModel.java169
-rw-r--r--contrib/java/src/org/uscxml/tests/TestDataModel.java4
-rw-r--r--contrib/java/src/org/uscxml/tests/TestJavaScriptDataModel.java25
5 files changed, 197 insertions, 2 deletions
diff --git a/contrib/java/.classpath b/contrib/java/.classpath
index 6034288..7592c3b 100644
--- a/contrib/java/.classpath
+++ b/contrib/java/.classpath
@@ -6,5 +6,6 @@
<classpathentry kind="src" path="applications"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/umundo"/>
+ <classpathentry kind="lib" path="src/js.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/contrib/java/src/js.jar b/contrib/java/src/js.jar
new file mode 100644
index 0000000..6f0dafb
--- /dev/null
+++ b/contrib/java/src/js.jar
Binary files differ
diff --git a/contrib/java/src/org/uscxml/ECMAScriptDataModel.java b/contrib/java/src/org/uscxml/ECMAScriptDataModel.java
new file mode 100644
index 0000000..25f1afe
--- /dev/null
+++ b/contrib/java/src/org/uscxml/ECMAScriptDataModel.java
@@ -0,0 +1,169 @@
+package org.uscxml;
+
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+
+
+public class ECMAScriptDataModel extends JavaDataModel {
+ protected Context ctx;
+ protected Scriptable scope;
+
+ @Override
+ public JavaDataModel create(Interpreter interpreter) {
+ /**
+ * Called when an SCXML interpreter wants an instance of this datamodel
+ * Be careful to instantiate attributes of instance returned and not *this*
+ */
+ System.out.println("create");
+ ECMAScriptDataModel newDM = new ECMAScriptDataModel();
+
+ newDM.ctx = Context.enter();
+ try {
+ newDM.scope = newDM.ctx.initStandardObjects();
+ } catch(Exception e) {
+ System.err.println(e);
+ }
+
+ return newDM;
+ }
+
+ @Override
+ public StringSet getNames() {
+ /**
+ * Register with the following names for the datamodel attribute
+ * at the scxml element. <scxml datamodel="one of these">
+ */
+ System.out.println("getNames");
+ StringSet ss = new StringSet();
+ ss.insert("ecmascript");
+ return ss;
+ }
+
+ @Override
+ public boolean validate(String location, String schema) {
+ /**
+ * Validate the datamodel. This make more sense for XML datamodels
+ * and is pretty much unused but required as per draft.
+ */
+ System.out.println("validate " + location + " " + schema);
+ return true;
+ }
+
+ @Override
+ public void setEvent(Event event) {
+ /**
+ * Make the current event available as the variable _event
+ * in the datamodel.
+ */
+ System.out.println("setEvent " + event);
+ }
+
+ @Override
+ public DataNative getStringAsData(String content) {
+ /**
+ * Evaluate the string as a value expression and
+ * transform it into a JSON-like Data structure
+ */
+ System.out.println("getStringAsData " + content);
+ Data data = new Data();
+
+ // TODO: populate data object
+
+ return Data.toNative(data);
+ }
+
+ @Override
+ public long getLength(String expr) {
+ /**
+ * Return the length of the expression if it were an
+ * array, used by foreach element.
+ */
+ System.out.println("getLength " + expr);
+
+ Object result = ctx.evaluateString(scope, expr, "uscxml", 1, null);
+ return (long) Context.toNumber(result);
+ }
+
+ @Override
+ public void setForeach(String item, String array, String index, long iteration) {
+ /**
+ * Prepare an iteration of the foreach element, by setting the variable in index
+ * to the current iteration and setting the variable in item to the current item
+ * from array.
+ */
+ System.out.println("setForeach " + item + " " + index + " " + iteration);
+
+
+ }
+
+ @Override
+ public void eval(String scriptElem, String expr) {
+ /**
+ * Evaluate the given expression in the datamodel.
+ * This is used foremost with script elements.
+ */
+ System.out.println("eval " + scriptElem + " " + expr);
+
+ ctx.evaluateString(scope, expr, "uscxml", 1, null);
+
+ }
+
+ @Override
+ public String evalAsString(String expr) {
+ /**
+ * Evaluate the expression as a string e.g. for the log element.
+ */
+ System.out.println("evalAsString " + expr);
+
+ Object result = ctx.evaluateString(scope, expr, "uscxml", 1, null);
+ return Context.toString(result);
+ }
+
+ @Override
+ public boolean evalAsBool(String expr) {
+ /**
+ * Evaluate the expression as a boolean for cond attributes in
+ * if and transition elements.
+ */
+ System.out.println("evalAsBool " + expr);
+
+ Object result = ctx.evaluateString(scope, expr, "uscxml", 1, null);
+ return Context.toBoolean(result);
+ }
+
+ @Override
+ public boolean isDeclared(String expr) {
+ /**
+ * The interpreter is supposed to raise an error if we assign
+ * to an undeclared variable. This method is used to check whether
+ * a location from assign is declared.
+ */
+ System.out.println("isDeclared " + expr);
+
+ Object x = scope.get(expr, scope);
+ return x != Scriptable.NOT_FOUND;
+ }
+
+ @Override
+ public void init(String dataElem, String location, String content) {
+ /**
+ * Called when we pass data elements.
+ */
+ System.out.println("init " + dataElem + " " + location + " " + content);
+
+ String expr = location + "=" + content;
+ ctx.evaluateString(scope, expr, "uscxml", 1, null);
+ }
+
+ @Override
+ public void assign(String assignElem, String location, String content) {
+ /**
+ * Called when we evaluate assign elements
+ */
+ System.out.println("assign " + assignElem + " " + location + " " + content);
+
+ String expr = location + "=" + content;
+ ctx.evaluateString(scope, expr, "uscxml", 1, null);
+ }
+
+}
diff --git a/contrib/java/src/org/uscxml/tests/TestDataModel.java b/contrib/java/src/org/uscxml/tests/TestDataModel.java
index 06a56d7..90f4a7a 100644
--- a/contrib/java/src/org/uscxml/tests/TestDataModel.java
+++ b/contrib/java/src/org/uscxml/tests/TestDataModel.java
@@ -142,14 +142,14 @@ public class TestDataModel extends JavaDataModel {
*/
public static void main(String[] args) {
// load JNI library from build directory
- System.load("/Users/sradomski/Documents/TK/Code/uscxml/build/cli/lib/libuscxmlNativeJava64_d.jnilib");
+ System.load("/Users/sradomski/Documents/TK/Code/uscxml/build/cli/lib/libuscxmlNativeJava64.jnilib");
// register java datamodel at factory
TestDataModel datamodel = new TestDataModel();
Factory.getInstance().registerDataModel(datamodel);
// instantiate interpreter with document from file
- Interpreter interpreter = Interpreter.fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/samples/uscxml/test-java-datamodel.scxml");
+ Interpreter interpreter = Interpreter.fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/uscxml/java/test-java-datamodel.scxml");
// wait until interpreter has finished
while(true)
diff --git a/contrib/java/src/org/uscxml/tests/TestJavaScriptDataModel.java b/contrib/java/src/org/uscxml/tests/TestJavaScriptDataModel.java
new file mode 100644
index 0000000..3621a19
--- /dev/null
+++ b/contrib/java/src/org/uscxml/tests/TestJavaScriptDataModel.java
@@ -0,0 +1,25 @@
+package org.uscxml.tests;
+
+import org.uscxml.Factory;
+import org.uscxml.Interpreter;
+import org.uscxml.ECMAScriptDataModel;
+
+public class TestJavaScriptDataModel {
+
+ public static void main(String[] args) {
+ // load JNI library from build directory
+ System.load("/Users/sradomski/Documents/TK/Code/uscxml/build/cli/lib/libuscxmlNativeJava64.jnilib");
+
+ // register java datamodel at factory
+ ECMAScriptDataModel datamodel = new ECMAScriptDataModel();
+ Factory.getInstance().registerDataModel(datamodel);
+
+ // instantiate interpreter with document from file
+ Interpreter interpreter = Interpreter.fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/uscxml/java/test-ecmascript-datamodel.scxml");
+
+ // wait until interpreter has finished
+ while(true)
+ interpreter.interpret();
+ }
+
+}