summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/swig/java/org/uscxml/Data.java5
-rw-r--r--src/bindings/swig/java/uscxml.i69
-rw-r--r--src/uscxml/Interpreter.cpp13
-rw-r--r--src/uscxml/Interpreter.h39
-rw-r--r--src/uscxml/interpreter/InterpreterDraft6.cpp9
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDOM.cpp3
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp2
-rw-r--r--src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp2
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp3
9 files changed, 77 insertions, 68 deletions
diff --git a/src/bindings/swig/java/org/uscxml/Data.java b/src/bindings/swig/java/org/uscxml/Data.java
index f3f21f3..fdd7448 100644
--- a/src/bindings/swig/java/org/uscxml/Data.java
+++ b/src/bindings/swig/java/org/uscxml/Data.java
@@ -30,8 +30,9 @@ public class Data {
public Data(DataNative nativeData) {
if (!nativeData.getCompound().empty()) {
// data is a key value compound
- for(String key : nativeData.getCompound()) {
- this.compound.put(key, new Data(nativeData.getCompound().get(key)));
+ StringVector keys = nativeData.getCompundKeys();
+ for(int i = 0; i < keys.size(); i++) {
+ this.compound.put(keys.get(i), new Data(nativeData.getCompound().get(keys.get(i))));
}
} else if (!nativeData.getArray().isEmpty()) {
// data is an array
diff --git a/src/bindings/swig/java/uscxml.i b/src/bindings/swig/java/uscxml.i
index ab46783..a88ebf1 100644
--- a/src/bindings/swig/java/uscxml.i
+++ b/src/bindings/swig/java/uscxml.i
@@ -95,9 +95,12 @@ using namespace Arabica::DOM;
%ignore uscxml::Event::toDocument();
%template(DataList) std::list<uscxml::Data>;
+%template(DataMap) std::map<std::string, uscxml::Data>;
%template(StringSet) std::set<std::string>;
+%template(StringVector) std::vector<std::string>;
%template(ParamPair) std::pair<std::string, uscxml::Data>;
%template(ParamPairVector) std::vector<std::pair<std::string, uscxml::Data> >;
+%template(IOProcMap) std::map<std::string, uscxml::IOProcessor>;
%rename Data DataNative;
# %typemap(jstype) uscxml::Data "Data"
@@ -127,52 +130,30 @@ using namespace Arabica::DOM;
}
};
+%extend uscxml::Interpreter {
+ std::vector<std::string> getIOProcessorKeys() {
+ std::vector<std::string> keys;
+ std::map<std::string, IOProcessor>::const_iterator iter = self->getIOProcessors().begin();
+ while(iter != self->getIOProcessors().end()) {
+ keys.push_back(iter->first);
+ iter++;
+ }
+ return keys;
+ }
+};
-// Provide an iterable interface for maps
-// http://stackoverflow.com/questions/9465856/no-iterator-for-java-when-using-swig-with-cs-stdmap
-
-%typemap(javainterfaces) MapKeyIterator "java.util.Iterator<String>"
-%typemap(javacode) MapKeyIterator %{
- public void remove() throws UnsupportedOperationException {
- throw new UnsupportedOperationException();
- }
-
- public String next() throws java.util.NoSuchElementException {
- if (!hasNext()) {
- throw new java.util.NoSuchElementException();
- }
- return nextImpl();
- }
-%}
-
-%javamethodmodifiers MapKeyIterator::nextImpl "private";
-%inline %{
- struct MapKeyIterator {
- typedef std::map<std::string, Data> map_t;
- MapKeyIterator(const map_t& m) : it(m.begin()), map(m) {}
- bool hasNext() const {
- return it != map.end();
- }
-
- const std::string nextImpl() {
- const std::pair<std::string, Data>& ret = *it++;
- return ret.first;
- }
- private:
- map_t::const_iterator it;
- const map_t& map;
- };
-%}
-%typemap(javainterfaces) std::map<std::string, Data> "Iterable<String>"
-
-%newobject std::map<std::string, uscxml::Data>::iterator() const;
-%extend std::map<std::string, uscxml::Data> {
- MapKeyIterator *iterator() const {
- return new MapKeyIterator(*$self);
- }
-}
+%extend uscxml::Data {
+ std::vector<std::string> getCompundKeys() {
+ std::vector<std::string> keys;
+ std::map<std::string, Data>::const_iterator iter = self->compound.begin();
+ while(iter != self->compound.end()) {
+ keys.push_back(iter->first);
+ iter++;
+ }
+ return keys;
+ }
+};
-%template(DataMap) std::map<std::string, uscxml::Data>;
//***********************************************
diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp
index b7de262..75d44c1 100644
--- a/src/uscxml/Interpreter.cpp
+++ b/src/uscxml/Interpreter.cpp
@@ -240,6 +240,8 @@ DONE_PARSING_CMD:
void NameSpaceInfo::init(const std::map<std::string, std::string>& namespaceInfo) {
nsInfo = namespaceInfo;
nsURL = "";
+ if (nsContext)
+ delete nsContext;
nsContext = new Arabica::XPath::StandardNamespaceContext<std::string>();
std::map<std::string, std::string>::const_iterator nsIter = namespaceInfo.begin();
@@ -462,7 +464,12 @@ void InterpreterImpl::setName(const std::string& name) {
}
InterpreterImpl::~InterpreterImpl() {
- _running = false;
+ {
+ // make sure we are done with setting up with early abort
+ tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
+ _running = false;
+ }
+// std::cout << "stopped " << this << std::endl;
// tthread::lock_guard<tthread::recursive_mutex> lock(_mutex);
if (_thread) {
if (_thread->get_id() != tthread::this_thread::get_id()) {
@@ -554,8 +561,8 @@ void InterpreterImpl::init() {
_scxml = (Arabica::DOM::Element<std::string>)scxmls.item(0);
// setup xpath and check that it works
- if (_nsInfo.nsContext != NULL)
- _xpath.setNamespaceContext(*_nsInfo.nsContext);
+ if (_nsInfo.getNSContext() != NULL)
+ _xpath.setNamespaceContext(*_nsInfo.getNSContext());
if (_name.length() == 0)
_name = (HAS_ATTR(_scxml, "name") ? ATTR(_scxml, "name") : UUID::getUUID());
diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h
index a18bc28..6a11c46 100644
--- a/src/uscxml/Interpreter.h
+++ b/src/uscxml/Interpreter.h
@@ -98,6 +98,18 @@ enum Capabilities {
class USCXML_API InterpreterOptions {
public:
+ InterpreterOptions() :
+ withDebugger(false),
+ verbose(false),
+ withHTTP(true),
+ withHTTPS(true),
+ withWS(true),
+ logLevel(0),
+ httpPort(0),
+ httpsPort(0),
+ wsPort(0)
+ {}
+
bool withDebugger;
bool verbose;
bool withHTTP;
@@ -124,31 +136,19 @@ public:
static InterpreterOptions fromCmdLine(int argc, char** argv);
unsigned int getCapabilities();
-protected:
- InterpreterOptions() :
- withDebugger(false),
- verbose(false),
- withHTTP(true),
- withHTTPS(true),
- withWS(true),
- logLevel(0),
- httpPort(0),
- httpsPort(0),
- wsPort(0)
- {}
};
class NameSpaceInfo {
public:
- NameSpaceInfo() {
+ NameSpaceInfo() : nsContext(NULL) {
init(std::map<std::string, std::string>());
}
- NameSpaceInfo(const std::map<std::string, std::string>& nsInfo) {
+ NameSpaceInfo(const std::map<std::string, std::string>& nsInfo) : nsContext(NULL) {
init(nsInfo);
}
- NameSpaceInfo(const NameSpaceInfo& other) {
+ NameSpaceInfo(const NameSpaceInfo& other) : nsContext(NULL) {
init(other.nsInfo);
}
@@ -172,14 +172,19 @@ public:
attribute.setPrefix(nsToPrefix[nsURL]);
}
+ const Arabica::XPath::StandardNamespaceContext<std::string>* getNSContext() {
+ return nsContext;
+ }
+
std::string nsURL; // ough to be "http://www.w3.org/2005/07/scxml" but maybe empty
std::string xpathPrefix; // prefix mapped for xpath, "scxml" is _xmlNSPrefix is empty but _nsURL set
std::string xmlNSPrefix; // the actual prefix for elements in the xml file
- Arabica::XPath::StandardNamespaceContext<std::string>* nsContext;
std::map<std::string, std::string> nsToPrefix; // prefixes for a given namespace
std::map<std::string, std::string> nsInfo; // all xmlns mappings
private:
+ Arabica::XPath::StandardNamespaceContext<std::string>* nsContext;
+
void init(const std::map<std::string, std::string>& nsInfo);
};
@@ -267,7 +272,7 @@ public:
void setNameSpaceInfo(const NameSpaceInfo& nsInfo) {
_nsInfo = nsInfo;
- _xpath.setNamespaceContext(*_nsInfo.nsContext);
+ _xpath.setNamespaceContext(*_nsInfo.getNSContext());
}
NameSpaceInfo getNameSpaceInfo() const {
return _nsInfo;
diff --git a/src/uscxml/interpreter/InterpreterDraft6.cpp b/src/uscxml/interpreter/InterpreterDraft6.cpp
index 721aea0..31c433c 100644
--- a/src/uscxml/interpreter/InterpreterDraft6.cpp
+++ b/src/uscxml/interpreter/InterpreterDraft6.cpp
@@ -69,6 +69,10 @@ void InterpreterDraft6::interpret() {
}
_running = true;
+#if VERBOSE
+ std::cout << "running " << this << std::endl;
+#endif
+
_binding = (HAS_ATTR(_scxml, "binding") && iequals(ATTR(_scxml, "binding"), "late") ? LATE : EARLY);
// @TODO: Reread http://www.w3.org/TR/scxml/#DataBinding
@@ -270,6 +274,11 @@ void InterpreterDraft6::mainEventLoop() {
_currEvent = _externalQueue.pop();
#if VERBOSE
std::cout << "Received externalEvent event " << _currEvent.name << std::endl;
+ if (_running && _currEvent.name == "unblock.and.die") {
+ std::cout << "Still running " << this << std::endl;
+ } else {
+ std::cout << "Aborting " << this << std::endl;
+ }
#endif
_currEvent.eventType = Event::EXTERNAL; // make sure it is set to external
if (!_running)
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDOM.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDOM.cpp
index 40bd464..402152d 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDOM.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDOM.cpp
@@ -29,10 +29,13 @@ JSCDOM::JSCDOM() {
}
JSCDOM::~JSCDOM() {
+ if (nsInfo)
+ delete(nsInfo);
if (xpath)
delete(xpath);
if (storage)
delete(storage);
+
}
}
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
index 2e8e6d2..3130d42 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
@@ -125,7 +125,7 @@ boost::shared_ptr<DataModelImpl> JSCDataModel::create(InterpreterImpl* interpret
dm->_dom = new JSCDOM();
dm->_dom->xpath = new XPath<std::string>();
- dm->_dom->xpath->setNamespaceContext(*interpreter->getNameSpaceInfo().nsContext);
+ dm->_dom->xpath->setNamespaceContext(*interpreter->getNameSpaceInfo().getNSContext());
dm->_dom->storage = new Storage(URL::getResourceDir() + PATH_SEPERATOR + interpreter->getName() + ".storage");
dm->_dom->nsInfo = new NameSpaceInfo(interpreter->getNameSpaceInfo());
diff --git a/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp
index c3e82df..bf32bf9 100644
--- a/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp
@@ -54,7 +54,7 @@ boost::shared_ptr<DataModelImpl> XPathDataModel::create(InterpreterImpl* interpr
// dm->_xpath->setNamespaceContext(interpreter->getNSContext());
dm->_funcResolver.setInterpreter(interpreter);
- dm->_xpath.setNamespaceContext(*interpreter->getNameSpaceInfo().nsContext);
+ dm->_xpath.setNamespaceContext(*interpreter->getNameSpaceInfo().getNSContext());
dm->_xpath.setFunctionResolver(dm->_funcResolver);
dm->_xpath.setVariableResolver(dm->_varResolver);
diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
index 37ec669..d89d8ac 100644
--- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
+++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
@@ -41,6 +41,9 @@ USCXMLInvoker::USCXMLInvoker() : _cancelled(false) {
USCXMLInvoker::~USCXMLInvoker() {
_cancelled = true;
+ Event event;
+ event.name = "unblock.and.die";
+ _invokedInterpreter.receive(event);
};
boost::shared_ptr<InvokerImpl> USCXMLInvoker::create(InterpreterImpl* interpreter) {