This commit is contained in:
2015-06-11 19:08:09 +02:00
parent 632a792f3a
commit 0a63e3752c
6 changed files with 187 additions and 72 deletions
@@ -136,7 +136,7 @@ void DeviceRepoHandler::__handleInfo(Poco::Net::HTTPServerRequest &req, Poco::Ne
// Iterate over devices
Variant result = Variant::List();
if (devices.size() > 0) {
if (devices.size() > rangeStart) {
for (size_t t = rangeStart; t <= rangeStop; t++) {
auto dev = devices[t].lock();
result.Append(parent->getDeviceInfo(dev.get()));
@@ -52,11 +52,11 @@ RuleEngineHandlerFactory::RuleEngineHandlerFactory(RuleEngineService* ruleServic
Poco::Net::HTTPResponse::HTTPStatus::HTTP_NOT_FOUND);
}) {
engineInfoFuncs.add("id", [](RuleEngineService* engine, const std::string& category)->Variant {
engineInfoFuncs.add("id", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, RuleEngineService* engine, const std::string& category)->Variant {
return engine->getName();
});
engineInfoFuncs.add("languages", [](RuleEngineService* engine, const std::string& category)->Variant {
engineInfoFuncs.add("languages", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, RuleEngineService* engine, const std::string& category)->Variant {
Variant retval = libvariant::Variant::List();
for (auto e : engine->getExecutionBackends()) {
retval.Append(e->getLanguage());
@@ -64,33 +64,38 @@ RuleEngineHandlerFactory::RuleEngineHandlerFactory(RuleEngineService* ruleServic
return retval;
});
engineInfoFuncs.add("packages", [this](RuleEngineService* engine, const std::string& category)->Variant {
engineInfoFuncs.add("packages", [this](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, RuleEngineService* engine, const std::string& category)->Variant {
bool onlyIds = form.has("onlyids");
Variant retval = libvariant::Variant::List();
for (auto r : engine->getRulePackages()) {
if (!r.expired()) {
retval.Append(getRulePkgInfo(r.lock().get()));
if (onlyIds) {
retval.Append(r.lock()->getName());
} else {
retval.Append(getRulePkgInfo(req, form, r.lock().get()));
}
}
}
return retval;
});
pkgInfoFuncs.add("id", [](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("id", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
return pkg->getName();
});
pkgInfoFuncs.add("parent", [](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("parent", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
return pkg->getParent()->getName();
});
pkgInfoFuncs.add("language", [](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("language", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
return pkg->getLanguage();
});
pkgInfoFuncs.add("enabled", [](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("enabled", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
return pkg->isEnabled();
});
pkgInfoFuncs.add("globalcontext", [](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("globalcontext", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
auto gc = pkg->getGlobalScriptContext();
if (!gc.expired()) {
return gc.lock()->getJSONRepresentation();
@@ -99,30 +104,39 @@ RuleEngineHandlerFactory::RuleEngineHandlerFactory(RuleEngineService* ruleServic
}
});
pkgInfoFuncs.add("rules", [this](rules::RulePackage* pkg, const std::string& category)->Variant {
pkgInfoFuncs.add("rules", [this](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category)->Variant {
bool onlyIds = form.has("onlyids");
Variant retval = libvariant::Variant::List();
for (auto r : pkg->getRules()) {
if (!r.expired()) {
retval.Append(getRuleInfo(r.lock().get()));
if (onlyIds) {
retval.Append(r.lock()->getName());
} else {
retval.Append(getRuleInfo(req, form, r.lock().get()));
}
}
}
return retval;
});
ruleInfoFuncs.add("id", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("id", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
return rule->getName();
});
ruleInfoFuncs.add("parent", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("parent", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
return rule->getParent()->getName();
});
ruleInfoFuncs.add("enabled", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("enabled", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
return rule->isEnabled();
});
ruleInfoFuncs.add("script", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("active", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
return rule->isActive();
});
ruleInfoFuncs.add("script", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
auto script = rule->getScript();
if (script) {
return script->getJSONRepresentation();
@@ -131,7 +145,7 @@ RuleEngineHandlerFactory::RuleEngineHandlerFactory(RuleEngineService* ruleServic
}
});
ruleInfoFuncs.add("exitscript", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("exitscript", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
auto script = rule->getExitScript();
if (script) {
return script->getJSONRepresentation();
@@ -140,7 +154,7 @@ RuleEngineHandlerFactory::RuleEngineHandlerFactory(RuleEngineService* ruleServic
}
});
ruleInfoFuncs.add("condition", [](rules::Rule* rule, const std::string& category)->Variant {
ruleInfoFuncs.add("condition", [](Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* rule, const std::string& category)->Variant {
return rule->getConditionJSONRepresentation();
});
@@ -153,17 +167,17 @@ Net::HTTPRequestHandler* RuleEngineHandlerFactory::createRequestHandler( Poco::U
}
Variant RuleEngineHandlerFactory::getEngineInfo( RuleEngineService* engine, const std::string& category, const std::string& path ) {
Variant RuleEngineHandlerFactory::getEngineInfo( Net::HTTPServerRequest& req, Net::HTMLForm& form, RuleEngineService* engine, const std::string& category, const std::string& path ) {
Variant retval;
// We want all info categories
if (category.empty()) {
engineInfoFuncs.forEach([&](const std::string& key, const Variant& value){
retval[key] = value;
}, engine, category);
}, req, form, engine, category);
// We want a single info category
} else {
retval = engineInfoFuncs.call(category, engine, category);
retval = engineInfoFuncs.call(category, req, form, engine, category);
if (!path.empty()) {
if (retval.HasPath(path)) {
retval = retval.GetPath(path);
@@ -177,17 +191,17 @@ Variant RuleEngineHandlerFactory::getEngineInfo( RuleEngineService* engine, cons
}
Variant RuleEngineHandlerFactory::getRulePkgInfo( rules::RulePackage* pkg, const std::string& category, const std::string& path ) {
Variant RuleEngineHandlerFactory::getRulePkgInfo( Net::HTTPServerRequest& req, Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category, const std::string& path ) {
Variant retval;
// We want all info categories
if (category.empty()) {
pkgInfoFuncs.forEach([&](const std::string& key, const Variant& value){
retval[key] = value;
}, pkg, category);
}, req, form, pkg, category);
// We want a single info category
} else {
retval = pkgInfoFuncs.call(category, pkg, category);
retval = pkgInfoFuncs.call(category, req, form, pkg, category);
if (!path.empty()) {
if (retval.HasPath(path)) {
retval = retval.GetPath(path);
@@ -202,17 +216,17 @@ Variant RuleEngineHandlerFactory::getRulePkgInfo( rules::RulePackage* pkg, const
Variant RuleEngineHandlerFactory::getRuleInfo( rules::Rule* rule, const std::string& category, const std::string& path ) {
Variant RuleEngineHandlerFactory::getRuleInfo( Net::HTTPServerRequest& req, Net::HTMLForm& form, rules::Rule* rule, const std::string& category, const std::string& path ) {
Variant retval;
// We want all info categories
if (category.empty()) {
ruleInfoFuncs.forEach([&](const std::string& key, const Variant& value){
retval[key] = value;
}, rule, category);
}, req, form, rule, category);
// We want a single info category
} else {
retval = ruleInfoFuncs.call(category, rule, category);
retval = ruleInfoFuncs.call(category, req, form, rule, category);
if (!path.empty()) {
if (retval.HasPath(path)) {
retval = retval.GetPath(path);
@@ -267,14 +281,136 @@ void RuleEngineHandler::__handleInfo(Poco::Net::HTTPServerRequest &req, Poco::Ne
// Nothing given, return engine info
if (pathPieces.size() <= matchPieces.size()) {
handleResponse(req, resp, form, parent->getEngineInfo(ruleService, "", ""));
handleResponse(req, resp, form, parent->getEngineInfo(req, form, ruleService, "", ""));
// rule package given
} else if (pathPieces.size() == matchPieces.size() + 1) {
// rule given
} else if (pathPieces.size() == matchPieces.size() + 2) {
} else {
std::weak_ptr<rules::Rule> rule;
std::string firstPiece = pathPieces[matchPieces.size()];
bool alreadyHandled = false;
size_t pathStart = 0;
Variant retval;
if (firstPiece == "packages") {
if (pathPieces.size() <= matchPieces.size() + 1) {
auto pkgs = ruleService->getRulePackages();
// Range header parameter
size_t rangeStart = 0;
size_t rangeStop = pkgs.size() - 1;
getRangeHeaderParameter(req, rangeStart, rangeStop, rangeStop);
// Iterate over devices
retval = Variant::List();
if (pkgs.size() > rangeStart) {
for (size_t t = rangeStart; t <= rangeStop; t++) {
auto dev = pkgs[t].lock();
retval.Append(parent->getRulePkgInfo(req, form, dev.get()));
}
}
// There are no devices and a range was given, probably out of range
if (retval.Size() == 0 && rangeStart > 0) {
if (rangeStart > 0) {
handleErrorResponse(req, resp, form, "Out of range", Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
} else {
handleResponse(req, resp, form, retval);
}
// Return devices array
} else {
setRangeHeaderParameter(resp, rangeStart, rangeStop, pkgs.size());
handleResponse(req, resp, form, retval);
}
alreadyHandled = true;
} else {
// Get rule package
std::string pkgid = pathPieces[matchPieces.size()+1];
auto pkg = ruleService->getRulePackage(pkgid);
if (!pkg.expired()) {
// Get info category
std::string category;
pathStart = 5;
if (pathPieces.size() > matchPieces.size() + 2) {
category = pathPieces[matchPieces.size() + 2];
pathStart = 6;
}
if (category == "rules") {
if (pathPieces.size() <= matchPieces.size() + 3) {
auto rules = pkg.lock()->getRules();
// Range header parameter
size_t rangeStart = 0;
size_t rangeStop = rules.size() - 1;
getRangeHeaderParameter(req, rangeStart, rangeStop, rangeStop);
// Iterate over devices
retval = Variant::List();
if (rules.size() > rangeStart) {
for (size_t t = rangeStart; t <= rangeStop; t++) {
auto r = rules[t].lock();
retval.Append(parent->getRuleInfo(req, form, r.get()));
}
}
// There are no devices and a range was given, probably out of range
if (retval.Size() == 0 && rangeStart > 0) {
if (rangeStart > 0) {
handleErrorResponse(req, resp, form, "Out of range", Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
} else {
handleResponse(req, resp, form, retval);
}
// Return devices array
} else {
setRangeHeaderParameter(resp, rangeStart, rangeStop, rules.size());
handleResponse(req, resp, form, retval);
}
alreadyHandled = true;
} else {
// Get rule
std::string ruleid = pathPieces[matchPieces.size()+3];
auto rule = pkg.lock()->getRule(ruleid);
if (!rule.expired()) {
// Get info category
std::string category;
pathStart = 7;
if (pathPieces.size() > matchPieces.size() + 4) {
category = pathPieces[matchPieces.size() + 4];
pathStart = 8;
}
retval = parent->getRuleInfo(req, form, rule.lock().get(), category);
} else {
throw webserver::webresource::WebResourceHandlerException((boost::format("Could not find rule \"%1%\"") % ruleid).str(),
Poco::Net::HTTPResponse::HTTPStatus::HTTP_NOT_FOUND);
}
}
} else {
retval = parent->getRulePkgInfo(req, form, pkg.lock().get(), category);
}
} else {
throw webserver::webresource::WebResourceHandlerException((boost::format("Could not find rule package \"%1%\"") % pkgid).str(),
Poco::Net::HTTPResponse::HTTPStatus::HTTP_NOT_FOUND);
}
}
} else {
retval = parent->getEngineInfo(req, form, ruleService, firstPiece, "");
}
if (!alreadyHandled) {
// Get path from url and append pointer parameter
std::stringstream pathstream;
for (int i = pathStart; i < pathPieces.size(); i++) {
pathstream << "/" << pathPieces[i];
}
std::string pointer;
if (getPointerParameter(pointer, form)) {
if (pointer.size() > 0 && pointer[0] != '/') {
pathstream << "/";
}
pathstream << pointer;
}
auto path = pathstream.str();
if (!path.empty()) {
if (retval.HasPath(path)) {
retval = retval.GetPath(path);
} else {
throw webserver::webresource::WebResourceHandlerException((boost::format("Unknown path \"%1%\".") % path).str(),
Poco::Net::HTTPResponse::HTTPStatus::HTTP_NOT_FOUND);
}
}
handleResponse(req, resp, form, retval);
}
}
}
@@ -79,9 +79,9 @@ public:
class RuleEngineHandlerFactory
: public webserver::webresource::WebResourceHandlerFactoryImpl<RuleEngineHandlerFactory, false, RuleEngineEventQueue> {
private:
typedef utils::FunctionTable<std::string, libvariant::Variant, RuleEngineService*, const std::string&> engineInfoFuncs_t;
typedef utils::FunctionTable<std::string, libvariant::Variant, rules::RulePackage*, const std::string&> pkgInfoFuncs_t;
typedef utils::FunctionTable<std::string, libvariant::Variant, rules::Rule*, const std::string&> ruleInfoFuncs_t;
typedef utils::FunctionTable<std::string, libvariant::Variant, Poco::Net::HTTPServerRequest&, Poco::Net::HTMLForm&, RuleEngineService*, const std::string&> engineInfoFuncs_t;
typedef utils::FunctionTable<std::string, libvariant::Variant, Poco::Net::HTTPServerRequest&, Poco::Net::HTMLForm&, rules::RulePackage*, const std::string&> pkgInfoFuncs_t;
typedef utils::FunctionTable<std::string, libvariant::Variant, Poco::Net::HTTPServerRequest&, Poco::Net::HTMLForm&, rules::Rule*, const std::string&> ruleInfoFuncs_t;
RuleEngineService* ruleService;
engineInfoFuncs_t engineInfoFuncs;
pkgInfoFuncs_t pkgInfoFuncs;
@@ -92,11 +92,11 @@ public:
virtual Poco::Net::HTTPRequestHandler* createRequestHandler(Poco::URI matchUri, const Poco::Net::HTTPServerRequest& request, bool ssl ) noexcept override;
libvariant::Variant getEngineInfo( RuleEngineService* engine, const std::string& category = "", const std::string& path = "" );
libvariant::Variant getEngineInfo( Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, RuleEngineService* engine, const std::string& category = "", const std::string& path = "" );
libvariant::Variant getRulePkgInfo( rules::RulePackage* pkg, const std::string& category = "", const std::string& path = "" );
libvariant::Variant getRulePkgInfo( Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::RulePackage* pkg, const std::string& category = "", const std::string& path = "" );
libvariant::Variant getRuleInfo( rules::Rule* pkg, const std::string& category = "", const std::string& path = "" );
libvariant::Variant getRuleInfo( Poco::Net::HTTPServerRequest& req, Poco::Net::HTMLForm& form, rules::Rule* pkg, const std::string& category = "", const std::string& path = "" );
};
@@ -6,12 +6,20 @@ define([
'dstore/SimpleQuery',
'dstore/Trackable',
'dstore/Tree',
"dojox/socket",
"dojo/_base/xhr",
"hos/Socket",
"dojo/request/xhr",
"dojox/uuid/generateRandomUuid"
], function(config, declare, Rest, RequestMemory, SimpleQuery, Trackable, Tree, Socket, xhr, generateRandomUuid){
var RuleEngineStore = declare([Rest, RequestMemory, SimpleQuery, Trackable, Tree]);
var RuleEngineStore = declare([Rest, RequestMemory, SimpleQuery, Trackable, Tree], {
_getTarget: function(id){
var target = this.target;
if(!target.slice(-1) == '/'){
target += "/";
}
return target + "packages" + id;
}
});
var _store = new RuleEngineStore({
target: config.hos.ruleEngineUrl
@@ -1,29 +0,0 @@
define([
'dojo/_base/declare',
'dstore/Rest',
'dstore/RequestMemory',
'dstore/SimpleQuery',
'dstore/Trackable',
'hos/Socket',
'dojo/_base/xhr',
'dojox/uuid/generateRandomUuid'
], function(declare, Rest, RequestMemory, SimpleQuery, Trackable, Socket, xhr, generateRandomUuid){
return declare([Rest, RequestMemory, SimpleQuery, Trackable], {
sendDeviceCommand: function(id, cmd) {
console.log("ToDo: send command", cmd ,"to " + id);
var devurl = config.hos.deviceRepoUrl + "/" + id + "?method=command&value=" + encodeURIComponent(JSON.stringify(cmd));
xhr.get({url: devurl}).then(function(data){
// Do something with the handled data
}, function(err){
// Handle the error condition
}, function(evt){
// Handle a progress event from the request if the
// browser supports XHR2
});
};
});
});
+1 -1
View File
@@ -41,7 +41,7 @@
"dojo/on",
"dojo/domReady!"
], function(RuleEngine, domConstruct, dom, on){
var test1 = RuleEngine.get("myid/bla");
var test1 = RuleEngine.get("rulepkg01");
console.log("test1: ", test1);
var test2 = RuleEngine.filter({arg01: "param01"});
console.log("test2: ", test2);