Using specific exceptions in RestApiCallNode 91/13391/2
authorGaurav Agrawal <gaurav.agrawal@huawei.com>
Tue, 19 Sep 2017 10:08:32 +0000 (15:38 +0530)
committerGaurav Agrawal <gaurav.agrawal@huawei.com>
Tue, 19 Sep 2017 12:29:24 +0000 (17:59 +0530)
Changes includes
1) Sonar critical fixes stating use of specific exceptions instead of generic one
2) Throw exception for invalid input of repeat times.
3) Added testcases
https://sonar.onap.org/component_issues/index?id=org.onap.ccsdk.sli.plugins%3Accsdk-sli-plugins#resolved=false|severities=CRITICAL

Change-Id: I2633f857e161bf7068c51ef835b7c2cd5eb5aa62
Issue-Id: CCSDK-67
Signed-off-by: Gaurav Agrawal <gaurav.agrawal@huawei.com>
restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java
restapi-call-node/provider/src/test/java/jtest/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java

index ca227c7..4bdbd00 100644 (file)
 
 package org.onap.ccsdk.sli.plugins.restapicall;
 
+import com.sun.jersey.api.client.ClientHandlerException;
+import com.sun.jersey.api.client.UniformInterfaceException;
 import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.SocketException;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -45,6 +49,7 @@ import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.UriBuilder;
 
 import org.apache.commons.lang3.StringUtils;
+import org.codehaus.jettison.json.JSONException;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
@@ -114,7 +119,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             throws SvcLogicException {
 
         RetryPolicy retryPolicy = null;
-        HttpResponse r = null;
+        HttpResponse r = new HttpResponse();
         try {
             Parameters p = getParameters(paramMap);
             if (p.partner != null) {
@@ -151,9 +156,9 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                             ctx.setAttribute(pp + entry.getKey(), entry.getValue());
                 }
             }
-        } catch (Exception e) {
+        } catch (SvcLogicException | JSONException e) {
             boolean shouldRetry = false;
-            if (e.getCause() instanceof java.net.SocketException) {
+            if (e.getCause().getCause() instanceof SocketException) {
                 shouldRetry = true;
             }
 
@@ -190,7 +195,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                 } catch (Exception ex) {
                     log.error("Could not attempt retry.", ex);
                     String retryErrorMessage =
-                            "Retry attempt has failed. No further retry shall be attempted, calling setFailureResponseStatus.";
+                            "Retry attempt has failed. No further retry shall be attempted, calling " +
+                                "setFailureResponseStatus.";
                     setFailureResponseStatus(ctx, prefix, retryErrorMessage, r);
                 }
             }
@@ -270,7 +276,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return value;
     }
 
-    protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format) {
+    protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format)
+        throws SvcLogicException {
         log.info("Building " + format + " started");
         long t1 = System.currentTimeMillis();
 
@@ -291,7 +298,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             int i2 = template.indexOf('}', i1 + 2);
             if (i2 < 0)
-                throw new RuntimeException("Template error: Matching } not found");
+                throw new SvcLogicException("Template error: Matching } not found");
 
             String var1 = template.substring(i1 + 2, i2);
             String value1 = format == Format.XML ? XmlJsonUtil.getXml(mm, var1) : XmlJsonUtil.getJson(mm, var1);
@@ -326,7 +333,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return req;
     }
 
-    protected String expandRepeats(SvcLogicContext ctx, String template, int level) {
+    protected String expandRepeats(SvcLogicContext ctx, String template, int level) throws SvcLogicException {
         StringBuilder newTemplate = new StringBuilder();
         int k = 0;
         while (k < template.length()) {
@@ -338,7 +345,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             int i2 = template.indexOf(':', i1 + 9);
             if (i2 < 0)
-                throw new RuntimeException(
+                throw new SvcLogicException(
                         "Template error: Context variable name followed by : is required after repeat");
 
             // Find the closing }, store in i3
@@ -348,7 +355,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             while (nn > 0 && i < template.length()) {
                 i3 = template.indexOf('}', i);
                 if (i3 < 0)
-                    throw new RuntimeException("Template error: Matching } not found");
+                    throw new SvcLogicException("Template error: Matching } not found");
                 int i32 = template.indexOf('{', i);
                 if (i32 >= 0 && i32 < i3) {
                     nn++;
@@ -365,8 +372,9 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             int n = 0;
             try {
                 n = Integer.parseInt(value1);
-            } catch (Exception e) {
-                n = 0;
+            } catch (NumberFormatException e) {
+                throw new SvcLogicException("Invalid input of repeat interval, should be an integer value " +
+                    e.getLocalizedMessage(), e);
             }
 
             newTemplate.append(template.substring(k, i1));
@@ -392,12 +400,17 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return expandRepeats(ctx, newTemplate.toString(), level + 1);
     }
 
-    protected String readFile(String fileName) throws Exception {
-        byte[] encoded = Files.readAllBytes(Paths.get(fileName));
-        return new String(encoded, "UTF-8");
+    protected String readFile(String fileName) throws SvcLogicException {
+        try {
+            byte[] encoded = Files.readAllBytes(Paths.get(fileName));
+            return new String(encoded, "UTF-8");
+        } catch (IOException | SecurityException e) {
+            throw new SvcLogicException("Unable to read file " + fileName + e.getLocalizedMessage(), e);
+        }
     }
 
-    protected HttpResponse sendHttpRequest(String request, Parameters p) throws Exception {
+    protected HttpResponse sendHttpRequest(String request, Parameters p) throws SvcLogicException {
+
         ClientConfig config = new DefaultClientConfig();
         SSLContext ssl = null;
         if (p.ssl && p.restapiUrl.startsWith("https"))
@@ -451,7 +464,14 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             webResourceBuilder.header("X-ECOMP-RequestID",org.slf4j.MDC.get("X-ECOMP-RequestID"));
 
-            ClientResponse response = webResourceBuilder.method(p.httpMethod.toString(), ClientResponse.class, request);
+            ClientResponse response;
+
+            try {
+                response = webResourceBuilder.method(p.httpMethod.toString(), ClientResponse.class, request);
+            } catch (UniformInterfaceException | ClientHandlerException e) {
+                throw new SvcLogicException("Exception while sending http request to client "
+                    + e.getLocalizedMessage(), e);
+            }
 
             r.code = response.getStatus();
             r.headers = response.getHeaders();
@@ -501,8 +521,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return null;
     }
 
-    protected void setFailureResponseStatus(SvcLogicContext ctx, String prefix, String errorMessage, HttpResponse r) {
-        HttpResponse resp = new HttpResponse();
+    protected void setFailureResponseStatus(SvcLogicContext ctx, String prefix, String errorMessage,
+        HttpResponse resp) {
         resp.code = 500;
         resp.message = errorMessage;
         String pp = prefix != null ? prefix + '.' : "";
@@ -525,7 +545,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             r = sendHttpData(data, p);
             setResponseStatus(ctx, p.responsePrefix, r);
 
-        } catch (Exception e) {
+        } catch (SvcLogicException | IOException e) {
             log.error("Error sending the request: " + e.getMessage(), e);
 
             r = new HttpResponse();
@@ -563,7 +583,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return p;
     }
 
-    protected HttpResponse sendHttpData(byte[] data, FileParam p) {
+    protected HttpResponse sendHttpData(byte[] data, FileParam p) throws SvcLogicException {
         Client client = Client.create();
         client.setConnectTimeout(5000);
         client.setFollowRedirects(true);
@@ -580,11 +600,18 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         if (!p.skipSending) {
             String tt = "application/octet-stream";
 
-            ClientResponse response = null;
-            if (p.httpMethod == HttpMethod.POST)
-                response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
-            else if (p.httpMethod == HttpMethod.PUT)
-                response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+            ClientResponse response;
+            try {
+                if (p.httpMethod == HttpMethod.POST)
+                    response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
+                else if (p.httpMethod == HttpMethod.PUT)
+                    response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+                else
+                    throw new SvcLogicException("Http operation" + p.httpMethod + "not supported");
+            } catch (UniformInterfaceException | ClientHandlerException e) {
+                throw new SvcLogicException("Exception while sending http request to client " +
+                    e.getLocalizedMessage(), e);
+            }
 
             r.code = response.getStatus();
             r.headers = response.getHeaders();
@@ -601,10 +628,17 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
                 webResource = client.resource(newUrl);
 
-                if (p.httpMethod == HttpMethod.POST)
-                    response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
-                else if (p.httpMethod == HttpMethod.PUT)
-                    response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+                try {
+                    if (p.httpMethod == HttpMethod.POST)
+                        response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
+                    else if (p.httpMethod == HttpMethod.PUT)
+                        response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+                    else
+                        throw new SvcLogicException("Http operation" + p.httpMethod + "not supported");
+                } catch (UniformInterfaceException | ClientHandlerException e) {
+                    throw new SvcLogicException("Exception while sending http request to client " +
+                        e.getLocalizedMessage(), e);
+                }
 
                 r.code = response.getStatus();
                 etag = response.getEntityTag();
@@ -648,7 +682,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (r.body != null)
                 ctx.setAttribute(pp + "httpResponse", r.body);
 
-        } catch (Exception e) {
+        } catch (SvcLogicException e) {
             log.error("Error sending the request: " + e.getMessage(), e);
 
             r = new HttpResponse();
@@ -682,7 +716,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return p;
     }
 
-    protected HttpResponse postOnUeb(String request, UebParam p) throws Exception {
+    protected HttpResponse postOnUeb(String request, UebParam p) throws SvcLogicException {
         String[] urls = uebServers.split(" ");
         for (int i = 0; i < urls.length; i++) {
             if (!urls[i].endsWith("/"))
@@ -706,7 +740,14 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             String tt = "application/json";
             String tt1 = tt + ";charset=UTF-8";
 
-            ClientResponse response = webResource.accept(tt).type(tt1).post(ClientResponse.class, request);
+            ClientResponse response;
+
+            try {
+                response = webResource.accept(tt).type(tt1).post(ClientResponse.class, request);
+            } catch (UniformInterfaceException | ClientHandlerException e) {
+                throw new SvcLogicException("Exception while posting http request to client " +
+                    e.getLocalizedMessage(), e);
+            }
 
             r.code = response.getStatus();
             r.headers = response.getHeaders();
index ff97148..51c3947 100644 (file)
@@ -26,6 +26,7 @@ import java.util.Map;
 
 import org.junit.Test;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.plugins.restapicall.RestapiCallNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +37,7 @@ public class TestRestapiCallNode {
 
 
     @Test
-    public void testDelete() throws Exception {
+    public void testDelete() throws SvcLogicException {
         SvcLogicContext ctx = new SvcLogicContext();
 
         Map<String, String> p = new HashMap<String, String>();
@@ -51,7 +52,7 @@ public class TestRestapiCallNode {
     }
 
     @Test
-    public void testJsonTemplate() throws Exception {
+    public void testJsonTemplate() throws SvcLogicException {
         SvcLogicContext ctx = new SvcLogicContext();
         ctx.setAttribute("tmp.sdn-circuit-req-row_length", "3");
         ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
@@ -89,4 +90,82 @@ public class TestRestapiCallNode {
         RestapiCallNode rcn = new RestapiCallNode();
         rcn.sendRequest(p, ctx);
     }
+
+    @Test(expected = SvcLogicException.class)
+    public void testInvalidRepeatTimes() throws SvcLogicException {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "a");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
+
+        Map<String, String> p = new HashMap<String, String>();
+        p.put("templateFileName", "src/test/resources/test-template.json");
+        p.put("restapiUrl", "http://echo.getpostman.com");
+        p.put("restapiUser", "user1");
+        p.put("restapiPassword", "abc123");
+        p.put("format", "json");
+        p.put("httpMethod", "post");
+        p.put("responsePrefix", "response");
+        p.put("skipSending", "true");
+
+        RestapiCallNode rcn = new RestapiCallNode();
+        rcn.sendRequest(p, ctx);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void testInvalidTemplatePath() throws SvcLogicException {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
+
+        Map<String, String> p = new HashMap<String, String>();
+        p.put("templateFileName", "src/test/resourcess/test-template.json");
+        p.put("restapiUrl", "http://echo.getpostman.com");
+        p.put("restapiUser", "user1");
+        p.put("restapiPassword", "abc123");
+        p.put("format", "json");
+        p.put("httpMethod", "post");
+        p.put("responsePrefix", "response");
+        p.put("skipSending", "true");
+
+        RestapiCallNode rcn = new RestapiCallNode();
+        rcn.sendRequest(p, ctx);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void testWithoutSkipSending() throws SvcLogicException {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
+        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
+
+        Map<String, String> p = new HashMap<String, String>();
+        p.put("templateFileName", "src/test/resources/test-template.json");
+        p.put("restapiUrl", "http://echo.getpostman.com");
+        p.put("restapiUser", "user1");
+        p.put("restapiPassword", "abc123");
+        p.put("format", "json");
+        p.put("httpMethod", "post");
+        p.put("responsePrefix", "response");
+        p.put("skipSending", "false");
+
+        RestapiCallNode rcn = new RestapiCallNode();
+        rcn.sendRequest(p, ctx);
+    }
 }