From 69247ac083836cfae493e0d220c5faf3818c0bf9 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Mon, 23 Jan 2017 17:58:06 +0100 Subject: Introduced InvokerCallbacks --- src/bindings/swig/csharp/uscxml.i | 1 + src/bindings/swig/java/uscxml.i | 1 + src/bindings/swig/lua/uscxml.i | 1 + src/bindings/swig/wrapped/WrappedInvoker.cpp | 4 +- src/bindings/swig/wrapped/WrappedInvoker.h | 8 ++-- src/uscxml/Interpreter.h | 2 +- src/uscxml/interpreter/InterpreterImpl.h | 6 ++- src/uscxml/messages/Data.h | 11 +++++- src/uscxml/plugins/Factory.cpp | 17 ++++++-- src/uscxml/plugins/Factory.h | 23 ++++++----- src/uscxml/plugins/InvokerImpl.h | 32 +++++++++++++-- .../plugins/invoker/dirmon/DirMonInvoker.cpp | 5 ++- src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h | 4 +- src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp | 46 +++++++++++----------- src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h | 2 +- 15 files changed, 108 insertions(+), 55 deletions(-) diff --git a/src/bindings/swig/csharp/uscxml.i b/src/bindings/swig/csharp/uscxml.i index e9f94f2..ac154c5 100644 --- a/src/bindings/swig/csharp/uscxml.i +++ b/src/bindings/swig/csharp/uscxml.i @@ -71,6 +71,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue; #include "../../../uscxml/plugins/Factory.h" #include "../../../uscxml/plugins/DataModelImpl.h" +#include "../../../uscxml/plugins/ExecutableContent.h" #include "../wrapped/WrappedInvoker.h" #include "../wrapped/WrappedDataModel.h" diff --git a/src/bindings/swig/java/uscxml.i b/src/bindings/swig/java/uscxml.i index db3b221..eb6da2b 100644 --- a/src/bindings/swig/java/uscxml.i +++ b/src/bindings/swig/java/uscxml.i @@ -65,6 +65,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue; #include "../../../uscxml/plugins/Factory.h" #include "../../../uscxml/plugins/DataModelImpl.h" +#include "../../../uscxml/plugins/ExecutableContent.h" #include "../wrapped/WrappedInvoker.h" #include "../wrapped/WrappedDataModel.h" diff --git a/src/bindings/swig/lua/uscxml.i b/src/bindings/swig/lua/uscxml.i index 9c2f115..0df7508 100644 --- a/src/bindings/swig/lua/uscxml.i +++ b/src/bindings/swig/lua/uscxml.i @@ -66,6 +66,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue; #include "../../../uscxml/plugins/Factory.h" #include "../../../uscxml/plugins/DataModelImpl.h" +#include "../../../uscxml/plugins/ExecutableContent.h" #include "../wrapped/WrappedInvoker.h" #include "../wrapped/WrappedDataModel.h" diff --git a/src/bindings/swig/wrapped/WrappedInvoker.cpp b/src/bindings/swig/wrapped/WrappedInvoker.cpp index 407323d..bdf9c76 100644 --- a/src/bindings/swig/wrapped/WrappedInvoker.cpp +++ b/src/bindings/swig/wrapped/WrappedInvoker.cpp @@ -21,8 +21,8 @@ namespace uscxml { -WrappedInvoker::WrappedInvoker(InterpreterImpl* interpreter) { - _interpreter = interpreter; +WrappedInvoker::WrappedInvoker(InvokerCallbacks* callbacks) { + _callbacks = callbacks; } WrappedInvoker::~WrappedInvoker() {} diff --git a/src/bindings/swig/wrapped/WrappedInvoker.h b/src/bindings/swig/wrapped/WrappedInvoker.h index bb5d1ba..dde8602 100644 --- a/src/bindings/swig/wrapped/WrappedInvoker.h +++ b/src/bindings/swig/wrapped/WrappedInvoker.h @@ -40,15 +40,15 @@ namespace uscxml { class WrappedInvoker : public InvokerImpl { public: - WrappedInvoker(InterpreterImpl* interpreter); + WrappedInvoker(InvokerCallbacks* callbacks); virtual ~WrappedInvoker(); virtual std::list getNames() { return std::list(); }; - virtual std::shared_ptr create(InterpreterImpl* interpreter) { - std::shared_ptr inv = std::shared_ptr(new WrappedInvoker(interpreter)); + virtual std::shared_ptr create(InvokerCallbacks* callbacks) { + std::shared_ptr inv = std::shared_ptr(new WrappedInvoker(callbacks)); return inv; } virtual void invoke(const std::string& source, const Event& invokeEvent) {} @@ -75,7 +75,7 @@ public: } private: - InterpreterImpl* _interpreter; + InvokerCallbacks* _callbacks; }; diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h index c74736e..806a0fc 100644 --- a/src/uscxml/Interpreter.h +++ b/src/uscxml/Interpreter.h @@ -58,7 +58,7 @@ public: ContentExecutor execContent; ///< To process executable content elements EventQueue internalQueue; ///< The queue where internal events will be enqueued EventQueue externalQueue; ///< The queue for external events - DelayedEventQueue delayedQueue; ///< The queue for delayed events + DelayedEventQueue delayQueue; ///< The queue for delayed events }; /** diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h index bd3898c..a4948b4 100644 --- a/src/uscxml/interpreter/InterpreterImpl.h +++ b/src/uscxml/interpreter/InterpreterImpl.h @@ -32,6 +32,7 @@ #include "uscxml/plugins/Factory.h" #include "uscxml/plugins/DataModelImpl.h" #include "uscxml/plugins/IOProcessorImpl.h" +#include "uscxml/plugins/InvokerImpl.h" #include "uscxml/interpreter/MicroStepImpl.h" #include "uscxml/interpreter/ContentExecutorImpl.h" #include "uscxml/interpreter/EventQueue.h" @@ -53,6 +54,7 @@ class USCXML_API InterpreterImpl : public IOProcessorCallbacks, public ContentExecutorCallbacks, public DelayedEventQueueCallbacks, + public InvokerCallbacks, public std::enable_shared_from_this { public: enum Binding { @@ -229,7 +231,7 @@ public: _dataModel = al.dataModel; _internalQueue = al.internalQueue; _externalQueue = al.externalQueue; - _delayQueue = al.delayedQueue; + _delayQueue = al.delayQueue; } ActionLanguage getActionLanguage() { @@ -240,7 +242,7 @@ public: al.dataModel = _dataModel; al.internalQueue = _internalQueue; al.externalQueue = _externalQueue; - al.delayedQueue = _delayQueue; + al.delayQueue = _delayQueue; return al; } diff --git a/src/uscxml/messages/Data.h b/src/uscxml/messages/Data.h index b279696..6d4af3e 100644 --- a/src/uscxml/messages/Data.h +++ b/src/uscxml/messages/Data.h @@ -65,10 +65,17 @@ public: explicit Data(const std::string& value) : node(NULL), atom(toStr(value)), type(VERBATIM) {} - template ::value, T>::type> + +#ifndef SWIGIMPORTED + // swig barfs on this one, have them explictly + template < + typename T, + typename = typename std::enable_if::value, T>::type + > explicit Data(T value) : node(NULL), atom(toStr(value)), type(INTERPRETED) {} - +#endif + template explicit Data(T value, Type type) : node(NULL), atom(toStr(value)), type(type) {} diff --git a/src/uscxml/plugins/Factory.cpp b/src/uscxml/plugins/Factory.cpp index 60e7a3e..b4120a1 100644 --- a/src/uscxml/plugins/Factory.cpp +++ b/src/uscxml/plugins/Factory.cpp @@ -24,6 +24,17 @@ #include "uscxml/Interpreter.h" #include "uscxml/interpreter/Logging.h" +#include "uscxml/plugins/ExecutableContent.h" +#include "uscxml/plugins/EventHandler.h" +#include "uscxml/plugins/IOProcessor.h" +#include "uscxml/plugins/IOProcessorImpl.h" +#include "uscxml/plugins/Invoker.h" +#include "uscxml/plugins/DataModelImpl.h" + +#include "uscxml/interpreter/ContentExecutorImpl.h" +#include "uscxml/interpreter/EventQueueImpl.h" +#include "uscxml/interpreter/MicrostepImpl.h" + #include "uscxml/plugins/ExecutableContentImpl.h" // see http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system @@ -289,20 +300,20 @@ bool Factory::hasInvoker(const std::string& type) { return false; } -std::shared_ptr Factory::createInvoker(const std::string& type, InterpreterImpl* interpreter) { +std::shared_ptr Factory::createInvoker(const std::string& type, InvokerCallbacks* callbacks) { // do we have this type ourself? if (_invokerAliases.find(type) != _invokerAliases.end()) { std::string canonicalName = _invokerAliases[type]; if (_invokers.find(canonicalName) != _invokers.end()) { - std::shared_ptr invoker = _invokers[canonicalName]->create(interpreter); + std::shared_ptr invoker = _invokers[canonicalName]->create(callbacks); return invoker; } } // lookup in parent factory if (_parentFactory) { - return _parentFactory->createInvoker(type, interpreter); + return _parentFactory->createInvoker(type, callbacks); } else { ERROR_EXECUTION_THROW("No Invoker named '" + type + "' known"); } diff --git a/src/uscxml/plugins/Factory.h b/src/uscxml/plugins/Factory.h index 9653107..50df6ed 100644 --- a/src/uscxml/plugins/Factory.h +++ b/src/uscxml/plugins/Factory.h @@ -22,13 +22,6 @@ #include "uscxml/Common.h" -#include "uscxml/plugins/ExecutableContent.h" -#include "uscxml/plugins/EventHandler.h" -#include "uscxml/plugins/IOProcessor.h" -#include "uscxml/plugins/IOProcessorImpl.h" -#include "uscxml/plugins/Invoker.h" -#include "uscxml/plugins/DataModelImpl.h" - #include #ifdef BUILD_AS_PLUGINS @@ -37,12 +30,21 @@ #include #include +#include +#include #include namespace uscxml { class InterpreterImpl; - +class IOProcessorImpl; +class IOProcessorCallbacks; +class DataModelImpl; +class DataModelCallbacks; +class InvokerImpl; +class InvokerCallbacks; +class ExecutableContentImpl; + class USCXML_API Factory { public: Factory(Factory* parentFactory); @@ -51,11 +53,11 @@ public: void registerIOProcessor(IOProcessorImpl* ioProcessor); void registerDataModel(DataModelImpl* dataModel); void registerInvoker(InvokerImpl* invoker); - void registerExecutableContent(ExecutableContentImpl* executableContent); + void registerExecutableContent(ExecutableContentImpl* executableContent); std::shared_ptr createDataModel(const std::string& type, DataModelCallbacks* callbacks); std::shared_ptr createIOProcessor(const std::string& type, IOProcessorCallbacks* callbacks); - std::shared_ptr createInvoker(const std::string& type, InterpreterImpl* interpreter); + std::shared_ptr createInvoker(const std::string& type, InvokerCallbacks* interpreter); std::shared_ptr createExecutableContent(const std::string& localName, const std::string& nameSpace, InterpreterImpl* interpreter); bool hasDataModel(const std::string& type); @@ -81,6 +83,7 @@ protected: std::map _invokerAliases; std::map, ExecutableContentImpl*> _executableContent; + #ifdef BUILD_AS_PLUGINS pluma::Pluma pluma; #endif diff --git a/src/uscxml/plugins/InvokerImpl.h b/src/uscxml/plugins/InvokerImpl.h index e5f7366..9d159a8 100644 --- a/src/uscxml/plugins/InvokerImpl.h +++ b/src/uscxml/plugins/InvokerImpl.h @@ -25,11 +25,37 @@ #include "uscxml/Common.h" #include "uscxml/plugins/EventHandler.h" #include "uscxml/messages/Event.h" -#include "uscxml/interpreter/InterpreterImpl.h" + +#include + +namespace XERCESC_NS { + class DOMElement; + class DOMDocument; + class DOMNode; +} namespace uscxml { class Interpreter; +class InterpreterMonitor; +class ActionLanguage; +class Logger; + +/** + * @ingroup invoker + * @ingroup callback + * Callbacks available for every invoker. + */ +class USCXML_API InvokerCallbacks { +public: + virtual ~InvokerCallbacks() {} ///< silence virtual destructor warning from swig + virtual void enqueueInternal(const Event& event) = 0; + virtual void enqueueExternal(const Event& event) = 0; + virtual ActionLanguage getActionLanguage() = 0; + virtual std::set getMonitors() = 0; + virtual std::string getBaseURL() = 0; + virtual Logger getLogger() = 0; +}; /** * @ingroup invoker @@ -48,7 +74,7 @@ public: * @param interpreter The imlementation of the associated Interpreter * @todo We will eventually introduce callbacks and prevent complete access to the interpreter. */ - virtual std::shared_ptr create(InterpreterImpl* interpreter) = 0; + virtual std::shared_ptr create(InvokerCallbacks* callbacks) = 0; /** * Invoker's parent state became active at the end of a macro-step. @@ -115,7 +141,7 @@ protected: XERCESC_NS::DOMElement* _finalize; std::string _invokeId; - InterpreterImpl* _callbacks; + InvokerCallbacks* _callbacks; }; } diff --git a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp index b5d7e8b..be13bf4 100644 --- a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp +++ b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp @@ -34,6 +34,7 @@ #include #include "uscxml/interpreter/Logging.h" +#include "uscxml/util/URL.h" namespace uscxml { @@ -63,9 +64,9 @@ DirMonInvoker::~DirMonInvoker() { delete(_watcher); }; -std::shared_ptr DirMonInvoker::create(InterpreterImpl* interpreter) { +std::shared_ptr DirMonInvoker::create(InvokerCallbacks* callbacks) { std::shared_ptr invoker(new DirMonInvoker()); - invoker->_callbacks = interpreter; + invoker->_callbacks = callbacks; return invoker; } diff --git a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h index e6bb9aa..31e535a 100644 --- a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h +++ b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h @@ -21,9 +21,11 @@ #define DIRMONINVOKER_H_W09J90F0 #include "uscxml/plugins/InvokerImpl.h" +#include "uscxml/interpreter/Logging.h" #include #include +#include #include #ifdef BUILD_AS_PLUGINS @@ -101,7 +103,7 @@ class DirMonInvoker : public InvokerImpl, public DirectoryWatchMonitor { public: DirMonInvoker(); virtual ~DirMonInvoker(); - virtual std::shared_ptr create(InterpreterImpl* interpreter); + virtual std::shared_ptr create(InvokerCallbacks* callbacks); virtual std::list getNames() { std::list names; diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp index 9ac8621..e776022 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp @@ -140,9 +140,9 @@ void USCXMLInvoker::run(void* instance) { INSTANCE->_isActive = false; } -std::shared_ptr USCXMLInvoker::create(InterpreterImpl* interpreter) { +std::shared_ptr USCXMLInvoker::create(InvokerCallbacks* callbacks) { std::shared_ptr invoker(new USCXMLInvoker()); - invoker->_callbacks = interpreter; + invoker->_callbacks = callbacks; return invoker; } @@ -176,33 +176,31 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent) if (_invokedInterpreter) { _invokedInterpreter.getImpl()->_parentQueue = _parentQueue; _invokedInterpreter.getImpl()->_invokeId = invokeEvent.invokeid; + + // test240 assumes that invoke request params will carry over to the datamodel _invokedInterpreter.getImpl()->_invokeReq = invokeEvent; // create new instances from the parent's ActionLanguage -#if 1 InterpreterImpl* invoked = _invokedInterpreter.getImpl().get(); - invoked->_execContent = _callbacks->_execContent.getImpl()->create(invoked); - invoked->_delayQueue = _callbacks->_delayQueue.getImplDelayed()->create(invoked); - invoked->_internalQueue = _callbacks->_internalQueue.getImplBase()->create(); - invoked->_externalQueue = _callbacks->_externalQueue.getImplBase()->create(); - invoked->_microStepper = _callbacks->_microStepper.getImpl()->create(invoked); + ActionLanguage al = _callbacks->getActionLanguage(); + + al.execContent = al.execContent.getImpl()->create(invoked); + al.delayQueue = al.delayQueue.getImplDelayed()->create(invoked); + al.internalQueue = al.internalQueue.getImplBase()->create(); + al.externalQueue = al.externalQueue.getImplBase()->create(); + al.microStepper = al.microStepper.getImpl()->create(invoked); + + _invokedInterpreter.setActionLanguage(al); + // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching? + + // copy monitors + std::set monitors = _callbacks->getMonitors(); + for (auto monitor : monitors) { + if (monitor->copyToInvokers()) { + _invokedInterpreter.getImpl()->_monitors.insert(monitor); + } + } - // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching? -#endif - // copy monitors - std::set::const_iterator monIter = _callbacks->_monitors.begin(); - while(monIter != _callbacks->_monitors.end()) { - if ((*monIter)->copyToInvokers()) { - _invokedInterpreter.getImpl()->_monitors.insert(*monIter); - } - monIter++; - } - - /** - * test240 assumes that invoke request params will carry over to the datamodel - * This is solved by passing the invoke request above - */ -// _invokedInterpreter.getImpl()->setInvokeRequest(req); _isActive = true; // we need to make sure it is at least setup to receive data! diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h index 78e7057..d37d2af 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h @@ -50,7 +50,7 @@ public: USCXMLInvoker(); virtual ~USCXMLInvoker(); - virtual std::shared_ptr create(InterpreterImpl* interpreter); + virtual std::shared_ptr create(InvokerCallbacks* callbacks); virtual std::list getNames() { std::list names; -- cgit v0.12