summaryrefslogtreecommitdiffstats
path: root/src/uscxml/Interpreter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/Interpreter.cpp')
-rw-r--r--src/uscxml/Interpreter.cpp271
1 files changed, 34 insertions, 237 deletions
diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp
index 2510ef4..7353104 100644
--- a/src/uscxml/Interpreter.cpp
+++ b/src/uscxml/Interpreter.cpp
@@ -22,7 +22,8 @@
#include "uscxml/Interpreter.h"
#include "uscxml/URL.h"
#include "uscxml/UUID.h"
-#include "uscxml/DOMUtils.h"
+#include "uscxml/dom/DOMUtils.h"
+#include "uscxml/dom/NameSpacingParser.h"
#include "uscxml/transform/FlatStateIdentifier.h"
#include "uscxml/transform/ChartToFSM.h" // only for testing
@@ -485,7 +486,7 @@ Interpreter Interpreter::fromXML(const std::string& xml, const std::string& sour
std::auto_ptr<std::istream> ssPtr(ss);
Arabica::SAX::InputSource<std::string> inputSource;
inputSource.setByteStream(ssPtr);
- return fromInputSource(inputSource, sourceURL);
+ return fromInputSource(&inputSource, sourceURL);
}
@@ -502,7 +503,7 @@ Interpreter Interpreter::fromURL(const std::string& url) {
if (iequals(absUrl.scheme(), "file")) {
Arabica::SAX::InputSource<std::string> inputSource;
inputSource.setSystemId(absUrl.asString());
- interpreter = fromInputSource(inputSource, absUrl);
+ interpreter = fromInputSource(&inputSource, absUrl);
} else {
// use curl for everything !file - even for http as arabica won't follow redirects
std::stringstream ss;
@@ -520,9 +521,10 @@ Interpreter Interpreter::fromURL(const std::string& url) {
return interpreter;
}
-Interpreter Interpreter::fromInputSource(Arabica::SAX::InputSource<std::string>& source, const std::string& sourceURL) {
+Interpreter Interpreter::fromInputSource(void* source, const std::string& sourceURL) {
tthread::lock_guard<tthread::recursive_mutex> lock(_instanceMutex);
+ Arabica::SAX::InputSource<std::string> sourceRef = *(Arabica::SAX::InputSource<std::string>*)source;
// remove old instances
std::map<std::string, boost::weak_ptr<InterpreterImpl> >::iterator instIter = _instances.begin();
while(instIter != _instances.end()) {
@@ -538,7 +540,7 @@ Interpreter Interpreter::fromInputSource(Arabica::SAX::InputSource<std::string>&
_instances[interpreterImpl->getSessionId()] = interpreterImpl;
NameSpacingParser parser;
- if (parser.parse(source) && parser.getDocument() && parser.getDocument().hasChildNodes()) {
+ if (parser.parse(sourceRef) && parser.getDocument() && parser.getDocument().hasChildNodes()) {
interpreterImpl->setNameSpaceInfo(parser.nameSpace);
interpreterImpl->_document = parser.getDocument();
interpreterImpl->_sourceURL = sourceURL;
@@ -680,11 +682,11 @@ void InterpreterImpl::exitInterpreter() {
statesToExit.sort();
for (int i = 0; i < statesToExit.size(); i++) {
- Arabica::XPath::NodeSet<std::string> onExitElems = filterChildElements(_nsInfo.xmlNSPrefix + "onexit", statesToExit[i]);
+ Arabica::XPath::NodeSet<std::string> onExitElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "onexit", statesToExit[i]);
for (int j = 0; j < onExitElems.size(); j++) {
executeContent(Element<std::string>(onExitElems[j]));
}
- Arabica::XPath::NodeSet<std::string> invokeElems = filterChildElements(_nsInfo.xmlNSPrefix + "invoke", statesToExit[i]);
+ Arabica::XPath::NodeSet<std::string> invokeElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "invoke", statesToExit[i]);
// TODO: we ought to cancel all remaining invokers just to be sure with the persist extension
for (int j = 0; j < invokeElems.size(); j++) {
cancelInvoke(Element<std::string>(invokeElems[j]));
@@ -888,7 +890,7 @@ InterpreterState InterpreterImpl::step(int waitForMS) {
// when we reach a stable configuration, invoke
for (unsigned int i = 0; i < _statesToInvoke.size(); i++) {
- NodeSet<std::string> invokes = filterChildElements(_nsInfo.xmlNSPrefix + "invoke", _statesToInvoke[i]);
+ NodeSet<std::string> invokes = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "invoke", _statesToInvoke[i]);
for (unsigned int j = 0; j < invokes.size(); j++) {
Element<std::string> invokeElem = Element<std::string>(invokes[j]);
if (!HAS_ATTR(invokeElem, "persist") || !stringIsTrue(ATTR(invokeElem, "persist"))) {
@@ -1066,7 +1068,7 @@ void InterpreterImpl::stabilize() {
// when we reach a stable configuration, invoke
for (unsigned int i = 0; i < _statesToInvoke.size(); i++) {
- NodeSet<std::string> invokes = filterChildElements(_nsInfo.xmlNSPrefix + "invoke", _statesToInvoke[i]);
+ NodeSet<std::string> invokes = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "invoke", _statesToInvoke[i]);
for (unsigned int j = 0; j < invokes.size(); j++) {
Element<std::string> invokeElem = Element<std::string>(invokes[j]);
if (!HAS_ATTR(invokeElem, "persist") || !stringIsTrue(ATTR(invokeElem, "persist"))) {
@@ -1091,7 +1093,7 @@ Arabica::XPath::NodeSet<std::string> InterpreterImpl::selectTransitions(const st
unsigned int index = 0;
while(states.size() > index) {
- NodeSet<std::string> transitions = filterChildElements(_nsInfo.xmlNSPrefix + "transition", states[index]);
+ NodeSet<std::string> transitions = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", states[index]);
for (unsigned int k = 0; k < transitions.size(); k++) {
if (isEnabledTransition(Element<std::string>(transitions[k]), event)) {
enabledTransitions.push_back(transitions[k]);
@@ -1126,7 +1128,7 @@ Arabica::XPath::NodeSet<std::string> InterpreterImpl::selectEventlessTransitions
unsigned int index = 0;
while(states.size() > index) {
bool foundTransition = false;
- NodeSet<std::string> transitions = filterChildElements(_nsInfo.xmlNSPrefix + "transition", states[index]);
+ NodeSet<std::string> transitions = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", states[index]);
for (unsigned int k = 0; k < transitions.size(); k++) {
Element<std::string> transElem(transitions[k]);
if (!HAS_ATTR(transElem, "event") && hasConditionMatch(transElem)) {
@@ -1172,7 +1174,7 @@ Arabica::XPath::NodeSet<std::string> InterpreterImpl::selectTransitions(const st
for (unsigned int i = 0; i < atomicStates.size(); i++) {
Element<std::string> state(atomicStates[i]);
while(true) {
- NodeSet<std::string> transitions = filterChildElements(_nsInfo.xmlNSPrefix + "transition", state);
+ NodeSet<std::string> transitions = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", state);
for (unsigned int k = 0; k < transitions.size(); k++) {
if (isEnabledTransition(Element<std::string>(transitions[k]), event)) {
enabledTransitions.push_back(transitions[k]);
@@ -1225,7 +1227,7 @@ Arabica::XPath::NodeSet<std::string> InterpreterImpl::selectEventlessTransitions
for (unsigned int i = 0; i < atomicStates.size(); i++) {
Element<std::string> state(atomicStates[i]);
while(true) {
- NodeSet<std::string> transitions = filterChildElements(_nsInfo.xmlNSPrefix + "transition", state);
+ NodeSet<std::string> transitions = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", state);
for (unsigned int k = 0; k < transitions.size(); k++) {
Element<std::string> transElem(transitions[k]);
if (!HAS_ATTR(transElem, "event") && hasConditionMatch(transElem)) {
@@ -1273,7 +1275,7 @@ bool InterpreterImpl::isEnabledTransition(const Element<std::string>& transition
return false;
}
- std::list<std::string> eventNames = tokenizeIdRefs(eventName);
+ std::list<std::string> eventNames = tokenize(eventName);
std::list<std::string>::iterator eventIter = eventNames.begin();
while(eventIter != eventNames.end()) {
if(nameMatch(*eventIter, event) && hasConditionMatch(transition)) {
@@ -1612,7 +1614,7 @@ void InterpreterImpl::resolveXIncludes(std::list<std::string> includeChain,
goto TRY_WITH_FALLBACK;
}
TRY_WITH_FALLBACK: {
- NodeSet<std::string> fallbacks = filterChildElements(xIncludeNS + "fallback", xinclude);
+ NodeSet<std::string> fallbacks = DOMUtils::filterChildElements(xIncludeNS + "fallback", xinclude);
if (fallbacks.size() > 0) {
LOG(WARNING) << "Using xi:fallback for '" << DOMUtils::xPathForNode(xinclude) << "'";
// move the fallbacks children in place
@@ -1629,7 +1631,7 @@ REMOVE_AND_RECURSE:
xinclude.getParentNode().removeChild(xinclude);
for (int i = 0; i < newNodes.size(); i++) {
_baseURL[newNodes[i]] = URL::asBaseURL(src);
- Arabica::XPath::NodeSet<std::string> xincludes = filterChildElements(xIncludeNS + "include", newNodes[i], true);
+ Arabica::XPath::NodeSet<std::string> xincludes = DOMUtils::filterChildElements(xIncludeNS + "include", newNodes[i], true);
for (int j = 0; j < xincludes.size(); j++) {
resolveXIncludes(includeChain, mergedNS, xIncludeNS, URL::asBaseURL(src), Element<std::string>(xincludes[j]));
}
@@ -1689,7 +1691,7 @@ void InterpreterImpl::init() {
}
} else {
// initialize current data elements
- NodeSet<std::string> topDataElems = filterChildElements(_nsInfo.xmlNSPrefix + "data", filterChildElements(_nsInfo.xmlNSPrefix + "datamodel", _scxml));
+ NodeSet<std::string> topDataElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "data", DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "datamodel", _scxml));
for (unsigned int i = 0; i < topDataElems.size(); i++) {
if (topDataElems[i].getNodeType() == Node_base::ELEMENT_NODE)
initializeData(Element<std::string>(topDataElems[i]));
@@ -1697,7 +1699,7 @@ void InterpreterImpl::init() {
}
// executeGlobalScriptElements
- NodeSet<std::string> globalScriptElems = filterChildElements(_nsInfo.xmlNSPrefix + "script", _scxml);
+ NodeSet<std::string> globalScriptElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "script", _scxml);
for (unsigned int i = 0; i < globalScriptElems.size(); i++) {
executeContent(Element<std::string>(globalScriptElems[i]));
}
@@ -1774,7 +1776,7 @@ void InterpreterImpl::internalDoneSend(const Arabica::DOM::Element<std::string>&
if (doneData) {
processParamChilds(doneData, event.params);
- Arabica::XPath::NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", doneData);
+ Arabica::XPath::NodeSet<std::string> contents = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "content", doneData);
if (contents.size() > 1)
LOG(ERROR) << "Only a single content element is allowed for send elements - using first one";
if (contents.size() > 0) {
@@ -1907,7 +1909,7 @@ void InterpreterImpl::processDOMorText(const Arabica::DOM::Element<std::string>&
}
void InterpreterImpl::processParamChilds(const Arabica::DOM::Element<std::string>& element, std::multimap<std::string, Data>& params) {
- NodeSet<std::string> paramElems = filterChildElements(_nsInfo.xmlNSPrefix + "param", element);
+ NodeSet<std::string> paramElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "param", element);
for (int i = 0; i < paramElems.size(); i++) {
try {
Element<std::string> paramElem = Element<std::string>(paramElems[i]);
@@ -2045,7 +2047,7 @@ void InterpreterImpl::send(const Arabica::DOM::Element<std::string>& element) {
try {
// namelist
if (HAS_ATTR(element, "namelist")) {
- std::list<std::string> names = tokenizeIdRefs(ATTR(element, "namelist"));
+ std::list<std::string> names = tokenize(ATTR(element, "namelist"));
for (std::list<std::string>::const_iterator nameIter = names.begin(); nameIter != names.end(); 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;
@@ -2072,7 +2074,7 @@ void InterpreterImpl::send(const Arabica::DOM::Element<std::string>& element) {
}
try {
// content
- NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", element);
+ NodeSet<std::string> contents = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "content", element);
if (contents.size() > 1)
LOG(ERROR) << "Only a single content element is allowed for send elements " << DOMUtils::xPathForNode(element) << " - using first one";
if (contents.size() > 0) {
@@ -2201,7 +2203,7 @@ void InterpreterImpl::invoke(const Arabica::DOM::Element<std::string>& element)
// namelist
if (HAS_ATTR(element, "namelist")) {
- std::list<std::string> names = tokenizeIdRefs(ATTR(element, "namelist"));
+ std::list<std::string> names = tokenize(ATTR(element, "namelist"));
for (std::list<std::string>::const_iterator nameIter = names.begin(); nameIter != names.end(); 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;
@@ -2229,7 +2231,7 @@ void InterpreterImpl::invoke(const Arabica::DOM::Element<std::string>& element)
// content
try {
- NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", element);
+ NodeSet<std::string> contents = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "content", element);
if (contents.size() > 1)
LOG(ERROR) << "Only a single content element is allowed for send elements - using first one";
if (contents.size() > 0) {
@@ -2372,92 +2374,6 @@ void InterpreterImpl::cancelInvoke(const Arabica::DOM::Element<std::string>& ele
//receiveInternal(Event("done.invoke." + invokeId, Event::PLATFORM));
}
-// see: http://www.w3.org/TR/scxml/#EventDescriptors
-bool InterpreterImpl::nameMatch(const std::string& eventDescs, const std::string& eventName) {
-#if 1
- if(eventDescs.length() == 0 || eventName.length() == 0)
- return false;
-
- // naive case of single descriptor and exact match
- if (iequals(eventDescs, eventName))
- return true;
-
- size_t start = 0;
- std::string eventDesc;
- for (int i = 0; i < eventDescs.size(); i++) {
- if (isspace(eventDescs[i])) {
- if (i > 0 && start < i - 1) {
- eventDesc = eventDescs.substr(start, i - start);
- }
- while(isspace(eventDescs[++i])); // skip whitespaces
- start = i;
- } else if (i + 1 == eventDescs.size()) {
- eventDesc = eventDescs.substr(start, i + 1 - start);
- }
-
- if (eventDesc.size() > 0) {
- // remove optional trailing .* for CCXML compatibility
- if (eventDesc.find("*", eventDesc.size() - 1) != std::string::npos)
- eventDesc = eventDesc.substr(0, eventDesc.size() - 1);
- if (eventDesc.find(".", eventDesc.size() - 1) != std::string::npos)
- eventDesc = eventDesc.substr(0, eventDesc.size() - 1);
-
- // was eventDesc the * wildcard
- if (eventDesc.size() == 0)
- return true;
-
- // eventDesc has to be a real prefix of event now and therefore shorter
- if (eventDesc.size() > eventName.size())
- goto NEXT_DESC;
-
- // are they already equal?
- if (iequals(eventDesc, eventName))
- return true;
-
- if (eventName.find(eventDesc) == 0) {
- if (eventName.find(".", eventDesc.size()) == eventDesc.size())
- return true;
- }
-NEXT_DESC:
- eventDesc = "";
- }
- }
- return false;
-#else
- const char* dPtr = eventDescs.c_str();
- const char* ePtr = eventName.c_str();
- while(*dPtr != 0) {
-
- if (*dPtr == '*' && *ePtr != 0) // something following
- return true;
-
- // descriptor differs from event name
- if (*dPtr != *ePtr) {
- // move to next descriptor
- while(*dPtr != ' ' && *dPtr != 0) {
- dPtr++;
- }
- if (*dPtr == 0)
- return false;
- dPtr++;
- ePtr = eventName.c_str();
- } else {
- // move both pointers one character
- dPtr++;
- ePtr++;
-
- }
-
- // descriptor is done, return match
- if (((*dPtr == 0 || *dPtr == ' ') && (*ePtr == 0 || *ePtr == ' ')) || // exact match, end of string
- (*dPtr == ' ' && *ePtr == '.') || (*dPtr == 0 && *ePtr == '.')) // prefix match
- return true;
- }
- return false;
-#endif
-}
-
-
bool InterpreterImpl::hasConditionMatch(const Arabica::DOM::Element<std::string>& conditional) {
if (HAS_ATTR(conditional, "cond") && ATTR(conditional, "cond").length() > 0) {
try {
@@ -2530,7 +2446,7 @@ void InterpreterImpl::executeContent(const Arabica::DOM::Element<std::string>& c
try {
// content
processParamChilds(content, raised.params);
- NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", content);
+ NodeSet<std::string> contents = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "content", content);
if (contents.size() > 1)
LOG(ERROR) << "Only a single content element is allowed for raise elements " << DOMUtils::xPathForNode(content) << " - using first one";
if (contents.size() > 0) {
@@ -2772,7 +2688,7 @@ void InterpreterImpl::finalizeAndAutoForwardCurrentEvent() {
invokeIter != _invokers.end();
invokeIter++) {
if (iequals(invokeIter->first, _currEvent.invokeid)) {
- Arabica::XPath::NodeSet<std::string> finalizes = filterChildElements(_nsInfo.xmlNSPrefix + "finalize", invokeIter->second.getElement());
+ Arabica::XPath::NodeSet<std::string> finalizes = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "finalize", invokeIter->second.getElement());
for (int k = 0; k < finalizes.size(); k++) {
Element<std::string> finalizeElem = Element<std::string>(finalizes[k]);
executeContent(finalizeElem);
@@ -3024,13 +2940,13 @@ Arabica::XPath::NodeSet<std::string> InterpreterImpl::getInitialStates(Arabica::
// initial attribute at element
Arabica::DOM::Element<std::string> stateElem = (Arabica::DOM::Element<std::string>)state;
if (stateElem.hasAttribute("initial")) {
- return getStates(tokenizeIdRefs(stateElem.getAttribute("initial")));
+ return getStates(tokenize(stateElem.getAttribute("initial")));
}
// initial element as child - but not the implicit generated one
- NodeSet<std::string> initElems = filterChildElements(_nsInfo.xmlNSPrefix + "initial", state);
+ NodeSet<std::string> initElems = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "initial", state);
if(initElems.size() > 0 && !iequals(ATTR_CAST(initElems[0], "generated"), "true")) {
- NodeSet<std::string> initTrans = filterChildElements(_nsInfo.xmlNSPrefix + "transition", initElems[0]);
+ NodeSet<std::string> initTrans = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", initElems[0]);
if (initTrans.size() > 0) {
return getTargetStates(Element<std::string>(initTrans[0]));
}
@@ -3084,7 +3000,7 @@ NodeSet<std::string> InterpreterImpl::getReachableStates() {
// reachable per target attribute in transitions
for (int i = 0; i < reachable.size(); i++) {
Element<std::string> state = Element<std::string>(reachable[i]);
- NodeSet<std::string> transitions = InterpreterImpl::filterChildElements(_nsInfo.xmlNSPrefix + "transition", state, false);
+ NodeSet<std::string> transitions = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "transition", state, false);
for (int j = 0; j < transitions.size(); j++) {
Element<std::string> transition = Element<std::string>(transitions[j]);
try {
@@ -3151,7 +3067,7 @@ NodeSet<std::string> InterpreterImpl::getTargetStates(const Arabica::DOM::Elemen
}
std::string targetId = ((Arabica::DOM::Element<std::string>)transition).getAttribute("target");
- std::list<std::string> targetIds = InterpreterImpl::tokenizeIdRefs(ATTR(transition, "target"));
+ std::list<std::string> targetIds = tokenize(ATTR(transition, "target"));
for (std::list<std::string>::const_iterator targetIter = targetIds.begin(); targetIter != targetIds.end(); targetIter++) {
Arabica::DOM::Node<std::string> state = getState(*targetIter);
if (state) {
@@ -3171,125 +3087,6 @@ NodeSet<std::string> InterpreterImpl::getTargetStates(const Arabica::XPath::Node
return targets;
}
-#define ISWHITESPACE(char) (isspace(char))
-
-std::list<std::string> InterpreterImpl::tokenize(const std::string& line, const char sep, bool trimWhiteSpace) {
- std::list<std::string> tokens;
-
- // appr. 3x faster than stringstream
- size_t start = 0;
- for (int i = 0; i < line.size(); i++) {
- if (line[i] == sep || (trimWhiteSpace && ISWHITESPACE(line[i]))) {
- if (i > 0 && start < i) {
- tokens.push_back(line.substr(start, i - start));
- }
- while(line[i] == sep || (trimWhiteSpace && ISWHITESPACE(line[i]))) {
- i++; // skip multiple occurences of seperator and whitespaces
- }
- start = i;
- } else if (i + 1 == line.size()) {
- tokens.push_back(line.substr(start, i + 1 - start));
- }
- }
-
- return tokens;
-}
-
-std::string InterpreterImpl::spaceNormalize(const std::string& text) {
- std::stringstream content;
-
-#if 1
- // 195ms with test-performance-events.scml
- std::string seperator;
-
- size_t start = 0;
- for (int i = 0; i < text.size(); i++) {
- if (isspace(text[i])) {
- if (i > 0 && start < i) {
- content << seperator << text.substr(start, i - start);
- seperator = " ";
- }
- while(isspace(text[++i])); // skip whitespaces
- start = i;
- } else if (i + 1 == text.size()) {
- content << seperator << text.substr(start, i + 1 - start);
- }
- }
-// std::cerr << ">>" << content.str() << "<<" << std::endl;
-
-#else
-
-// 291ms with test-performance-events.scml
- std::istringstream iss(text);
- std::string seperator;
- do {
- std::string token;
- iss >> token;
- if (token.length() > 0) {
- content << seperator << token;
- seperator = " ";
- }
- } while (iss);
-
-#endif
- return content.str();
-}
-
-
-NodeSet<std::string> InterpreterImpl::filterChildElements(const std::string& tagName, const NodeSet<std::string>& nodeSet, bool recurse) {
- NodeSet<std::string> filteredChildElems;
- for (unsigned int i = 0; i < nodeSet.size(); i++) {
- filteredChildElems.push_back(filterChildElements(tagName, nodeSet[i], recurse));
- }
- return filteredChildElems;
-}
-
-NodeSet<std::string> InterpreterImpl::filterChildElements(const std::string& tagName, const Node<std::string>& node, bool recurse) {
- NodeSet<std::string> filteredChildElems;
-
- if (!node)
- return filteredChildElems;
-
- NodeList<std::string> childs = node.getChildNodes();
- for (unsigned int i = 0; i < childs.getLength(); i++) {
- if (childs.item(i).getNodeType() != Node_base::ELEMENT_NODE)
- continue;
-// std::cerr << TAGNAME(childs.item(i)) << std::endl;
- if(iequals(TAGNAME_CAST(childs.item(i)), tagName)) {
- filteredChildElems.push_back(childs.item(i));
- }
- if (recurse) {
- filteredChildElems.push_back(filterChildElements(tagName, childs.item(i), recurse));
- }
- }
- return filteredChildElems;
-}
-
-
-NodeSet<std::string> InterpreterImpl::filterChildType(const Node_base::Type type, const NodeSet<std::string>& nodeSet, bool recurse) {
- NodeSet<std::string> filteredChildType;
- for (unsigned int i = 0; i < nodeSet.size(); i++) {
- filteredChildType.push_back(filterChildType(type, nodeSet[i], recurse));
- }
- return filteredChildType;
-}
-
-NodeSet<std::string> InterpreterImpl::filterChildType(const Node_base::Type type, const Node<std::string>& node, bool recurse) {
- NodeSet<std::string> filteredChildTypes;
-
- if (!node)
- return filteredChildTypes;
-
- NodeList<std::string> childs = node.getChildNodes();
- for (unsigned int i = 0; i < childs.getLength(); i++) {
- if (childs.item(i).getNodeType() == type)
- filteredChildTypes.push_back(childs.item(i));
- if (recurse) {
- filteredChildTypes.push_back(filterChildType(type, childs.item(i), recurse));
- }
- }
- return filteredChildTypes;
-}
/*
* If state2 is null, returns the set of all ancestors of state1 in ancestry order
@@ -3724,7 +3521,7 @@ void InterpreterImpl::handleDOMEvent(Arabica::DOM::Events::Event<std::string>& e
// remove modified states from cache
Node<std::string> target = Arabica::DOM::Node<std::string>(event.getTarget());
- NodeSet<std::string> childs = InterpreterImpl::filterChildElements(_nsInfo.xmlNSPrefix + "state", target);
+ NodeSet<std::string> childs = DOMUtils::filterChildElements(_nsInfo.xmlNSPrefix + "state", target);
for (int i = 0; i < childs.size(); i++) {
if (HAS_ATTR_CAST(childs[i], "id")) {
_cachedStates.erase(ATTR_CAST(childs[i], "id"));