summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/datamodel/lua
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-08-18 08:23:49 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-08-18 08:23:49 (GMT)
commit8b9ae4ba7aa509f467b97ae298642fbe1710ea36 (patch)
tree68194b17601a24bf484429e0371b0ea7d953e26b /src/uscxml/plugins/datamodel/lua
parent940de61e5b6d8651f6ea8b1626c92f5d80cb723c (diff)
downloaduscxml-8b9ae4ba7aa509f467b97ae298642fbe1710ea36.zip
uscxml-8b9ae4ba7aa509f467b97ae298642fbe1710ea36.tar.gz
uscxml-8b9ae4ba7aa509f467b97ae298642fbe1710ea36.tar.bz2
DOM support for Lua DM via luaExpat
Diffstat (limited to 'src/uscxml/plugins/datamodel/lua')
-rw-r--r--src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
index a36a5f7..ca50b75 100644
--- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp
@@ -48,11 +48,25 @@ static int luaInspect(lua_State * l) {
return 0;
}
+bool _luaHasXMLParser = false;
+
static luabridge::LuaRef getDataAsLua(lua_State* _luaState, const Data& data) {
luabridge::LuaRef luaData (_luaState);
if (data.node) {
- ERROR_EXECUTION_THROW("No DOM support in Lua datamodel");
+ if (_luaHasXMLParser) {
+ const luabridge::LuaRef& luaLom = luabridge::getGlobal(_luaState, "lxp.lom");
+ const luabridge::LuaRef& luaLomParse = luaLom["parse"];
+ assert(luaLomParse.isFunction());
+ std::stringstream luaXMLSS;
+ luaXMLSS << data.node;
+ try {
+ luaData = luaLomParse(luaXMLSS.str());
+ } catch (luabridge::LuaException e) {
+ LOG(ERROR) << e.what();
+ }
+ return luaData;
+ }
}
if (data.compound.size() > 0) {
luaData = luabridge::newTable(_luaState);
@@ -128,6 +142,19 @@ boost::shared_ptr<DataModelImpl> LuaDataModel::create(InterpreterImpl* interpret
dm->_luaState = luaL_newstate();
luaL_openlibs(dm->_luaState);
+ try {
+ const luabridge::LuaRef& requireFunc = luabridge::getGlobal(dm->_luaState, "require");
+ const luabridge::LuaRef& resultLxp = requireFunc("lxp");
+ const luabridge::LuaRef& resultLxpLOM = requireFunc("lxp.lom");
+ if (resultLxp && resultLxpLOM) {
+ _luaHasXMLParser = true;
+ luabridge::setGlobal(dm->_luaState, resultLxp, "lxp");
+ luabridge::setGlobal(dm->_luaState, resultLxpLOM, "lxp.lom");
+ }
+ } catch (luabridge::LuaException e) {
+ LOG(ERROR) << e.what();
+ }
+
luabridge::getGlobalNamespace(dm->_luaState).beginClass<InterpreterImpl>("Interpreter").endClass();
luabridge::setGlobal(dm->_luaState, dm->_interpreter, "__interpreter");
@@ -222,7 +249,20 @@ void LuaDataModel::setEvent(const Event& event) {
}
if (event.dom) {
- ERROR_EXECUTION_THROW("No DOM support in Lua datamodel");
+ if (_luaHasXMLParser) {
+ const luabridge::LuaRef& luaLom = luabridge::getGlobal(_luaState, "lxp.lom");
+ const luabridge::LuaRef& luaLomParse = luaLom["parse"];
+ assert(luaLomParse.isFunction());
+ std::stringstream luaXMLSS;
+ luaXMLSS << event.dom;
+ try {
+ luaEvent["data"] = luaLomParse(luaXMLSS.str());
+ } catch (luabridge::LuaException e) {
+ LOG(ERROR) << e.what();
+ }
+ } else {
+ ERROR_EXECUTION_THROW("No DOM support in Lua datamodel");
+ }
} else if (event.content.length() > 0) {
// _event.data is a string or JSON
Data json = Data::fromJSON(event.content);