diff options
Diffstat (limited to 'src/uscxml/plugins/datamodel/xpath/XPathDataModel.h')
-rw-r--r-- | src/uscxml/plugins/datamodel/xpath/XPathDataModel.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/uscxml/plugins/datamodel/xpath/XPathDataModel.h b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.h new file mode 100644 index 0000000..d028129 --- /dev/null +++ b/src/uscxml/plugins/datamodel/xpath/XPathDataModel.h @@ -0,0 +1,143 @@ +#ifndef XPATHDATAMODEL_H_KN8TWG0V +#define XPATHDATAMODEL_H_KN8TWG0V + +#include "uscxml/Interpreter.h" +#include <list> + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + +namespace uscxml { +class Event; +class Data; +} + +namespace uscxml { + +class XPathFunctionIn : public Arabica::XPath::BooleanXPathFunction<std::string> { +public: + XPathFunctionIn(int minArgs, + int maxArgs, + const std::vector<Arabica::XPath::XPathExpression<std::string> >& args, + InterpreterImpl* interpreter) : + BooleanXPathFunction(minArgs, maxArgs, args), + _interpreter(interpreter) {} + +protected: + bool doEvaluate(const Arabica::DOM::Node<std::string>& context, + const Arabica::XPath::ExecutionContext<std::string>& executionContext) const; + InterpreterImpl* _interpreter; +}; + +class XPathFunctionResolver : public Arabica::XPath::FunctionResolver<std::string> { +public: + virtual ~XPathFunctionResolver() { } + + virtual Arabica::XPath::XPathFunction<std::string>* + resolveFunction(const std::string& namespace_uri, + const std::string& name, + const std::vector<Arabica::XPath::XPathExpression<std::string> >& argExprs) const; + + virtual std::vector<std::pair<std::string, std::string> > validNames() const; + void setInterpreter(InterpreterImpl* interpreter) { _interpreter = interpreter; } +protected: + Arabica::XPath::StandardXPathFunctionResolver<std::string> _xpathFuncRes; + InterpreterImpl* _interpreter; +}; + +class NodeSetVariableResolver : public Arabica::XPath::VariableResolver<std::string> { +public: + Arabica::XPath::XPathValue<std::string> resolveVariable(const std::string& namepaceUri, + const std::string& name) const; + void setVariable(const std::string& name, const Arabica::XPath::NodeSet<std::string>& value) { + _variables[name] = value; + } + +private: + std::map<std::string, Arabica::XPath::NodeSet<std::string> > _variables; +}; + +class XPathDataModel : public DataModelImpl { +public: + XPathDataModel(); + virtual ~XPathDataModel(); + virtual boost::shared_ptr<DataModelImpl> create(InterpreterImpl* interpreter); + + virtual std::set<std::string> getNames() { + std::set<std::string> names; + names.insert("xpath"); + return names; + } + + virtual void initialize(); + virtual void setEvent(const Event& event); + + virtual bool validate(const std::string& location, const std::string& schema); + + virtual uint32_t getLength(const std::string& expr); + virtual void pushContext(); + virtual void popContext(); + + virtual void eval(const std::string& expr); + virtual void assign(const std::string& location, + const Arabica::DOM::Document<std::string>& doc, + const Arabica::DOM::Element<std::string>& assignElem); + virtual void assign(const std::string& location, + const std::string& expr, + const Arabica::DOM::Element<std::string>& assignElem); + virtual void assign(const std::string& location, + const Data& data, + const Arabica::DOM::Element<std::string>& assignElem); + + virtual void init(const std::string& location, + const Arabica::DOM::Document<std::string>& doc, + const Arabica::DOM::Element<std::string>& dataElem); + virtual void init(const std::string& location, + const std::string& expr, + const Arabica::DOM::Element<std::string>& dataElem); + virtual void init(const std::string& location, + const Data& data, + const Arabica::DOM::Element<std::string>& dataElem); + + virtual Data getStringAsData(const std::string& content); + virtual bool isDeclared(const std::string& expr); + + virtual std::string evalAsString(const std::string& expr); + virtual bool evalAsBool(const std::string& expr); + virtual double evalAsNumber(const std::string& expr); + +protected: + Arabica::XPath::XPath<std::string> _xpath; + Arabica::DOM::DOMImplementation<std::string> _domFactory; + Arabica::DOM::Element<std::string> _datamodel; + Arabica::DOM::Document<std::string> _doc; + + void assign(Arabica::XPath::XPathValue<std::string>& key, + const Arabica::XPath::XPathValue<std::string>& value, + const Arabica::DOM::Element<std::string>& assignElem); + void assign(Arabica::XPath::XPathValue<std::string>& key, + const std::string& value, + const Arabica::DOM::Element<std::string>& assignElem); + void assign(Arabica::XPath::XPathValue<std::string>& key, + const double value, + const Arabica::DOM::Element<std::string>& assignElem); + void assign(Arabica::XPath::XPathValue<std::string>& key, + const bool value, + const Arabica::DOM::Element<std::string>& assignElem); + void assign(Arabica::XPath::XPathValue<std::string>& key, + const Arabica::XPath::NodeSet<std::string>& value, + const Arabica::DOM::Element<std::string>& assignElem); + + NodeSetVariableResolver _varResolver; + XPathFunctionResolver _funcResolver; + +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(XPathDataModel, DataModelImpl); +#endif + +} + +#endif /* end of include guard: XPATHDATAMODEL_H_KN8TWG0V */ |