Redo admin logic template 06/32706/2
authorZofia Abramowska <z.abramowska@samsung.com>
Mon, 22 Dec 2014 15:40:16 +0000 (16:40 +0100)
committerZofia Abramowska <z.abramowska@samsung.com>
Tue, 23 Dec 2014 16:31:27 +0000 (17:31 +0100)
Template askCynaraAndInterpreteCodeResponse replaced with more general
getResponse.

Change-Id: I3d4ba04ebc5fb279a4eefbe9657a627822c39fc2

src/admin/logic/OnlineLogic.cpp
src/admin/logic/OnlineLogic.h

index 6626a77..d27681b 100644 (file)
@@ -64,8 +64,8 @@ bool OnlineLogic::ensureConnection(void) {
     return m_socketClient->isConnected() || m_socketClient->connect();
 }
 
-template<typename T, typename... Args>
-int OnlineLogic::askCynaraAndInterpreteCodeResponse(Args... args) {
+template<typename Req, typename Res, typename... ReqArgs>
+int OnlineLogic::getResponse(std::shared_ptr<Res> &retResponse, ReqArgs... args) {
     if (!ensureConnection()) {
         LOGE("Cannot connect to cynara. Service not available.");
         return CYNARA_API_SERVICE_NOT_AVAILABLE;
@@ -73,24 +73,25 @@ int OnlineLogic::askCynaraAndInterpreteCodeResponse(Args... args) {
 
     ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
 
-    //Ask cynara service
-    CodeResponsePtr codeResponse;
-
-    RequestPtr request = std::make_shared<T>(args..., sequenceNumber);
+    RequestPtr request = std::make_shared<Req>(args..., sequenceNumber);
     ResponsePtr response;
     while (!(response = m_socketClient->askCynaraServer(request))) {
         if (!m_socketClient->connect())
             return CYNARA_API_SERVICE_NOT_AVAILABLE;
     }
 
-    codeResponse = std::dynamic_pointer_cast<CodeResponse>(response);
-    if (!codeResponse) {
-        LOGC("Critical error. Casting Response to CodeResponse failed.");
+    retResponse = std::dynamic_pointer_cast<Res>(response);
+    if (!retResponse) {
+        LOGC("Critical error. Casting Response failed.");
         return CYNARA_API_UNKNOWN_ERROR;
     }
 
-    LOGD("codeResponse: code [%" PRIu16 "]", codeResponse->m_code);
-    switch (codeResponse->m_code) {
+    return CYNARA_API_SUCCESS;
+}
+
+static int interpretCodeResponse(const CodeResponse::Code &code) {
+    LOGD("codeResponse: code [%" PRIu16 "]", code);
+    switch (code) {
         case CodeResponse::Code::OK:
             LOGI("Cynara command finished successfully.");
             return CYNARA_API_SUCCESS;
@@ -105,49 +106,49 @@ int OnlineLogic::askCynaraAndInterpreteCodeResponse(Args... args) {
             return CYNARA_API_OPERATION_FAILED;
         default:
             LOGE("Unexpected response code from server: [%d]",
-                 static_cast<int>(codeResponse->m_code));
+                 static_cast<int>(code));
             return CYNARA_API_UNKNOWN_ERROR;
     }
 }
 
 int OnlineLogic::setPolicies(const ApiInterface::PoliciesByBucket &insertOrUpdate,
-                             const ApiInterface::KeysByBucket &remove) {
-    return askCynaraAndInterpreteCodeResponse<SetPoliciesRequest>(insertOrUpdate, remove);
+                       const ApiInterface::KeysByBucket &remove) {
+    CodeResponsePtr codeResponse;
+    int ret = getResponse<SetPoliciesRequest>(codeResponse, insertOrUpdate, remove);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
+    }
+
+    return interpretCodeResponse(codeResponse->m_code);
 }
 
 int OnlineLogic::insertOrUpdateBucket(const PolicyBucketId &bucket,
-                                      const PolicyResult &policyResult) {
-    return askCynaraAndInterpreteCodeResponse<InsertOrUpdateBucketRequest>(bucket, policyResult);
-}
+                                const PolicyResult &policyResult) {
+    CodeResponsePtr codeResponse;
+    int ret = getResponse<InsertOrUpdateBucketRequest>(codeResponse, bucket, policyResult);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
+    }
 
-int OnlineLogic::removeBucket(const PolicyBucketId &bucket) {
-    return askCynaraAndInterpreteCodeResponse<RemoveBucketRequest>(bucket);
+    return interpretCodeResponse(codeResponse->m_code);
 }
 
-int OnlineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const PolicyKey &key,
-                            PolicyResult &result) {
-    if (!ensureConnection()) {
-        LOGE("Cannot connect to cynara. Service not available.");
-        return CYNARA_API_SERVICE_NOT_AVAILABLE;
+int OnlineLogic::removeBucket(const PolicyBucketId &bucket) {
+    CodeResponsePtr codeResponse;
+    int ret = getResponse<RemoveBucketRequest>(codeResponse, bucket);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
     }
 
-    ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
+    return interpretCodeResponse(codeResponse->m_code);
+}
 
-    //Ask cynara service
+int OnlineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const PolicyKey &key,
+                      PolicyResult &result) {
     AdminCheckResponsePtr adminCheckResponse;
-
-    RequestPtr request = std::make_shared<AdminCheckRequest>(key, startBucket, recursive,
-                                                             sequenceNumber);
-    ResponsePtr response;
-    while (!(response = m_socketClient->askCynaraServer(request))) {
-        if (!m_socketClient->connect())
-            return CYNARA_API_SERVICE_NOT_AVAILABLE;
-    }
-
-    adminCheckResponse = std::dynamic_pointer_cast<AdminCheckResponse>(response);
-    if (!adminCheckResponse) {
-        LOGC("Casting Response to AdminCheckResponse failed.");
-        return CYNARA_API_UNKNOWN_ERROR;
+    int ret = getResponse<AdminCheckRequest>(adminCheckResponse, key, startBucket, recursive);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
     }
 
     LOGD("AdminCheckResponse: policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d]",
@@ -166,27 +167,10 @@ int OnlineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive, c
 
 int OnlineLogic::listPolicies(const PolicyBucketId &bucket, const PolicyKey &filter,
                         std::vector<Policy> &policies) {
-    if (!ensureConnection()) {
-        LOGE("Cannot connect to cynara. Service not available.");
-        return CYNARA_API_SERVICE_NOT_AVAILABLE;
-    }
-
-    ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber();
-
-    //Ask cynara service
     ListResponsePtr listResponse;
-
-    RequestPtr request = std::make_shared<ListRequest>(bucket, filter, sequenceNumber);
-    ResponsePtr response;
-    while (!(response = m_socketClient->askCynaraServer(request))) {
-        if (!m_socketClient->connect())
-            return CYNARA_API_SERVICE_NOT_AVAILABLE;
-    }
-
-    listResponse = std::dynamic_pointer_cast<ListResponse>(response);
-    if (!listResponse) {
-        LOGC("Casting Response to ListResponse failed.");
-        return CYNARA_API_UNKNOWN_ERROR;
+    int ret = getResponse<ListRequest>(listResponse, bucket, filter);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
     }
 
     LOGD("listResponse: number of policies [%zu], bucketValid [%d]",
@@ -202,7 +186,13 @@ int OnlineLogic::listPolicies(const PolicyBucketId &bucket, const PolicyKey &fil
 
 int OnlineLogic::erasePolicies(const PolicyBucketId &startBucket, bool recursive,
                          const PolicyKey &filter) {
-    return askCynaraAndInterpreteCodeResponse<EraseRequest>(startBucket, recursive, filter);
+    CodeResponsePtr codeResponse;
+    int ret = getResponse<EraseRequest>(codeResponse, startBucket, recursive, filter);
+    if (ret != CYNARA_API_SUCCESS) {
+        return ret;
+    }
+
+    return interpretCodeResponse(codeResponse->m_code);
 }
 
 int OnlineLogic::listDescriptions(std::vector<PolicyDescription> &descriptions) {
index 84becd7..fbcbc48 100644 (file)
@@ -34,8 +34,8 @@ private:
     SocketClientPtr m_socketClient;
 
     bool ensureConnection(void);
-    template<typename T, typename... Args>
-    int askCynaraAndInterpreteCodeResponse(Args... args);
+    template<typename Req, typename Res, typename... ReqArgs>
+    int getResponse(std::shared_ptr<Res> &retResponse, ReqArgs... args);
 
 public:
     OnlineLogic();