SDN-R add updated devicemanager
[ccsdk/features.git] / sdnr / wt / devicemanager / provider / src / main / java / org / onap / ccsdk / features / sdnr / wt / devicemanager / dcaeconnector / impl / DcaeSenderImpl.java
diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSenderImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSenderImpl.java
new file mode 100644 (file)
index 0000000..31f7b4e
--- /dev/null
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH 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==========================================================================
+ ******************************************************************************/
+/**
+ * Client for ECOMP notification server
+ *
+ * Reference: @link
+ * http://stackoverflow.com/questions/13022717/java-and-https-url-connection-without-downloading-certificate
+ *
+ * @author herbert
+ */
+package org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Base64;
+import javax.net.ssl.SSLContext;
+import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DcaeSenderImpl implements DcaeSender {
+
+    private static final Logger LOG = LoggerFactory.getLogger(DcaeSenderImpl.class);
+    private static final String EMPTY = "";
+    private static final String charset = "UTF-8";
+
+    private final String urlString;
+    private final String basicAuth;
+
+    private SSLContext sc = null;
+    private URL url = null;
+    private HttpURLConnection connection = null;
+
+    public DcaeSenderImpl(String url, String userCredentials) {
+
+        LOG.info("DcaeSenderImpl setup start with {} {}", url, userCredentials);
+
+        this.urlString = url;
+        this.basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));
+
+        if (urlString != null && !urlString.equals("off")) {
+            try {
+                this.url = new URL(url);
+                sc = BaseHTTPClient.setupSsl(true);
+            } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException
+                    | CertificateException | KeyStoreException | InvalidKeySpecException | IOException e) {
+                LOG.warn("SSL setup failed: {}", e.getMessage());
+            }
+        }
+        LOG.info("DcaeSenderImpl setup ends");
+    }
+
+    /**
+     * Send message to ECOMP Server
+     *
+     * @param body for POST message
+     */
+    @Override
+    public String sendDcaePost(String body) {
+
+        if (url != null) {
+            try {
+                connection = DcaeMessages.openConnection(url, basicAuth, true, sc);
+                if (connection != null) {
+                    return processPost(connection, body);
+                } else {
+                    LOG.warn("No SSL context available");
+                }
+            } catch (IOException e) {
+                LOG.warn("Dcae post failed {}", e.getMessage());
+            }
+        }
+        return EMPTY;
+    }
+
+    /**
+     * Connect to Server and expect answer.
+     *
+     * @return with answer body
+     */
+    public String testConnectServer() {
+
+        if (url != null) {
+            try {
+                connection = DcaeMessages.openConnection(url, null, false, sc);
+                if (connection != null) {
+                    return receiveInitialAnswer(connection);
+                }
+            } catch (IOException e) {
+                LOG.warn("Dcae post failed {}", e.getMessage());
+            }
+        }
+        return EMPTY;
+    }
+
+    /**
+     * Show status in readable form for testing
+     *
+     * @return String with result
+     */
+    public String getStatusAsString() {
+        StringBuffer sb = new StringBuffer();
+
+        sb.append("URL: " + url.getPath() + " " + url.getPort() + " Host: " + url.getHost());
+        sb.append("\n");
+        if (connection != null) {
+            sb.append("Connection setup: ");
+            sb.append(connection.getClass().getName());
+            sb.append(" ");
+        } else {
+            sb.append("Connection setup: No connection (server problem or switched off)");
+        }
+        return sb.toString();
+
+    }
+
+
+    /*------------------------------------------------------------------------------
+     * Private functions
+     */
+
+
+    /**
+     * Send Post and wait for answer
+     *
+     * @param connection
+     * @param body
+     * @return
+     * @throws IOException
+     */
+    private static String processPost(HttpURLConnection connection, String body) throws IOException {
+
+        LOG.debug("Post message: {}", connection.getURL().toString());
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Body: {} ", body);
+        }
+
+        // Send the message to destination
+        try (OutputStream output = connection.getOutputStream()) {
+            output.write(body.getBytes(charset));
+        }
+
+        // Receive answer
+        InputStream response = null;
+        BufferedReader rd = null;
+        StringBuilder result = new StringBuilder();
+
+        try {
+            int responseCode = connection.getResponseCode();
+            LOG.debug("Response code: {}", String.valueOf(responseCode));
+
+            if (responseCode >= 200 && responseCode < 300) {
+                response = connection.getInputStream();
+            } else {
+                response = connection.getErrorStream();
+                if (response == null) {
+                    response = connection.getInputStream();
+                }
+            }
+            if (response != null) {
+                rd = new BufferedReader(new InputStreamReader(response));
+                String line;
+                while ((line = rd.readLine()) != null) {
+                    result.append(line);
+                }
+            }
+        } catch (IOException e) {
+            LOG.debug("No response received: {}", e.getMessage());
+        } finally {
+            if (response != null) {
+                response.close();
+            }
+            if (rd != null) {
+                rd.close();
+            }
+        }
+
+        LOG.trace("Result: {} ", result);
+        return result.toString();
+    }
+
+    /**
+     * Read initial answer from Server after connect
+     *
+     * @param connection that was opened
+     * @return String with answer message
+     * @throws IOException
+     */
+    private static String receiveInitialAnswer(URLConnection iConnection) throws IOException {
+
+
+        final StringBuffer response = new StringBuffer();
+
+        if (iConnection != null) {
+
+            final Reader reader = new InputStreamReader(iConnection.getInputStream());
+            final BufferedReader br = new BufferedReader(reader);
+            String line = "";
+            while ((line = br.readLine()) != null) {
+                response.append(line);
+                response.append("\n");
+            }
+            br.close();
+        }
+
+        return response.toString();
+    }
+}