summaryrefslogtreecommitdiffstats
path: root/src/uscxml
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-07-23 09:25:44 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-07-23 09:25:44 (GMT)
commiteb99c62e3d00f4ea5271f6dfc6401e3fcd5a5b90 (patch)
treec57585368b5855b7f71c5383d045d428a249ef8b /src/uscxml
parent122285d16fd8ac9855c92519d48919bea36791b4 (diff)
downloaduscxml-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.cpp13
-rw-r--r--src/uscxml/interpreter/InterpreterDraft6.cpp70
-rw-r--r--src/uscxml/plugins/datamodel/xpath/XPathDataModel.cpp4
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;