Support merge JSON to SvcLogicContext 27/102527/4
authorDan Timoney <dtimoney@att.com>
Thu, 27 Feb 2020 21:27:37 +0000 (16:27 -0500)
committerDan Timoney <dtimoney@att.com>
Fri, 28 Feb 2020 16:30:33 +0000 (16:30 +0000)
Add support for merging JSON into SvcLogicContext

Change-Id: If13fd6328a36ccff6393d0829319bbd99cd2a1f0
Issue-ID: CCSDK-2096
Signed-off-by: Dan Timoney <dtimoney@att.com>
sli/common/pom.xml
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicContext.java
sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SvcLogicServiceBase.java
sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/provider/base/SvcLogicServiceImplBase.java
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiController.java
sliapi/springboot/src/test/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiControllerTest.java

index 8290a42..2570f33 100755 (executable)
             <groupId>org.onap.logging-analytics</groupId>
             <artifactId>logging-slf4j</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
         <!-- Testing Dependencies -->
         <dependency>
             <groupId>junit</groupId>
index 3681e1e..fcd51d1 100644 (file)
@@ -25,6 +25,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+
+import com.google.gson.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -207,6 +209,38 @@ public class SvcLogicContext {
 
        }
 
+       public void mergeJson(String pfx, String jsonString) {
+               JsonParser jp = new JsonParser();
+               JsonElement element = jp.parse(jsonString);
+
+               mergeJsonObject(element.getAsJsonObject(), pfx+".");
+       }
+
+       public void mergeJsonObject(JsonObject jsonObject, String pfx) {
+               for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
+                       if (entry.getValue().isJsonObject()) {
+                               mergeJsonObject(entry.getValue().getAsJsonObject(), pfx + entry.getKey() + ".");
+                       } else if (entry.getValue().isJsonArray()) {
+                               JsonArray array = entry.getValue().getAsJsonArray();
+                               this.setAttribute(pfx + entry.getKey() + "_length", String.valueOf(array.size()));
+                               Integer arrayIdx = 0;
+                               for (JsonElement element : array) {
+                                       if (element.isJsonObject()) {
+                                               mergeJsonObject(element.getAsJsonObject(), pfx + entry.getKey() + "[" + arrayIdx + "].");
+                                       }
+                                       arrayIdx++;
+                               }
+                       } else {
+                               if (entry.getValue() instanceof JsonNull) {
+                                       LOG.debug("Skipping parameter {} with null value",entry.getKey());
+
+                               } else {
+                                       this.setAttribute(pfx + entry.getKey(), entry.getValue().getAsString());
+                               }
+                       }
+               }
+       }
+
        public String resolve(String ctxVarName) {
 
                if (ctxVarName.indexOf('[') == -1) {
index 8c436fe..3bade81 100644 (file)
@@ -56,6 +56,20 @@ public interface SvcLogicServiceBase {
      *
      */
     Properties execute(String module, String rpc, String version, String mode, Properties parms) throws SvcLogicException;
+    /**
+     *  Execute a directed graph
+     *
+     * @param module - module name
+     * @param rpc - rpc name
+     * @param version - version.  If null, use active version
+     * @param mode - mode (sync/async)
+     * @param ctx - parameters, as a SvcLogicContext object
+     * @return final values of attributes from SvcLogicContext, as Properties
+     * @throws SvcLogicException
+     *
+     *
+     */
+    SvcLogicContext execute(String module, String rpc, String version, String mode, SvcLogicContext ctx) throws SvcLogicException;
 
     SvcLogicStore getStore() throws SvcLogicException;
 
index 80d992f..75673f7 100644 (file)
@@ -142,25 +142,37 @@ public class SvcLogicServiceImplBase implements SvcLogicServiceBase {
     @Override
     public Properties execute(String module, String rpc, String version, String mode, Properties props)
             throws SvcLogicException {
+
+        SvcLogicContext ctx = new SvcLogicContext(props);
+
+        return(execute(module, rpc, version, mode, ctx).toProperties());
+    }
+
+    @Override
+    public SvcLogicContext execute(String module, String rpc, String version, String mode, SvcLogicContext ctx) throws SvcLogicException {
         SvcLogicGraph graph = store.fetch(module, rpc, version, mode);
 
+               if (ctx == null) {
+                       ctx = new SvcLogicContext();
+               }
+
         if (graph == null) {
-            Properties retProps = new Properties();
-            retProps.setProperty("error-code", "401");
-            retProps.setProperty("error-message",
+            ctx.setAttribute("error-code", "401");
+            ctx.setAttribute("error-message",
                     "No service logic found for [" + module + "," + rpc + "," + version + "," + mode + "]");
-            return (retProps);
+            return (ctx);
         }
 
-        SvcLogicContext ctx = new SvcLogicContext(props);
+
+
         ctx.setAttribute(CURRENT_GRAPH, graph.toString());
         // To support legacy code we should not stop populating X-ECOMP-RequestID
         ctx.setAttribute("X-ECOMP-RequestID", MDC.get(ONAPLogConstants.MDCs.REQUEST_ID));
         execute(graph, ctx);
-        return (ctx.toProperties());
+        return (ctx);
     }
 
-       @Override
+    @Override
        public SvcLogicStore getStore() throws SvcLogicException {
                return this.store;
        }
index 7c4717d..2da5490 100644 (file)
@@ -85,8 +85,9 @@ public class RestconfApiController implements RestconfApi {
 
                try {
                        log.info("Calling SLI-API:healthcheck DG");
-                       Properties inputProps = new Properties();
-                       Properties respProps = svc.execute("sli", "healthcheck", null, "sync", inputProps);
+                       SvcLogicContext ctxIn = new SvcLogicContext();
+                       SvcLogicContext ctxOut = svc.execute("sli", "healthcheck", null, "sync", ctxIn);
+                       Properties respProps = ctxOut.toProperties();
 
                        resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
                        resp.setResponseCode(respProps.getProperty("error-code", "200"));
@@ -110,9 +111,9 @@ public class RestconfApiController implements RestconfApi {
 
                try {
                        log.info("Calling SLI-API:vlbcheck DG");
-                       Properties inputProps = new Properties();
-                       Properties respProps = svc.execute("sli", "vlbcheck", null, "sync", inputProps);
-
+                       SvcLogicContext ctxIn = new SvcLogicContext();
+                       SvcLogicContext ctxOut = svc.execute("sli", "vlbcheck", null, "sync", ctxIn);
+                       Properties respProps = ctxOut.toProperties();
                        resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
                        resp.setResponseCode(respProps.getProperty("error-code", "200"));
                        resp.setResponseMessage(respProps.getProperty("error-message", "Success"));
@@ -142,7 +143,7 @@ public class RestconfApiController implements RestconfApi {
 
        @Override
        public ResponseEntity<ResponseFields> executeGraph(@Valid ExecuteGraphInput executeGraphInput) {
-               Properties parms = new Properties();
+               SvcLogicContext ctxIn = new SvcLogicContext();
                ResponseFields resp = new ResponseFields();
                String executeGraphInputJson = null;
 
@@ -161,8 +162,7 @@ public class RestconfApiController implements RestconfApi {
                JsonObject jsonInput = new Gson().fromJson(executeGraphInputJson, JsonObject.class);
                JsonObject passthroughObj = jsonInput.get("input").getAsJsonObject();
 
-               writeResponseToCtx(passthroughObj.toString(), parms, "input");
-
+               ctxIn.mergeJson("input", passthroughObj.toString());
 
                try {
                        // Any of these can throw a nullpointer exception
@@ -170,7 +170,8 @@ public class RestconfApiController implements RestconfApi {
                        String calledRpc = executeGraphInput.getInput().getRpcName();
                        String modeStr = executeGraphInput.getInput().getMode();
                        // execute should only throw a SvcLogicException
-                       Properties respProps = svc.execute(calledModule, calledRpc, null, modeStr, parms);
+                       SvcLogicContext ctxOut = svc.execute(calledModule, calledRpc, null, modeStr, ctxIn);
+                       Properties respProps = ctxOut.toProperties();
 
                        resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
                        resp.setResponseCode(respProps.getProperty("error-code", "200"));
@@ -193,37 +194,6 @@ public class RestconfApiController implements RestconfApi {
                }
        }
 
-       public static void writeResponseToCtx(String resp, Properties ctx, String prefix) {
-               JsonParser jp = new JsonParser();
-               JsonElement element = jp.parse(resp);
-               writeJsonObject(element.getAsJsonObject(), ctx, prefix + ".");
-       }
-
-       public static void writeJsonObject(JsonObject obj, Properties ctx, String root) {
-               for (Map.Entry<String, JsonElement> entry : obj.entrySet()) {
-                       if (entry.getValue().isJsonObject()) {
-                               writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + entry.getKey() + ".");
-                       } else if (entry.getValue().isJsonArray()) {
-                               JsonArray array = entry.getValue().getAsJsonArray();
-                               ctx.put(root + entry.getKey() + "_length", String.valueOf(array.size()));
-                               Integer arrayIdx = 0;
-                               for (JsonElement element : array) {
-                                       if (element.isJsonObject()) {
-                                               writeJsonObject(element.getAsJsonObject(), ctx, root + entry.getKey() + "[" + arrayIdx + "].");
-                                       }
-                                       arrayIdx++;
-                               }
-                       } else {
-                               if (entry.getValue() instanceof JsonNull) {
-                                       log.info("Skipping parameter "+entry.getKey()+" with null value");
-
-                               } else {
-                                       ctx.put(root + entry.getKey(), entry.getValue().getAsString());
-                               }
-                       }
-               }
-       }
-
        public static String propsToJson(Properties props, String root)
        {
                StringBuffer sbuff = new StringBuffer();
index 701cb3e..13f5939 100644 (file)
@@ -7,6 +7,8 @@ import org.junit.runner.RunWith;
 import org.onap.ccsdk.sli.core.sliapi.model.ExecuteGraphInput;
 import org.onap.ccsdk.sli.core.sliapi.model.ExecutegraphinputInput;
 import org.onap.ccsdk.sli.core.sliapi.model.ResponseFields;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.http.MediaType;
@@ -21,6 +23,9 @@ import static org.junit.Assert.assertEquals;
 @WebMvcTest(RestconfApiController.class)
 public class RestconfApiControllerTest {
 
+
+    private static final Logger log = LoggerFactory.getLogger(RestconfApiControllerTest.class);
+
     @Autowired
     private MockMvc mvc;
 
@@ -56,6 +61,7 @@ public class RestconfApiControllerTest {
         executeGraphInput.setInput(executeGraphData);
 
         String jsonString = mapToJson(executeGraphInput);
+        log.error("jsonString is {}", jsonString);
 
         MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(jsonString)).andReturn();
 
@@ -77,6 +83,8 @@ public class RestconfApiControllerTest {
 
         String jsonString = mapToJson(executeGraphInput);
 
+        log.error("jsonString is {}", jsonString);
+
         MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(jsonString)).andReturn();
 
         assertEquals(401, mvcResult.getResponse().getStatus());