aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpwielebs <piotr.wielebski@nokia.com>2018-04-21 16:51:20 +0200
committerpwielebs <piotr.wielebski@nokia.com>2018-04-23 15:07:22 +0200
commita274374b520aad75c99cdce7f4f9ebc31ce74343 (patch)
treed537e1747184cf7688c7db48bcc91fdc84482817
parent1fb9130cd488228574b49e078148e4bcf1a7a5a8 (diff)
DmaaP http clients added
Change-Id: I1acc7e2a46b81b0af9a3b23982582c9e0053ffa1 Issue-ID: DCAEGEN2-451 Signed-off-by: pwielebs <piotr.wielebski@nokia.com>
-rw-r--r--prh-aai-client/pom.xml1
-rw-r--r--prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java25
-rw-r--r--prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java4
-rw-r--r--prh-app-server/src/test/resources/prh_endpoints.json28
-rw-r--r--prh-dmaap-client/pom.xml5
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java8
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java28
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/CommonMethods.java52
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/DmaapHttpClientImpl.java71
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/HttpUtils.java31
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImpl.java131
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/DmaapPublisherRequestDetails.java38
-rw-r--r--prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImpl.java147
-rw-r--r--prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImplTest.java96
-rw-r--r--prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImplTest.java98
15 files changed, 714 insertions, 49 deletions
diff --git a/prh-aai-client/pom.xml b/prh-aai-client/pom.xml
index 4f5e1867..1b2b1991 100644
--- a/prh-aai-client/pom.xml
+++ b/prh-aai-client/pom.xml
@@ -105,7 +105,6 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
- <version>2.16.0</version>
<scope>test</scope>
</dependency>
</dependencies>
diff --git a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java b/prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java
index 85c8caba..2e6aa9e6 100644
--- a/prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java
+++ b/prh-aai-client/src/main/java/org/onap/dcaegen2/services/service/AAIExtendedHttpClientImpl.java
@@ -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);
+ }
}
diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java
index 42269d44..93555665 100644
--- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java
+++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/configuration/PrhAppConfigTest.java
@@ -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
diff --git a/prh-app-server/src/test/resources/prh_endpoints.json b/prh-app-server/src/test/resources/prh_endpoints.json
index c3e96d65..b401b90d 100644
--- a/prh-app-server/src/test/resources/prh_endpoints.json
+++ b/prh-app-server/src/test/resources/prh_endpoints.json
@@ -14,24 +14,24 @@
"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"
}
}
}
diff --git a/prh-dmaap-client/pom.xml b/prh-dmaap-client/pom.xml
index 48cd9003..ff6a0b30 100644
--- a/prh-dmaap-client/pom.xml
+++ b/prh-dmaap-client/pom.xml
@@ -94,5 +94,10 @@
<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
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java
index de24caec..382dfcad 100644
--- a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapConsumerConfiguration.java
@@ -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
diff --git a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java
index 60df5b05..0c20989a 100644
--- a/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/config/DmaapCustomConfig.java
@@ -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
index 00000000..fe792809
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/CommonMethods.java
@@ -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
index 00000000..be4442d7
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/DmaapHttpClientImpl.java
@@ -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
index 00000000..fb615bbf
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/HttpUtils.java
@@ -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
index 00000000..30d7ad86
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImpl.java
@@ -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
index 00000000..6541fe96
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/DmaapPublisherRequestDetails.java
@@ -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
index 00000000..32972273
--- /dev/null
+++ b/prh-dmaap-client/src/main/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImpl.java
@@ -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
index 00000000..21d3e4c2
--- /dev/null
+++ b/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/consumer/ExtendedDmaapConsumerHttpClientImplTest.java
@@ -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
index 00000000..67c58f55
--- /dev/null
+++ b/prh-dmaap-client/src/test/java/org/onap/dcaegen2/services/service/producer/ExtendedDmaapProducerHttpClientImplTest.java
@@ -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);
+ }
+}