summaryrefslogtreecommitdiffstats
path: root/src/uscxml/Interpreter.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-07-03 11:31:35 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-07-03 11:31:35 (GMT)
commit67f8e8b4106eb20ce0bc01fd840b0d8e4319cb36 (patch)
tree42ba94ef35bf70d74ebb8dcc03e01752874a6540 /src/uscxml/Interpreter.cpp
parentb542369263782dc8b85893e218119ed070efa7b3 (diff)
downloaduscxml-67f8e8b4106eb20ce0bc01fd840b0d8e4319cb36.zip
uscxml-67f8e8b4106eb20ce0bc01fd840b0d8e4319cb36.tar.gz
uscxml-67f8e8b4106eb20ce0bc01fd840b0d8e4319cb36.tar.bz2
Introduced isLocation for datamodels to check for valid namelist entries
Diffstat (limited to 'src/uscxml/Interpreter.cpp')
-rw-r--r--src/uscxml/Interpreter.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp
index 5b0db2d..7ae34f2 100644
--- a/src/uscxml/Interpreter.cpp
+++ b/src/uscxml/Interpreter.cpp
@@ -585,8 +585,8 @@ void InterpreterImpl::run(void* instance) {
}
} catch (Event e) {
LOG(ERROR) << e;
- } catch(boost::bad_lexical_cast e) {
- LOG(ERROR) << "InterpreterImpl::run catched exception: " << e.what();
+ } catch(std::exception e) {
+ LOG(ERROR) << "InterpreterImpl::run catched an exception: " << e.what() << std::endl << "Unclean shutdown";
} catch (...) {
LOG(ERROR) << "InterpreterImpl::run catched unknown exception";
}
@@ -1164,9 +1164,10 @@ void InterpreterImpl::send(const Arabica::DOM::Node<std::string>& element) {
if (HAS_ATTR(element, "namelist")) {
std::list<std::string> names = tokenizeIdRefs(ATTR(element, "namelist"));
for (std::list<std::string>::const_iterator nameIter = names.begin(); nameIter != names.end(); nameIter++) {
- if (!_dataModel.isDeclared(*nameIter)) {
- LOG(ERROR) << "Error in send element " << DOMUtils::xPathForNode(element) << " namelist:" << std::endl << "'" << *nameIter << "' is not declared" << std::endl;
+ if (!_dataModel.isLocation(*nameIter)) {
+ LOG(ERROR) << "Error in send element " << DOMUtils::xPathForNode(element) << " namelist:" << std::endl << "'" << *nameIter << "' is not a location expression" << std::endl;
ERROR_EXECUTION2(err, "Location expression '" + *nameIter + "' in namelist is invalid", element);
+ receiveInternal(err);
return;
}
Data namelistValue = _dataModel.getStringAsData(*nameIter);
@@ -1200,6 +1201,7 @@ void InterpreterImpl::send(const Arabica::DOM::Node<std::string>& element) {
} catch (Event e) {
e.name = "error.execution";
receiveInternal(e);
+ return;
}
// set as content if it's only an atom
if (sendReq.data.atom.length() > 0) {
@@ -1311,7 +1313,15 @@ void InterpreterImpl::invoke(const Arabica::DOM::Node<std::string>& element) {
if (HAS_ATTR(element, "namelist")) {
std::list<std::string> names = tokenizeIdRefs(ATTR(element, "namelist"));
for (std::list<std::string>::const_iterator nameIter = names.begin(); nameIter != names.end(); nameIter++) {
- invokeReq.namelist[*nameIter] = _dataModel.evalAsString(*nameIter);
+ if (!_dataModel.isLocation(*nameIter)) {
+ LOG(ERROR) << "Error in send element " << DOMUtils::xPathForNode(element) << " namelist:" << std::endl << "'" << *nameIter << "' is not a location expression" << std::endl;
+ ERROR_EXECUTION2(err, "Location expression '" + *nameIter + "' in namelist is invalid", element);
+ receiveInternal(err);
+ return;
+ }
+ Data namelistValue = _dataModel.getStringAsData(*nameIter);
+ invokeReq.namelist[*nameIter] = namelistValue;
+ invokeReq.data.compound[*nameIter] = namelistValue;
}
}