summaryrefslogtreecommitdiffstats
path: root/src/uscxml/DOMUtils.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-10-31 16:43:13 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-10-31 16:43:13 (GMT)
commit71e1b30a2dcb8eefae105a5562239e21f07768c7 (patch)
tree0c18610f809fecc06c89c1fa0e2c36e51498b7ba /src/uscxml/DOMUtils.cpp
parentcf67d5ccefd7092fdf5c2bc1284e74f4c3413c7b (diff)
downloaduscxml-71e1b30a2dcb8eefae105a5562239e21f07768c7.zip
uscxml-71e1b30a2dcb8eefae105a5562239e21f07768c7.tar.gz
uscxml-71e1b30a2dcb8eefae105a5562239e21f07768c7.tar.bz2
Moved Parser into DOMUtils and new node -> xpath function for debugging
Diffstat (limited to 'src/uscxml/DOMUtils.cpp')
-rw-r--r--src/uscxml/DOMUtils.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/uscxml/DOMUtils.cpp b/src/uscxml/DOMUtils.cpp
new file mode 100644
index 0000000..d521b49
--- /dev/null
+++ b/src/uscxml/DOMUtils.cpp
@@ -0,0 +1,104 @@
+/**
+ * @file
+ * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de)
+ * @copyright Simplified BSD
+ *
+ * @cond
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the FreeBSD license as published by the FreeBSD
+ * project.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the FreeBSD license along with this
+ * program. If not, see <http://www.opensource.org/licenses/bsd-license>.
+ * @endcond
+ */
+
+#include <uscxml/Common.h>
+#include "DOMUtils.h"
+#include <uscxml/Convenience.h>
+#include <glog/logging.h>
+#include <SAX/helpers/InputSourceResolver.hpp>
+
+namespace uscxml {
+
+std::string DOMUtils::xPathForNode(const Arabica::DOM::Node<std::string>& node) {
+ std::string xPath;
+
+ if (!node || node.getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE)
+ return xPath;
+
+ Arabica::DOM::Node<std::string> curr = node;
+ while(curr) {
+ switch (curr.getNodeType()) {
+ case Arabica::DOM::Node_base::ELEMENT_NODE: {
+ if (HAS_ATTR(curr, "id")) {
+ // we assume ids to be unique and return immediately
+ xPath.insert(0, "//" + TAGNAME(curr) + "[@id=\"" + ATTR(curr, "id") + "\"]");
+ return xPath;
+ } else {
+ // check previous siblings to count our index
+ Arabica::DOM::Node<std::string> sibling = curr.getPreviousSibling();
+ int index = 1;
+ while(sibling) {
+ if (sibling.getNodeType() == Arabica::DOM::Node_base::ELEMENT_NODE) {
+ if (iequals(TAGNAME(sibling), TAGNAME(curr))) {
+ index++;
+ }
+ }
+ sibling = sibling.getPreviousSibling();
+ }
+ xPath.insert(0, "/" + TAGNAME(curr) + "[" + toStr(index) + "]");
+ }
+ break;
+ }
+ case Arabica::DOM::Node_base::DOCUMENT_NODE:
+ return xPath;
+ default:
+ LOG(ERROR) << "Only nodes of type element supported for now";
+ return "";
+ break;
+ }
+ curr = curr.getParentNode();
+ }
+ return xPath;
+}
+
+NameSpacingParser NameSpacingParser::fromXML(const std::string& xml) {
+ std::stringstream* ss = new std::stringstream();
+ (*ss) << xml;
+ // we need an auto_ptr for arabica to assume ownership
+ std::auto_ptr<std::istream> ssPtr(ss);
+ Arabica::SAX::InputSource<std::string> inputSource;
+ inputSource.setByteStream(ssPtr);
+ return fromInputSource(inputSource);
+}
+
+NameSpacingParser NameSpacingParser::fromInputSource(Arabica::SAX::InputSource<std::string>& source) {
+ NameSpacingParser parser;
+ if(!parser.parse(source) || !parser.getDocument().hasChildNodes()) {
+ if(parser._errorHandler.errorsReported()) {
+ LOG(ERROR) << "could not parse input:";
+ LOG(ERROR) << parser._errorHandler.errors() << std::endl;
+ } else {
+ Arabica::SAX::InputSourceResolver resolver(source, Arabica::default_string_adaptor<std::string>());
+ if (!resolver.resolve()) {
+ LOG(ERROR) << source.getSystemId() << ": no such file";
+ }
+ }
+ }
+ return parser;
+}
+
+NameSpacingParser::NameSpacingParser() {
+ setErrorHandler(_errorHandler);
+}
+
+void NameSpacingParser::startPrefixMapping(const std::string& prefix, const std::string& uri) {
+ nameSpace.insert(std::make_pair(uri, prefix));
+}
+
+} \ No newline at end of file