Modified template manager as singleton 58/58558/5
authorSomin Kim <somin926.kim@samsung.com>
Mon, 1 Feb 2016 12:06:11 +0000 (21:06 +0900)
committerSomin Kim <somin926.kim@samsung.com>
Mon, 15 Feb 2016 10:09:57 +0000 (02:09 -0800)
- rule_manager calls apply_templates() to synchronize template db

Change-Id: I9b3b5d7fac7d78f61c15f3ae660a63d92be72494
Signed-off-by: Somin Kim <somin926.kim@samsung.com>
src/context_trigger/rule_manager.cpp
src/context_trigger/rule_manager.h
src/context_trigger/template_manager.cpp
src/context_trigger/template_manager.h
src/context_trigger/trigger.cpp
src/context_trigger/trigger.h

index cb8f579..61b745e 100644 (file)
@@ -20,6 +20,7 @@
 #include <db_mgr.h>
 #include <app_manager.h>
 #include "rule_manager.h"
+#include "template_manager.h"
 #include "context_monitor.h"
 #include "rule.h"
 #include "timer.h"
@@ -235,6 +236,7 @@ bool ctx::rule_manager::reenable_rule(void)
        _D(YELLOW("Re-enable rule started"));
 
        std::string q_rowid;
+       q_rowid.clear();
        std::vector<json>::iterator vec_end = record.end();
        for (std::vector<json>::iterator vec_pos = record.begin(); vec_pos != vec_end; ++vec_pos) {
                ctx::json elem = *vec_pos;
@@ -248,6 +250,7 @@ bool ctx::rule_manager::reenable_rule(void)
                        _E("Re-enable rule%d failed(%d)", row_id, error);
                }
        }
+       IF_FAIL_RETURN(!q_rowid.empty(), true);
        q_rowid = q_rowid.substr(0, q_rowid.length() - 4);
 
        // For rules which is failed to re-enable
@@ -499,6 +502,7 @@ int ctx::rule_manager::verify_rule(ctx::json& rule, const char* creator)
 
 int ctx::rule_manager::add_rule(std::string creator, const char* app_id, ctx::json rule, ctx::json* rule_id)
 {
+       apply_templates();
        bool ret;
        int64_t rid;
 
@@ -543,6 +547,7 @@ int ctx::rule_manager::add_rule(std::string creator, const char* app_id, ctx::js
 
 int ctx::rule_manager::remove_rule(int rule_id)
 {
+       apply_templates();
        bool ret;
 
        // Delete rule from DB
@@ -560,6 +565,7 @@ int ctx::rule_manager::remove_rule(int rule_id)
 
 int ctx::rule_manager::enable_rule(int rule_id)
 {
+       apply_templates();
        int error;
        std::string query;
        std::vector<json> rule_record;
@@ -610,6 +616,7 @@ CATCH:
 
 int ctx::rule_manager::disable_rule(int rule_id)
 {
+       apply_templates();
        bool ret;
        int error;
 
@@ -709,6 +716,7 @@ bool ctx::rule_manager::is_rule_enabled(int rule_id)
 
 int ctx::rule_manager::get_rule_by_id(std::string creator, int rule_id, ctx::json* request_result)
 {
+       apply_templates();
        std::string q = "SELECT description FROM context_trigger_rule WHERE (creator = '";
        q += creator;
        q += "') and (row_id = ";
@@ -764,3 +772,10 @@ int ctx::rule_manager::get_rule_ids(std::string creator, ctx::json* request_resu
 
        return ERR_NONE;
 }
+
+void ctx::rule_manager::apply_templates()
+{
+       ctx::template_manager* tmpl_mgr = ctx::template_manager::get_instance();
+       IF_FAIL_VOID_TAG(tmpl_mgr, _E, "Memory allocation failed");
+       tmpl_mgr->apply_templates();
+}
index 62c2e5d..bf054e9 100644 (file)
@@ -56,6 +56,7 @@ namespace ctx {
                        bool rule_equals(ctx::json& lrule, ctx::json& rrule);
                        int get_uninstalled_app(void);
                        int clear_rule_of_uninstalled_app(bool is_init = false);
+                       void apply_templates(void);
 
                        std::set<std::string> uninstalled_apps;
 
index f90bccf..a1c2cf2 100644 (file)
 #include "rule_manager.h"
 #include "template_manager.h"
 
+ctx::template_manager *ctx::template_manager::_instance = NULL;
+ctx::context_manager_impl *ctx::template_manager::_context_mgr = NULL;
+ctx::rule_manager *ctx::template_manager::_rule_mgr = NULL;
+
 static std::string int_to_string(int i)
 {
        std::ostringstream convert;
@@ -30,14 +34,41 @@ static std::string int_to_string(int i)
        return str;
 }
 
-ctx::template_manager::template_manager(ctx::context_manager_impl* ctx_mgr, ctx::rule_manager* rule_mgr)
-: _context_mgr(ctx_mgr), _rule_mgr(rule_mgr)
+ctx::template_manager::template_manager()
 {
 }
 
 ctx::template_manager::~template_manager()
 {
-       apply_templates();
+}
+
+void ctx::template_manager::set_manager(ctx::context_manager_impl* ctx_mgr, ctx::rule_manager* rule_mgr)
+{
+       _context_mgr = ctx_mgr;
+       _rule_mgr = rule_mgr;
+}
+
+ctx::template_manager* ctx::template_manager::get_instance()
+{
+       IF_FAIL_RETURN_TAG(_context_mgr, NULL, _E, "Context manager is needed");
+       IF_FAIL_RETURN_TAG(_rule_mgr, NULL, _E, "Rule manager is needed");
+
+       IF_FAIL_RETURN(!_instance, _instance);
+
+       _instance = new(std::nothrow) template_manager();
+       IF_FAIL_RETURN_TAG(_instance, NULL, _E, "Memory alllocation failed");
+
+       return _instance;
+}
+
+void ctx::template_manager::destroy()
+{
+       _instance->apply_templates();
+
+       if (_instance) {
+               delete _instance;
+               _instance = NULL;
+       }
 }
 
 bool ctx::template_manager::init()
index 245db76..dc578e6 100644 (file)
@@ -25,16 +25,22 @@ namespace ctx {
        class rule_manager;
        class template_manager {
        public:
-               template_manager(ctx::context_manager_impl* ctx_mgr, ctx::rule_manager* rule_mgr);
-               ~template_manager();
+               static template_manager* get_instance();
+               static void set_manager(ctx::context_manager_impl* ctx_mgr, ctx::rule_manager* rule_mgr);
+               static void destroy();
 
                bool init();
                void apply_templates();
                int get_template(std::string &subject, ctx::json* tmpl);
 
        private:
-               context_manager_impl *_context_mgr;
-               rule_manager *_rule_mgr;
+               template_manager();
+               template_manager(const template_manager& other);
+               ~template_manager();
+
+               static template_manager *_instance;
+               static context_manager_impl *_context_mgr;
+               static rule_manager *_rule_mgr;
 
                std::string add_template(std::string &subject, int &operation, ctx::json &attributes, ctx::json &options, std::string &owner);
                std::string remove_template(std::string &subject);
index 994fb55..94b3f15 100644 (file)
@@ -23,7 +23,6 @@
 
 ctx::context_trigger::context_trigger()
        : rule_mgr(NULL)
-       , tmpl_mgr(NULL)
 {
 }
 
@@ -45,14 +44,15 @@ void ctx::context_trigger::release()
 {
        // Release the occupied resources.
        // This function is called from the main thread during the service termination process.
-       _D("Template Manager Release");
-       delete tmpl_mgr;
-       tmpl_mgr = NULL;
+
+       _D("Template Manager Destroy");
+       ctx::template_manager::destroy();
 
        _D("Rule Manager Release");
        delete rule_mgr;
        rule_mgr = NULL;
 
+       _D("Context Monitor Destroy");
        ctx::context_monitor::destroy();
 }
 
@@ -106,7 +106,8 @@ void ctx::context_trigger::process_initialize(ctx::context_manager_impl* mgr)
        IF_FAIL_VOID_TAG(rule_mgr, _E, "Memory allocation failed");
 
        // Template Manager
-       tmpl_mgr = new(std::nothrow) template_manager(mgr, rule_mgr);
+       ctx::template_manager::set_manager(mgr, rule_mgr);
+       ctx::template_manager* tmpl_mgr = ctx::template_manager::get_instance();
        IF_FAIL_VOID_TAG(tmpl_mgr, _E, "Memory allocation failed");
 
        // Initialization
@@ -278,6 +279,13 @@ void ctx::context_trigger::get_template(ctx::request_info* request)
        std::string name;
        option.get(NULL, SUBJECT_STR, &name);
 
+       ctx::template_manager* tmpl_mgr = ctx::template_manager::get_instance();
+       if (!tmpl_mgr) {
+               _E("Memory allocation failed");
+               request->reply(ERR_OUT_OF_MEMORY);
+               return;
+       }
+
        ctx::json tmpl;
        error = tmpl_mgr->get_template(name, &tmpl);
 
index 9d03a40..5a371d1 100644 (file)
@@ -21,7 +21,6 @@
 
 namespace ctx {
 
-       class template_manager;
        class rule_manager;
        class client_request;
        class context_manager_impl;
@@ -48,7 +47,6 @@ namespace ctx {
                        void get_template(ctx::request_info* request);
 
                        ctx::rule_manager* rule_mgr;
-                       ctx::template_manager* tmpl_mgr;
        };
 
 }      /* namespace ctx */