Merge "Fix sli dependency"
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / RestapiCallNode.java
index ca227c7..c4ad4c5 100644 (file)
@@ -8,9 +8,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
 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 e) {
             boolean shouldRetry = false;
-            if (e.getCause() instanceof java.net.SocketException) {
+            if (e.getCause().getCause() instanceof SocketException) {
                 shouldRetry = true;
             }
 
@@ -178,10 +183,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                         URI retryUri = UriBuilder.fromUri(uri).host(uriTwo.getHost()).port(uriTwo.getPort()).scheme(
                                 uriTwo.getScheme()).build();
                         paramMap.put("restapiUrl", retryUri.toString());
-                        log.debug("URL was set to " + retryUri.toString());
-                        log.debug("Failed to communicate with host " + hostname +
-                                ". Request will be re-attempted using the host " + retryString + ".");
-                        log.debug("This is retry attempt " + retryCount + " out of " + retryPolicy.getMaximumRetries());
+                        log.debug("URL was set to {}", retryUri.toString());
+                        log.debug("Failed to communicate with host {}. Request will be re-attempted using the host {}.",
+                            hostname, retryString);
+                        log.debug("This is retry attempt {} out of {}", retryCount, retryPolicy.getMaximumRetries());
                         sendRequest(paramMap, ctx, retryCount);
                     } else {
                         log.debug("Maximum retries reached, calling setFailureResponseStatus.");
@@ -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);
                 }
             }
@@ -204,6 +210,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         Parameters p = new Parameters();
         p.templateFileName = parseParam(paramMap, "templateFileName", false, null);
         p.restapiUrl = parseParam(paramMap, "restapiUrl", true, null);
+        validateUrl(p.restapiUrl);
         p.restapiUser = parseParam(paramMap, "restapiUser", false, null);
         p.restapiPassword = parseParam(paramMap, "restapiPassword", false, null);
         p.contentType = parseParam(paramMap, "contentType", false, null);
@@ -226,6 +233,14 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         return p;
     }
 
+    private void validateUrl(String restapiUrl) throws SvcLogicException {
+        try {
+            URI.create(restapiUrl);
+        } catch (IllegalArgumentException e) {
+            throw new SvcLogicException("Invalid input of url " + e.getLocalizedMessage(), e);
+        }
+    }
+
     protected Set<String> getListNameList(Map<String, String> paramMap) {
         Set<String> ll = new HashSet<>();
         for (Map.Entry<String,String> entry : paramMap.entrySet())
@@ -245,7 +260,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         s = s.trim();
-        String value = "";
+        StringBuilder value = new StringBuilder();
         int i = 0;
         int i1 = s.indexOf('%');
         while (i1 >= 0) {
@@ -258,20 +273,21 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (varValue == null)
                 varValue = "%" + varName + "%";
 
-            value += s.substring(i, i1);
-            value += varValue;
+            value.append(s.substring(i, i1));
+            value.append(varValue);
 
             i = i2 + 1;
             i1 = s.indexOf('%', i);
         }
-        value += s.substring(i);
+        value.append(s.substring(i));
 
-        log.info("Parameter " + name + ": [" + value + "]");
-        return value;
+        log.info("Parameter {}: [{}]", name, value);
+        return value.toString();
     }
 
-    protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format) {
-        log.info("Building " + format + " started");
+    protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format)
+        throws SvcLogicException {
+        log.info("Building {} started", format);
         long t1 = System.currentTimeMillis();
 
         template = expandRepeats(ctx, template, 1);
@@ -291,7 +307,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);
@@ -321,12 +337,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             req = XmlJsonUtil.removeLastCommaJson(req);
 
         long t2 = System.currentTimeMillis();
-        log.info("Building " + format + " completed. Time: " + (t2 - t1));
+        log.info("Building {} completed. Time: {}", format, (t2 - t1));
 
         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 +354,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 +364,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++;
@@ -361,12 +377,13 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             String var1 = template.substring(i1 + 9, i2);
             String value1 = ctx.getAttribute(var1);
-            log.info("     " + var1 + ": " + value1);
+            log.info("     {}:{}", var1, value1);
             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,24 +409,23 @@ 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"))
             ssl = createSSLContext(p);
         if (ssl != null) {
-            HostnameVerifier hostnameVerifier = new HostnameVerifier() {
-
-                @Override
-                public boolean verify(String hostname, SSLSession session) {
-                    return true;
-                }
-            };
+            HostnameVerifier hostnameVerifier = (hostname, session) -> true;
 
             config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                     new HTTPSProperties(hostnameVerifier, ssl));
@@ -451,7 +467,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();
@@ -463,11 +486,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
-        log.info("HTTP response message: " + r.message);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
+        log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
-        log.info("HTTP response: " + r.body);
+        log.info("HTTP response: {}", r.body);
 
         return r;
     }
@@ -478,13 +501,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             System.setProperty("javax.net.ssl.trustStore", p.trustStoreFileName);
             System.setProperty("javax.net.ssl.trustStorePassword", p.trustStorePassword);
 
-            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
-
-                @Override
-                public boolean verify(String string, SSLSession ssls) {
-                    return true;
-                }
-            });
+            HttpsURLConnection.setDefaultHostnameVerifier((string, ssls) -> true);
 
             KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
             KeyStore ks = KeyStore.getInstance("PKCS12");
@@ -496,13 +513,13 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             ctx.init(kmf.getKeyManagers(), null, null);
             return ctx;
         } catch (Exception e) {
-            log.error("Error creating SSLContext: " + e.getMessage(), e);
+            log.error("Error creating SSLContext: {}", e.getMessage(), e);
         }
         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,8 +542,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             r = sendHttpData(data, p);
             setResponseStatus(ctx, p.responsePrefix, r);
 
-        } catch (Exception e) {
-            log.error("Error sending the request: " + e.getMessage(), e);
+        } catch (SvcLogicException | IOException e) {
+            log.error("Error sending the request: {}", e.getMessage(), e);
 
             r = new HttpResponse();
             r.code = 500;
@@ -563,7 +580,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 +597,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();
@@ -597,14 +621,21 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (r.code == 301) {
                 String newUrl = response.getHeaders().getFirst("Location");
 
-                log.info("Got response code 301. Sending same request to URL: " + newUrl);
+                log.info("Got response code 301. Sending same request to URL: {}", newUrl);
 
                 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();
@@ -616,11 +647,11 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
-        log.info("HTTP response message: " + r.message);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
+        log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
-        log.info("HTTP response: " + r.body);
+        log.info("HTTP response: {}", r.body);
 
         return r;
     }
@@ -635,7 +666,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             String req;
 
             if (p.templateFileName == null) {
-                log.info("No template file name specified. Using default UEB template: " + defaultUebTemplateFileName);
+                log.info("No template file name specified. Using default UEB template: {}", defaultUebTemplateFileName);
                 p.templateFileName = defaultUebTemplateFileName;
             }
 
@@ -648,8 +679,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (r.body != null)
                 ctx.setAttribute(pp + "httpResponse", r.body);
 
-        } catch (Exception e) {
-            log.error("Error sending the request: " + e.getMessage(), e);
+        } catch (SvcLogicException e) {
+            log.error("Error sending the request: {}", e.getMessage(), e);
 
             r = new HttpResponse();
             r.code = 500;
@@ -682,7 +713,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("/"))
@@ -694,7 +725,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         client.setConnectTimeout(5000);
         WebResource webResource = client.resource(urls[0]);
 
-        log.info("UEB URL: " + urls[0]);
+        log.info("UEB URL: {}", urls[0]);
         log.info("Sending request:");
         log.info(request);
         long t1 = System.currentTimeMillis();
@@ -706,7 +737,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();
@@ -715,10 +753,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Response received. Time: " + (t2 - t1));
-        log.info("HTTP response code: " + r.code);
+        log.info("Response received. Time: {}", (t2 - t1));
+        log.info("HTTP response code: {}", r.code);
         logHeaders(r.headers);
-        log.info("HTTP response:\n" + r.body);
+        log.info("HTTP response:\n {}", r.body);
 
         return r;
     }
@@ -731,7 +769,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
         log.info("Properties:");
         for (String name : ll)
-            log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+            log.info("--- {}:{}", name, String.valueOf(mm.get(name)));
     }
 
     protected void logHeaders(MultivaluedMap<String, String> mm) {
@@ -746,7 +784,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         Collections.sort(ll);
 
         for (String name : ll)
-            log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+            log.info("--- {}:{}", name, String.valueOf(mm.get(name)));
     }
 
     public void setUebServers(String uebServers) {