AAI HTTP simple and extended clients added

Change-Id: I759aeeb64085dbe32883a942941bffc8e03515f7
Issue-ID: DCAEGEN2-407
Signed-off-by: pwielebs <piotr.wielebski@nokia.com>
diff --git a/pom.xml b/pom.xml
index 9843357..142ae73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -401,7 +401,27 @@
         <artifactId>docker-maven-plugin</artifactId>
         <version>1.0.0</version>
       </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.4</version>
+        </dependency>
 
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>10.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>5.0.4.RELEASE</version>
+        </dependency>
 
       <!-- LOGGING dependencies> -->
       <dependency>
@@ -471,7 +491,6 @@
         <scope>test</scope>
       </dependency>
 
-
       <!-- ONLY REQUIRED TO RUN TESTS IN AN IDE THAT BUNDLES AN OLDER VERSION -->
       <dependency>
         <groupId>org.junit.platform</groupId>
diff --git a/prh-aai-client/pom.xml b/prh-aai-client/pom.xml
index 6ac6484..6a40d32 100644
--- a/prh-aai-client/pom.xml
+++ b/prh-aai-client/pom.xml
@@ -46,6 +46,29 @@
       <groupId>org.immutables</groupId>
       <artifactId>value</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+    </dependency>
+
+    <!-- VERSION SET DUE TO THE FAILING BUILD-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+      <version>3.0.2.RELEASE</version>
+    </dependency>
+      <dependency>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+      </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
 
     <!-- LOGGING DEPENDENCIES-->
     <dependency>
@@ -84,4 +107,4 @@
     </dependency>
 
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/prh-aai-client/src/main/java/services/config/AAIDmaapProducerConfiguration.java b/prh-aai-client/src/main/java/services/config/AAIHttpClientConfiguration.java
similarity index 86%
rename from prh-aai-client/src/main/java/services/config/AAIDmaapProducerConfiguration.java
rename to prh-aai-client/src/main/java/services/config/AAIHttpClientConfiguration.java
index dfeafdd..4c50966 100644
--- a/prh-aai-client/src/main/java/services/config/AAIDmaapProducerConfiguration.java
+++ b/prh-aai-client/src/main/java/services/config/AAIHttpClientConfiguration.java
@@ -17,17 +17,17 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+
 package services.config;
 
-import java.net.URL;
-import org.immutables.value.Value;
 
-/**
- * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 3/23/18
- */
+import org.immutables.value.Value;
+import org.springframework.stereotype.Component;
+
+@Component
 @Value.Immutable(prehash = true)
 @Value.Style(stagedBuilder = true)
-public abstract class AAIDmaapProducerConfiguration implements AAIConfig {
+public abstract class AAIHttpClientConfiguration implements AAIConfig {
 
     private static final long serialVersionUID = 1L;
 
@@ -47,9 +47,6 @@
     public abstract String aaiUserPassword();
 
     @Value.Parameter
-    public abstract URL aaiProxyURL();
-
-    @Value.Parameter
     public abstract boolean aaiIgnoreSSLCertificateErrors();
 
 }
diff --git a/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClient.java b/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClient.java
new file mode 100644
index 0000000..8b7db1b
--- /dev/null
+++ b/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClient.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * 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 services.service;
+
+import java.util.Map;
+
+public interface AAIExtendedHttpClient {
+    String getExtendedDetails(String aaiAPIPath, Map<String, String> queryParams, Map<String, String> headers);
+}
diff --git a/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClientImpl.java b/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClientImpl.java
new file mode 100644
index 0000000..06d1a55
--- /dev/null
+++ b/prh-aai-client/src/main/java/services/service/AAIExtendedHttpClientImpl.java
@@ -0,0 +1,142 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * 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 services.service;
+
+import com.google.common.base.Optional;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import services.config.AAIHttpClientConfiguration;
+import services.utils.HttpUtils;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+import java.util.Map;
+
+public class AAIExtendedHttpClientImpl implements AAIExtendedHttpClient {
+
+    private final CloseableHttpClient closeableHttpClient;
+    private final String aaiHost;
+    private final String aaiProtocol;
+    private final Integer aaiHostPortNumber;
+
+    @Autowired
+    public AAIExtendedHttpClientImpl (AAIHttpClientConfiguration aaiHttpClientConfiguration) {
+        final AAIHttpClient aaiHttpClient = new AAIHttpClientImpl(aaiHttpClientConfiguration);
+        closeableHttpClient = aaiHttpClient.getAAIHttpClient();
+        aaiHost = aaiHttpClientConfiguration.aaiHost();
+        aaiProtocol = aaiHttpClientConfiguration.aaiProtocol();
+        aaiHostPortNumber = aaiHttpClientConfiguration.aaiHostPortNumber();
+    }
+
+    @Override
+    public String getExtendedDetails(final String aaiAPIPath, final Map<String, String> queryParams,
+                                       final Map<String, String> headers) {
+        final URI extendedURI =
+                createAAIExtendedURI(aaiProtocol, aaiHost, aaiHostPortNumber, aaiAPIPath, queryParams);
+
+        if (extendedURI == null) {
+            return null;
+        }
+
+        final HttpGet getRequest = new HttpGet(extendedURI);
+
+        for (Map.Entry<String, String> headersEntry : headers.entrySet()) {
+            getRequest.addHeader(headersEntry.getKey(), headersEntry.getValue());
+        }
+
+        Optional<String> extendedDetails = Optional.absent();
+
+        try {
+            extendedDetails = closeableHttpClient.execute(getRequest, aaiResponseHandler());
+        } catch (IOException ex) {
+            //ToDo loging
+        }
+
+        // return response
+        if (extendedDetails.isPresent()) {
+            return extendedDetails.get();
+        } else {
+            return null;
+        }
+    }
+
+    private URI createAAIExtendedURI(final String protocol, final String hostName,  final Integer portNumber,
+                                     final String path, Map<String, String> queryParams) {
+        final URIBuilder uriBuilder = new URIBuilder().setScheme(protocol).setHost(hostName).setPort(portNumber)
+                .setPath(path);
+
+        final String customQuery = createCustomQuery(queryParams);
+        if (StringUtils.isNoneBlank(customQuery)) {
+            uriBuilder.setCustomQuery(customQuery);
+        }
+
+        URI extendedURI = null;
+
+        try {
+            extendedURI = uriBuilder.build();
+        } catch (URISyntaxException e) {
+            // ToDo loging
+        }
+
+        return extendedURI;
+    }
+
+    private static String createCustomQuery(@Nonnull final Map<String, String> queryParams) {
+        final StringBuilder queryStringBuilder = new StringBuilder("");
+        final Iterator<Map.Entry<String, String>> queryParamIterator = queryParams.entrySet().iterator();
+        while (queryParamIterator.hasNext()) {
+            final Map.Entry<String, String> queryParamsEntry = queryParamIterator.next();
+            queryStringBuilder.append(queryParamsEntry.getKey());
+            queryStringBuilder.append("=");
+            queryStringBuilder.append(queryParamsEntry.getValue());
+            if (queryParamIterator.hasNext()) {
+                queryStringBuilder.append("&");
+            }
+        }
+        return queryStringBuilder.toString();
+    }
+
+    public static ResponseHandler<Optional<String>> aaiResponseHandler() {
+        return httpResponse ->  {
+            final int responseCode = httpResponse.getStatusLine().getStatusCode();
+            final HttpEntity responseEntity = httpResponse.getEntity();
+
+            if (HttpUtils.isSuccessfulResponseCode(responseCode) && null != responseEntity) {
+                final String aaiResponse = EntityUtils.toString(responseEntity);
+                return Optional.of(aaiResponse);
+            } else {
+                String aaiResponse = responseEntity != null ? EntityUtils.toString(responseEntity) : "";
+                //ToDo loging
+                return Optional.absent();
+            }
+        };
+    }
+
+}
diff --git a/prh-aai-client/src/main/java/services/service/AAIHttpClient.java b/prh-aai-client/src/main/java/services/service/AAIHttpClient.java
new file mode 100644
index 0000000..3dd17fc
--- /dev/null
+++ b/prh-aai-client/src/main/java/services/service/AAIHttpClient.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * 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 services.service;
+
+import org.apache.http.impl.client.CloseableHttpClient;
+
+public interface AAIHttpClient {
+    CloseableHttpClient getAAIHttpClient();
+}
+
diff --git a/prh-aai-client/src/main/java/services/service/AAIHttpClientImpl.java b/prh-aai-client/src/main/java/services/service/AAIHttpClientImpl.java
new file mode 100644
index 0000000..76d090d
--- /dev/null
+++ b/prh-aai-client/src/main/java/services/service/AAIHttpClientImpl.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * 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 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.conn.ssl.NoopHostnameVerifier;
+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.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import services.config.AAIHttpClientConfiguration;
+
+
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+
+public class AAIHttpClientImpl implements AAIHttpClient {
+
+    Logger logger = LoggerFactory.getLogger(AAIHttpClientImpl.class);
+
+    private AAIHttpClientConfiguration aaiHttpClientConfig;
+
+    @Autowired
+    public AAIHttpClientImpl(AAIHttpClientConfiguration aaiHttpClientConfiguration) {
+        this.aaiHttpClientConfig = aaiHttpClientConfiguration;
+    }
+
+    @Override
+    public CloseableHttpClient getAAIHttpClient() {
+
+        final HttpClientBuilder httpClientBuilder = HttpClients.custom().useSystemProperties();
+        final boolean aaiIgnoreSSLCertificateErrors = aaiHttpClientConfig.aaiIgnoreSSLCertificateErrors();
+
+        TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
+
+        if (aaiIgnoreSSLCertificateErrors) {
+            try {
+                SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
+                sslContextBuilder.loadTrustMaterial(null, acceptingTrustStrategy);
+                httpClientBuilder.setSSLContext(sslContextBuilder.build());
+
+            } catch (NoSuchAlgorithmException | KeyStoreException |  KeyManagementException e )  {
+                logger.error("Exception while setting SSL Context for AAI HTTP Client.");
+            }
+
+            httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
+        }
+
+        final String aaiUserName = aaiHttpClientConfig.aaiUserName();
+
+        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+
+        if (aaiUserName != null) {
+            final String aaiHost = aaiHttpClientConfig.aaiHost();
+            final Integer aaiHostPortNumber = aaiHttpClientConfig.aaiHostPortNumber();
+            final String aaiUserPassword = aaiHttpClientConfig.aaiUserPassword();
+            final AuthScope aaiHostPortAuthScope = new AuthScope(aaiHost, aaiHostPortNumber);
+            final Credentials aaiCredentials = new UsernamePasswordCredentials(aaiUserName, aaiUserPassword);
+            credentialsProvider.setCredentials(aaiHostPortAuthScope, aaiCredentials);
+        }
+
+        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+
+        return httpClientBuilder.build();
+    }
+}
diff --git a/prh-aai-client/src/main/java/services/utils/HttpUtils.java b/prh-aai-client/src/main/java/services/utils/HttpUtils.java
new file mode 100644
index 0000000..f752d14
--- /dev/null
+++ b/prh-aai-client/src/main/java/services/utils/HttpUtils.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * PROJECT
+ * ================================================================================
+ * 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 services.utils;
+
+public class HttpUtils {
+
+    private HttpUtils() {}
+
+    public static final Integer HTTP_OK_RESPONSE_CODE = 200;
+    public static final Integer HTTP_ACCEPTED_RESPONSE_CODE = 200;
+    public static final Integer HTTP_NONAUTHORATIVE_INFORMATION_RESPONSE_CODE = 203;
+    public static final Integer HTTP_NO_CONTENT_RESPONSE_CODE = 204;
+    public static final Integer HTTP_RESET_CONTENT_RESPONSE_CODE = 205;
+    public static final Integer HTTP_PARTIAL_CONTENT_RESPONSE_CODE = 206;
+    public static final String JSON_APPLICATION_TYPE = "application/json";
+
+    public static boolean isSuccessfulResponseCode(Integer statusCode) {
+        return statusCode >= 200 && statusCode < 300;
+    }
+}