Restapi: DELETE with payload doesn't work
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / RestapiCallNode.java
index 83b12c7..9b50eaa 100644 (file)
@@ -25,7 +25,7 @@ package org.onap.ccsdk.sli.plugins.restapicall;
 import static java.lang.Boolean.valueOf;
 import static javax.ws.rs.client.Entity.entity;
 import static org.onap.ccsdk.sli.plugins.restapicall.AuthType.fromString;
-
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.SocketException;
@@ -53,14 +53,19 @@ import javax.ws.rs.client.Invocation;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.Feature;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import org.apache.commons.lang3.StringUtils;
 import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.HttpUrlConnectorProvider;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.glassfish.jersey.client.oauth1.ConsumerCredentials;
 import org.glassfish.jersey.client.oauth1.OAuth1ClientSupport;
+import org.glassfish.jersey.media.multipart.MultiPart;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
@@ -92,8 +97,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         try (FileInputStream in = new FileInputStream(configDir + "/" + DME2_PROPERTIES_FILE_NAME)) {
             Properties props = new Properties();
             props.load(in);
-            this.retryPolicyStore = new RetryPolicyStore();
-            this.retryPolicyStore.setProxyServers(props.getProperty("proxyUrl"));
+            retryPolicyStore = new RetryPolicyStore();
+            retryPolicyStore.setProxyServers(props.getProperty("proxyUrl"));
             log.info("DME2 support enabled");
         } catch (Exception e) {
             log.warn("DME2 properties could not be read, DME2 support will not be enabled.", e);
@@ -102,7 +107,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         try (FileInputStream in = new FileInputStream(configDir + "/" + UEB_PROPERTIES_FILE_NAME)) {
             Properties props = new Properties();
             props.load(in);
-            this.uebServers = props.getProperty("servers");
+            uebServers = props.getProperty("servers");
             log.info("UEB support enabled");
         } catch (Exception e) {
             log.warn("UEB properties could not be read, UEB support will not be enabled.", e);
@@ -165,6 +170,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             false, null));
         p.returnRequestPayload = valueOf(parseParam(
             paramMap, "returnRequestPayload", false, null));
+        p.accept = parseParam(paramMap, "accept",
+                false, null);
+        p.multipartFormData = valueOf(parseParam(paramMap, "multipartFormData",
+                false, "false"));
+        p.multipartFile = parseParam(paramMap, "multipartFile",
+                false, null);
         return p;
     }
 
@@ -454,7 +465,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info("Building {} completed. Time: {}", format, (t2 - t1));
+        log.info("Building {} completed. Time: {}", format, t2 - t1);
 
         return req;
     }
@@ -620,6 +631,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                 .build();
         }
         client.property(ClientProperties.CONNECT_TIMEOUT, 5000);
+        // Needed to support additional HTTP methods such as PATCH
+        client.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
 
         WebTarget webTarget = addAuthType(client, p).target(p.restapiUrl);
 
@@ -630,15 +643,19 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         HttpResponse r = new HttpResponse();
         r.code = 200;
 
-        if (!p.skipSending) {
-            String tt = p.format == Format.XML ? "application/xml" : "application/json";
-            String tt1 = tt + ";charset=UTF-8";
-            if (p.contentType != null) {
-                tt = p.contentType;
-                tt1 = p.contentType;
-            }
+        String accept = p.accept;
+        if(accept == null) {
+            accept = p.format == Format.XML ? "application/xml" : "application/json";
+        }
 
-            Invocation.Builder invocationBuilder = webTarget.request(tt1).accept(tt);
+        String contentType = p.contentType;
+        if(contentType == null) {
+            contentType = accept + ";charset=UTF-8";
+        }
+
+        if (!p.skipSending && !p.multipartFormData) {
+
+            Invocation.Builder invocationBuilder = webTarget.request(contentType).accept(accept);
 
             if (p.format == Format.NONE) {
                 invocationBuilder.header("", "");
@@ -655,10 +672,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
             invocationBuilder.header("X-ECOMP-RequestID", org.slf4j.MDC.get("X-ECOMP-RequestID"));
 
+            invocationBuilder.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
+
             Response response;
 
             try {
-                response = invocationBuilder.method(p.httpMethod.toString(), entity(request, tt1));
+                response = invocationBuilder.method(p.httpMethod.toString(), entity(request, contentType));
             } catch (ProcessingException | IllegalStateException e) {
                 throw new SvcLogicException(requestPostingException +
                     e.getLocalizedMessage(), e);
@@ -673,10 +692,59 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             if (response.hasEntity() && r.code != 204) {
                 r.body = response.readEntity(String.class);
             }
+        } else if (!p.skipSending && p.multipartFormData) {
+
+            WebTarget wt = client.register(MultiPartFeature.class).target(p.restapiUrl);
+
+            MultiPart multiPart = new MultiPart();
+            multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
+
+            FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
+                    new File(p.multipartFile),
+                    MediaType.APPLICATION_OCTET_STREAM_TYPE);
+            multiPart.bodyPart(fileDataBodyPart);
+
+
+            Invocation.Builder invocationBuilder = wt.request(contentType).accept(accept);
+
+            if (p.format == Format.NONE) {
+                invocationBuilder.header("", "");
+            }
+
+            if (p.customHttpHeaders != null && p.customHttpHeaders.length() > 0) {
+                String[] keyValuePairs = p.customHttpHeaders.split(",");
+                for (String singlePair : keyValuePairs) {
+                    int equalPosition = singlePair.indexOf('=');
+                    invocationBuilder.header(singlePair.substring(0, equalPosition),
+                            singlePair.substring(equalPosition + 1, singlePair.length()));
+                }
+            }
+
+            invocationBuilder.header("X-ECOMP-RequestID", org.slf4j.MDC.get("X-ECOMP-RequestID"));
+
+            Response response;
+
+            try {
+                response = invocationBuilder.method(p.httpMethod.toString(), entity(multiPart, multiPart.getMediaType()));
+            } catch (ProcessingException | IllegalStateException e) {
+                throw new SvcLogicException(requestPostingException +
+                        e.getLocalizedMessage(), e);
+            }
+
+            r.code = response.getStatus();
+            r.headers = response.getStringHeaders();
+            EntityTag etag = response.getEntityTag();
+            if (etag != null) {
+                r.message = etag.getValue();
+            }
+            if (response.hasEntity() && r.code != 204) {
+                r.body = response.readEntity(String.class);
+            }
+
         }
 
         long t2 = System.currentTimeMillis();
-        log.info(responseReceivedMessage, (t2 - t1));
+        log.info(responseReceivedMessage, t2 - t1);
         log.info(responseHttpCodeMessage, r.code);
         log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
@@ -851,7 +919,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
                 log.info("Got response code 301. Sending same request to URL: {}", newUrl);
 
-                webTarget = client.target(newUrl);
+                    webTarget = client.target(newUrl);
                 invocationBuilder = webTarget.request(tt).accept(tt);
 
                 try {
@@ -879,7 +947,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info(responseReceivedMessage, (t2 - t1));
+        log.info(responseReceivedMessage, t2 - t1);
         log.info(responseHttpCodeMessage, r.code);
         log.info("HTTP response message: {}", r.message);
         logHeaders(r.headers);
@@ -972,7 +1040,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         }
 
         long t2 = System.currentTimeMillis();
-        log.info(responseReceivedMessage, (t2 - t1));
+        log.info(responseReceivedMessage, t2 - t1);
         log.info(responseHttpCodeMessage, r.code);
         logHeaders(r.headers);
         log.info("HTTP response:\n {}", r.body);
@@ -1012,4 +1080,4 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         public String responsePrefix;
         public boolean skipSending;
     }
-}
\ No newline at end of file
+}