InterpreterImpl.h
Go to the documentation of this file.
1 
20 #ifndef INTERPRETERIMPL_H_2A79C83D
21 #define INTERPRETERIMPL_H_2A79C83D
22 
23 #include <memory>
24 #include <mutex>
25 #include <list>
26 #include <map>
27 #include <string>
28 
29 #include "uscxml/Common.h"
30 #include "uscxml/util/URL.h"
31 #include "uscxml/plugins/Factory.h"
37 #include "uscxml/util/DOM.h"
38 #include <xercesc/dom/DOM.hpp>
39 
40 namespace uscxml {
41 
42 class InterpreterMonitor;
43 class InterpreterIssue;
44 
49 class USCXML_API InterpreterImpl :
50  public MicroStepCallbacks,
51  public DataModelCallbacks,
54 // public std::enable_shared_from_this<InterpreterImpl>
55 {
56 public:
57  enum Binding {
58  EARLY = 0,
59  LATE = 1
60  };
61 
63  virtual ~InterpreterImpl();
64 
65  void cloneFrom(InterpreterImpl* other);
66  void cloneFrom(std::shared_ptr<InterpreterImpl> other);
67 
68  virtual InterpreterState step(bool blocking) {
69  if (!_isInitialized) {
70  init();
71  _state = USCXML_INITIALIZED;
72  } else {
73  _state = _microStepper.step(blocking);
74  }
75  return _state;
76  }
77 
78  virtual void reset() {
79  _microStepper.reset();
80  _isInitialized = false;
81  _state = USCXML_INSTANTIATED;
82 // _dataModel.reset();
83 // _eventQueue.reset();
84 // _contentExecutor.reset();
85  }
86 
87  virtual void cancel();
88 
89  InterpreterState getState() {
90  return _state;
91  }
92 
93  std::list<XERCESC_NS::DOMElement*> getConfiguration() {
94  return _microStepper.getConfiguration();
95  }
96 
97  void setMonitor(InterpreterMonitor* monitor) {
98  _monitor = monitor;
99  }
100 
104  virtual Event dequeueInternal() {
105  _currEvent = _internalQueue.dequeue(false);
106  if (_currEvent)
107  _dataModel.setEvent(_currEvent);
108  return _currEvent;
109  }
110  virtual Event dequeueExternal(bool blocking);
111  virtual bool isTrue(const std::string& expr);
112 
113  virtual void raiseDoneEvent(XERCESC_NS::DOMElement* state, XERCESC_NS::DOMElement* doneData) {
114  _execContent.raiseDoneEvent(state, doneData);
115  }
116 
117  virtual void process(XERCESC_NS::DOMElement* block) {
118  _execContent.process(block, _xmlPrefix);
119  }
120 
121  virtual bool isMatched(const Event& event, const std::string& eventDesc);
122  virtual void initData(XERCESC_NS::DOMElement* element);
123 
124  virtual void invoke(XERCESC_NS::DOMElement* invoke) {
125  _execContent.invoke(invoke);
126  }
127 
128  virtual void uninvoke(XERCESC_NS::DOMElement* invoke) {
129  _execContent.uninvoke(invoke);
130  }
131 
133  return _monitor;
134  }
135 
139  virtual const std::string& getName() {
140  return _name;
141  }
142  virtual const std::string& getSessionId() {
143  return _sessionId;
144  }
145  virtual const std::map<std::string, IOProcessor>& getIOProcessors() {
146  return _ioProcs;
147  }
148  virtual const std::map<std::string, Invoker>& getInvokers() {
149  return _invokers;
150  }
151 
152  virtual bool isInState(const std::string& stateId) {
153  return _microStepper.isInState(stateId);
154  }
155  virtual XERCESC_NS::DOMDocument* getDocument() const {
156  return _document;
157  }
158 
163  virtual void enqueueInternal(const Event& event) {
164  return _internalQueue.enqueue(event);
165  }
166  virtual void enqueueExternal(const Event& event) {
167  return _externalQueue.enqueue(event);
168  }
169  virtual void enqueueExternalDelayed(const Event& event, size_t delayMs, const std::string& eventUUID) {
170  return _delayQueue.enqueueDelayed(event, delayMs, eventUUID);
171  }
172  virtual void cancelDelayed(const std::string& eventId);
173 
174  virtual size_t getLength(const std::string& expr) {
175  return _dataModel.getLength(expr);
176  }
177 
178  virtual void setForeach(const std::string& item,
179  const std::string& array,
180  const std::string& index,
181  uint32_t iteration) {
182  return _dataModel.setForeach(item, array, index, iteration);
183  }
184  virtual Data evalAsData(const std::string& expr) {
185  return _dataModel.evalAsData(expr);
186  }
187 
188  virtual Data getAsData(const std::string& expr) {
189  return _dataModel.getAsData(expr);
190  }
191 
192  virtual void assign(const std::string& location, const Data& data);
193 
194  virtual std::string getInvokeId() {
195  return _invokeId;
196  }
197  virtual std::string getBaseURL() {
198  return _baseURL;
199  }
200 
201  virtual bool checkValidSendType(const std::string& type, const std::string& target);
202  virtual void invoke(const std::string& type, const std::string& src, bool autoForward, XERCESC_NS::DOMElement* finalize, const Event& invokeEvent);
203  virtual void uninvoke(const std::string& invokeId);
204  virtual void enqueue(const std::string& type, const std::string& target, size_t delayMs, const Event& sendEvent);
205 
206  virtual const Event& getCurrentEvent() {
207  return _currEvent;
208  }
209 
214  virtual void eventReady(Event& event, const std::string& eventUUID);
215 
219  _execContent = al.execContent;
220  _microStepper = al.microStepper;
221  _dataModel = al.dataModel;
222  }
223 
224  static std::map<std::string, std::weak_ptr<InterpreterImpl> > getInstances();
225 
226  virtual XERCESC_NS::DOMDocument* getDocument() {
227  return _document;
228  }
229 
230 protected:
231  static void addInstance(std::shared_ptr<InterpreterImpl> instance);
232 
233  Binding _binding;
234 
235  std::string _sessionId;
236  std::string _name;
237  std::string _invokeId; // TODO: Never set!
238 
239  bool _isInitialized;
240  XERCESC_NS::DOMDocument* _document;
241  XERCESC_NS::DOMElement* _scxml;
242 
243  std::map<std::string, std::tuple<std::string, std::string, std::string> > _delayedEventTargets;
244 
245  virtual void init();
246 
247  static std::map<std::string, std::weak_ptr<InterpreterImpl> > _instances;
248  static std::recursive_mutex _instanceMutex;
249  std::recursive_mutex _delayMutex;
250 
251  friend class Interpreter;
252  friend class InterpreterIssue;
253  friend class TransformerImpl;
254  friend class USCXMLInvoker;
255  friend class SCXMLIOProcessor;
256 
257  X _xmlPrefix;
258  X _xmlNS;
259  Factory* _factory;
260 
261  URL _baseURL;
262 
263  MicroStep _microStepper;
264  DataModel _dataModel;
265  ContentExecutor _execContent;
266 
267  InterpreterState _state;
268 
269  EventQueue _internalQueue;
270  EventQueue _externalQueue;
271  EventQueue _parentQueue;
272  DelayedEventQueue _delayQueue;
273 
274  Event _currEvent;
275  Event _invokeReq;
276 
277  std::map<std::string, IOProcessor> _ioProcs;
278  std::map<std::string, Invoker> _invokers;
279  std::set<std::string> _autoForwarders;
280  InterpreterMonitor* _monitor;
281 
282 private:
283  void setupDOM();
284 };
285 
286 }
287 
288 #endif /* end of include guard: INTERPRETERIMPL_H_2A79C83D */
Definition: InterpreterIssue.cpp:33
Definition: InterpreterMonitor.h:46
virtual Event dequeueInternal()
MicrostepCallbacks.
Definition: InterpreterImpl.h:104
Definition: MicroStepImpl.h:40
void setActionLanguage(const ActionLanguage &al)
Definition: InterpreterImpl.h:218
virtual void process(XERCESC_NS::DOMElement *block)
Executable Content.
Definition: InterpreterImpl.h:117
virtual void reset()
Definition: InterpreterImpl.h:78
Definition: EventQueueImpl.h:51
MicroStep microStepper
The microstepper instance to use.
Definition: Interpreter.h:92
virtual const std::string & getName()
DataModelCallbacks.
Definition: InterpreterImpl.h:139
Collection of instances for interpreter that constitute its action language.
Definition: Interpreter.h:90
DataModel dataModel
The datamodel to uses.
Definition: Interpreter.h:93
Definition: InterpreterImpl.h:49
virtual void enqueueInternal(const Event &event)
ContentExecutorCallbacks.
Definition: InterpreterImpl.h:163
ContentExecutor execContent
To process executable content elements.
Definition: Interpreter.h:94
Definition: Event.h:84
Callbacks available for every data-model.
Definition: DataModelImpl.h:44
Definition: ContentExecutorImpl.h:38
virtual InterpreterMonitor * getMonitor()
Monitoring.
Definition: InterpreterImpl.h:132
virtual void invoke(XERCESC_NS::DOMElement *invoke)
Invocations.
Definition: InterpreterImpl.h:124