diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2013-07-23 09:25:44 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2013-07-23 09:25:44 (GMT) |
commit | eb99c62e3d00f4ea5271f6dfc6401e3fcd5a5b90 (patch) | |
tree | c57585368b5855b7f71c5383d045d428a249ef8b /src/uscxml | |
parent | 122285d16fd8ac9855c92519d48919bea36791b4 (diff) | |
download | uscxml-eb99c62e3d00f4ea5271f6dfc6401e3fcd5a5b90.zip uscxml-eb99c62e3d00f4ea5271f6dfc6401e3fcd5a5b90.tar.gz uscxml-eb99c62e3d00f4ea5271f6dfc6401e3fcd5a5b90.tar.bz2 |
Fixed setting intial config
Diffstat (limited to 'src/uscxml')
-rw-r--r-- | src/uscxml/Interpreter.cpp | 13 | ||||
-rw-r--r-- | src/uscxml/interpreter/InterpreterDraft6.cpp | 70 | ||||
-rw-r--r-- | src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp | 4 |
3 files changed, 57 insertions, 30 deletions
diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp index 8c1b4a6..f36e6b2 100644 --- a/src/uscxml/Interpreter.cpp +++ b/src/uscxml/Interpreter.cpp @@ -382,12 +382,12 @@ void InterpreterImpl::normalize(Arabica::DOM::Element<std::string>& scxml) { } void InterpreterImpl::receiveInternal(const Event& event) { - std::cout << _name << " receiveInternal: " << event.name << std::endl; + //std::cout << _name << " receiveInternal: " << event.name << std::endl; _internalQueue.push_back(event); } void InterpreterImpl::receive(const Event& event, bool toFront) { - std::cout << _name << " receive: " << event.name << std::endl; + //std::cout << _name << " receive: " << event.name << std::endl; if (toFront) { _externalQueue.push_front(event); } else { @@ -478,7 +478,7 @@ void InterpreterImpl::processDOMorText(const Arabica::DOM::Node<std::string>& no if (parser.parse(inputSource) && parser.getDocument()) { dom = parser.getDocument(); - std::cout << dom; + //std::cout << dom; Node<std::string> content = dom.getDocumentElement(); assert(content.getNodeType() == Node_base::ELEMENT_NODE); Node<std::string> container = dom.createElement("container"); @@ -1704,7 +1704,7 @@ void InterpreterImpl::setCmdLineOptions(int argc, char** argv) { */ bool InterpreterImpl::hasLegalConfiguration() { -#if 0 +#if VERBOSE std::cout << "Checking whether {"; std::string seperator; for (int i = 0; i < _configuration.size(); i++) { @@ -1757,8 +1757,10 @@ bool InterpreterImpl::hasLegalConfiguration() { for (int i = 0; i < _configuration.size(); i++) { if (!isAtomic(_configuration[i]) && !isParallel(_configuration[i])) { bool foundChildState = false; + //std::cout << _configuration[i] << std::endl; NodeSet<std::string> childs = getChildStates(_configuration[i]); for (int j = 0; j < childs.size(); j++) { + //std::cout << childs[j] << std::endl; if (isMember(childs[j], _configuration)) { if (foundChildState) return false; @@ -1775,8 +1777,9 @@ bool InterpreterImpl::hasLegalConfiguration() { if (isParallel(_configuration[i])) { NodeSet<std::string> childs = getChildStates(_configuration[i]); for (int j = 0; j < childs.size(); j++) { - if (!isMember(childs[j], _configuration) && !isHistory(childs[j])) + if (!isMember(childs[j], _configuration) && !isHistory(childs[j])) { return false; + } } } } diff --git a/src/uscxml/interpreter/InterpreterDraft6.cpp b/src/uscxml/interpreter/InterpreterDraft6.cpp index 915eba5..abea1ae 100644 --- a/src/uscxml/interpreter/InterpreterDraft6.cpp +++ b/src/uscxml/interpreter/InterpreterDraft6.cpp @@ -78,33 +78,48 @@ void InterpreterDraft6::interpret() { NodeSet<std::string> initialTransitions; - if (_userDefinedStartConfiguration.size() == 0) { + if (_userDefinedStartConfiguration.size() > 0) { + // we emulate entering a given configuration by creating a pseudo deep history + Element<std::string> initHistory = _document.createElementNS(_nsURL, "history"); + initHistory.setAttribute("id", getUUID()); + initHistory.setAttribute("type", "deep"); + _scxml.insertBefore(initHistory, _scxml.getFirstChild()); + + std::string histId = ATTR(initHistory, "id"); + NodeSet<std::string> histStates; + for (int i = 0; i < _userDefinedStartConfiguration.size(); i++) { + histStates.push_back(getState(_userDefinedStartConfiguration[i])); + } + _historyValue[histId] = histStates; + + Element<std::string> initialElem = _document.createElementNS(_nsURL, "initial"); + initialElem.setAttribute("generated", "true"); + Element<std::string> transitionElem = _document.createElementNS(_nsURL, "transition"); + transitionElem.setAttribute("target", histId); + initialElem.appendChild(transitionElem); + _scxml.appendChild(initialElem); + initialTransitions.push_back(transitionElem); + + } else { // try to get initial transition form initial element initialTransitions = _xpath.evaluate("/" + _xpathPrefix + "initial/" + _xpathPrefix + "transition", _scxml).asNodeSet(); - } - - if (initialTransitions.size() == 0) { - Arabica::XPath::NodeSet<std::string> initialStates; - if (_userDefinedStartConfiguration.size() > 0) { - // otherwise use user supplied config - initialStates = getStates(_userDefinedStartConfiguration); - } else { - // or fetch per draft + if (initialTransitions.size() == 0) { + Arabica::XPath::NodeSet<std::string> initialStates; + // fetch per draft initialStates = getInitialStates(); - } - - assert(initialStates.size() > 0); - for (int i = 0; i < initialStates.size(); i++) { - Element<std::string> initialElem = _document.createElementNS(_nsURL, "initial"); - initialElem.setAttribute("generated", "true"); - Element<std::string> transitionElem = _document.createElementNS(_nsURL, "transition"); - transitionElem.setAttribute("target", ATTR(initialStates[i], "id")); - initialElem.appendChild(transitionElem); - _scxml.appendChild(initialElem); - initialTransitions.push_back(transitionElem); + assert(initialStates.size() > 0); + for (int i = 0; i < initialStates.size(); i++) { + Element<std::string> initialElem = _document.createElementNS(_nsURL, "initial"); + initialElem.setAttribute("generated", "true"); + Element<std::string> transitionElem = _document.createElementNS(_nsURL, "transition"); + transitionElem.setAttribute("target", ATTR(initialStates[i], "id")); + initialElem.appendChild(transitionElem); + _scxml.appendChild(initialElem); + initialTransitions.push_back(transitionElem); + } } } - + assert(initialTransitions.size() > 0); enterStates(initialTransitions); // _mutex.unlock(); @@ -228,12 +243,13 @@ void InterpreterDraft6::mainEventLoop() { if (_dataModel && boost::iequals(_currEvent.name, "cancel.invoke." + _sessionId)) break; - if (_dataModel) + if (_dataModel) { try { _dataModel.setEvent(_currEvent); } catch (Event e) { LOG(ERROR) << "Syntax error while setting external event:" << std::endl << e << std::endl; } + } for (unsigned int i = 0; i < _configuration.size(); i++) { NodeSet<std::string> invokes = filterChildElements(_xmlNSPrefix + "invoke", _configuration[i]); for (unsigned int j = 0; j < invokes.size(); j++) { @@ -824,6 +840,14 @@ void InterpreterDraft6::enterStates(const Arabica::XPath::NodeSet<std::string>& } statesToEnter.to_document_order(); +#if VERBOSE + std::cout << "States to enter: "; + for (int i = 0; i < statesToEnter.size(); i++) { + std::cout << ATTR(statesToEnter[i], "id") << ", "; + } + std::cout << std::endl; +#endif + monIter = _monitors.begin(); while(monIter != _monitors.end()) { try { diff --git a/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp index 6b2f039..1de9c1b 100644 --- a/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp +++ b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp @@ -725,7 +725,7 @@ NodeSetVariableResolver::resolveVariable(const std::string& namepaceUri, if(n == _variables.end()) { throw Event("error.execution"); } -#if 1 +#if VERBOSE std::cout << std::endl << "Getting " << name << ":" << std::endl; for (int i = 0; i < n->second.size(); i++) { std::cout << n->second[i].getNodeType() << " | " << n->second[i] << std::endl; @@ -736,7 +736,7 @@ NodeSetVariableResolver::resolveVariable(const std::string& namepaceUri, } void NodeSetVariableResolver::setVariable(const std::string& name, const NodeSet<std::string>& value) { -#if 1 +#if VERBOSE std::cout << std::endl << "Setting " << name << ":" << std::endl; for (int i = 0; i < value.size(); i++) { std::cout << value[i].getNodeType() << " | " << value[i] << std::endl; |