From e437da537c85d82e26665837ee7e66a35080eb1e Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 14 May 2014 09:03:59 +0200 Subject: More work on Rhino --- .../org/uscxml/datamodel/ecmascript/ECMAData.java | 110 ++++++++++++++++++ .../org/uscxml/datamodel/ecmascript/ECMAEvent.java | 129 +++++++++++++++------ .../datamodel/ecmascript/ECMAScriptDataModel.java | 18 +-- contrib/java/src/org/uscxml/tests/TestW3CECMA.java | 24 ++-- src/bindings/swig/java/uscxml.i | 19 +++ 5 files changed, 244 insertions(+), 56 deletions(-) create mode 100644 contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java diff --git a/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java new file mode 100644 index 0000000..56d7090 --- /dev/null +++ b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAData.java @@ -0,0 +1,110 @@ +package org.uscxml.datamodel.ecmascript; + +import org.mozilla.javascript.Scriptable; +import org.uscxml.Data; + +public class ECMAData implements Scriptable { + + protected Data data; + protected Scriptable parent; + protected Scriptable prototype; + + public ECMAData(Data data) { + this.data = data; + } + + @Override + public String getClassName() { + return "Data"; + } + + public Object unwrap(Data data) { + if (data.atom.length() > 0) { + return data.atom; + } + return new ECMAData(data); + + } + + @Override + public Object get(String name, Scriptable start) { + if (data.compound.containsKey(name)) + return unwrap(data.compound.get(name)); + return NOT_FOUND; + } + + @Override + public Object get(int index, Scriptable start) { + if (data.array.size() > index) + return unwrap(data.array.get(index)); + return NOT_FOUND; + } + + @Override + public boolean has(String name, Scriptable start) { + return data.compound.containsKey(name); + } + + @Override + public boolean has(int index, Scriptable start) { + return data.array.size() > index; + } + + @Override + public void put(String name, Scriptable start, Object value) { + } + + @Override + public void put(int index, Scriptable start, Object value) { + } + + @Override + public void delete(String name) { + } + + @Override + public void delete(int index) { + } + + @Override + public Scriptable getPrototype() { + return prototype; + } + + @Override + public void setPrototype(Scriptable prototype) { + this.prototype = prototype; + } + + @Override + public Scriptable getParentScope() { + return parent; + } + + @Override + public void setParentScope(Scriptable parent) { + this.parent = parent; + } + + @Override + public Object[] getIds() { + return data.compound.keySet().toArray(); + } + + @Override + public Object getDefaultValue(Class hint) { + return "[object Data]"; + } + + @Override + public boolean hasInstance(Scriptable instance) { + Scriptable proto = instance.getPrototype(); + while (proto != null) { + if (proto.equals(this)) + return true; + proto = proto.getPrototype(); + } + return false; + } + +} diff --git a/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java index e876d80..58fff72 100644 --- a/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java +++ b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAEvent.java @@ -1,69 +1,126 @@ package org.uscxml.datamodel.ecmascript; -import org.mozilla.javascript.ScriptableObject; -import org.mozilla.javascript.annotations.JSConstructor; -import org.mozilla.javascript.annotations.JSGetter; +import java.util.HashMap; +import java.util.Map; + +import org.mozilla.javascript.Scriptable; import org.uscxml.Data; -import org.uscxml.DataMap; import org.uscxml.Event; -import org.uscxml.Event.Type; - -public class ECMAEvent { +import org.uscxml.ParamPair; +import org.uscxml.ParamPairVector; - private Event event; +public class ECMAEvent implements Scriptable { - private static final long serialVersionUID = -5241020609349204355L; + protected Event event; + protected Scriptable parent; + protected Scriptable prototype; + protected Map members = new HashMap(); + 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())); + } + + members.put("type", event.getEventType().toString()); + members.put("data", new ECMAData(data)); + members.put("sendid", event.getSendId()); + members.put("origin", event.getOrigin()); + members.put("originType", event.getOriginType()); + // add others as necessary + + } + + @Override + public String getClassName() { + return "Event"; + } + + @Override + public Object get(String name, Scriptable start) { + if (members.containsKey(name)) + return members.get(name); + return NOT_FOUND; + } + + @Override + public Object get(int index, Scriptable start) { + return NOT_FOUND; + } + + @Override + public boolean has(String name, Scriptable start) { + return (members.containsKey(name)); } - public String getName() { - return event.getName(); + @Override + public boolean has(int index, Scriptable start) { + return false; } - public Type getEventType() { - return event.getEventType(); + @Override + public void put(String name, Scriptable start, Object value) { } - public String getOrigin() { - return event.getOrigin(); + @Override + public void put(int index, Scriptable start, Object value) { } - public String getOriginType() { - return event.getOriginType(); + @Override + public void delete(String name) { } - public String getContent() { - return event.getContent(); + @Override + public void delete(int index) { } - public String getXML() { - return event.getXML(); + @Override + public Scriptable getPrototype() { + return prototype; } - public String getSendId() { - return event.getSendId(); + @Override + public void setPrototype(Scriptable prototype) { + this.prototype = prototype; } - public String getInvokeId() { - return event.getInvokeId(); + @Override + public Scriptable getParentScope() { + return parent; } - public Data getData() { - return new Data(event.getData()); + @Override + public void setParentScope(Scriptable parent) { + this.parent = parent; } - public DataMap getNameList() { - return event.getNameList(); + @Override + public Object[] getIds() { + return members.keySet().toArray(); } - /* - @JSGetter - public SWIGTYPE_p_std__multimapT_std__string_uscxml__Data_t getParams() { - // TODO Auto-generated method stub - return super.getParams(); + @Override + public Object getDefaultValue(Class hint) { + return "[object Event]"; } -*/ - + + @Override + public boolean hasInstance(Scriptable instance) { + Scriptable proto = instance.getPrototype(); + while (proto != null) { + if (proto.equals(this)) + return true; + proto = proto.getPrototype(); + } + + return false; + } + } diff --git a/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java index 6fee8ec..e3f4f2c 100644 --- a/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java +++ b/contrib/java/src/org/uscxml/datamodel/ecmascript/ECMAScriptDataModel.java @@ -79,7 +79,8 @@ public class ECMAScriptDataModel extends JavaDataModel { newDM.ctx = Context.enter(); try { newDM.scope = newDM.ctx.initStandardObjects(); -// ScriptableObject.defineClass(newDM.scope, ECMAEvent.class); +// ScriptableObject.defineClass(newDM.scope, ECMAEvent.class); +// ScriptableObject.defineClass(newDM.scope, ECMAEventScriptable.class); } catch (Exception e) { System.err.println(e); } @@ -114,20 +115,21 @@ public class ECMAScriptDataModel extends JavaDataModel { * datamodel. */ + Data data = new Data(event.getData()); + // Object[] args = { event }; // Scriptable ecmaEvent = ctx.newObject(scope, "Event", args); +// ECMAEvent ecmaEvent = new ECMAEvent(event); +// NativeJavaObject njo = new NativeJavaObject(scope, ecmaEvent, ECMAEvent.class, true); + ECMAEvent ecmaEvent = new ECMAEvent(event); - NativeJavaObject njo = new NativeJavaObject(scope, ecmaEvent, ECMAEvent.class, true); - -// for (Object key : njo.getIds()) { + +// for (Object key : ecmaEvent.getIds()) { // System.out.println(key); // } - scope.put("_event", scope, njo); - Data data = new Data(getStringAsData("_event")); - -// System.out.println(data); + scope.put("_event", scope, ecmaEvent); } @Override diff --git a/contrib/java/src/org/uscxml/tests/TestW3CECMA.java b/contrib/java/src/org/uscxml/tests/TestW3CECMA.java index 2b2a36e..4c77a11 100644 --- a/contrib/java/src/org/uscxml/tests/TestW3CECMA.java +++ b/contrib/java/src/org/uscxml/tests/TestW3CECMA.java @@ -16,19 +16,19 @@ public class TestW3CECMA { ECMAScriptDataModel datamodel = new ECMAScriptDataModel(); Factory.getInstance().registerDataModel(datamodel); - Interpreter interpreter = Interpreter.fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/w3c/ecma/test176.scxml"); - interpreter.interpret(); - System.exit(0); +// Interpreter interpreter = Interpreter.fromURI("/Users/sradomski/Documents/TK/Code/uscxml/test/w3c/ecma/test176.scxml"); +// interpreter.interpret(); +// System.exit(0); -// File dir = new File(testDir); -// File[] filesList = dir.listFiles(); -// for (File file : filesList) { -// if (file.isFile() && file.getName().endsWith(".scxml")) { -// System.out.println("### " + file.getName() + " #####"); -// Interpreter interpreter = Interpreter.fromURI(file.getAbsolutePath()); -// interpreter.interpret(); -// } -// } + File dir = new File(testDir); + File[] filesList = dir.listFiles(); + for (File file : filesList) { + if (file.isFile() && file.getName().endsWith(".scxml")) { + System.out.println("### " + file.getName() + " #####"); + Interpreter interpreter = Interpreter.fromURI(file.getAbsolutePath()); + interpreter.interpret(); + } + } } diff --git a/src/bindings/swig/java/uscxml.i b/src/bindings/swig/java/uscxml.i index ae20eb3..ab46783 100644 --- a/src/bindings/swig/java/uscxml.i +++ b/src/bindings/swig/java/uscxml.i @@ -96,6 +96,8 @@ using namespace Arabica::DOM; %template(DataList) std::list; %template(StringSet) std::set; +%template(ParamPair) std::pair; +%template(ParamPairVector) std::vector >; %rename Data DataNative; # %typemap(jstype) uscxml::Data "Data" @@ -109,6 +111,23 @@ using namespace Arabica::DOM; %feature("director") uscxml::JavaInvoker; %feature("director") uscxml::JavaDataModel; +// translate param multimap to Map > +%rename(getParamsNative) uscxml::Event::getParams(); +%javamethodmodifiers uscxml::Event::getParams() "private"; + +%extend uscxml::Event { + std::vector > getParamPairs() { + std::vector > pairs; + std::multimap::iterator paramPairIter = self->getParams().begin(); + while(paramPairIter != self->getParams().end()) { + pairs.push_back(*paramPairIter); + paramPairIter++; + } + return pairs; + } +}; + + // Provide an iterable interface for maps // http://stackoverflow.com/questions/9465856/no-iterator-for-java-when-using-swig-with-cs-stdmap -- cgit v0.12