aboutsummaryrefslogtreecommitdiffstats
path: root/base/http/provider/src
diff options
context:
space:
mode:
authorSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>2019-08-06 19:36:13 +0000
committerKevin Smokowski <kevin.smokowski@att.com>2019-08-09 16:48:01 +0000
commit375001472fa8c286ac61557c63f2703da923b1d1 (patch)
tree6de38be4d3c6dd154699322241a7bb5d67b0d86b /base/http/provider/src
parentbe718ade10ffe698739ae724d50628e559d28805 (diff)
introduce base adaptor
introduce base adaptor for other adaptors to extend Issue-ID: CCSDK-1595 Signed-off-by: Smokowski, Kevin (ks6305) <kevin.smokowski@att.com> Change-Id: I35d4499491cd87a7d651fa9ed654ad7c677ae2b8
Diffstat (limited to 'base/http/provider/src')
-rw-r--r--base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapter.java109
-rw-r--r--base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilter.java24
-rw-r--r--base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapterTest.java47
-rw-r--r--base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilterTest.java20
-rw-r--r--base/http/provider/src/test/resources/testprops.properties1
5 files changed, 201 insertions, 0 deletions
diff --git a/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapter.java b/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapter.java
new file mode 100644
index 00000000..fda4bafb
--- /dev/null
+++ b/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapter.java
@@ -0,0 +1,109 @@
+package org.onap.ccsdk.sli.adaptors.base.http;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+import javax.ws.rs.client.ClientBuilder;
+import javax.xml.bind.DatatypeConverter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractHttpAdapter {
+ protected static final String SDNC_CONFIG_DIR = "SDNC_CONFIG_DIR";
+ private static final String SDNC_CONFIG_DIR_DEFAULT = "/opt/sdnc/data/properties";
+ protected static final int DEFAULT_HTTP_CONNECT_TIMEOUT_MS = 60000; // 1 minute
+ protected static final int DEFAULT_HTTP_READ_TIMEOUT_MS = 1800000; // 30 minutes
+ protected ClientBuilder clientBuilder;
+
+ private static final Logger logger = LoggerFactory.getLogger(AbstractHttpAdapter.class);
+
+ public AbstractHttpAdapter() {
+ clientBuilder = ClientBuilder.newBuilder();
+ setTimeouts();
+ registerLoggingFilter();
+ defaultHostNameVerifier();
+ }
+
+ private void defaultHostNameVerifier() {
+ clientBuilder.hostnameVerifier(new HostnameVerifier() {
+ @Override
+ public boolean verify(String hostname, SSLSession session) {
+ return true;
+ }
+ });
+ }
+
+ protected abstract void registerLoggingFilter();
+
+ private void setTimeouts() {
+ Integer httpReadTimeout = readOptionalInteger("HTTP_READ_TIMEOUT_MS", DEFAULT_HTTP_READ_TIMEOUT_MS);
+ Integer httpConnectTimeout = readOptionalInteger("HTTP_CONNECT_TIMEOUT_MS", DEFAULT_HTTP_CONNECT_TIMEOUT_MS);
+
+ // restore once we migrate to once we migrate to javax.ws.rs-api 2.1
+ // clientBuilder.connectTimeout(30, TimeUnit.SECONDS);
+ // clientBuilder.readTimeout(30, TimeUnit.SECONDS);
+
+ // Setting jersey specific properties is ugly, such behavior should be removed
+ // once we migrate to javax.ws.rs-api 2.1
+ clientBuilder.property("jersey.config.client.readTimeout", httpReadTimeout);
+ clientBuilder.property("jersey.config.client.connectTimeout", httpConnectTimeout);
+ }
+
+ public Properties getProperties(String propertiesFileName) throws FileNotFoundException, IOException {
+ // Check System property, then environment variable then default if null
+ String propDir = System.getProperty(SDNC_CONFIG_DIR);
+ if (propDir == null || propDir.length() < 1) {
+ propDir = System.getenv(SDNC_CONFIG_DIR);
+ }
+ if (propDir == null || propDir.length() < 1) {
+ propDir = SDNC_CONFIG_DIR_DEFAULT;
+ }
+ Properties properties = new Properties();
+ // forward slash is checked to support path src/test/resources on windows machine
+ if (!propDir.endsWith(File.separator) && !propDir.endsWith("/")) {
+ propDir = propDir + File.separator;
+ }
+ String path = propDir + propertiesFileName;
+ properties.load(new FileInputStream(path));
+ logger.trace("Initialized properties from ({}) properties ({})", path, properties);
+ return properties;
+ }
+
+ protected void addBasicAuthCredentials(String username, String password) {
+ String basicAuthValue = getBasicAuthValue(username,password);
+ clientBuilder.register(new BasicAuthFilter(basicAuthValue));
+ }
+
+ protected String getBasicAuthValue(String userName, String password) {
+ String token = userName + ":" + password;
+ try {
+ return "BASIC " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
+ } catch (Exception e) {
+ logger.error("getBasicAuthValue threw an exception, credentials will be null", e);
+ }
+ return null;
+ }
+
+ public ClientBuilder getClientBuilder() {
+ return clientBuilder;
+ }
+
+ private Integer readOptionalInteger(String propertyName, Integer defaultValue) {
+ String stringValue = System.getProperty(propertyName);
+ if (stringValue != null && stringValue.length() > 0) {
+ try {
+ return Integer.valueOf(stringValue);
+ } catch (NumberFormatException e) {
+ logger.warn("property " + propertyName + " had the value " + stringValue + " that could not be converted to an Integer, default " + defaultValue + " will be used instead", e);
+ }
+ }
+ return defaultValue;
+ }
+
+}
diff --git a/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilter.java b/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilter.java
new file mode 100644
index 00000000..48d996ef
--- /dev/null
+++ b/base/http/provider/src/main/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilter.java
@@ -0,0 +1,24 @@
+package org.onap.ccsdk.sli.adaptors.base.http;
+
+import java.io.IOException;
+
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BasicAuthFilter implements ClientRequestFilter {
+ private final String basicAuthValue;
+
+
+ public BasicAuthFilter(String basicAuthValue) {
+ this.basicAuthValue = basicAuthValue;
+ }
+
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+ headers.add("Authorization", basicAuthValue);
+ }
+}
diff --git a/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapterTest.java b/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapterTest.java
new file mode 100644
index 00000000..ee2d223d
--- /dev/null
+++ b/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/AbstractHttpAdapterTest.java
@@ -0,0 +1,47 @@
+package org.onap.ccsdk.sli.adaptors.base.http;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Properties;
+import java.util.Set;
+
+import javax.ws.rs.client.Client;
+
+import org.junit.Test;
+
+public class AbstractHttpAdapterTest {
+
+ public class NonLoggingHttpAdapter extends AbstractHttpAdapter {
+ @Override
+ protected void registerLoggingFilter() {
+ // nonlogging, do nothing
+ }
+ }
+
+ @Test
+ public void checkTimeouts() throws Exception {
+ NonLoggingHttpAdapter adapter = new NonLoggingHttpAdapter();
+ Client client = adapter.getClientBuilder().build();
+ assertNotNull(client.getConfiguration().getProperty("jersey.config.client.readTimeout"));
+ assertNotNull(client.getConfiguration().getProperty("jersey.config.client.connectTimeout"));
+ }
+
+ @Test
+ public void propertiesTest() throws Exception {
+ System.setProperty(AbstractHttpAdapter.SDNC_CONFIG_DIR, "src/test/resources/");
+ NonLoggingHttpAdapter adapter = new NonLoggingHttpAdapter();
+ Properties props = adapter.getProperties("testprops.properties");
+ assertNotNull(props);
+ assertEquals("world", props.get("hello"));
+ }
+
+ @Test
+ public void basicAuthFilter() throws Exception {
+ NonLoggingHttpAdapter adapter = new NonLoggingHttpAdapter();
+ adapter.addBasicAuthCredentials("hello", "world");
+ Set<Object> objs = adapter.getClientBuilder().getConfiguration().getInstances();
+ assertEquals(BasicAuthFilter.class,objs.iterator().next().getClass());
+ }
+
+}
diff --git a/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilterTest.java b/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilterTest.java
new file mode 100644
index 00000000..b9565ba6
--- /dev/null
+++ b/base/http/provider/src/test/java/org/onap/ccsdk/sli/adaptors/base/http/BasicAuthFilterTest.java
@@ -0,0 +1,20 @@
+package org.onap.ccsdk.sli.adaptors.base.http;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+
+public class BasicAuthFilterTest {
+
+ @Test
+ public void notNullParameters() throws Exception {
+ BasicAuthFilter myFilter = new BasicAuthFilter("helloworld");
+ assertNotNull(myFilter);
+ }
+
+ @Test
+ public void nullParameters() throws Exception {
+ BasicAuthFilter myFilter = new BasicAuthFilter(null);
+ assertNotNull(myFilter);
+ }
+}
diff --git a/base/http/provider/src/test/resources/testprops.properties b/base/http/provider/src/test/resources/testprops.properties
new file mode 100644
index 00000000..3f602680
--- /dev/null
+++ b/base/http/provider/src/test/resources/testprops.properties
@@ -0,0 +1 @@
+hello = world \ No newline at end of file