diff options
author | Stefan Radomski <sradomski@mintwerk.de> | 2016-02-23 11:28:18 (GMT) |
---|---|---|
committer | Stefan Radomski <sradomski@mintwerk.de> | 2016-02-23 11:28:18 (GMT) |
commit | 7212d5a3dbbd2845d09df96b2c345132c8a24931 (patch) | |
tree | 194bf3525bc7b607013301b79dde6c9950ccbf2e /src/uscxml/Interpreter.cpp | |
parent | 8e62f3801b98bf4b7f7f85b848b2fe6339c99162 (diff) | |
download | uscxml-7212d5a3dbbd2845d09df96b2c345132c8a24931.zip uscxml-7212d5a3dbbd2845d09df96b2c345132c8a24931.tar.gz uscxml-7212d5a3dbbd2845d09df96b2c345132c8a24931.tar.bz2 |
Some refactoring for improved compile times
Diffstat (limited to 'src/uscxml/Interpreter.cpp')
-rw-r--r-- | src/uscxml/Interpreter.cpp | 271 |
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")); |