diff options
Diffstat (limited to 'message-router/publisher/provider/src')
3 files changed, 243 insertions, 0 deletions
diff --git a/message-router/publisher/provider/src/main/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImpl.java b/message-router/publisher/provider/src/main/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImpl.java new file mode 100755 index 000000000..4aedc6071 --- /dev/null +++ b/message-router/publisher/provider/src/main/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImpl.java @@ -0,0 +1,178 @@ +/**
+ * ============LICENSE_START====================================================
+ * org.onap.aaf
+ * ===========================================================================
+ * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+ *
+ * Modifications Copyright (C) 2019 IBM.
+ * ===========================================================================
+ * 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.ccsdk.sli.adaptors.messagerouter.publisher.provider.impl;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.SocketException;
+import java.net.URL;
+import java.util.Base64;
+
+import org.onap.ccsdk.sli.adaptors.messagerouter.publisher.api.PublisherApi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PublisherApiImpl implements PublisherApi {
+ private static final Logger logger = LoggerFactory.getLogger(PublisherApiImpl.class);
+ protected static final Integer DEFAULT_CONNECT_TIMEOUT = 30000; // will be treated as 30 seconds
+ protected static final Integer DEFAULT_READ_TIMEOUT = 180000; // will be treated as 3 minutes
+ private String authorizationString;
+ protected Integer connectTimeout;
+ protected Integer readTimeout;
+ protected String baseUrl;
+ protected String username;
+ protected String[] hosts;
+ private String password;
+
+ public PublisherApiImpl() {
+ connectTimeout = DEFAULT_CONNECT_TIMEOUT;
+ readTimeout = DEFAULT_READ_TIMEOUT;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ setAuthorizationString();
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ setAuthorizationString();
+ }
+
+ public void setHost(String hostString) {
+ // a comma separated list of hosts can be passed in or a single host may be used
+ if (!hostString.contains(",")) {
+ this.hosts = new String[] { hostString };
+ } else {
+ this.hosts = hostString.split(",");
+ }
+ }
+
+ public void init() {
+ setAuthorizationString();
+ }
+
+ protected String buildUrlString(Integer hostIndex, String topic) {
+ return hosts[hostIndex] + "/events/" + topic;
+ }
+
+ protected void configureHttpURLConnection(HttpURLConnection httpUrlConnection) {
+ httpUrlConnection.setRequestProperty("Content-Type", "application/json");
+ }
+
+ public Boolean publish(String topic, String body) {
+ for (int hostIndex = 0; hostIndex < hosts.length; hostIndex++) {
+ HttpURLConnection httpUrlConnection = null;
+ URL url = null;
+ try {
+ url = new URL(buildUrlString(hostIndex, topic));
+ logger.info("Publishing body to topic {} using the url {}", topic, url);
+ logger.info("Message to publish is\n{}", body);
+ httpUrlConnection = buildHttpURLConnection(url);
+ httpUrlConnection.setDoInput(true);
+ httpUrlConnection.setDoOutput(true);
+ httpUrlConnection.setUseCaches(false);
+ httpUrlConnection.setRequestMethod("POST");
+
+ // Write message
+ httpUrlConnection.setRequestProperty("Content-Length", Integer.toString(body.length()));
+ DataOutputStream outStr = new DataOutputStream(httpUrlConnection.getOutputStream());
+ outStr.write(body.getBytes());
+ outStr.close();
+
+ int status = httpUrlConnection.getResponseCode();
+ logger.info("Publishing body for topic {} using url {} returned status {}.", topic, url, status);
+ if (status < 300) {
+ String responseFromDMaaP = readFromStream(httpUrlConnection.getInputStream());
+ logger.info("Message router response is\n{}", responseFromDMaaP);
+ return true;
+ } else {
+ if (httpUrlConnection.getErrorStream() != null) {
+ String responseFromDMaaP = readFromStream(httpUrlConnection.getErrorStream());
+ logger.warn("Publishing body for topic {} using url {} failed." + " Error message is\n{}",
+ topic, url, responseFromDMaaP);
+ }
+ return false;
+ }
+
+ } catch (SocketException socketException) {
+ logger.error("SocketException was thrown during publishing message to DMaaP on url {}.", url,
+ socketException);
+ if (hostIndex < hosts.length) {
+ logger.info("Message sent to {} failed with a SocketException, but will be tried on {}",
+ hosts[hostIndex], hosts[hostIndex + 1]);
+ }
+ } catch (Exception e) {
+ logger.warn("Exception was thrown during publishing message to DMaaP on url {}.", url, e);
+ return false;
+ } finally {
+ if (httpUrlConnection != null) {
+ httpUrlConnection.disconnect();
+ }
+ }
+ }
+ return false;
+ }
+
+ protected void setAuthorizationString() {
+ String str = buildAuthorizationString(this.username, this.password);
+ this.authorizationString = str;
+ //System.out.println(this.authorizationString);
+ }
+
+ protected String buildAuthorizationString(String username, String password) {
+ String basicAuthString = username + ":" + password;
+ basicAuthString = Base64.getEncoder().encodeToString(basicAuthString.getBytes());
+ return "Basic " + basicAuthString;
+ }
+
+ protected HttpURLConnection buildHttpURLConnection(URL url) throws IOException {
+ HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
+ if (authorizationString != null) {
+ System.out.println(authorizationString);
+ httpUrlConnection.setRequestProperty("Authorization", authorizationString);
+ }
+ httpUrlConnection.setRequestProperty("Accept", "application/json");
+ httpUrlConnection.setUseCaches(false);
+ httpUrlConnection.setConnectTimeout(connectTimeout);
+ httpUrlConnection.setReadTimeout(readTimeout);
+ configureHttpURLConnection(httpUrlConnection);
+ return httpUrlConnection;
+ }
+
+ protected String readFromStream(InputStream stream) throws IOException {
+ BufferedReader br = new BufferedReader(new InputStreamReader(stream));
+ StringBuilder sb = new StringBuilder();
+ String line;
+ while ((line = br.readLine()) != null) {
+ sb.append(line);
+ }
+ br.close();
+ return sb.toString();
+ }
+
+}
\ No newline at end of file diff --git a/message-router/publisher/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/message-router/publisher/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100755 index 000000000..4702a6260 --- /dev/null +++ b/message-router/publisher/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.2.0"> + + <bean id="publisher" + class="org.onap.ccsdk.sli.adaptors.messagerouter.publisher.provider.impl.PublisherApiImpl"> + <cm:managed-properties + persistent-id="org.onap.ccsdk.sli.adaptors.messagerouter.publisher.provider" + update-strategy="container-managed" /> + </bean> + + <service ref="publisher" interface="org.onap.ccsdk.sli.adaptors.messagerouter.publisher.api.PublisherApi" /> + +</blueprint>
\ No newline at end of file diff --git a/message-router/publisher/provider/src/test/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImplTest.java b/message-router/publisher/provider/src/test/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImplTest.java new file mode 100644 index 000000000..53744f73e --- /dev/null +++ b/message-router/publisher/provider/src/test/java/org/onap/ccsdk/sli/adaptors/messagerouter/publisher/provider/impl/PublisherApiImplTest.java @@ -0,0 +1,51 @@ +package org.onap.ccsdk.sli.adaptors.messagerouter.publisher.provider.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.junit.Test;
+
+public class PublisherApiImplTest {
+ @Test
+ public void verifyDefaultTimeouts() {
+ PublisherApiImpl pub = new PublisherApiImpl();
+ assertEquals(pub.DEFAULT_CONNECT_TIMEOUT, pub.connectTimeout);
+ assertEquals(pub.DEFAULT_READ_TIMEOUT, pub.readTimeout);
+ }
+
+ @Test
+ public void buildHttpURLConnection() throws Exception {
+ PublisherApiImpl pub = new PublisherApiImpl();
+ pub.init();
+
+ String myUserName = "Batman";
+ pub.setUsername(myUserName);
+ assertEquals(myUserName, pub.username);
+ String password = "P@$$";
+ pub.setPassword(password);
+
+ HttpURLConnection httpUrlConnection = pub.buildHttpURLConnection(new URL("http://localhost:7001"));
+ assertNotNull(httpUrlConnection.getReadTimeout());
+ assertNotNull(httpUrlConnection.getConnectTimeout());
+ assertEquals("application/json", httpUrlConnection.getRequestProperty("Content-Type"));
+ assertEquals("application/json", httpUrlConnection.getRequestProperty("Accept"));
+ }
+
+ @Test
+ public void testMultipleHosts() {
+ PublisherApiImpl pub = new PublisherApiImpl();
+ String myTopic = "worldNews";
+ String hostOne = "http://localhost:7001";
+ String hostTwo = "http://localhost:7002";
+ String hostThree = "http://localhost:7003";
+
+ pub.setHost(hostOne + "," + hostTwo + "," + hostThree);
+
+ assertEquals("http://localhost:7001/events/worldNews", pub.buildUrlString(0, myTopic));
+ assertEquals("http://localhost:7002/events/worldNews", pub.buildUrlString(1, myTopic));
+ assertEquals("http://localhost:7003/events/worldNews", pub.buildUrlString(2, myTopic));
+ }
+}
\ No newline at end of file |