summaryrefslogtreecommitdiffstats
path: root/src/uscxml/Interpreter.h
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-03-28 23:28:46 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-03-28 23:28:46 (GMT)
commit2317f2bf8beb03c60463a9482dbef23540f5c1e0 (patch)
tree9983553e5289cf622e782d0132bb1810276364d2 /src/uscxml/Interpreter.h
parent7279ab2caf72b68126bf0c1d7e62c7d89024f9a0 (diff)
downloaduscxml-2317f2bf8beb03c60463a9482dbef23540f5c1e0.zip
uscxml-2317f2bf8beb03c60463a9482dbef23540f5c1e0.tar.gz
uscxml-2317f2bf8beb03c60463a9482dbef23540f5c1e0.tar.bz2
Refactoring and W3C tests
- Moved core of interpreter to support various versions - Added experimental setConfiguration() - There can be more than one initial state
Diffstat (limited to 'src/uscxml/Interpreter.h')
-rw-r--r--src/uscxml/Interpreter.h83
1 files changed, 28 insertions, 55 deletions
diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h
index 5d29eb6..353233d 100644
--- a/src/uscxml/Interpreter.h
+++ b/src/uscxml/Interpreter.h
@@ -26,8 +26,6 @@
#include "uscxml/server/InterpreterServlet.h"
-#define ORIG_ENTERSTATES
-
namespace uscxml {
class HTTPServletInvoker;
@@ -71,7 +69,16 @@ public:
std::string unit;
};
-class Interpreter : protected Arabica::SAX2DOM::Parser<std::string> {
+class SCXMLParser : public Arabica::SAX2DOM::Parser<std::string> {
+public:
+ SCXMLParser(Interpreter* interpreter);
+ void startPrefixMapping(const std::string& /* prefix */, const std::string& /* uri */);
+
+ Arabica::SAX::CatchErrorHandler<std::string> _errorHandler;
+ Interpreter* _interpreter;
+};
+
+class Interpreter {
public:
enum Binding {
EARLY = 0,
@@ -91,8 +98,6 @@ public:
static Interpreter* fromURI(const std::string& uri);
static Interpreter* fromInputSource(Arabica::SAX::InputSource<std::string>& source);
- virtual void startPrefixMapping(const std::string& /* prefix */, const std::string& /* uri */);
-
void start();
static void run(void*);
void join() {
@@ -102,7 +107,7 @@ public:
return _running || !_done;
}
- void interpret();
+ virtual void interpret() = 0;
void addMonitor(InterpreterMonitor* monitor) {
_monitors.insert(monitor);
@@ -168,7 +173,13 @@ public:
Arabica::XPath::NodeSet<std::string> getConfiguration() {
return _configuration;
}
+ void setConfiguration(const std::vector<std::string>& states) {
+ _userDefinedStartConfiguration = states;
+ }
+
Arabica::DOM::Node<std::string> getState(const std::string& stateId);
+ Arabica::XPath::NodeSet<std::string> getStates(const std::vector<std::string>& stateIds);
+
Arabica::DOM::Document<std::string>& getDocument() {
return _document;
}
@@ -203,13 +214,18 @@ public:
static bool isCompound(const Arabica::DOM::Node<std::string>& state);
static bool isDescendant(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2);
+ static std::vector<std::string> tokenizeIdRefs(const std::string& idRefs);
+
bool isInitial(const Arabica::DOM::Node<std::string>& state);
- Arabica::DOM::Node<std::string> getInitialState(Arabica::DOM::Node<std::string> state = Arabica::DOM::Node<std::string>());
+ Arabica::XPath::NodeSet<std::string> getInitialStates(Arabica::DOM::Node<std::string> state = Arabica::DOM::Node<std::string>());
static Arabica::XPath::NodeSet<std::string> getChildStates(const Arabica::DOM::Node<std::string>& state);
Arabica::XPath::NodeSet<std::string> getTargetStates(const Arabica::DOM::Node<std::string>& transition);
+ Arabica::DOM::Node<std::string> getSourceState(const Arabica::DOM::Node<std::string>& transition);
static Arabica::XPath::NodeSet<std::string> filterChildElements(const std::string& tagname, const Arabica::DOM::Node<std::string>& node);
static Arabica::XPath::NodeSet<std::string> filterChildElements(const std::string& tagName, const Arabica::XPath::NodeSet<std::string>& nodeSet);
+ Arabica::DOM::Node<std::string> findLCCA(const Arabica::XPath::NodeSet<std::string>& states);
+ Arabica::XPath::NodeSet<std::string> getProperAncestors(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2);
static const std::string getUUID();
protected:
@@ -219,8 +235,6 @@ protected:
void normalize(const Arabica::DOM::Document<std::string>& node);
void setupIOProcessors();
- void mainEventLoop();
-
bool _stable;
tthread::thread* _thread;
tthread::mutex _mutex;
@@ -241,7 +255,8 @@ protected:
Binding _binding;
Arabica::XPath::NodeSet<std::string> _configuration;
Arabica::XPath::NodeSet<std::string> _statesToInvoke;
-
+ std::vector<std::string> _userDefinedStartConfiguration;
+
DataModel _dataModel;
std::map<std::string, Arabica::XPath::NodeSet<std::string> > _historyValue;
@@ -251,52 +266,14 @@ protected:
DelayedEventQueue* _sendQueue;
Event _currEvent;
-
InterpreterServlet* _httpServlet;
-
std::set<InterpreterMonitor*> _monitors;
static URL toBaseURI(const URL& url);
- void microstep(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
- void executeTransitionContent(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
void executeContent(const Arabica::DOM::Node<std::string>& content);
void executeContent(const Arabica::DOM::NodeList<std::string>& content);
void executeContent(const Arabica::XPath::NodeSet<std::string>& content);
- void initializeData(const Arabica::DOM::Node<std::string>& data);
- void exitInterpreter();
-
-#ifdef ORIG_ENTERSTATES
- void enterStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
- void addStatesToEnter(const Arabica::DOM::Node<std::string>& state,
- Arabica::XPath::NodeSet<std::string>& statesToEnter,
- Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry);
-#endif
-
-#ifdef ENTERSTATES_02_2013
- void enterStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
- void computeEntrySet(const Arabica::XPath::NodeSet<std::string>& transitions,
- Arabica::XPath::NodeSet<std::string>& statesToEnter,
- Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry);
- void addDescendentStatesToEnter(const Arabica::DOM::Node<std::string>& state,
- Arabica::XPath::NodeSet<std::string>& statesToEnter,
- Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry);
- void addAncestorStatesToEnter(const Arabica::DOM::Node<std::string>& state,
- const Arabica::DOM::Node<std::string>& ancestor,
- Arabica::XPath::NodeSet<std::string>& statesToEnter,
- Arabica::XPath::NodeSet<std::string>& statesForDefaultEntry);
- Arabica::DOM::Node<std::string> getTransitionDomain(const Arabica::DOM::Node<std::string>& transition);
-
-#endif
-
- void exitStates(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
-
- Arabica::XPath::NodeSet<std::string> selectEventlessTransitions();
- Arabica::XPath::NodeSet<std::string> selectTransitions(const std::string& event);
- Arabica::DOM::Node<std::string> getSourceState(const Arabica::DOM::Node<std::string>& transition);
- Arabica::DOM::Node<std::string> findLCCA(const Arabica::XPath::NodeSet<std::string>& states);
- Arabica::XPath::NodeSet<std::string> getProperAncestors(const Arabica::DOM::Node<std::string>& s1, const Arabica::DOM::Node<std::string>& s2);
-
void send(const Arabica::DOM::Node<std::string>& element);
void invoke(const Arabica::DOM::Node<std::string>& element);
@@ -306,16 +283,11 @@ protected:
static void delayedSend(void* userdata, std::string eventName);
static bool nameMatch(const std::string& transitionEvent, const std::string& event);
- Arabica::XPath::NodeSet<std::string> filterPreempted(const Arabica::XPath::NodeSet<std::string>& enabledTransitions);
- bool isPreemptingTransition(const Arabica::DOM::Node<std::string>& t1, const Arabica::DOM::Node<std::string>& t2);
bool isWithinSameChild(const Arabica::DOM::Node<std::string>& transition);
bool hasConditionMatch(const Arabica::DOM::Node<std::string>& conditional);
bool isInFinalState(const Arabica::DOM::Node<std::string>& state);
bool parentIsScxmlState(Arabica::DOM::Node<std::string> state);
-// Arabica::DOM::Node<std::string> getTransitionSubgraph(const Arabica::DOM::Node<std::string>& transition);
-
- static std::vector<std::string> tokenizeIdRefs(const std::string& idRefs);
static boost::uuids::random_generator uuidGen;
@@ -327,7 +299,6 @@ protected:
Data _cmdLineOptions;
IOProcessor getIOProcessor(const std::string& type);
-// IOProcessor* getIOProcessorForId(const std::string& sendId);
std::map<std::string, IOProcessor> _ioProcessors;
std::map<std::string, std::pair<Interpreter*, SendRequest> > _sendIds;
@@ -335,9 +306,11 @@ protected:
std::map<std::string, Invoker> _autoForwardees;
std::map<Arabica::DOM::Node<std::string>, ExecutableContent> _executableContent;
- /// We need to remember to adapt them when the DOM is operated upon
+ /// TODO: We need to remember to adapt them when the DOM is operated upon
std::map<std::string, Arabica::DOM::Node<std::string> > _cachedStates;
std::map<std::string, URL> _cachedURLs;
+
+ friend class SCXMLParser;
};
}