summaryrefslogtreecommitdiffstats
path: root/embedding
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-07-01 22:51:30 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-07-01 22:51:30 (GMT)
commit945160d0539ad119ffc986fac712db76c7203e84 (patch)
treec43e4a7db898026bc62cc20af5061d07736f847e /embedding
parentc70d02010ea99e6c8e35da3b767f41f1ee5dce56 (diff)
downloaduscxml-945160d0539ad119ffc986fac712db76c7203e84.zip
uscxml-945160d0539ad119ffc986fac712db76c7203e84.tar.gz
uscxml-945160d0539ad119ffc986fac712db76c7203e84.tar.bz2
More polishing for bindings C# and Java
Diffstat (limited to 'embedding')
-rw-r--r--embedding/csharp/uSCXMLEmbedding.suobin0 -> 29184 bytes
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Examples.csproj13
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Extensions/CustomDataModel.cs (renamed from embedding/csharp/uSCXMLEmbedding/Extensions/SampleDataModel.cs)11
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Extensions/CustomExecutableContent.cs (renamed from embedding/csharp/uSCXMLEmbedding/Extensions/SampleExecutableContent.cs)4
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Extensions/CustomIOProc.cs (renamed from embedding/csharp/uSCXMLEmbedding/Extensions/SampleIOProc.cs)8
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Extensions/CustomInterpreterMonitor.cs (renamed from embedding/csharp/uSCXMLEmbedding/Extensions/SampleInterpreterMonitor.cs)2
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Extensions/CustomInvoker.cs (renamed from embedding/csharp/uSCXMLEmbedding/Extensions/SampleInvoker.cs)10
-rw-r--r--embedding/csharp/uSCXMLEmbedding/Program.cs34
-rw-r--r--embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java18
-rw-r--r--embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java21
-rw-r--r--embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java31
-rw-r--r--embedding/java/src/org/uscxml/tests/TestData.java11
-rw-r--r--embedding/java/src/org/uscxml/tests/TestLifecycle.java124
-rw-r--r--embedding/java/src/org/uscxml/tests/execContent/TestCustomExecContent.java4
-rw-r--r--embedding/java/src/org/uscxml/tests/invoker/TestCustomInvoker.java55
-rw-r--r--embedding/java/src/org/uscxml/tests/ioprocessor/TestCustomIOProc.java115
16 files changed, 357 insertions, 104 deletions
diff --git a/embedding/csharp/uSCXMLEmbedding.suo b/embedding/csharp/uSCXMLEmbedding.suo
new file mode 100644
index 0000000..b08325e
--- /dev/null
+++ b/embedding/csharp/uSCXMLEmbedding.suo
Binary files differ
diff --git a/embedding/csharp/uSCXMLEmbedding/Examples.csproj b/embedding/csharp/uSCXMLEmbedding/Examples.csproj
index b1579bf..b312b5f 100644
--- a/embedding/csharp/uSCXMLEmbedding/Examples.csproj
+++ b/embedding/csharp/uSCXMLEmbedding/Examples.csproj
@@ -41,18 +41,19 @@
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
- <Reference Include="uscxmlCSharp">
+ <Reference Include="uscxmlCSharp, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
<HintPath>C:\Users\sradomski\Desktop\build\uscxml\lib\uscxmlCSharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
- <Compile Include="Extensions\SampleDataModel.cs" />
- <Compile Include="Extensions\SampleExecutableContent.cs" />
- <Compile Include="Extensions\SampleInterpreterMonitor.cs" />
- <Compile Include="Extensions\SampleInvoker.cs" />
- <Compile Include="Extensions\SampleIOProc.cs" />
+ <Compile Include="Extensions\CustomDataModel.cs" />
+ <Compile Include="Extensions\CustomExecutableContent.cs" />
+ <Compile Include="Extensions\CustomInterpreterMonitor.cs" />
+ <Compile Include="Extensions\CustomInvoker.cs" />
+ <Compile Include="Extensions\CustomIOProc.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleDataModel.cs b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomDataModel.cs
index 4d70594..b2ee1de 100644
--- a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleDataModel.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomDataModel.cs
@@ -4,13 +4,13 @@ using System.Linq;
using System.Text;
using org.uscxml;
-namespace EmbeddedDataModel
+namespace embedding
{
- class SampleDataModel : DataModel
+ class CustomDataModel : DataModel
{
public override DataModel create(Interpreter interpreter)
{
- return new SampleDataModel();
+ return new CustomDataModel();
}
public override void eval(string scriptElem, string expr)
@@ -54,10 +54,9 @@ namespace EmbeddedDataModel
return names;
}
- public override DataNative getStringAsData(string content)
+ public override Data getStringAsData(string content)
{
- // DataNative ought to be wrapped by a Data.cs class - used to carry JSONesque structures
- DataNative data = new DataNative();
+ Data data = new Data();
return data;
}
diff --git a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleExecutableContent.cs b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomExecutableContent.cs
index a86776f..4789020 100644
--- a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleExecutableContent.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomExecutableContent.cs
@@ -6,7 +6,7 @@ using org.uscxml;
namespace embedding
{
- class SampleExecutableContent : ExecutableContent
+ class CustomExecutableContent : ExecutableContent
{
public override string getLocalName()
{
@@ -25,7 +25,7 @@ namespace embedding
public override ExecutableContent create(Interpreter interpreter)
{
- return new SampleExecutableContent();
+ return new CustomExecutableContent();
}
diff --git a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleIOProc.cs b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomIOProc.cs
index 5abbf37..0480a34 100644
--- a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleIOProc.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomIOProc.cs
@@ -6,16 +6,16 @@ using org.uscxml;
namespace embedding
{
- class SampleIOProc : IOProcessor
+ class CustomIOProc : IOProcessor
{
public override IOProcessor create(Interpreter interpreter)
{
- return new SampleIOProc();
+ return new CustomIOProc();
}
- public override DataNative getDataModelVariables()
+ public override Data getDataModelVariables()
{
- DataNative data = new DataNative();
+ Data data = new Data();
return data;
}
diff --git a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleInterpreterMonitor.cs b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomInterpreterMonitor.cs
index 2a2f561..8009aa0 100644
--- a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleInterpreterMonitor.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomInterpreterMonitor.cs
@@ -6,7 +6,7 @@ using org.uscxml;
namespace embedding
{
- class SampleInterpreterMonitor : InterpreterMonitor
+ class CustomInterpreterMonitor : InterpreterMonitor
{
public override void afterCompletion(Interpreter interpreter) { }
public override void afterMicroStep(Interpreter interpreter) { }
diff --git a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleInvoker.cs b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomInvoker.cs
index f5fb363..3fd01ce 100644
--- a/embedding/csharp/uSCXMLEmbedding/Extensions/SampleInvoker.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Extensions/CustomInvoker.cs
@@ -4,18 +4,18 @@ using System.Linq;
using System.Text;
using org.uscxml;
-namespace EmbeddedInvoker
+namespace embedding
{
- class SampleInvoker : Invoker
+ class CustomInvoker : Invoker
{
public override Invoker create(Interpreter interpreter)
{
- return new SampleInvoker();
+ return new CustomInvoker();
}
- public override DataNative getDataModelVariables()
+ public override Data getDataModelVariables()
{
- DataNative data = new DataNative();
+ Data data = new Data();
return data;
}
diff --git a/embedding/csharp/uSCXMLEmbedding/Program.cs b/embedding/csharp/uSCXMLEmbedding/Program.cs
index 559d28f..0c76cb4 100644
--- a/embedding/csharp/uSCXMLEmbedding/Program.cs
+++ b/embedding/csharp/uSCXMLEmbedding/Program.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using System.Diagnostics;
using System.Runtime.InteropServices;
namespace embedding
@@ -13,6 +14,34 @@ namespace embedding
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern void SetDllDirectory(string lpPathName);
+ static bool testLifecycle() {
+ // try to instantiate an interpreter with a parse error
+ try
+ {
+ Interpreter interpreter = Interpreter.fromXML("<invalid");
+ Debug.Assert(false);
+ }
+ catch (InterpreterException e) {
+ Console.Write(e.Message);
+ }
+
+ // try to instantiate an interpreter with invalid XML (no scxml element)
+ try
+ {
+ Interpreter interpreter = Interpreter.fromXML("<invalid />");
+ Debug.Assert(interpreter.getState() == InterpreterState.USCXML_INSTANTIATED);
+ InterpreterState state = interpreter.step();
+
+ Debug.Assert(false);
+ }
+ catch (InterpreterException e)
+ {
+ Console.Write(e.Message);
+ }
+
+ return true;
+ }
+
static void Main(string[] args)
{
@@ -28,9 +57,8 @@ namespace embedding
SetDllDirectory("C:\\Users\\sradomski\\Desktop\\build\\uscxml\\lib\\csharp");
}
- Interpreter interpreter = Interpreter.fromXML("<scxml><state id=\"f oo\" final=\"true\" /></scxml>");
- interpreter.addMonitor(new SampleInterpreterMonitor());
- interpreter.interpret();
+ testLifecycle();
+ Console.ReadKey();
}
}
}
diff --git a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java
index 56d7090..035da61 100644
--- a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java
+++ b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java
@@ -19,8 +19,8 @@ public class ECMAData implements Scriptable {
}
public Object unwrap(Data data) {
- if (data.atom.length() > 0) {
- return data.atom;
+ if (data.getAtom().length() > 0) {
+ return data.getAtom();
}
return new ECMAData(data);
@@ -28,26 +28,26 @@ public class ECMAData implements Scriptable {
@Override
public Object get(String name, Scriptable start) {
- if (data.compound.containsKey(name))
- return unwrap(data.compound.get(name));
+ if (data.hasKey(name))
+ return unwrap(data.at(name));
return NOT_FOUND;
}
@Override
public Object get(int index, Scriptable start) {
- if (data.array.size() > index)
- return unwrap(data.array.get(index));
+ if (data.getArray().size() > index)
+ return unwrap(data.item(index));
return NOT_FOUND;
}
@Override
public boolean has(String name, Scriptable start) {
- return data.compound.containsKey(name);
+ return data.hasKey(name);
}
@Override
public boolean has(int index, Scriptable start) {
- return data.array.size() > index;
+ return data.getArray().size() > index;
}
@Override
@@ -88,7 +88,7 @@ public class ECMAData implements Scriptable {
@Override
public Object[] getIds() {
- return data.compound.keySet().toArray();
+ return data.getCompound().keySet().toArray();
}
@Override
diff --git a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java
index 58fff72..45d93b8 100644
--- a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java
+++ b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java
@@ -1,13 +1,12 @@
package org.uscxml.datamodel.ecmascript;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.mozilla.javascript.Scriptable;
import org.uscxml.Data;
import org.uscxml.Event;
-import org.uscxml.ParamPair;
-import org.uscxml.ParamPairVector;
public class ECMAEvent implements Scriptable {
@@ -19,17 +18,17 @@ public class ECMAEvent implements Scriptable {
public ECMAEvent(Event event) {
this.event = event;
-
- Data data = new Data(event.getData());
-
- // insert params into event.data
- ParamPairVector ppv = event.getParamPairs();
- for (int i = 0; i < ppv.size(); i++) {
- ParamPair pp = ppv.get(i);
- data.compound.put(pp.getFirst(), new Data(pp.getSecond()));
+
+ // copy event params to data
+ Data data = event.getData();
+ Map<String, List<Data>> params = event.getParams();
+ for (String key : params.keySet()) {
+ for (Data param : params.get(key)) {
+ data.put(key, param);
+ }
}
- members.put("type", event.getEventType().toString());
+ members.put("type", event.getEventType());
members.put("data", new ECMAData(data));
members.put("sendid", event.getSendId());
members.put("origin", event.getOrigin());
diff --git a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java
index 152f5e3..0b2b576 100644
--- a/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java
+++ b/embedding/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java
@@ -12,7 +12,6 @@ import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.Undefined;
import org.uscxml.Data;
import org.uscxml.DataModel;
-import org.uscxml.DataNative;
import org.uscxml.Event;
import org.uscxml.Interpreter;
import org.uscxml.StringList;
@@ -45,20 +44,20 @@ public class ECMAScriptDataModel extends DataModel {
ScriptableObject obj = (ScriptableObject) Context.toObject(s,
scope);
for (Object key : obj.getIds()) {
- data.compound.put(Context.toString(key),
+ data.put(Context.toString(key),
getScriptableAsData(obj.get(key)));
}
}
} catch (ClassCastException e) {
if (object instanceof Boolean) {
- data.atom = (Context.toBoolean(object) ? "true" : "false");
- data.type = Data.Type.INTERPRETED;
+ data.setAtom(Context.toBoolean(object) ? "true" : "false");
+ data.setType(Data.Type.INTERPRETED);
} else if (object instanceof String) {
- data.atom = (String) object;
- data.type = Data.Type.VERBATIM;
+ data.setAtom((String) object);
+ data.setType(Data.Type.VERBATIM);
} else if (object instanceof Integer) {
- data.atom = ((Integer) object).toString();
- data.type = Data.Type.INTERPRETED;
+ data.setAtom(((Integer) object).toString());
+ data.setType(Data.Type.INTERPRETED);
} else {
throw new RuntimeException("Unhandled ECMA type "
+ object.getClass().getName());
@@ -102,9 +101,9 @@ public class ECMAScriptDataModel extends DataModel {
Data ioProcs = new Data();
StringVector keys = interpreter.getIOProcessorKeys();
for (int i = 0; i < keys.size(); i++) {
- ioProcs.compound.put(keys.get(i), new Data(interpreter
+ ioProcs.put(keys.get(i), interpreter
.getIOProcessors().get(keys.get(i))
- .getDataModelVariables()));
+ .getDataModelVariables());
}
newDM.scope
.put("_ioprocessors", newDM.scope, new ECMAData(ioProcs));
@@ -115,9 +114,9 @@ public class ECMAScriptDataModel extends DataModel {
Data invokers = new Data();
StringVector keys = interpreter.getInvokerKeys();
for (int i = 0; i < keys.size(); i++) {
- invokers.compound.put(keys.get(i), new Data(interpreter
+ invokers.put(keys.get(i), interpreter
.getInvokers().get(keys.get(i))
- .getDataModelVariables()));
+ .getDataModelVariables());
}
newDM.scope
.put("_ioprocessors", newDM.scope, new ECMAData(invokers));
@@ -176,7 +175,7 @@ public class ECMAScriptDataModel extends DataModel {
}
@Override
- public DataNative getStringAsData(String content) {
+ public Data getStringAsData(String content) {
if (debug) {
System.out.println(interpreter.getName() + " getStringAsData");
}
@@ -186,7 +185,7 @@ public class ECMAScriptDataModel extends DataModel {
* JSON-like Data structure
*/
if (content.length() == 0) {
- return Data.toNative(new Data());
+ return new Data();
}
// is it a json expression?
@@ -194,7 +193,7 @@ public class ECMAScriptDataModel extends DataModel {
Object json = NativeJSON.parse(ctx, scope, content,
new NullCallable());
if (json != NativeJSON.NOT_FOUND) {
- return Data.toNative(getScriptableAsData(json));
+ return getScriptableAsData(json);
}
} catch (org.mozilla.javascript.EcmaError e) {
System.err.println(e);
@@ -207,7 +206,7 @@ public class ECMAScriptDataModel extends DataModel {
x = ctx.evaluateString(scope, '"' + content + '"', "uscxml", 0,
null);
}
- return Data.toNative(getScriptableAsData(x));
+ return getScriptableAsData(x);
}
@Override
diff --git a/embedding/java/src/org/uscxml/tests/TestData.java b/embedding/java/src/org/uscxml/tests/TestData.java
index 44f1ce0..d1ebf20 100644
--- a/embedding/java/src/org/uscxml/tests/TestData.java
+++ b/embedding/java/src/org/uscxml/tests/TestData.java
@@ -1,7 +1,7 @@
package org.uscxml.tests;
import org.uscxml.Data;
-import org.uscxml.DataNative;
+import org.uscxml.Event;
public class TestData {
@@ -9,15 +9,12 @@ public class TestData {
System.load("/Users/sradomski/Documents/TK/Code/uscxml/build/cli/lib/libuscxmlNativeJava64.jnilib");
{
Data data = Data.fromJSON("[1,2,3,4,5]");
- DataNative nData2 = Data.toNative(data);
- Data data2 = new Data(nData2);
- System.out.println(data2);
+ System.out.println(data);
}
{
Data data = Data.fromJSON("{ \"foo\": \"bar\", \"faz\": 12 }");
- DataNative nData2 = Data.toNative(data);
- Data data2 = new Data(nData2);
- System.out.println(data2);
+ System.out.println(data);
}
+
}
}
diff --git a/embedding/java/src/org/uscxml/tests/TestLifecycle.java b/embedding/java/src/org/uscxml/tests/TestLifecycle.java
new file mode 100644
index 0000000..9278cbe
--- /dev/null
+++ b/embedding/java/src/org/uscxml/tests/TestLifecycle.java
@@ -0,0 +1,124 @@
+package org.uscxml.tests;
+
+import org.uscxml.Interpreter;
+import org.uscxml.InterpreterException;
+import org.uscxml.InterpreterState;
+
+public class TestLifecycle {
+ public static void main(String[] args) {
+ System.load("/Users/sradomski/Documents/TK/Code/uscxml/build/cli/lib/libuscxmlNativeJava64.jnilib");
+
+ // syntactic xml parse error -> throws
+ try {
+ String xml = "<invalid";
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ throw new RuntimeException("");
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+
+ // semantic xml parse error -> throws
+ try {
+ String xml = "<invalid />";
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ interpreter.step();
+ throw new RuntimeException("");
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+
+ // request unknown datamodel -> throws
+ try {
+ String xml =
+ "<scxml datamodel=\"invalid\">" +
+ " <state id=\"start\">" +
+ " <transition target=\"done\" />" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ interpreter.step();
+ throw new RuntimeException("");
+
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+
+ try {
+ // two microsteps
+ String xml =
+ "<scxml>" +
+ " <state id=\"start\">" +
+ " <transition target=\"s2\" />" +
+ " </state>" +
+ " <state id=\"s2\">" +
+ " <transition target=\"done\" />" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+
+ Interpreter interpreter = Interpreter.fromXML(xml);
+
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_MICROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_MICROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_FINISHED) throw new RuntimeException("");
+
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+
+ try {
+ // single macrostep, multiple runs
+ String xml =
+ "<scxml>" +
+ " <state id=\"start\">" +
+ " <transition target=\"done\" />" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_MICROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_FINISHED) throw new RuntimeException("");
+ interpreter.reset();
+
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_MICROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_FINISHED) throw new RuntimeException("");
+
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+
+ try {
+ // macrostep in between
+ String xml =
+ "<scxml>" +
+ " <state id=\"start\">" +
+ " <onentry>" +
+ " <send event=\"continue\" delay=\"2s\"/>" +
+ " </onentry>" +
+ " <transition target=\"s2\" event=\"continue\" />" +
+ " </state>" +
+ " <state id=\"s2\">" +
+ " <transition target=\"done\" />" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ if (interpreter.getState() != InterpreterState.USCXML_INSTANTIATED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_IDLE) throw new RuntimeException("");
+ if (interpreter.step(true) != InterpreterState.USCXML_MACROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_MICROSTEPPED) throw new RuntimeException("");
+ if (interpreter.step() != InterpreterState.USCXML_FINISHED) throw new RuntimeException("");
+
+ } catch (InterpreterException e) {
+ System.err.println(e);
+ }
+ }
+}
diff --git a/embedding/java/src/org/uscxml/tests/execContent/TestCustomExecContent.java b/embedding/java/src/org/uscxml/tests/execContent/TestCustomExecContent.java
index 92d7ed3..7a97ab4 100644
--- a/embedding/java/src/org/uscxml/tests/execContent/TestCustomExecContent.java
+++ b/embedding/java/src/org/uscxml/tests/execContent/TestCustomExecContent.java
@@ -1,11 +1,9 @@
package org.uscxml.tests.execContent;
-import org.uscxml.Data;
-import org.uscxml.Event;
+import org.uscxml.ExecutableContent;
import org.uscxml.Factory;
import org.uscxml.Interpreter;
import org.uscxml.InterpreterException;
-import org.uscxml.ExecutableContent;
public class TestCustomExecContent extends ExecutableContent {
diff --git a/embedding/java/src/org/uscxml/tests/invoker/TestCustomInvoker.java b/embedding/java/src/org/uscxml/tests/invoker/TestCustomInvoker.java
index b17b52e..25420ed 100644
--- a/embedding/java/src/org/uscxml/tests/invoker/TestCustomInvoker.java
+++ b/embedding/java/src/org/uscxml/tests/invoker/TestCustomInvoker.java
@@ -1,7 +1,6 @@
package org.uscxml.tests.invoker;
import org.uscxml.Data;
-import org.uscxml.DataNative;
import org.uscxml.Event;
import org.uscxml.Factory;
import org.uscxml.Interpreter;
@@ -21,27 +20,29 @@ public class TestCustomInvoker extends Invoker {
}
@Override
- public DataNative getDataModelVariables() {
+ public Data getDataModelVariables() {
Data data = new Data();
- data.array.add(new Data("foo", Data.Type.VERBATIM));
- return Data.toNative(data);
+ return data;
}
@Override
public void send(SendRequest req) {
- System.out.println("send");
+ System.out.println(req);
+ if ("foo".equals(req.getName()))
+ returnEvent(new Event("received2"), true); // enqueue an external event
}
@Override
public void invoke(InvokeRequest req) {
- System.out.println("invoke");
-
- System.out.println(req.getData());
- System.out.println(req.getXML());
+ System.out.println(req);
+ if ("Some string content".equals(req.getContent())) {
+ returnEvent(new Event("received1"), true); // enqueue an external event
+ }
+ }
- Event ev = new Event();
- ev.setName("foo");
- returnEvent(ev);
+ @Override
+ public void uninvoke() {
+ System.out.println("uninvoke");
}
@Override
@@ -54,15 +55,35 @@ public class TestCustomInvoker extends Invoker {
* @throws InterpreterException
*/
public static void main(String[] args) throws InterpreterException {
- 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");
TestCustomInvoker invoker = new TestCustomInvoker();
+ // just register prototype at global factory
Factory.getInstance().registerInvoker(invoker);
- Interpreter interpreter = Interpreter
- .fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/samples/uscxml/test-java-invoker.scxml");
- while (true)
- interpreter.interpret();
+ String xml =
+ "<scxml>" +
+ " <state id=\"s1\">" +
+ " <invoke type=\"java\" id=\"javainvoker1\">" +
+ " <content>Some string content</content>" +
+ " </invoke>" +
+ " <invoke type=\"java\" id=\"javainvoker2\" />" +
+ " <state id=\"s11\">" +
+ " <transition event=\"received1\" target=\"s12\" />" +
+ " </state>" +
+ " <state id=\"s12\">" +
+ " <onentry>" +
+ " <send target=\"#_javainvoker2\" event=\"foo\" />" +
+ " </onentry>" +
+ " <transition event=\"received2\" target=\"done\" />" +
+ " </state>" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+
+ // parse and interpret
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ interpreter.interpret();
}
}
diff --git a/embedding/java/src/org/uscxml/tests/ioprocessor/TestCustomIOProc.java b/embedding/java/src/org/uscxml/tests/ioprocessor/TestCustomIOProc.java
index cc4d332..277c505 100644
--- a/embedding/java/src/org/uscxml/tests/ioprocessor/TestCustomIOProc.java
+++ b/embedding/java/src/org/uscxml/tests/ioprocessor/TestCustomIOProc.java
@@ -1,16 +1,30 @@
package org.uscxml.tests.ioprocessor;
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
import org.uscxml.Data;
-import org.uscxml.DataNative;
+import org.uscxml.Event;
import org.uscxml.Factory;
import org.uscxml.IOProcessor;
import org.uscxml.Interpreter;
import org.uscxml.InterpreterException;
import org.uscxml.SendRequest;
import org.uscxml.StringList;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
public class TestCustomIOProc extends IOProcessor {
+ public Interpreter interpreter;
+
+ /**
+ * The types we will handle on a <send> element
+ */
@Override
public StringList getNames() {
StringList ss = new StringList();
@@ -18,38 +32,111 @@ public class TestCustomIOProc extends IOProcessor {
return ss;
}
+ /**
+ * Optional data we want to make available at
+ * _ioprocessors[this.getNames.front()] in the datamodel
+ */
@Override
- public DataNative getDataModelVariables() {
- Data data = new Data();
- data.array.add(new Data("foo", Data.Type.VERBATIM));
- return Data.toNative(data);
+ public Data getDataModelVariables() {
+ return new Data();
}
+ /**
+ * Send from the SCXML interpreter to this ioprocessor
+ */
@Override
public void send(SendRequest req) {
- System.out.println("send");
+ System.out.println(req);
+ // send in s1.onentry
+ if ("This is some content!".equals(req.getContent())) {
+ returnEvent(new Event("received1"));
+ return;
+ }
+ // send in s2.onentry
+ if (req.getParams().containsKey("foo")
+ && "bar".equals(req.getParams().get("foo").get(0).getAtom())) {
+ returnEvent(new Event("received2"));
+ return;
+ }
+ // send in s3
+ if (req.getXML().length() > 0) {
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory
+ .newInstance();
+ Document doc = factory.newDocumentBuilder().parse(
+ new InputSource(new StringReader(req.getXML())));
+ System.out.println("Root element :"
+ + doc.getDocumentElement().getNodeName());
+ if ("this".equals(doc.getDocumentElement().getNodeName())) {
+ returnEvent(new Event("received3"));
+ return;
+ }
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ } catch (SAXException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
}
+ /**
+ * Create a new instance of this
+ */
@Override
public IOProcessor create(Interpreter interpreter) {
- return new TestCustomIOProc();
+ TestCustomIOProc ioProc = new TestCustomIOProc();
+ ioProc.interpreter = interpreter;
+ return ioProc;
}
/**
* @param args
- * @throws InterpreterException
+ * @throws InterpreterException
*/
public static void main(String[] args) throws InterpreterException {
- 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");
TestCustomIOProc ioproc = new TestCustomIOProc();
+ // just register prototype at global factory
Factory.getInstance().registerIOProcessor(ioproc);
- Interpreter interpreter = Interpreter
- .fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/samples/uscxml/test-java-invoker.scxml");
-
- while (true)
- interpreter.interpret();
+ String xml =
+ "<scxml>" +
+ " <state id=\"s1\">" +
+ " <onentry>" +
+ " <send type=\"java\">" +
+ " <content>This is some content!</content>" +
+ " </send>" +
+ " </onentry>" +
+ " <transition event=\"received1\" target=\"s2\" />" +
+ " </state>" +
+ " <state id=\"s2\">" +
+ " <onentry>" +
+ " <send type=\"java\">" +
+ " <param name=\"foo\" expr=\"bar\" />" +
+ " </send>" +
+ " </onentry>" +
+ " <transition event=\"received2\" target=\"s3\" />" +
+ " </state>" +
+ " <state id=\"s3\">" +
+ " <onentry>" +
+ " <send type=\"java\">" +
+ " <content>" +
+ " <this><is><xml/></is></this>" +
+ " </content>" +
+ " </send>" +
+ " </onentry>" +
+ " <transition event=\"received3\" target=\"done\" />" +
+ " </state>" +
+ " <final id=\"done\" />" +
+ "</scxml>";
+
+ // parse and interpret
+ Interpreter interpreter = Interpreter.fromXML(xml);
+ interpreter.interpret();
}
}