DmaaP http clients added 01/43401/5
authorpwielebs <piotr.wielebski@nokia.com>
Sat, 21 Apr 2018 14:51:20 +0000 (16:51 +0200)
committerpwielebs <piotr.wielebski@nokia.com>
Mon, 23 Apr 2018 13:07:22 +0000 (15:07 +0200)
Change-Id: I1acc7e2a46b81b0af9a3b23982582c9e0053ffa1
Issue-ID: DCAEGEN2-451
Signed-off-by: pwielebs <piotr.wielebski@nokia.com>
15 files changed:
prh-aai-client/pom.xml
prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java
prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java
prh-app-server/src/test/resources/prh_endpoints.json
prh-dmaap-client/pom.xml
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/CommonMethods.java [new file with mode: 0644]
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/DmaapHttpClientImpl.java [new file with mode: 0644]
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/HttpUtils.java [new file with mode: 0644]
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImpl.java [new file with mode: 0644]
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/DmaapPublisherRequestDetails.java [new file with mode: 0644]
prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImpl.java [new file with mode: 0644]
prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImplTest.java [new file with mode: 0644]
prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImplTest.java [new file with mode: 0644]

index 4f5e186..1b2b199 100644 (file)
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
-      <version>2.16.0</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
index 85c8cab..2e6aa9e 100644 (file)
@@ -65,24 +65,13 @@ public class AAIExtendedHttpClientImpl implements AAIExtendedHttpClient {
     }
 
     @Override
-    public Optional<String> getHttpResponse(HttpRequestDetails httpRequestDetails) {
+    public Optional<String> getHttpResponse(HttpRequestDetails requestDetails) {
 
         Optional<String> extendedDetails = Optional.empty();
-
-        final URI extendedURI = createAAIExtendedURI(httpRequestDetails.aaiAPIPath(),
-                httpRequestDetails.queryParameters());
-        final HttpRequestBase request = createHttpRequest(extendedURI, httpRequestDetails);
-
-        if (request == null) {
-            return Optional.empty();
-        }
-
-        for (Map.Entry<String, String> headersEntry : httpRequestDetails.headers().entrySet()) {
-            request.addHeader(headersEntry.getKey(), headersEntry.getValue());
-        }
+        Optional<HttpRequestBase> request = createRequest(requestDetails);
 
         try {
-            extendedDetails = closeableHttpClient.execute(request, aaiResponseHandler());
+            extendedDetails = closeableHttpClient.execute(request.get(), aaiResponseHandler());
         } catch (IOException e) {
             logger.error("Exception while executing HTTP request: {}", e);
         }
@@ -191,4 +180,12 @@ public class AAIExtendedHttpClientImpl implements AAIExtendedHttpClient {
     private Boolean isPatchRequestValid(RequestVerbs requestVerb, Optional<String> jsonBody) {
         return requestVerb == RequestVerbs.PATCH && jsonBody.isPresent();
     }
+
+    private Optional<HttpRequestBase> createRequest(HttpRequestDetails requestDetails) {
+
+        final URI extendedURI = createAAIExtendedURI(requestDetails.aaiAPIPath(), requestDetails.queryParameters());
+        HttpRequestBase request = createHttpRequest(extendedURI, requestDetails);
+        requestDetails.headers().forEach(request::addHeader);
+        return Optional.of(request);
+    }
 }
index 42269d4..9355566 100644 (file)
@@ -44,8 +44,8 @@ import org.onap.dcaegen2.services.prh.IT.junit5.mockito.MockitoExtension;
 class PrhAppConfigTest {
 
     private static final String PRH_ENDPOINTS = "prh_endpoints.json";
-    private static final String jsonString = "{\"configs\":{\"aai\":{\"aaiHttpClientConfiguration\":{\"aaiHost\":\"\",\"aaiHostPortNumber\":8080,\"aaiIgnoreSSLCertificateErrors\":true,\"aaiProtocol\":\"https\",\"aaiUserName\":\"admin\",\"aaiUserPassword\":\"admin\"}},\"dmaap\":{\"dmaapConsumerConfiguration\":{\"consumerGroup\":\"other\",\"consumerId\":\"1\",\"dmmapContentType\":\"application/json\",\"dmmapHostName\":\"localhost\",\"dmmapPortNumber\":2222,\"dmmapProtocol\":\"http\",\"dmmapTopicName\":\"temp\",\"dmmapUserName\":\"admin\",\"dmmapUserPassword\":\"admin\",\"messageLimit\":1000,\"timeoutMS\":1000},\"dmaapProducerConfiguration\":{\"dmmapContentType\":\"application/json\",\"dmmapHostName\":\"localhost\",\"dmmapPortNumber\":2223,\"dmmapProtocol\":\"http\",\"dmmapTopicName\":\"temp\",\"dmmapUserName\":\"admin\",\"dmmapUserPassword\":\"admin\"}}}}";
-    private static final String incorrectJsonString = "{\"configs\":{\"aai\":{\"aaiHttpClientConfiguration\":{\"aaiHost\":\"\",\"aaiHostPortNumber\":8080,\"aaiIgnoreSSLCertificateErrors\":true,\"aaiProtocol\":\"https\",\"aaiUserName\":\"admin\",\"aaiUserPassword\":\"admin\"}},\"dmaap\":{\"dmaapConsumerConfiguration\":{\"consumerGroup\":\"other\",\"consumerId\":\"1\",\"dmmapContentType\":\"application/json\",\"dmmapHostName\":\"localhost\",\"dmmapPortNumber\":2222,\"dmmapProtocol\":\"http\",\"dmmapTopicName\":\"temp\",\"dmmapUserName\":\"admin\",\"dmmapUserPassword\":\"admin\",\"messageLimit\":1000,\"timeoutMS\":1000},\"dmaapProducerConfiguration\":{\"dmmapContentType\":\"application/json\",\"dmmapHostName\":\"localhost\",\"dmmapPortNumber\":2223,\"dmmapProtocol\":\"http\",\"dmmaptopicName\":\"temp\",\"dmmapuserName\":\"admin\",\"dmmapuserPassword\":\"admin\"}}}}";
+    private static final String jsonString = "{\"configs\":{\"aai\":{\"aaiHttpClientConfiguration\":{\"aaiHost\":\"\",\"aaiHostPortNumber\":8080,\"aaiIgnoreSSLCertificateErrors\":true,\"aaiProtocol\":\"https\",\"aaiUserName\":\"admin\",\"aaiUserPassword\":\"admin\"}},\"dmaap\":{\"dmaapConsumerConfiguration\":{\"consumerGroup\":\"other\",\"consumerId\":\"1\",\"dmaapContentType\":\"application/json\",\"dmaapHostName\":\"localhost\",\"dmaapPortNumber\":2222,\"dmaapProtocol\":\"http\",\"dmaapTopicName\":\"temp\",\"dmaapUserName\":\"admin\",\"dmaapUserPassword\":\"admin\",\"messageLimit\":1000,\"timeoutMS\":1000},\"dmaapProducerConfiguration\":{\"dmaapContentType\":\"application/json\",\"dmaapHostName\":\"localhost\",\"dmaapPortNumber\":2223,\"dmaapProtocol\":\"http\",\"dmaapTopicName\":\"temp\",\"dmaapUserName\":\"admin\",\"dmaapUserPassword\":\"admin\"}}}}";
+    private static final String incorrectJsonString = "{\"configs\":{\"aai\":{\"aaiHttpClientConfiguration\":{\"aaiHost\":\"\",\"aaiHostPortNumber\":8080,\"aaiIgnoreSSLCertificateErrors\":true,\"aaiProtocol\":\"https\",\"aaiUserName\":\"admin\",\"aaiUserPassword\":\"admin\"}},\"dmaap\":{\"dmaapConsumerConfiguration\":{\"consumerGroup\":\"other\",\"consumerId\":\"1\",\"dmaapContentType\":\"application/json\",\"dmaapHostName\":\"localhost\",\"dmaapPortNumber\":2222,\"dmaapProtocol\":\"http\",\"dmaapTopicName\":\"temp\",\"dmaapUserName\":\"admin\",\"dmaapUserPassword\":\"admin\",\"messageLimit\":1000,\"timeoutMS\":1000},\"dmaapProducerConfiguration\":{\"dmaapContentType\":\"application/json\",\"dmaapHostName\":\"localhost\",\"dmaapPortNumber\":2223,\"dmaapProtocol\":\"http\",\"dmaaptopicName\":\"temp\",\"dmaapuserName\":\"admin\",\"dmaapuserPassword\":\"admin\"}}}}";
     private static PrhAppConfig prhAppConfig;
 
     private static String filePath = Objects
index c3e96d6..b401b90 100644 (file)
       "dmaapConsumerConfiguration": {
         "consumerGroup": "other",
         "consumerId": "1",
-        "dmmapContentType": "application/json",
-        "dmmapHostName": "localhost",
-        "dmmapPortNumber": 2222,
-        "dmmapProtocol": "http",
-        "dmmapTopicName": "temp",
-        "dmmapUserName": "admin",
-        "dmmapUserPassword": "admin",
+        "dmaapContentType": "application/json",
+        "dmaapHostName": "localhost",
+        "dmaapPortNumber": 2222,
+        "dmaapProtocol": "http",
+        "dmaapTopicName": "temp",
+        "dmaapUserName": "admin",
+        "dmaapUserPassword": "admin",
         "messageLimit": 1000,
         "timeoutMS": 1000
       },
       "dmaapProducerConfiguration": {
-        "dmmapContentType": "application/json",
-        "dmmapHostName": "localhost",
-        "dmmapPortNumber": 2223,
-        "dmmapProtocol": "http",
-        "dmmapTopicName": "temp",
-        "dmmapUserName": "admin",
-        "dmmapUserPassword": "admin"
+        "dmaapContentType": "application/json",
+        "dmaapHostName": "localhost",
+        "dmaapPortNumber": 2223,
+        "dmaapProtocol": "http",
+        "dmaapTopicName": "temp",
+        "dmaapUserName": "admin",
+        "dmaapUserPassword": "admin"
       }
     }
   }
index 48cd900..ff6a0b3 100644 (file)
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
index de24cae..382dfca 100644 (file)
@@ -35,16 +35,16 @@ public abstract class DmaapConsumerConfiguration implements DmaapCustomConfig {
     private static final long serialVersionUID = 1L;
 
     @Value.Parameter
-    abstract String consumerId();
+    public abstract String consumerId();
 
     @Value.Parameter
-    abstract String consumerGroup();
+    public abstract String consumerGroup();
 
     @Value.Parameter
-    abstract Integer timeoutMS();
+    public abstract Integer timeoutMS();
 
     @Value.Parameter
-    abstract Integer messageLimit();
+    public abstract Integer messageLimit();
 
 
     public interface Builder extends
index 60df5b0..0c20989 100644 (file)
@@ -28,42 +28,42 @@ import org.immutables.value.Value;
 public interface DmaapCustomConfig extends Serializable {
 
     @Value.Parameter
-    String dmmapHostName();
+    String dmaapHostName();
 
     @Value.Parameter
-    Integer dmmapPortNumber();
+    Integer dmaapPortNumber();
 
     @Value.Parameter
-    String dmmapTopicName();
+    String dmaapTopicName();
 
     @Value.Parameter
-    String dmmapProtocol();
+    String dmaapProtocol();
 
     @Value.Parameter
-    String dmmapUserName();
+    String dmaapUserName();
 
     @Value.Parameter
-    String dmmapUserPassword();
+    String dmaapUserPassword();
 
     @Value.Parameter
-    String dmmapContentType();
+    String dmaapContentType();
 
 
     interface Builder<T extends DmaapCustomConfig, B extends Builder<T, B>> {
 
-        B dmmapHostName(String dmmapHostName);
+        B dmaapHostName(String dmaapHostName);
 
-        B dmmapPortNumber(Integer dmmapPortNumber);
+        B dmaapPortNumber(Integer dmaapPortNumber);
 
-        B dmmapTopicName(String dmmapTopicName);
+        B dmaapTopicName(String dmaapTopicName);
 
-        B dmmapProtocol(String dmmapProtocol);
+        B dmaapProtocol(String dmaapProtocol);
 
-        B dmmapUserName(String dmmapUserName);
+        B dmaapUserName(String dmaapUserName);
 
-        B dmmapUserPassword(String dmmapUserPassword);
+        B dmaapUserPassword(String dmaapUserPassword);
 
-        B dmmapContentType(String dmmapContentType);
+        B dmaapContentType(String dmaapContentType);
 
         T build();
     }
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/CommonMethods.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/CommonMethods.java
new file mode 100644 (file)
index 0000000..fe79280
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.service;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Optional;
+
+public class CommonMethods {
+
+    private static Logger logger = LoggerFactory.getLogger(CommonMethods.class);
+
+    private CommonMethods() {}
+
+    public static ResponseHandler<Optional<String>> dmaapResponseHandler() {
+        return httpResponse ->  {
+            final int responseCode = httpResponse.getStatusLine().getStatusCode();
+            final HttpEntity responseEntity = httpResponse.getEntity();
+
+            if (HttpUtils.isSuccessfulResponseCode(responseCode) && responseEntity != null) {
+                logger.info("HTTP response successful.");
+                final String response = EntityUtils.toString(responseEntity);
+                return Optional.of(response);
+            } else {
+                String response = responseEntity != null ? EntityUtils.toString(responseEntity) : "";
+                logger.error("HTTP response not successful : {}", response);
+                return Optional.empty();
+            }
+        };
+    }
+}
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/DmaapHttpClientImpl.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/DmaapHttpClientImpl.java
new file mode 100644 (file)
index 0000000..be4442d
--- /dev/null
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service;
+
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.Credentials;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.onap.dcaegen2.services.config.DmaapCustomConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DmaapHttpClientImpl {
+
+    private static Logger logger = LoggerFactory.getLogger(DmaapHttpClientImpl.class);
+
+    private final String dmaapHostName;
+    private final Integer dmaapPortNumber;
+    private final String dmaapUserName;
+    private final String dmaapUserPassword;
+
+
+    public DmaapHttpClientImpl(DmaapCustomConfig configuration) {
+        this.dmaapHostName = configuration.dmaapHostName();
+        this.dmaapPortNumber = configuration.dmaapPortNumber();
+        this.dmaapUserName = configuration.dmaapUserName();
+        this.dmaapUserPassword = configuration.dmaapUserPassword();
+    }
+
+    public CloseableHttpClient getHttpClient() {
+
+        logger.info("Preparing closeable http client");
+
+        HttpClientBuilder httpClientBuilder = HttpClients.custom().useSystemProperties();
+
+        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+
+        if (dmaapUserName != null) {
+            final AuthScope dmaapHostPortAuthScope = new AuthScope(dmaapHostName, dmaapPortNumber);
+            final Credentials dmaapCredentials = new UsernamePasswordCredentials(dmaapUserName, dmaapUserPassword);
+            credentialsProvider.setCredentials(dmaapHostPortAuthScope, dmaapCredentials);
+        }
+
+        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+
+        return httpClientBuilder.build();
+    }
+
+}
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/HttpUtils.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/HttpUtils.java
new file mode 100644 (file)
index 0000000..fb615bb
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.dcaegen2.services.service;
+
+import org.apache.http.HttpStatus;
+
+public final class HttpUtils implements HttpStatus {
+
+    private HttpUtils() {}
+
+    public static boolean isSuccessfulResponseCode(Integer statusCode) {
+        return statusCode >= 200 && statusCode < 300;
+    }
+}
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImpl.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImpl.java
new file mode 100644 (file)
index 0000000..30d7ad8
--- /dev/null
@@ -0,0 +1,131 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service.consumer;
+
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.onap.dcaegen2.services.config.DmaapConsumerConfiguration;
+import org.onap.dcaegen2.services.service.CommonMethods;
+import org.onap.dcaegen2.services.service.DmaapHttpClientImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Optional;
+
+
+public class ExtendedDmaapConsumerHttpClientImpl {
+
+    private static Logger logger = LoggerFactory.getLogger(ExtendedDmaapConsumerHttpClientImpl.class);
+
+    private final CloseableHttpClient closeableHttpClient;
+    private final String dmaapHostName;
+    private final String dmaapProtocol;
+    private final Integer dmaapPortNumber;
+    private final String dmaapTopicName;
+    private final String consumerGroup;
+    private final String consumerId;
+    private final String dmaapContentType;
+
+
+    public ExtendedDmaapConsumerHttpClientImpl(DmaapConsumerConfiguration configuration) {
+        this.closeableHttpClient = new DmaapHttpClientImpl(configuration).getHttpClient();
+        this.dmaapHostName = configuration.dmaapHostName();
+        this.dmaapProtocol = configuration.dmaapProtocol();
+        this.dmaapPortNumber = configuration.dmaapPortNumber();
+        this.dmaapTopicName = configuration.dmaapTopicName();
+        this.consumerGroup = configuration.consumerGroup();
+        this.consumerId = configuration.consumerId();
+        this.dmaapContentType = configuration.dmaapContentType();
+    }
+
+    public Optional<String> getHttpConsumerResponse() {
+
+        Optional<String> extendedDetails = Optional.empty();
+        Optional<HttpRequestBase> request = createRequest();
+
+        try {
+            extendedDetails = closeableHttpClient.execute(request.get(), CommonMethods.dmaapResponseHandler());
+        } catch (IOException | NullPointerException e) {
+            logger.error("Exception while executing HTTP request: {}", e);
+        }
+
+        if (extendedDetails.isPresent()) {
+            return extendedDetails;
+        } else {
+            return Optional.empty();
+        }
+    }
+
+    private static HttpRequestBase createHttpRequest(URI extendedURI) {
+        if (isExtendedURINotNull(extendedURI)) {
+            return new HttpGet(extendedURI);
+        }
+
+        return null;
+    }
+
+    private static Boolean isExtendedURINotNull(URI extendedURI) {
+        return extendedURI != null;
+    }
+
+    private Optional<HttpRequestBase> createRequest() {
+
+        Optional<HttpRequestBase> request = Optional.empty();
+        final URI extendedURI = createDmaapConsumerExtendedURI();
+
+        if ("application/json".equals(dmaapContentType)) {
+            request = Optional.of(createHttpRequest(extendedURI));
+            request.get().addHeader("Content-type", dmaapContentType);
+        }
+
+        return request;
+    }
+
+    private String createRequestPath() {
+        return dmaapTopicName + "/" + consumerGroup + "/" + consumerId;
+    }
+
+    private URI createDmaapConsumerExtendedURI() {
+        URI extendedURI = null;
+
+        final URIBuilder uriBuilder = new URIBuilder()
+                .setScheme(dmaapProtocol)
+                .setHost(dmaapHostName)
+                .setPort(dmaapPortNumber)
+                .setPath(createRequestPath());
+
+        try {
+            logger.info("Building extended URI");
+            extendedURI = uriBuilder.build();
+        } catch (URISyntaxException e) {
+            logger.error("Exception while building extended URI: {}", e);
+        }
+
+        return extendedURI;
+    }
+}
+
+
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/DmaapPublisherRequestDetails.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/DmaapPublisherRequestDetails.java
new file mode 100644 (file)
index 0000000..6541fe9
--- /dev/null
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service.producer;
+
+import org.immutables.value.Value;
+
+import java.util.Optional;
+
+@Value.Immutable(prehash = true)
+@Value.Style(builder = "new")
+public abstract class DmaapPublisherRequestDetails {
+
+    private static final long serialVersionUID = 1L;
+
+    @Value.Parameter
+    public abstract String dmaapAPIPath();
+
+    @Value.Parameter
+    public abstract Optional<String> jsonBody();
+}
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImpl.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImpl.java
new file mode 100644 (file)
index 0000000..3297227
--- /dev/null
@@ -0,0 +1,147 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service.producer;
+
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.onap.dcaegen2.services.config.DmaapPublisherConfiguration;
+import org.onap.dcaegen2.services.service.CommonMethods;
+import org.onap.dcaegen2.services.service.DmaapHttpClientImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Optional;
+
+public class ExtendedDmaapProducerHttpClientImpl {
+
+    private static Logger logger = LoggerFactory.getLogger(ExtendedDmaapProducerHttpClientImpl.class);
+
+    private final CloseableHttpClient closeableHttpClient;
+    private final String dmaapHostName;
+    private final String dmaapProtocol;
+    private final Integer dmaapPortNumber;
+    private final String dmaapTopicName;
+    private final String dmaapContentType;
+
+
+    ExtendedDmaapProducerHttpClientImpl(DmaapPublisherConfiguration configuration) {
+        this.closeableHttpClient = new DmaapHttpClientImpl(configuration).getHttpClient();
+        this.dmaapHostName = configuration.dmaapHostName();
+        this.dmaapProtocol = configuration.dmaapProtocol();
+        this.dmaapPortNumber = configuration.dmaapPortNumber();
+        this.dmaapTopicName = configuration.dmaapTopicName();
+        this.dmaapContentType = configuration.dmaapContentType();
+    }
+
+    public Optional<String> getHttpProducerResponse(DmaapPublisherRequestDetails requestDetails) {
+
+        Optional<String> extendedDetails = Optional.empty();
+        Optional<HttpRequestBase> request = createRequest(requestDetails);
+
+        try {
+            extendedDetails = closeableHttpClient.execute(request.get(), CommonMethods.dmaapResponseHandler());
+        } catch (IOException | NullPointerException e) {
+            logger.error("Exception while executing HTTP request: {}", e);
+        }
+
+        if (extendedDetails.isPresent()) {
+            return extendedDetails;
+        } else {
+            return Optional.empty();
+        }
+    }
+
+    private Boolean isExtendedURINotNull(URI extendedURI) {
+        return extendedURI != null;
+    }
+
+    private Optional<StringEntity> createStringEntity(Optional<String> jsonBody) {
+        return Optional.of(parseJson(jsonBody).get());
+    }
+
+    private Optional<StringEntity> parseJson(Optional<String> jsonBody) {
+        Optional<StringEntity> stringEntity = Optional.empty();
+
+        try {
+            stringEntity = Optional.of(new StringEntity(jsonBody.get()));
+        } catch (UnsupportedEncodingException e) {
+            logger.error("Exception while parsing JSON: {}", e);
+        }
+
+        return stringEntity;
+    }
+
+    private Optional<HttpRequestBase> createRequest (DmaapPublisherRequestDetails requestDetails) {
+
+        Optional<HttpRequestBase> request = Optional.empty();
+        final URI extendedURI = createDmaapPublisherExtendedURI(requestDetails);
+
+        if ("application/json".equals(dmaapContentType)) {
+            request = Optional.of(createRequest(extendedURI, requestDetails));
+            request.get().addHeader("Content-type", dmaapContentType);
+        }
+
+        return request;
+    }
+
+    private URI createDmaapPublisherExtendedURI(DmaapPublisherRequestDetails requestDetails) {
+        URI extendedURI = null;
+
+        final URIBuilder uriBuilder = new URIBuilder()
+                .setScheme(dmaapProtocol)
+                .setHost(dmaapHostName)
+                .setPort(dmaapPortNumber)
+                .setPath(requestDetails.dmaapAPIPath() + "/" + dmaapTopicName);
+
+        try {
+            logger.info("Building extended URI");
+            extendedURI = uriBuilder.build();
+        } catch (URISyntaxException e) {
+            logger.error("Exception while building extended URI: {}", e);
+        }
+
+        return extendedURI;
+    }
+
+    private HttpRequestBase createRequest(URI extendedURI, DmaapPublisherRequestDetails requestDetails) {
+        if (isExtendedURINotNull(extendedURI) && requestDetails.jsonBody().isPresent()) {
+            return createHttpPost(extendedURI, requestDetails.jsonBody());
+        } else {
+            return null;
+        }
+    }
+
+    private HttpPost createHttpPost(URI extendedURI, Optional<String> jsonBody) {
+        HttpPost post = new HttpPost(extendedURI);
+        Optional<StringEntity> stringEntity = createStringEntity(jsonBody);
+        post.setEntity(stringEntity.get());
+        return post;
+    }
+
+
+}
diff --git a/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImplTest.java b/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImplTest.java
new file mode 100644 (file)
index 0000000..21d3e4c
--- /dev/null
@@ -0,0 +1,96 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service.consumer;
+
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.config.DmaapConsumerConfiguration;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Optional;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+
+public class ExtendedDmaapConsumerHttpClientImplTest {
+
+    private static ExtendedDmaapConsumerHttpClientImpl objectUnderTest;
+
+    private static DmaapConsumerConfiguration configurationMock = mock(DmaapConsumerConfiguration.class);
+    private static CloseableHttpClient closeableHttpClientMock = mock(CloseableHttpClient.class);
+
+    private static final String JSON_MESSAGE = "{ \"responseFromDmaap\": \"Success\" }";
+
+    private static Optional<String> expectedResult = Optional.empty();
+
+    @BeforeAll
+    public static void init() throws NoSuchFieldException, IllegalAccessException {
+
+        when(configurationMock.dmaapHostName()).thenReturn("54.45.33.2");
+        when(configurationMock.dmaapProtocol()).thenReturn("https");
+        when(configurationMock.dmaapPortNumber()).thenReturn(1234);
+        when(configurationMock.dmaapUserName()).thenReturn("PRH");
+        when(configurationMock.dmaapUserPassword()).thenReturn("PRH");
+        when(configurationMock.dmaapContentType()).thenReturn("application/json");
+        when(configurationMock.dmaapTopicName()).thenReturn("pnfReady");
+        when(configurationMock.consumerGroup()).thenReturn("consumerGroup");
+        when(configurationMock.consumerId()).thenReturn("consumerId");
+
+        objectUnderTest = new ExtendedDmaapConsumerHttpClientImpl(configurationMock);
+
+        setField();
+    }
+
+
+    @Test
+    public void getHttpResponseGet_success() throws IOException {
+        expectedResult = Optional.of(JSON_MESSAGE);
+
+        when(closeableHttpClientMock.execute(any(HttpGet.class), any(ResponseHandler.class)))
+                .thenReturn(expectedResult);
+
+        Optional<String> actualResult = objectUnderTest.getHttpConsumerResponse();
+
+        Assertions.assertEquals(expectedResult.get(), actualResult.get());
+    }
+
+    @Test
+    public void getExtendedDetails_returnsNull() throws IOException {
+        when(closeableHttpClientMock.execute(any(HttpGet.class), any(ResponseHandler.class))).
+                thenReturn(Optional.empty());
+        Optional<String>  actualResult = objectUnderTest.getHttpConsumerResponse();
+        Assertions.assertEquals(Optional.empty(),actualResult);
+    }
+
+
+    private static void setField() throws NoSuchFieldException, IllegalAccessException {
+        Field field = objectUnderTest.getClass().getDeclaredField("closeableHttpClient");
+        field.setAccessible(true);
+        field.set(objectUnderTest, closeableHttpClientMock);
+    }
+}
diff --git a/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImplTest.java b/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImplTest.java
new file mode 100644 (file)
index 0000000..67c58f5
--- /dev/null
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PNF-REGISTRATION-HANDLER
+ * ================================================================================
+ * Copyright (C) 2018 NOKIA Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.service.producer;
+
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.services.config.DmaapPublisherConfiguration;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Optional;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+
+public class ExtendedDmaapProducerHttpClientImplTest {
+
+    private static ExtendedDmaapProducerHttpClientImpl objectUnderTest;
+
+    private static DmaapPublisherConfiguration configurationMock = mock(DmaapPublisherConfiguration.class);
+    private static CloseableHttpClient closeableHttpClientMock = mock(CloseableHttpClient.class);
+    private static DmaapPublisherRequestDetails requestDetailsMock = mock(DmaapPublisherRequestDetails.class);
+
+    private static Optional<String> expectedResult = Optional.empty();
+    private static final String JSON_MESSAGE = "{ \"ipaddress-v4-oam\": \"11.22.33.44\" }";
+
+    @BeforeAll
+    public static void init() throws NoSuchFieldException, IllegalAccessException {
+
+        when(configurationMock.dmaapHostName()).thenReturn("54.45.33.2");
+        when(configurationMock.dmaapProtocol()).thenReturn("https");
+        when(configurationMock.dmaapPortNumber()).thenReturn(1234);
+        when(configurationMock.dmaapUserName()).thenReturn("PRH");
+        when(configurationMock.dmaapUserPassword()).thenReturn("PRH");
+        when(configurationMock.dmaapContentType()).thenReturn("application/json");
+        when(configurationMock.dmaapTopicName()).thenReturn("pnfReady");
+
+        when(requestDetailsMock.dmaapAPIPath()).thenReturn("events");
+        when(requestDetailsMock.jsonBody()).thenReturn(Optional.of(JSON_MESSAGE));
+
+        objectUnderTest = new ExtendedDmaapProducerHttpClientImpl(configurationMock);
+
+        setField();
+    }
+
+
+    @Test
+    public void getHttpResponsePost_success() throws IOException {
+        expectedResult = Optional.of(JSON_MESSAGE);
+
+        when(closeableHttpClientMock.execute(any(HttpPost.class), any(ResponseHandler.class)))
+                .thenReturn(expectedResult);
+
+        Optional<String> actualResult = objectUnderTest.getHttpProducerResponse(requestDetailsMock);
+
+        Assertions.assertEquals(expectedResult.get(), actualResult.get());
+    }
+
+    @Test
+    public void getExtendedDetails_returnsNull() throws IOException {
+        expectedResult = Optional.of(JSON_MESSAGE);
+        when(closeableHttpClientMock.execute(any(HttpPost.class), any(ResponseHandler.class))).
+                thenReturn(Optional.empty());
+        Optional<String>  actualResult = objectUnderTest.getHttpProducerResponse(requestDetailsMock);
+        Assertions.assertEquals(Optional.empty(),actualResult);
+    }
+
+
+    private static void setField() throws NoSuchFieldException, IllegalAccessException {
+        Field field = objectUnderTest.getClass().getDeclaredField("closeableHttpClient");
+        field.setAccessible(true);
+        field.set(objectUnderTest, closeableHttpClientMock);
+    }
+}