Add support for multi part form data 41/85141/3
authorGaurav Agrawal <gaurav.agrawal@huawei.com>
Fri, 12 Apr 2019 04:38:20 +0000 (10:08 +0530)
committerTimoney, Dan (dt5972) <dtimoney@att.com>
Tue, 16 Apr 2019 14:05:39 +0000 (10:05 -0400)
Add support for multipart form data in CCSDK

Change-Id: Iacc35efe28b9d91afcfc1e87e0faf41fc74d5c8a
Issue-ID: CCSDK-239
Signed-off-by: Gaurav Agrawal <gaurav.agrawal@huawei.com>
restapi-call-node/provider/pom.xml
restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/Parameters.java
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 c555601..2455866 100755 (executable)
             <artifactId>jersey-client</artifactId>
             <version>${jersey.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-multipart</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
 
         <!-- For test -->
         <dependency>
index 8f65cf2..aeb07c4 100644 (file)
@@ -51,4 +51,6 @@ public class Parameters {
     public AuthType authtype;
     public Boolean returnRequestPayload;
     public String accept;
+    public boolean multipartFormData;
+    public String multipartFile;
 }
index 521c66c..a7235fc 100644 (file)
@@ -26,6 +26,7 @@ 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;
@@ -51,17 +52,17 @@ import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Entity;
 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.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.*;
+
 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;
@@ -168,6 +169,10 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             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;
     }
 
@@ -635,15 +640,17 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
         HttpResponse r = new HttpResponse();
         r.code = 200;
 
-        if (!p.skipSending) {
-            String accept = p.accept;
-            if(accept == null) {
-                accept = p.format == Format.XML ? "application/xml" : "application/json";
-            }
-            String contentType = p.contentType;
-            if(contentType == null) {
-                contentType = accept + ";charset=UTF-8";
-            }
+        String accept = p.accept;
+        if(accept == null) {
+            accept = p.format == Format.XML ? "application/xml" : "application/json";
+        }
+
+        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);
 
@@ -680,6 +687,55 @@ 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();
@@ -858,7 +914,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 {
index fd982d7..5b047e4 100644 (file)
@@ -224,6 +224,33 @@ public class TestRestapiCallNode {
         rcn.sendRequest(p, ctx);
     }
 
+    @Test(expected = SvcLogicException.class)
+    public void testFormData() 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");
+        p.put("multipartFormData", "true");
+        p.put("multipartFile", "src/test/resources/test-template.json");
+
+        RestapiCallNode rcn = new RestapiCallNode();
+        rcn.sendRequest(p, ctx);
+    }
 
     @Test(expected = SvcLogicException.class)
     public void testWithInvalidURI() throws SvcLogicException {