diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-07-01 22:51:30 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-07-01 22:51:30 (GMT) |
commit | 945160d0539ad119ffc986fac712db76c7203e84 (patch) | |
tree | c43e4a7db898026bc62cc20af5061d07736f847e /embedding | |
parent | c70d02010ea99e6c8e35da3b767f41f1ee5dce56 (diff) | |
download | uscxml-945160d0539ad119ffc986fac712db76c7203e84.zip uscxml-945160d0539ad119ffc986fac712db76c7203e84.tar.gz uscxml-945160d0539ad119ffc986fac712db76c7203e84.tar.bz2 |
More polishing for bindings C# and Java
Diffstat (limited to 'embedding')
16 files changed, 357 insertions, 104 deletions
diff --git a/embedding/csharp/uSCXMLEmbedding.suo b/embedding/csharp/uSCXMLEmbedding.suo Binary files differnew file mode 100644 index 0000000..b08325e --- /dev/null +++ b/embedding/csharp/uSCXMLEmbedding.suo 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(); } } |