add common lib 03/98803/3
authorMichael Dürre <michael.duerre@highstreet-technologies.com>
Mon, 25 Nov 2019 09:22:16 +0000 (10:22 +0100)
committerTimoney, Dan (dt5972) <dtimoney@att.com>
Wed, 4 Dec 2019 15:34:25 +0000 (10:34 -0500)
common lib with code used by multiple sdnr bundles

Issue-ID: SDNC-990
Signed-off-by: Michael Dürre <michael.duerre@highstreet-technologies.com>
Change-Id: Id21a7346497c45c50eec565e7a75684f88fbf4b6

81 files changed:
sdnr/wt/common/pom.xml [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java [new file with mode: 0644]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java [new file with mode: 0644]
sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java [new file with mode: 0644]
sdnr/wt/common/src/test/resources/log4j.properties [new file with mode: 0644]
sdnr/wt/common/src/test/resources/log4j2.xml [new file with mode: 0644]
sdnr/wt/common/src/test/resources/simplelogger.properties [new file with mode: 0644]
sdnr/wt/data-provider/database/src/main/resources/es-init.sh [new file with mode: 0755]
sdnr/wt/pom.xml

diff --git a/sdnr/wt/common/pom.xml b/sdnr/wt/common/pom.xml
new file mode 100644 (file)
index 0000000..144cb66
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    ============LICENSE_START=======================================================
+    ONAP : CCSDK / SDNR / WT / common
+    ================================================================================
+    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=========================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+
+       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+       <artifactId>sdnr-wt-common</artifactId>
+       <version>0.7.0-SNAPSHOT</version>
+       <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name>
+       <packaging>jar</packaging>
+
+       <parent>
+               <groupId>org.onap.ccsdk.parent</groupId>
+               <artifactId>binding-parent</artifactId>
+               <version>1.5.1-SNAPSHOT</version>
+               <relativePath/>
+       </parent>
+
+       <properties>
+               <checkstyle.skip>true</checkstyle.skip> <!-- POM configuration -->
+               <maven.javadoc.skip>true</maven.javadoc.skip>
+               <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
+               <buildtime>${maven.build.timestamp} UTC</buildtime>
+               <elasticsearch.version>6.4.3</elasticsearch.version>
+               <databaseport>49400</databaseport>
+       </properties>
+
+       <licenses>
+               <license>
+                       <name>Apache License, Version 2.0</name>
+                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+               </license>
+       </licenses>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.mockito</groupId>
+                       <artifactId>mockito-core</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.osgi</groupId>
+                       <artifactId>org.osgi.core</artifactId>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.json</groupId>
+                       <artifactId>json</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.elasticsearch.client</groupId>
+                       <artifactId>elasticsearch-rest-client</artifactId>
+                       <version>${elasticsearch.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.core</groupId>
+                       <artifactId>jackson-core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.core</groupId>
+                       <artifactId>jackson-annotations</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.core</groupId>
+                       <artifactId>jackson-databind</artifactId>
+               </dependency>
+
+
+       </dependencies>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.jacoco</groupId>
+                               <artifactId>jacoco-maven-plugin</artifactId>
+                               <configuration>
+                                       <excludes>
+                                               <exclude>**/gen/**</exclude>
+                                               <exclude>**/generated-sources/**</exclude>
+                                               <exclude>**/yang-gen-sal/**</exclude>
+                                               <exclude>**/pax/**</exclude>
+                                       </excludes>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.codehaus.mojo</groupId>
+                               <artifactId>exec-maven-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>generateDTOs</id>
+                                               <phase>generate-sources</phase>
+                                               <goals>
+                                                       <goal>exec</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <executable>${basedir}/../data-provider/database/src/main/resources/es-init.sh</executable>
+                                                       <arguments>
+                                                               <argument>initfile</argument>
+                                                               <argument>-f</argument>
+                                                               <argument>${project.build.directory}/EsInit.script</argument>
+                                                       </arguments>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>com.github.alexcojocaru</groupId>
+                               <artifactId>elasticsearch-maven-plugin</artifactId>
+                               <version>6.14</version>
+                               <configuration>
+                                       <clusterName>testCluster</clusterName>
+                                       <transportPort>9500</transportPort>
+                                       <httpPort>${databaseport}</httpPort>
+                                       <version>6.4.3</version>
+                                       <pathInitScript>${project.build.directory}/EsInit.script</pathInitScript>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <id>start-elasticsearch</id>
+                                               <phase>process-test-classes</phase>
+                                               <goals>
+                                                       <goal>runforked</goal>
+                                               </goals>
+                                       </execution>
+                                       <execution>
+                                               <id>stop-elasticsearch</id>
+                                               <phase>prepare-package</phase>
+                                               <goals>
+                                                       <goal>stop</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <configuration>
+                                       <systemProperties>
+                                               <property>
+                                                       <name>databaseport</name>
+                                                       <value>${databaseport}</value>
+                                               </property>
+                                       </systemProperties>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java
new file mode 100644 (file)
index 0000000..3fa9b69
--- /dev/null
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common;
+
+public interface PropertyService {
+       
+       public String getProperty(String property);
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java
new file mode 100644 (file)
index 0000000..3597f2e
--- /dev/null
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Resources {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Resources.class);
+
+    private static final String RESSOURCEROOT = "src/main/resources";
+
+    private static URL getFileURL(Class<?> cls,String resFile) {
+       Bundle b = FrameworkUtil.getBundle(cls);
+        URL u = null;
+        LOG.debug("try to get file {}", resFile);
+        if (b == null) {
+            LOG.info("Load resource as file: {}", resFile);
+            u = getUrlForRessource(cls,resFile);
+        } else {
+            LOG.info("Load resource from bundle: {}", resFile);
+            u = b.getEntry(resFile);
+        }
+        return u;
+    }
+
+    private static File getFile(Bundle b,String resFile) {
+        File f = null;
+        LOG.debug("try to get file {}", resFile);
+        if (b == null) {
+            LOG.warn("cannot load bundle resources");
+            f = new File(RESSOURCEROOT + resFile);
+        } else {
+            try {
+                f = new File(b.getEntry(resFile).toURI());
+            } catch (URISyntaxException e) {
+                LOG.warn("Con not load file: {}",e.getMessage());
+            }
+        }
+        return f;
+    }
+
+    private static String readFile(final URL u) throws IOException {
+        return readFile(u.openStream());
+    }
+
+    private static String readFile(final InputStream s) throws IOException {
+        // read file
+       final String LR = "\n";
+        BufferedReader in = new BufferedReader(new InputStreamReader(s));
+        StringBuilder sb = new StringBuilder();
+        String inputLine;
+        while ((inputLine = in.readLine()) != null) {
+            sb.append(inputLine+LR);
+        }
+        in.close();
+        s.close();
+        return sb.toString();
+    }
+
+    private static List<URL> getFileURLs(Bundle b,String folder, final String filter, final boolean recursive)
+            throws IOException {
+        
+        List<URL> list = new ArrayList<>();
+        if (b == null) {
+            FileFilter ff = pathname -> {
+                if (pathname.isFile()) {
+                    return pathname.getName().contains(filter);
+                } else {
+                    return true;
+                }
+            };
+            File ffolder = getFile(b,folder);
+            if (ffolder != null && ffolder.isDirectory()) {
+                File[] files = ffolder.listFiles(ff);
+                if (files != null && files.length > 0) {
+                    for (File f : files) {
+                        if (f.isFile()) {
+                            list.add(f.toURI().toURL());
+                        } else if (f.isDirectory() && recursive) {
+                            getFileURLsRecursive(f, ff, list);
+                        }
+                    }
+                }
+            }
+        } else {
+            getResourceURLsTreeRecurse(b, filter, b.getEntryPaths(folder), recursive, list);
+        }
+        return list;
+    }
+
+    private static void getFileURLsRecursive(File root, FileFilter ff, List<URL> list) throws MalformedURLException {
+        if (root != null && root.isDirectory()) {
+            File[] files = root.listFiles(ff);
+            if (files != null && files.length > 0) {
+                for (File f : files) {
+                    if (f.isFile()) {
+                        list.add(f.toURI().toURL());
+                    } else if (f.isDirectory()) {
+                        getFileURLsRecursive(f, ff, list);
+                    }
+                }
+            }
+        }
+
+    }
+
+    private static void getResourceURLsTreeRecurse(Bundle b, String filter, Enumeration<String> resource,
+            boolean recursive, List<URL> outp) throws IOException {
+        while (resource.hasMoreElements()) {
+            String name = resource.nextElement();
+            Enumeration<String> list = b.getEntryPaths(name);
+            if (list != null) {
+                if (recursive) {
+                    getResourceURLsTreeRecurse(b, filter, list, recursive, outp);
+                }
+            } else {
+                // Read
+                if (name.contains(filter)) {
+                    LOG.debug("add {} to list", name);
+                    outp.add(b.getEntry(name));
+                } else {
+                    LOG.debug("filtered out {}", name);
+                }
+            }
+        }
+    }
+
+//    public static List<JSONObject> getJSONFiles(Bundle b,String folder, boolean recursive) {
+//        List<JSONObject> list = new ArrayList<>();
+//        List<URL> urls;
+//        try {
+//            urls = getFileURLs(b,folder, ".json", recursive);
+//            LOG.debug("found {} files", urls.size());
+//        } catch (IOException e1) {
+//            urls = new ArrayList<>();
+//            LOG.warn("failed to get urls from resfolder {} : {}", folder, e1.getMessage());
+//        }
+//        for (URL u : urls) {
+//            LOG.debug("try to parse " + u.toString());
+//            try {
+//                JSONObject o = new JSONObject(readFile(u));
+//                list.add(o);
+//            } catch (JSONException | IOException e) {
+//                LOG.warn("problem reading/parsing file {} : {}", u, e.getMessage());
+//            }
+//        }
+//        return list;
+//    }
+    public static String getFileContent( Class<?> cls, String resFile) {
+        LOG.debug("loading file {} from res", resFile);
+         URL u = getFileURL(cls,resFile);
+         String s=null;
+         if (u == null) {
+             LOG.warn("cannot find resfile: {}", resFile);
+             return null;
+         }
+         try {
+             s=readFile(u);
+         } catch (Exception e) {
+             LOG.warn("problem reading file: {}", e.getMessage());
+         }
+         return s;
+
+       }
+//    public static JSONObject getJSONFile(Class<?> cls,String resFile) {
+//        LOG.debug("loading json file {} from res", resFile);
+//        JSONObject o = null;
+//        try {
+//            // parse to jsonobject
+//            o = new JSONObject(getFileContent(cls,resFile));
+//        } catch (Exception e) {
+//            LOG.warn("problem reading/parsing file: {}", e.getMessage());
+//        }
+//        return o;
+//    }
+
+    /**
+     * Used for reading plugins from resource files /elasticsearch/plugins/head
+     * /etc/elasticsearch-plugins /elasticsearch/plugins
+     *
+     * @param resFolder resource folder pointing to the related files
+     * @param dstFolder destination
+     * @param rootDirToRemove part from full path to remove
+     * @return true if files could be extracted
+     */
+//    public static boolean copyFolderInto(Bundle b,Class<?> cls,String resFolder, String dstFolder, String rootDirToRemove) {
+//
+//        Enumeration<URL> urls = null;
+//        if (b == null) {
+//            LOG.info("Running in file text.");
+//            urls = getResourceFolderFiles(cls,resFolder);
+//        } else {
+//            urls = b.findEntries(resFolder, "*", true);
+//        }
+//
+//        boolean success = true;
+//        URL srcUrl;
+//        String srcFilename;
+//        String dstFilename;
+//        while (urls.hasMoreElements()) {
+//            srcUrl = urls.nextElement();
+//            srcFilename = srcUrl.getFile();
+//
+//            if (srcFilename.endsWith("/")) {
+//                LOG.debug("Skip directory: {}", srcFilename);
+//                continue;
+//            }
+//
+//            LOG.debug("try to copy res {} to {}", srcFilename, dstFolder);
+//            if (rootDirToRemove != null) {
+//                srcFilename =
+//                        srcFilename.substring(srcFilename.indexOf(rootDirToRemove) + rootDirToRemove.length() + 1);
+//                LOG.debug("dstfilename trimmed to {}", srcFilename);
+//            }
+//            dstFilename = dstFolder + "/" + srcFilename;
+//            try {
+//                if (!extractFileTo(srcUrl, new File(dstFilename))) {
+//                    success = false;
+//                }
+//            } catch (Exception e) {
+//                LOG.warn("problem copying res {} to {}: {}", srcFilename, dstFilename, e.getMessage());
+//            }
+//        }
+//
+//        return success;
+//
+//    }
+
+//    private static Enumeration<URL> getResourceFolderFiles(Class<?> cls,String folder) {
+//        LOG.debug("Get resource: {}", folder);
+//        Collection<URL> urlCollection = new ArrayList<>();
+//        URL url = getUrlForRessource(cls,folder);
+//        if(url==null) {
+//             return Collections.enumeration(urlCollection);
+//        }
+//        String path = url.getPath();
+//        File[] files = new File(path).listFiles();
+//        
+//        if (files != null) {
+//            for (File f : files) {
+//                try {
+//                    if (f.isDirectory()) {
+//                        urlCollection.addAll(Collections.list(getResourceFolderFiles(cls,folder + "/" + f.getName())));
+//                    } else {
+//                        urlCollection.add(f.toURI().toURL());
+//                    }
+//                } catch (MalformedURLException e) {
+//                    LOG.error("Can not read ressources", e);
+//                    break;
+//                }
+//            }
+//        }
+//
+//        return Collections.enumeration(urlCollection);
+//        
+//    }
+
+    public static URL getUrlForRessource(Class<?> cls,String fileOrDirectory) {
+        //ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        ClassLoader loader = cls.getClassLoader();
+        URL url = loader.getResource(fileOrDirectory);
+        if(url==null && fileOrDirectory.startsWith("/")) {
+               url = loader.getResource(fileOrDirectory.substring(1));
+        }
+        return url;
+    }
+
+//    public static boolean extractFileTo(Class<?> cls,String resFile, File oFile) {
+//        if (oFile == null) {
+//            return false;
+//        }
+//        LOG.debug("try to copy {} from res to {}", resFile, oFile.getAbsolutePath());
+//        URL u = getFileURL(cls,resFile);
+//        if (u == null) {
+//            LOG.warn("cannot find resfile: {}", resFile);
+//            return false;
+//        }
+//        return extractFileTo(u, oFile);
+//    }
+//
+//    public static boolean extractFileTo(URL u, File oFile) {
+//
+//        if (oFile.isDirectory()) {
+//            oFile.mkdirs();
+//            return true;
+//        } else {
+//            oFile.getParentFile().mkdirs();
+//        }
+//
+//        if (!oFile.exists()) {
+//            try {
+//                oFile.createNewFile();
+//            } catch (IOException e) {
+//                LOG.warn("problem creating file {}: {}", oFile.getAbsoluteFile(), e.getMessage());
+//            }
+//        }
+//        try (InputStream in = u.openStream(); OutputStream outStream = new FileOutputStream(oFile);) {
+//
+//            int theInt;
+//            while ((theInt = in.read()) >= 0) {
+//                outStream.write(theInt);
+//            }
+//            in.close();
+//            outStream.flush();
+//            outStream.close();
+//            LOG.debug("file written successfully");
+//        } catch (IOException e) {
+//            LOG.error("problem writing file: {}", e.getMessage());
+//            return false;
+//        }
+//        return true;
+//    }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java
new file mode 100644 (file)
index 0000000..6191917
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration;
+
+/**
+ * Marker interface for configurations
+ */
+public interface Configuration {
+
+       String getSectionName();
+
+    void defaults();
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
new file mode 100644 (file)
index 0000000..36673d3
--- /dev/null
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Optional;
+
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.ConfigFileObserver;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Representation of configuration file with section.<br>
+ * A root section is used for parameters, not assigned to a specific section.<br>
+ * The definitions of the configuration are attributes of a java class<br>
+ */
+public class ConfigurationFileRepresentation implements IConfigChangedListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigurationFileRepresentation.class);
+
+    private static final long FILE_POLL_INTERVAL_MS = 1000;
+    private static final String SECTIONNAME_ROOT = "";
+    private static final String LR = "\n";
+    private static final String EMPTY = "";
+
+    /** Related configuration file **/
+    private final File mFile;
+    /** Monitor changes of file **/
+    private final ConfigFileObserver fileObserver;
+    /** List of sections **/
+    private final HashMap<String, Section> sections;
+
+    public ConfigurationFileRepresentation(File f) {
+
+           this.mFile = f;
+           this.sections = new HashMap<String, Section>();
+               try {
+               if (!this.mFile.exists()) {
+                               if (!this.mFile.createNewFile()) {
+                                       LOG.error("Can not create file {}", f.getAbsolutePath());
+                               }
+                       }
+               reLoad();
+                       
+               } catch (IOException e) {
+                       LOG.error("Problem loading config file {} : {}", f.getAbsolutePath(), e.getMessage());
+               }
+           this.fileObserver = new ConfigFileObserver(f.getAbsolutePath(), FILE_POLL_INTERVAL_MS);
+           this.fileObserver.start();
+           this.fileObserver.registerConfigChangedListener(this);
+    }
+
+       public ConfigurationFileRepresentation(String configurationfile) {
+               this(new File(configurationfile));
+       }
+
+       public Optional<Section> getSection(String name) {
+               return Optional.ofNullable(sections.get(name));
+    }
+
+       public Section addSection(String name) {
+               if (this.sections.containsKey(name)) {
+                       return this.sections.get(name);
+               }
+               Section s = new Section(name);
+               this.sections.put(name, s);
+               return s;
+       }
+
+    public void reLoad() {
+        sections.clear();
+        addSection(SECTIONNAME_ROOT);
+        load();
+    }
+
+    public void save() {
+       LOG.debug("Write configuration to {}", getMFileName());
+        try (BufferedWriter bw = new BufferedWriter(new FileWriter(this.mFile, false))) {
+            for (Section section : this.sections.values()) {
+                if (section.hasValues()) {
+                    bw.write(String.join(LR, section.toLines()) + LR + LR);
+                }
+            }
+            bw.close();
+        } catch (Exception e) {
+            LOG.warn("problem saving value: " + e.getMessage());
+        }
+    }
+
+    public void registerConfigChangedListener(IConfigChangedListener l) {
+        this.fileObserver.registerConfigChangedListener(l);
+    }
+
+    public void unregisterConfigChangedListener(IConfigChangedListener l) {
+        this.fileObserver.unregisterConfigChangedListener(l);
+    }
+
+       @Override
+       public void onConfigChanged() {
+               LOG.debug("Reload on change {}", getMFileName());
+               reLoad();
+       }
+
+       @Override
+       public String toString() {
+               return "ConfigurationFileRepresentation [mFile=" + mFile + ", sections=" + sections + "]";
+       }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (this.fileObserver != null) {
+            this.fileObserver.interrupt();
+        }
+        super.finalize();
+    }
+
+       /*
+        * Property access set/get
+        */
+    public void setProperty(String section, String key, Object value) {
+        Optional<Section> os = this.getSection(section);
+        if (os.isPresent()) {
+               os.get().setProperty(key, value == null ? "null" : value.toString());
+               save();
+        } else {
+                       LOG.info("Unknown configuration section {}", section);
+        }
+    }
+
+       public String getProperty(String section, String propertyKey) {
+        Optional<Section> os = this.getSection(section);
+        if (os.isPresent()) {
+               return os.get().getProperty(propertyKey);
+        } else {
+                       LOG.debug("Unknown configuration section {}", section);
+                       return EMPTY;
+        }
+       }
+
+       public Optional<Long> getPropertyLong(String section, String propertyKey) {
+        Optional<Section> os = this.getSection(section);
+        if (os.isPresent()) {
+               return os.get().getLong(propertyKey);
+        } else {
+                       LOG.debug("Unknown configuration section {}", section);
+                       return Optional.empty();
+        }
+       }
+
+       public boolean isPropertyAvailable(String section, String propertyKey) {
+        Optional<Section> s = this.getSection(section);
+        return s.isPresent() && s.get().hasKey(propertyKey);
+       }
+
+       public void setPropertyIfNotAvailable(String section, String propertyKey,
+                       Object propertyValue) {
+               if (! isPropertyAvailable(section, propertyKey)) {
+                       setProperty(section, propertyKey, propertyValue.toString());
+               }
+       }
+
+       public boolean getPropertyBoolean(String section, String propertyKey) {
+               return getProperty(section, propertyKey).equalsIgnoreCase("true");
+       }
+
+       /*
+        * Private
+        */
+       private void load() {
+               LOG.debug("loading file {}", getMFileName());
+               String curSectionName = SECTIONNAME_ROOT;
+               Optional<Section> sectionOptional = this.getSection(curSectionName);
+               Section curSection=sectionOptional.isPresent()?sectionOptional.get():this.addSection(curSectionName);
+               BufferedReader br = null;
+               try {
+                       br = new BufferedReader(new FileReader(this.mFile));
+                       for (String line; (line = br.readLine()) != null;) {
+                               line = line.trim();
+                               if (line.isEmpty()) {
+                                       continue;
+                               }
+                               if (line.startsWith("[") && line.endsWith("]")) {
+                                       curSectionName = line.substring(1, line.length() - 1);
+                                       curSection = this.addSection(curSectionName);
+                               } else {
+                                       curSection.addLine(line);
+                               }
+                       }
+
+               } catch (Exception e) {
+                       LOG.info("Problem loading configuration file. {} {}", getMFileName(), e);
+               } finally {
+                       try {
+                               if (br != null) {
+                                       br.close();
+                               }
+                       } catch (IOException e) {
+                       }
+               }
+               LOG.debug("finished loading file");
+               LOG.debug("start parsing sections");
+               for (Section section : this.sections.values()) {
+                       section.parseLines();
+               }
+               LOG.debug("finished parsing " + this.sections.size() + " sections");
+       }
+
+    private String getMFileName() {
+       return mFile.getAbsolutePath();
+    }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java
new file mode 100644 (file)
index 0000000..f6d3601
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration;
+
+public interface ISubConfigHandler {
+    void save();
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java
new file mode 100644 (file)
index 0000000..18ed409
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.exception;
+
+public class ConfigurationException extends Exception {
+
+    private static final long serialVersionUID = 733061908616404383L;
+
+    public ConfigurationException(String m) {
+        super(m);
+    }
+}
\ No newline at end of file
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java
new file mode 100644 (file)
index 0000000..d261c73
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.exception;
+
+public class ConversionException extends Exception {
+    private static final long serialVersionUID = 5179891576029923079L;
+
+    public ConversionException(String m) {
+        super(m);
+    }
+}
+
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java
new file mode 100644 (file)
index 0000000..78f1166
--- /dev/null
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import org.onap.ccsdk.features.sdnr.wt.common.file.FileWatchdog;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConfigFileObserver extends FileWatchdog {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigFileObserver.class);
+
+    private final List<IConfigChangedListener> mConfigChangedHandlers = new ArrayList<>();
+
+    public ConfigFileObserver(String filename, long pollIntervallMs) {
+        super(filename);
+        this.setDelay(pollIntervallMs);
+    }
+
+    @Override
+    protected void doOnChange() {
+        LOG.debug("property file has changed");
+        for (IConfigChangedListener listener : this.mConfigChangedHandlers) {
+            listener.onConfigChanged();
+        }
+    }
+
+    public void registerConfigChangedListener(@Nonnull IConfigChangedListener l) {
+        if (!this.mConfigChangedHandlers.contains(l)) {
+            this.mConfigChangedHandlers.add(l);
+        }
+    }
+
+    public void unregisterConfigChangedListener(IConfigChangedListener l) {
+        this.mConfigChangedHandlers.remove(l);
+    }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java
new file mode 100644 (file)
index 0000000..32f11cd
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange;
+
+public interface IConfigChangedListener {
+    void onConfigChanged();
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java
new file mode 100644 (file)
index 0000000..a0e21be
--- /dev/null
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Optional;
+
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConversionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Section {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Section.class);
+    private static final String DELIMITER = "=";
+    private static final String COMMENTCHARS[] = {"#", ";"};
+
+    private final String name;
+    private final List<String> rawLines;
+    private final LinkedHashMap<String, SectionValue> values;
+
+    public Section(String name) {
+        LOG.debug("new section created: '{}'", name);
+        this.name = name;
+        this.rawLines = new ArrayList<>();
+        this.values = new LinkedHashMap<>();
+    }
+
+    public void addLine(String line) {
+        LOG.trace("adding raw line:" + line);
+        this.rawLines.add(line);
+    }
+
+    public String getProperty(String key) {
+        return this.getProperty(key, null);
+    }
+
+    public String getProperty(String key, String defValue) {
+        if (values.containsKey(key)) {
+            return values.get(key).getValue();
+        }
+        return defValue;
+    }
+
+    public String getName() {
+       return name;
+    }
+
+    public void setProperty(String key, String value) {
+        boolean isuncommented = this.isCommentLine(key);
+        if (isuncommented) {
+            key = key.substring(1);
+        }
+        if (this.values.containsKey(key)) {
+               this.values.get(key).setValue(value).setIsUncommented(isuncommented);
+        } else {
+            this.values.put(key, new SectionValue(value,isuncommented));
+        }
+    }
+
+    public void parseLines() {
+        this.values.clear();
+        List<String> commentsForValue = new ArrayList<>();
+        boolean uncommented = false;
+        for (String line : rawLines) {
+
+            if (this.isCommentLine(line)) {
+                if (!line.contains(DELIMITER)) {
+                    commentsForValue.add(line);
+                    continue;
+                } else {
+                    uncommented = true;
+                    line = line.substring(1);
+                }
+            }
+            if (!line.contains(DELIMITER)) {
+                continue;
+            }
+            String hlp[] = line.split(DELIMITER);
+            if (hlp.length > 1) {
+                String key = hlp[0];
+                String value =
+                        line.length() > (key + DELIMITER).length() ? line.substring((key + DELIMITER).length())
+                                : "";
+                if (this.values.containsKey(key)) {
+                    this.values.get(key).setValue(value);
+                } else {
+                    this.values.put(key, new SectionValue(value, commentsForValue, uncommented));
+                    commentsForValue = new ArrayList<>();
+                }
+            } else {
+                LOG.warn("ignoring unknown formatted line:" + line);
+            }
+            uncommented = false;
+        }
+    }
+
+    private boolean isCommentLine(String line) {
+        for (String c : COMMENTCHARS) {
+            if (line.startsWith(c)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public String[] toLines() {
+        List<String> lines = new ArrayList<>();
+        if (!this.name.isEmpty()) {
+            lines.add("[" + this.name + "]");
+        }
+        for (Entry<String, SectionValue> entry : this.values.entrySet()) {
+               SectionValue sectionValue = entry.getValue();
+            if (sectionValue.getComments().size() > 0) {
+                for (String comment : sectionValue.getComments()) {
+                    lines.add(comment);
+                }
+            }
+            lines.add((sectionValue.isUncommented() ? COMMENTCHARS[0] : "") + entry.getKey() + DELIMITER
+                    + sectionValue.getValue());
+        }
+        String[] alines = new String[lines.size()];
+        return lines.toArray(alines);
+    }
+
+    public String getString(String key, String def) {
+        return this.getProperty(key, def);
+    }
+
+    public boolean getBoolean(String key, boolean def) throws ConversionException {
+        String v = this.getProperty(key);
+        if (v == null || v.isEmpty()) {
+            return def;
+        }
+        if (v.equals("true")) {
+            return true;
+        }
+        if (v.equals("false")) {
+            return false;
+        }
+        throw new ConversionException("invalid value for key " + key);
+    }
+
+    public int getInt(String key, int def) throws ConversionException {
+        String v = this.getProperty(key);
+        if (v == null || v.isEmpty()) {
+            return def;
+        }
+        try {
+            return Integer.parseInt(v);
+        } catch (NumberFormatException e) {
+            throw new ConversionException(e.getMessage());
+        }
+    }
+
+    public Optional<Long> getLong(String key) {
+        String v = this.getProperty(key);
+               try {
+                       return Optional.of(Long.parseLong(v));
+               } catch (NumberFormatException e) {
+               }
+               return Optional.empty();
+    }
+
+    public boolean hasValues() {
+        return this.values.size() > 0;
+    }
+
+    public boolean hasKey(String key) {
+        return this.values.containsKey(key);
+    }
+
+       @Override
+       public String toString() {
+               return "Section [name=" + name + ", rawLines=" + rawLines + ", values=" + values + "]";
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java
new file mode 100644 (file)
index 0000000..8af0724
--- /dev/null
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class SectionValue {
+
+    private String value;
+    private final List<String> comments;
+    private boolean isUncommented;
+
+    public SectionValue(String value, List<String> commentsForValue, boolean isuncommented) {
+        this.comments = commentsForValue;
+        this.value = value;
+        this.isUncommented = isuncommented;
+    }
+
+    public SectionValue(String value) {
+        this(value, new ArrayList<String>(), false);
+    }
+
+    public SectionValue(String value, boolean isUncommented) {
+       this(value, new ArrayList<String>(), isUncommented);
+       }
+
+    /* Getter / Setter */
+
+       public String getValue() {
+               return value;
+       }
+
+       public SectionValue setValue(String value) {
+               this.value = value;
+               return this;
+       }
+
+       public boolean isUncommented() {
+               return isUncommented;
+       }
+
+       public SectionValue setIsUncommented(boolean isUncommented) {
+               this.isUncommented = isUncommented;
+               return this;
+       }
+
+       public List<String> getComments() {
+               return comments;
+       }
+
+       @Override
+       public String toString() {
+               return "SectionValue [value=" + value + ", comments=" + comments + ", isUncommented=" + isUncommented + "]";
+       }
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java
new file mode 100644 (file)
index 0000000..78501a8
--- /dev/null
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+
+/**
+ * Access elasticsearch database
+ */
+
+public interface DatabaseClient {
+
+    /**
+     * Read JSON Object from database
+     * @param dataTypeName to read
+     * @param esId to provide id to read
+     * @return String with json structure
+     */
+    public @Nullable String doReadJsonData(String dataTypeName, @Nonnull IsEsObject esId );
+
+    /**
+     * Read JSON Object from database
+     * @param dataTypeName to read
+     * @param esId of object to read
+     * @return String with json structure
+     */
+    public @Nullable String doReadJsonData(String dataTypeName, @Nonnull String esId);
+
+    /**
+     * Provide all Objects of the specified dataTypeName.
+     * @param dataTypeName to be used
+     * @return SearchResult with list of elements
+     */
+    public @Nonnull SearchResult<SearchHit> doReadAllJsonData(String dataTypeName);
+
+    /**
+     * Provide all Objects that are covered by query.
+     * @param dataTypeName to be used
+     * @param queryBuilder with the query to be used.
+     * @return SearchResult with list of elements
+     */
+    public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder);
+    /**
+     * Write one object into Database
+     *
+     * @param esId Database index
+     * @param dataTypeName Name of datatype
+     * @param json String in JSON format.
+     * @return esId String of the database object or null in case of write problems.
+     */
+    public @Nullable String doWriteJsonString( String dataTypeName, @Nonnull IsEsObject esId, String json);
+
+    /**
+     * Write one object into Database
+     * @param dataTypeName Name of datatype
+     * @param esId of object to be replaced or null for new entry.
+     * @param json String in JSON format.
+     * @return esId String of the database object or null in case of write problems.
+     */
+    public @Nullable String doWriteRaw( String dataTypeName, @Nullable  String esId, String json);
+
+    /**
+     * Remove Object from database
+     * @param dataTypeName of object
+     * @param esId of object to be deleted
+     * @return success
+     */
+    public boolean doRemove( String dataTypeName, IsEsObject esId );
+
+    /**
+     * Remove Object from database
+     * @param dataTypeName of object
+     * @param esId as String of object to be deleted
+     * @return success
+     */
+    boolean doRemove(String dataTypeName, String esId);
+
+    /**
+     * Verify if index already created
+     * @param dataTypeName to be verified.
+     * @return boolean accordingly
+     */
+    public boolean isExistsIndex(String dataTypeName);
+
+    /**
+     * Update one object in Database with id=esId or create if not exists.
+     * @param dataTypeName Name of datatype
+     * @param esId of object to be replaced or null for new entry.
+     * @param json String in JSON format.
+     * @return esId String of the database object or null in case of write problems.
+     */
+    public String doUpdateOrCreate(String dataTypeName, String esId, String json);
+
+    /**
+     * Update one object in Database with id=esId or create if not exists.
+     * @param dataTypeName Name of datatype
+     * @param esId to use for DB object
+     * @param json object to write
+     * @param doNotUpdateField Fields that are not updated, but inserted if DB Object not existing in DB
+     * @return esId as String or null of not successfully
+     */
+    public String doUpdateOrCreate(String dataTypeName, String esId, String json, List<String> doNotUpdateField);
+
+    /**
+     * remove items from database by query
+     * @param dataTypeName Name of datatype
+     * @param query query to select items to remove
+     * @return count of removed items
+     */
+    public int doRemove(String dataTypeName, QueryBuilder query);
+
+    /**
+     * update object in database
+     * @param dataTypeName Name of datatype
+     * @param json dataobject
+     * @param query query to select item to update
+     * @return esId which was updated or null if failed
+     */
+    public String doUpdate(String dataTypeName, String json, QueryBuilder query);
+
+    /**
+     * 
+     * @param dataTypeName Name of datatype
+     * @param queryBuilder query to select items to read
+     * @param ignoreException flag if serverside exception will be thrown if query is not valid (needed for user entered filters)
+     * @return results
+     */
+    SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder,
+            boolean ignoreException);
+
+
+    /**
+     * read all data
+     * @param dataTypeName Name of datatype
+     * @param ignoreException flag if serverside exception will be thrown if query is not valid (needed for user entered filters)
+     * @return results
+     */
+    SearchResult<SearchHit> doReadAllJsonData(String dataTypeName, boolean ignoreException);
+
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java
new file mode 100644 (file)
index 0000000..828ae8b
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+
+public interface DatabaseConfig {
+
+       HostInfo[] getHosts();
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
new file mode 100644 (file)
index 0000000..0e544ac
--- /dev/null
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import java.io.IOException;
+import org.apache.http.HttpHost;
+import org.elasticsearch.client.Response;
+import org.elasticsearch.client.ResponseException;
+import org.elasticsearch.client.RestClient;
+import org.json.JSONException;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterHealthRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndicesAliasesRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.NodeStatsRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AcknowledgedResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterHealthResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.CreateIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.NodeStatsResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.RefreshIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ExtRestClient {
+
+       private static final Logger LOGGER = LoggerFactory.getLogger(ExtRestClient.class);
+       
+       private RestClient client;
+
+       public ExtRestClient(RestClient client) {
+               this.client = client;
+       }
+
+       public ClusterHealthResponse health(ClusterHealthRequest request)
+                       throws UnsupportedOperationException, IOException, JSONException {
+               return new ClusterHealthResponse(this.client.performRequest(request.getInner()));
+       }
+
+       public void close() throws IOException {
+               this.client.close();
+               
+       }
+       //
+       public boolean indicesExists(GetIndexRequest request) throws IOException {
+               Response response = this.client.performRequest(request.getInner());
+               return response.getStatusLine().getStatusCode()==200;
+       }
+
+       public AcknowledgedResponse updateAliases(IndicesAliasesRequest request) throws IOException{
+               return new AcknowledgedResponse(this.client.performRequest(request.getInner()));
+       }
+
+       public CreateIndexResponse createIndex(CreateIndexRequest request) throws IOException {
+               CreateIndexResponse response = new CreateIndexResponse(this.client.performRequest(request.getInner()));
+               return response;
+       }
+       public DeleteIndexResponse deleteIndex(DeleteIndexRequest request) throws IOException {
+               return new DeleteIndexResponse(this.client.performRequest(request.getInner()));
+       }
+       public IndexResponse index(IndexRequest request) throws IOException{
+               return new IndexResponse(this.client.performRequest(request.getInner()));
+       }
+
+       public DeleteResponse delete(DeleteRequest request) throws IOException{
+               Response response=null;
+               try {
+                        response = this.client.performRequest(request.getInner());
+               }
+               catch(ResponseException e) {
+                       new DeleteResponse(e.getResponse());
+               }
+               return new DeleteResponse(response);
+       }
+       public DeleteByQueryResponse deleteByQuery(DeleteByQueryRequest request) throws IOException {
+               Response response=null;
+               try {
+                        response = this.client.performRequest(request.getInner());
+               }
+               catch(ResponseException e) {
+                       new DeleteResponse(e.getResponse());
+               }
+               return new DeleteByQueryResponse(response);
+       }
+       public SearchResponse search(SearchRequest request) throws IOException{
+               return this.search(request,false);
+       }
+
+       /**
+        * 
+        * @param request
+        * @param ignoreParseException especially for usercreated filters which may cause ES server response exceptions
+        * @return
+        * @throws IOException
+        */
+       public SearchResponse search(SearchRequest request, boolean ignoreParseException) throws IOException {
+               if (ignoreParseException) {
+                       try {
+                               return new SearchResponse(this.client.performRequest(request.getInner()));
+                       } catch (ResponseException e) {
+                               LOGGER.debug("ignoring Exception for request {}: {}",request,e.getMessage());
+                               return new SearchResponse(e.getResponse());
+                       }
+               } else {
+                       return new SearchResponse(this.client.performRequest(request.getInner()));
+               }
+       }
+
+       public GetResponse get(GetRequest request) throws IOException{
+               try {
+                       return new GetResponse(this.client.performRequest(request.getInner()));
+               }
+               catch (ResponseException e) {
+                       return new GetResponse(e.getResponse());
+               }
+       }
+       public UpdateByQueryResponse update(UpdateByQueryRequest request) throws IOException {
+               return new UpdateByQueryResponse(this.client.performRequest(request.getInner()));
+               
+       }
+       public UpdateResponse update(UpdateRequest request) throws IOException {
+               return new UpdateResponse(this.client.performRequest(request.getInner()));
+               
+       }
+       public RefreshIndexResponse refreshIndex(RefreshIndexRequest request) throws IOException{
+               return new RefreshIndexResponse(this.client.performRequest(request.getInner()));
+       }
+       
+       public NodeStatsResponse stats(NodeStatsRequest request) throws IOException{
+               return new NodeStatsResponse(this.client.performRequest(request.getInner()));
+       }
+       
+       public boolean waitForYellowStatus(long timeoutms) {
+       
+               ClusterHealthRequest request = new ClusterHealthRequest();
+               request.timeout(timeoutms/1000);
+               ClusterHealthResponse response = null;
+               String status="";
+               try {
+                       response = this.health(request);
+
+               } catch (UnsupportedOperationException | IOException | JSONException e) {
+                       LOGGER.error(e.getMessage());
+               }
+               if(response!=null) {
+                       status=response.getStatus();
+                       LOGGER.debug("Elasticsearch service started with status {}", response.getStatus());
+
+               }
+               else {
+                       LOGGER.warn("Elasticsearch service not started yet with status {}. current status is {}",status,"none");
+                       return false;
+               }
+               return response.isStatusMinimal(ClusterHealthResponse.HEALTHSTATUS_YELLOW);
+
+       }
+       
+       protected ExtRestClient(HostInfo[] hosts) {
+               this(RestClient.builder(get(hosts)).build());
+       }
+       private static HttpHost[] get(HostInfo[] hosts) {
+               HttpHost[] httphosts = new HttpHost[hosts.length];
+               for(int i=0;i<hosts.length;i++) {
+                       httphosts[i]=new HttpHost(hosts[i].hostname, hosts[i].port, hosts[i].protocol.toString());
+               }
+               return httphosts;
+       }
+       public static ExtRestClient createInstance(HostInfo[] hosts) {
+               HttpHost[] httphosts = new HttpHost[hosts.length];
+               for(int i=0;i<hosts.length;i++) {
+                       httphosts[i]=new HttpHost(hosts[i].hostname, hosts[i].port, hosts[i].protocol.toString());
+               }
+               return new ExtRestClient(RestClient.builder(httphosts).build());
+       }
+       public static ExtRestClient createInstance(String hostname, int port, Protocol protocol) throws InvalidProtocolException {
+               return createInstance(new HostInfo[] {new HostInfo(hostname,port,protocol)});
+
+       }
+       
+       
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
new file mode 100644 (file)
index 0000000..c3bd7c5
--- /dev/null
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import java.io.IOException;
+import java.util.List;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.RefreshIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Herbert, Micha
+ *
+ * Hint: Elasticsearch index/alias and doctype will be the same value
+ *       server side restricted since ES 5.0
+ *
+ */
+public class HtDatabaseClient extends ExtRestClient implements DatabaseClient, AutoCloseable {
+
+       private final Logger LOG = LoggerFactory.getLogger(HtDatabaseClient.class);
+
+       private boolean doRefreshAfterWrite;
+    public HtDatabaseClient(HostInfo[] hosts) {
+               this(hosts,true);
+       }
+    public HtDatabaseClient(HostInfo[] hosts, boolean refreshAfterWrite) {
+               super(hosts);
+               this.doRefreshAfterWrite = refreshAfterWrite;
+       }
+
+
+
+    /*----------------------------------
+     * Functions
+     */
+
+   /**
+    * Close function
+    */
+   @Override
+   public void close() {
+       try {
+                       super.close();
+               } catch (IOException e) {
+                       LOG.warn("Problem closing db client: {}",e);
+               }
+   }
+
+    @Override
+    public boolean isExistsIndex(String esIndexAlias) {
+
+       LOG.debug("Check status of ES index: {}", esIndexAlias);
+
+        GetIndexRequest request = new GetIndexRequest(esIndexAlias);
+
+               boolean indexStatus = false;
+               try {
+                       indexStatus = this.indicesExists(request);
+               } catch (IOException e) {
+                       LOG.warn("Problem checking index for {}: {}",esIndexAlias,e);
+               }
+
+        return indexStatus;
+
+    }
+
+    @Override
+    public @Nullable String doWriteJsonString(String dataTypeName, @Nonnull IsEsObject esId, String json) {
+        return doWriteRaw(dataTypeName, esId.getEsId(), json);
+    }
+
+    @Override
+    public @Nullable String doWriteRaw(String dataTypeName, @Nullable String esId, String json) {
+
+        IndexResponse response = null;
+        IndexRequest indexRequest = new IndexRequest(dataTypeName,dataTypeName,esId);
+        indexRequest.source(json);
+        try {
+            response = this.index(indexRequest );
+        } catch (IOException e) {
+            LOG.warn("ES Exception {} Json: {}", e.getMessage(), json);
+        }
+
+        if (response == null) {
+            LOG.warn("Response null during write: {} {}", esId, json);
+            return null;
+        }
+               if(this.doRefreshAfterWrite) {
+                       this.doRefresh(dataTypeName);
+               }
+               return response.getId();
+    }
+
+    private void doRefresh(String dataTypeName) {
+               try {
+                       RefreshIndexResponse response = this.refreshIndex(new RefreshIndexRequest(dataTypeName));
+                       if(!response.succeeded()) {
+                               LOG.warn("seems that index {} was not refreshed",dataTypeName);
+                       }
+               } catch (IOException e) {
+                       LOG.warn("problem with refreshing index: {}",e);
+               }
+               
+       }
+       @Override
+    public boolean doRemove(String dataTypeName, IsEsObject esId) {
+       return doRemove(dataTypeName, esId.getEsId());
+    }
+
+
+    @Override
+    public boolean doRemove(String dataTypeName, String esId) {
+        DeleteRequest deleteRequest = new DeleteRequest(dataTypeName,dataTypeName,esId);
+               DeleteResponse response = null;
+               try {
+                       response = this.delete(deleteRequest);
+               } catch (IOException e) {
+                       LOG.warn("Problem deleting from db: {}",e.getMessage());
+               }
+               if(this.doRefreshAfterWrite) {
+                       this.doRefresh(dataTypeName);
+               }
+        return response!=null?response.isDeleted():false;
+    }
+
+    @Override
+    public @Nullable String doReadJsonData(String dataTypeName, @Nonnull IsEsObject esId) {
+
+        if (esId.getEsId() == null) {
+            throw new IllegalArgumentException("Read access to object without database Id");
+        }
+
+        return doReadJsonData(dataTypeName, esId.getEsId());
+    }
+
+    @Override
+    public @Nullable String doReadJsonData(String dataTypeName, @Nonnull String esId) {
+
+       LOG.debug("NetworkIndex read: {}", dataTypeName);
+        GetRequest getRequest = new GetRequest(dataTypeName,dataTypeName,esId);
+               GetResponse response = null;
+               try {
+                       response = this.get(getRequest);
+               } catch (IOException e) {
+                       LOG.warn("problem reading data {} with id {}: {}",dataTypeName,esId,e);
+               }
+        return response!=null && response.isExists() ? response.getSourceAsBytesRef() : null;
+    }
+
+       @Override
+       public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName, QueryBuilder queryBuilder) {
+
+               return this.doReadByQueryJsonData(dataTypeName, queryBuilder, false);
+       }
+
+       @Override
+       public @Nonnull SearchResult<SearchHit> doReadByQueryJsonData(String dataTypeName,QueryBuilder queryBuilder, boolean ignoreException) {
+
+               long total = 0;
+               LOG.debug("NetworkIndex query and read: {}", dataTypeName);
+
+               SearchRequest searchRequest = new SearchRequest(dataTypeName, dataTypeName);
+               searchRequest.setQuery(queryBuilder);
+               SearchResponse response = null;
+               try {
+                       response = this.search(searchRequest,ignoreException);
+                       total = response.getTotal();
+
+               } catch (IOException e) {
+                       LOG.warn("error do search {}: {}", queryBuilder, e);
+               }
+               return new SearchResult<SearchHit>(response != null ? response.getHits() : new SearchHit[] {}, total);
+       }
+       @Override
+       public @Nonnull SearchResult<SearchHit> doReadAllJsonData(String dataTypeName) {
+               return this.doReadAllJsonData( dataTypeName,false);
+       }
+    @Override
+       public @Nonnull SearchResult<SearchHit> doReadAllJsonData( String dataTypeName, boolean ignoreException) {
+       // Use query
+        return doReadByQueryJsonData( dataTypeName, QueryBuilders.matchAllQuery(),ignoreException);
+       }
+
+   
+       @Override
+       public String doUpdateOrCreate(String dataTypeName, String esId, String json) {
+                       return this.doUpdateOrCreate(dataTypeName, esId, json,null);
+       }
+
+
+
+       @Override
+       public String doUpdateOrCreate(String dataTypeName, String esId, String json, List<String> onlyForInsert) {
+               if(esId==null) {
+                       LOG.warn("try to update or insert {} with id null is not allowed.",dataTypeName);
+                       return null;
+               }
+               boolean success = false;
+               UpdateRequest request = new UpdateRequest(dataTypeName, dataTypeName, esId);
+               request.source(new JSONObject(json),onlyForInsert);
+               try {
+                       UpdateResponse response = this.update(request);
+                       success = response.succeeded();
+               } catch (IOException e) {
+                       LOG.warn("Problem updating {} with id {} and data {}: {}", dataTypeName, esId, json, e);
+               }
+               if(this.doRefreshAfterWrite) {
+                       this.doRefresh(dataTypeName);
+               }
+               return success ? esId : null;
+       }
+       @Override
+       public String doUpdate(String dataTypeName, String json, QueryBuilder query) {
+               boolean success = false;
+               UpdateByQueryRequest request = new UpdateByQueryRequest(dataTypeName, dataTypeName );
+               request.source(new JSONObject(json),query);
+               try {
+                       UpdateByQueryResponse response = this.update(request);
+                       success = !response.hasFailures();
+               } catch (IOException e) {
+                       LOG.warn("Problem updating items in {} with query {} and data {}: {}", dataTypeName, query, json, e);
+               }
+               if(this.doRefreshAfterWrite) {
+                       this.doRefresh(dataTypeName);
+               }
+               return success?"":null;
+       }
+
+
+
+       @Override
+       public int doRemove(String dataTypeName, QueryBuilder query) {
+               int del=0;
+               DeleteByQueryRequest request = new DeleteByQueryRequest(dataTypeName);
+               request.source(query);
+               try {
+                       DeleteByQueryResponse response = this.deleteByQuery(request);
+                       del = response.getDeleted();
+               } catch (IOException e) {
+                       LOG.warn("Problem delete in {} with query {}:{} ", dataTypeName, query.toJSON(), e);
+               }
+               if(this.doRefreshAfterWrite) {
+                       this.doRefresh(dataTypeName);
+               }
+               return del;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java
new file mode 100644 (file)
index 0000000..c7d2720
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+public class InvalidProtocolException extends Exception {
+
+       
+       /**
+        * 
+        */
+       private static final long serialVersionUID = 1L;
+       
+       public InvalidProtocolException(String e) {
+               super(e);
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java
new file mode 100644 (file)
index 0000000..a5c7df6
--- /dev/null
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+/**
+ * Element is a document in the ES database.
+ */
+public interface IsEsObject {
+
+    /**
+     * Set the ES Id
+     * @param id Set the ID, created by ES for this Object
+     */
+    void setEsId( String id );
+
+    /**
+     * Get Id content as string that is used in ES
+     * @return Related ID, that was specified by set command.
+     */
+    String getEsId();
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java
new file mode 100644 (file)
index 0000000..e86c5c3
--- /dev/null
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import org.json.JSONObject;
+
+public class SearchHit {
+
+       private String index;
+       private String type;
+       private String id;
+       private JSONObject source;
+
+       public SearchHit(JSONObject o) {
+               this.index=o.getString("_index");
+               this.type = o.getString("_type");
+               this.id = o.getString("_id");
+               this.source = o.getJSONObject("_source");
+       }
+       
+       public String getIndex() {
+               return this.index;
+       }
+       public String getType() {
+               return this.type;
+       }
+       public String getId() {
+               return this.id;
+       }
+
+       public String getSourceAsString() {
+               return this.source.toString();
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java
new file mode 100644 (file)
index 0000000..eedc45c
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class SearchResult<T> {
+
+       /**
+        * objects in results
+        */
+       private final List<T> hits;
+       /**
+        * size of all potential hits
+        * not necessarily the number of hits
+        */
+       private long total;
+
+       public SearchResult(T[] hits) {
+               this(hits,hits==null?0:hits.length);
+       }
+       public SearchResult(T[] hits,long total) {
+               this.hits = Arrays.asList(hits);
+               this.total = total;
+       }
+//     public SearchResult(List<T> hits,long total) {
+//             this.hits = hits;
+//             this.total = total;
+//     }
+       public SearchResult() {
+               this.hits=new ArrayList<>();
+               this.total = 0;
+       }
+       public List<T> getHits() {
+               return this.hits;
+       }
+       public long getTotal() {
+               return this.total;
+       }
+       public void setTotal(long total) {
+               this.total = total;
+       }
+       public void add(T object) {
+               this.hits.add(object);
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java
new file mode 100644 (file)
index 0000000..11554b5
--- /dev/null
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.config;
+
+public class HostInfo {
+
+       public enum Protocol{
+               HTTP("http"),
+               HTTPS("https");//,
+//             FILETRANSFERPROTOCOL("ftp");
+
+               private final String value;
+
+               private Protocol(String s) {
+                       this.value = s;
+               }
+               @Override
+               public String toString() {
+                       return this.value;
+               }
+               public String getValue() {
+                       return value;
+               }
+               public static Protocol getValueOf(String s)  {
+                       s = s.toLowerCase();
+                       for(Protocol p:Protocol.values()) {
+                               if(p.value.equals(s)) {
+                                       return p;
+                               }
+                       }
+                       return HTTP;
+               }
+       }
+       private static final Protocol DEFAULT_PROTOCOL = Protocol.HTTP;
+       public final String hostname;
+       public final int port;
+       public final Protocol protocol;
+
+       public HostInfo(String hostname,int port, Protocol protocol)  {
+               this.hostname = hostname;
+               this.port = port;
+               this.protocol=protocol;
+
+       }
+
+       public HostInfo(String hostname, int port) {
+               this(hostname,port,DEFAULT_PROTOCOL);
+
+       }
+
+       @Override
+       public String toString() {
+               return "HostInfo [hostname=" + hostname + ", port=" + port + ", protocol=" + protocol + "]";
+       }
+
+       public String toUrl() {
+               return String.format("%s://%s:%d",this.protocol,this.hostname,this.port);
+       }
+
+       public static HostInfo getDefault() {
+               return new HostInfo("localhost",9200,Protocol.HTTP);
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
new file mode 100644 (file)
index 0000000..19cb826
--- /dev/null
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.data;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
+
+public class DbFilter {
+
+       public static String createDatabaseRegex(String restFilterValue) {
+               return restFilterValue == null ? null : restFilterValue.replace("?", ".{1,1}").replace("*", ".*");
+       }
+
+       public static boolean hasSearchParams(String restFilterValue) {
+               return restFilterValue == null ? false : restFilterValue.contains("*") || restFilterValue.contains("?");
+       }
+
+       public static boolean isComparisonValid(String restFilterValue) {
+               return restFilterValue == null ? false : restFilterValue.contains(">") || restFilterValue.contains("<");
+       }
+
+       public static RangeQueryBuilder getRangeQuery(String key, String restFilterValue) {
+               RangeQueryBuilder query = new RangeQueryBuilder(key);
+               restFilterValue = restFilterValue.trim();
+               if (restFilterValue.startsWith(">=")) {
+                       query.gte(getObjectFromString(restFilterValue.substring(2).trim()));
+               } else if (restFilterValue.startsWith(">")) {
+                       query.gt(getObjectFromString(restFilterValue.substring(1).trim()));
+               } else if (restFilterValue.startsWith("<=")) {
+                       query.lte(getObjectFromString(restFilterValue.substring(2).trim()));
+               }  else if (restFilterValue.startsWith("<")) {
+                       query.lt(getObjectFromString(restFilterValue.substring(1).trim()));
+               } else {
+                       return null;
+               }
+
+               return query;
+       }
+
+       private static Object getObjectFromString(String str) {
+               try {
+               return Double.parseDouble(str);
+           } catch (NumberFormatException | NullPointerException nfe) {
+               return str;
+           }
+               
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java
new file mode 100644 (file)
index 0000000..a753122
--- /dev/null
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.data;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.IsEsObject;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * @author Herbert
+ *
+ */
+public class EsObject implements IsEsObject {
+
+    @JsonIgnore
+    private String esId;
+
+    @Override
+    public String getEsId() {
+        return esId;
+    }
+
+    @Override
+    public void setEsId(String esId) {
+        this.esId = esId;
+    }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java
new file mode 100644 (file)
index 0000000..5edc261
--- /dev/null
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class BoolQueryBuilder extends QueryBuilder {
+
+       private JSONObject inner;
+
+       public BoolQueryBuilder() {
+               super();
+               this.inner = new JSONObject();
+               this.setQuery("bool", this.inner);
+       }
+
+       @Override
+       public String toString() {
+               return "BoolQueryBuilder [inner=" + inner + "]";
+       }
+
+       public BoolQueryBuilder must(QueryBuilder matchQuery) {
+               
+               if(this.inner.has("must") || this.inner.has("match") || this.inner.has("regexp")) {
+                       Object x = this.inner.has("must") ?this.inner.get("must"):this.inner;
+                       if(x instanceof JSONArray) {
+                               ((JSONArray)x).put(matchQuery.getInner());
+                       }
+                       else {
+                               this.inner = new JSONObject();
+                               this.inner.put("must", new JSONObject());
+                               JSONArray a=new JSONArray();
+                               a.put(x);
+                               a.put(matchQuery.getInner());
+                               this.inner.put("must", a);
+                       }
+               }
+               
+               else {
+                       this.inner = matchQuery.getInner();
+               }
+               this.setQuery("bool", this.inner);
+               return this;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
new file mode 100644 (file)
index 0000000..c1f372c
--- /dev/null
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+public class QueryBuilder {
+
+       private JSONObject innerQuery;
+       private final JSONObject outerQuery;
+       private final JSONObject queryObj;
+
+       public QueryBuilder() {
+               this.outerQuery = new JSONObject();
+               this.queryObj = new JSONObject();
+               this.outerQuery.put("query", this.queryObj);
+
+       }
+
+       public QueryBuilder from(long from) {
+               this.outerQuery.put("from", from);
+               return this;
+       }
+
+       public QueryBuilder size(long size) {
+               this.outerQuery.put("size", size);
+               return this;
+       }
+
+       public QueryBuilder sort(String prop, SortOrder order) {
+               JSONArray a;
+               if (this.outerQuery.has("sort")) {
+                       a = this.outerQuery.getJSONArray("sort");
+               } else {
+                       a = new JSONArray();
+               }
+               JSONObject sortObj = new JSONObject();
+               JSONObject orderObj = new JSONObject();
+               orderObj.put("order", order.getValue());
+               sortObj.put(prop, orderObj);
+               a.put(sortObj);
+               this.outerQuery.put("sort", a);
+               return this;
+       }
+
+       public QueryBuilder aggregations(String key, SortOrder sortOrder) {
+               JSONObject keyquery = new JSONObject();
+               JSONObject terms = new JSONObject();
+               JSONObject field = new JSONObject();
+               field.put("field", key);
+               terms.put("terms", field);
+               if(sortOrder!=null) {
+                       JSONObject so = new JSONObject();
+                       so.put("_key",sortOrder.getValue());
+                       terms.put("order", so);
+               }
+               keyquery.put(key, terms);
+               this.outerQuery.put("aggs", keyquery);
+               return this;
+       }
+
+       protected QueryBuilder setQuery(String key, JSONObject query) {
+               this.innerQuery = query;
+               this.queryObj.put(key, this.innerQuery);
+               return this;
+       }
+
+       public JSONObject getInner() {
+               return this.queryObj;
+       }
+       public boolean contains(String match) {
+               return this.toJSON().contains(match);
+       }
+       public String toJSON() {
+               return this.outerQuery.toString();
+       }
+
+       public QueryBuilder aggregations(String key) {
+               return this.aggregations(key, null);
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
new file mode 100644 (file)
index 0000000..b9271c2
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+import org.json.JSONObject;
+
+public class QueryBuilders {
+
+       public static QueryBuilder matchAllQuery() {
+               return new QueryBuilder().setQuery("match_all",new JSONObject());
+       }
+       public static QueryBuilder termQuery(String key, String value) {
+               JSONObject o=new JSONObject();
+               o.put(key, value);
+               return new QueryBuilder().setQuery("term", o);
+       }
+       public static QueryBuilder matchQuery(String key, Object value) {
+               JSONObject o=new JSONObject();
+               o.put(key, value);
+               return new QueryBuilder().setQuery("match", o);
+       }
+       public static BoolQueryBuilder boolQuery() {
+               return new BoolQueryBuilder();
+       }
+       public static RangeQueryBuilder rangeQuery(String key) {
+               return new RangeQueryBuilder(key);
+       }
+       public static RegexQueryBuilder regex(String propertyName, String re) {
+               return new RegexQueryBuilder().add(propertyName, re);
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java
new file mode 100644 (file)
index 0000000..e9df263
--- /dev/null
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+import org.json.JSONObject;
+
+public class RangeQueryBuilder extends QueryBuilder{
+
+       private Object gtValue=null;
+       private Object gteValue=null;
+       private Float boost=2.0f;
+       private Object ltValue=null;
+       private Object lteValue=null;
+       private String key;
+
+       public RangeQueryBuilder(String key) {
+               super();
+               this.key=key;
+               
+       }
+
+       private void setQuery() {
+               JSONObject r=new JSONObject();
+               JSONObject k=new JSONObject();
+               if(this.gteValue!=null) {
+                       k.put("gte", this.gteValue);
+               }else if(this.gtValue!=null) {
+                       k.put("gt", this.gtValue);
+               }
+               if(this.lteValue!=null) {
+                       k.put("lte", this.lteValue);
+               } else if(this.ltValue!=null) {
+                       k.put("lt", this.ltValue);
+               }
+               if(this.boost!=null) {
+                       k.put("boost", this.boost);
+               }
+               r.put(this.key,k);
+               
+               this.setQuery("range",r);
+       }
+       
+
+       public RangeQueryBuilder lte(Object compare) {
+               this.lteValue=compare;
+               this.ltValue=null;
+               this.setQuery();
+               return this;
+       }
+       public RangeQueryBuilder lt(Object compare) {
+               this.lteValue=null;
+               this.ltValue=compare;
+               this.setQuery();
+               return this;
+       }
+       
+       public RangeQueryBuilder gte(Object compare) {
+               this.gteValue=compare;
+               this.gtValue=null;
+               this.setQuery();
+               return this;
+       }
+       public RangeQueryBuilder gt(Object compare) {
+               this.gteValue=null;
+               this.gtValue=compare;
+               this.setQuery();
+               return this;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java
new file mode 100644 (file)
index 0000000..d9f9c10
--- /dev/null
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+import org.json.JSONObject;
+
+public class RegexQueryBuilder extends QueryBuilder {
+
+       private JSONObject inner;
+
+       public RegexQueryBuilder() {
+               super();
+               this.inner = new JSONObject();
+               this.setQuery("regexp", this.inner);
+       }
+       public RegexQueryBuilder add(String propertyName, String filter) {
+               JSONObject regexFilter = new JSONObject();
+               regexFilter.put("value", filter);
+               regexFilter.put("flags", "ALL");
+               regexFilter.put("max_determinized_states", 10000);
+               this.inner.put(propertyName, regexFilter);
+               return this;
+       }
+       @Override
+       public String toString() {
+               return "RegexQueryBuilder [inner=" + inner + "]";
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java
new file mode 100644 (file)
index 0000000..aae7f64
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+
+public enum SortOrder {
+
+       ASCENDING("asc"),
+       DESCENDING("desc");
+       
+       private final String value;
+
+       SortOrder(String so){
+               this.value=so;
+       }
+       public String getValue() {
+               return  this.value;
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java
new file mode 100644 (file)
index 0000000..e00cd1a
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+import org.elasticsearch.client.Request;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class BaseRequest {
+
+       private static final Logger LOG = LoggerFactory.getLogger(BaseRequest.class);
+
+       protected final Request request;
+       private String query;
+       public BaseRequest(String method, String endpoint) {
+               LOG.debug("create request {} {}", method, endpoint);
+               this.request = new Request(method, endpoint);
+               query=null;
+       }
+
+       public Request getInner() {
+
+               return this.request;
+       }
+
+       public static String urlEncodeValue(String value) {
+               if (value == null)
+                       return null;
+               try {
+                       return URLEncoder.encode(value, StandardCharsets.UTF_8.toString()).replace("+", "%20");
+               } catch (UnsupportedEncodingException ex) {
+                       LOG.warn("encoding problem: {}", ex.getMessage());
+               }
+               return value;
+       }
+       @Override
+       public String toString() {
+               return this.request.getMethod() + " "+this.request.getEndpoint()+ " : "+(this.query!=null?this.query:"no query");
+       }
+
+       protected void setQuery(QueryBuilder query) {
+               this.setQuery(query.toJSON());
+       }
+
+       public void setQuery(JSONObject o) {
+               this.setQuery(o.toString());
+       }
+
+       public void setQuery(String content) {
+               this.query=content;
+               LOG.trace("query={}",content);
+               this.request.setJsonEntity(this.query);
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java
new file mode 100644 (file)
index 0000000..4c1d858
--- /dev/null
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+public class ClusterHealthRequest extends BaseRequest{
+
+       
+       public ClusterHealthRequest() {
+               super("GET","/_cluster/health");
+       }
+
+       public void timeout(long seconds) {
+               this.request.addParameter("timeout", String.valueOf(seconds)+"s");
+               
+       }       
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java
new file mode 100644 (file)
index 0000000..0e00d5d
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+public class CountRequest extends BaseRequest{
+
+       
+       public CountRequest(String alias,String dataType) {
+               super("GET",String.format("/%s/%s/_count",alias,dataType));
+       }
+
+       
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java
new file mode 100644 (file)
index 0000000..c7e27ee
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import org.json.JSONObject;
+
+//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.create.json
+//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_mapping.json
+public class CreateIndexRequest extends BaseRequest{
+
+       private JSONObject settings;
+       private JSONObject mappings;
+
+       public CreateIndexRequest(String index) {
+               super("PUT","/"+index);
+               this.mappings=new JSONObject();
+       }
+
+       private void setRequest() {
+       
+               JSONObject o=new JSONObject();
+               if(this.mappings!=null) {
+                       o.put("mappings", this.mappings);
+               }
+               if(this.settings!=null) {
+                       o.put("settings", this.settings);
+               }
+               super.setQuery(o);
+       }
+       public void mappings(JSONObject mappings) {
+               this.mappings=mappings;
+               this.setRequest();
+       }
+
+       public void settings(JSONObject settings) {
+               this.settings = settings;
+               this.setRequest();
+       }
+
+       public boolean hasMappings() {
+               return this.mappings!=null;
+       }
+
+       public boolean hasSettings() {
+               return this.settings!=null;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java
new file mode 100644 (file)
index 0000000..b02f027
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+
+public class DeleteByQueryRequest  extends BaseRequest {
+
+       public DeleteByQueryRequest(String alias) {
+               super("POST",String.format("/%s/_delete_by_query",alias));
+       }
+
+       public void source(QueryBuilder query) {
+               this.setQuery(query);
+       }
+
+       
+
+       
+}
\ No newline at end of file
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java
new file mode 100644 (file)
index 0000000..f673c53
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete.json
+public class DeleteIndexRequest extends BaseRequest{
+
+       public DeleteIndexRequest(String index) {
+               super("DELETE","/"+index);
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java
new file mode 100644 (file)
index 0000000..fb84ce4
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+public class DeleteRequest extends BaseRequest {
+
+       public DeleteRequest(String alias,String dataType,String esId) {
+               super("DELETE",String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId)));
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java
new file mode 100644 (file)
index 0000000..2a56b21
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.exists.json
+public class GetIndexRequest extends BaseRequest {
+
+       public GetIndexRequest(String index) {
+               super("HEAD","/"+index);
+       }
+
+       
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java
new file mode 100644 (file)
index 0000000..855a7c4
--- /dev/null
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import javax.annotation.Nonnull;
+
+public class GetRequest extends BaseRequest{
+
+       public GetRequest(String alias,String dataType,@Nonnull String esId) {
+               super("GET",String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId)));
+       }
+
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java
new file mode 100644 (file)
index 0000000..521760c
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import javax.annotation.Nullable;
+
+public class IndexRequest extends BaseRequest{
+
+       public IndexRequest(String alias, String dataType) {
+               this(alias,dataType,null);
+       }
+
+       public IndexRequest(String alias,String dataType, @Nullable String esId) {
+               super("POST",esId!=null?String.format("/%s/%s/%s",alias,dataType,BaseRequest.urlEncodeValue(esId)):String.format("/%s/%s",alias,dataType));
+       }
+
+       public void source(String content) {
+               super.setQuery(content);
+       }
+
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java
new file mode 100644 (file)
index 0000000..e9436e9
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+//https://github.com/elastic/elasticsearch/blob/6.4/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_alias.json
+public class IndicesAliasesRequest extends BaseRequest{
+
+       public IndicesAliasesRequest(String index, String alias) {
+               super("PUT", String.format("/%s/_alias/%s",index,alias));
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java
new file mode 100644 (file)
index 0000000..e77a39a
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+public class NodeStatsRequest extends BaseRequest{
+
+       
+       public NodeStatsRequest() {
+               super("GET","/_nodes/stats");
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java
new file mode 100644 (file)
index 0000000..e7cdd0c
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+public class RefreshIndexRequest extends BaseRequest{
+
+       public RefreshIndexRequest(String alias) {
+               super("GET",String.format("/%s/_refresh",alias));
+       }
+
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java
new file mode 100644 (file)
index 0000000..86fa8a9
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+
+public class SearchRequest extends BaseRequest{
+
+       public SearchRequest(String alias,String dataType) {
+               super("POST",String.format("/%s/%s/_search", alias,dataType));
+       }
+
+       @Override
+       public void setQuery(QueryBuilder query){
+               super.setQuery(query);
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java
new file mode 100644 (file)
index 0000000..b1469a5
--- /dev/null
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+
+public class UpdateByQueryRequest extends BaseRequest {
+
+       private JSONObject params;
+
+       public UpdateByQueryRequest(String alias, String dataType) {
+               super("POST", String.format("/%s/%s/_update_by_query", alias, dataType));
+               this.params = null;
+       }
+
+       public void source(String esId, JSONObject map) {
+               this.source(map, QueryBuilders.matchQuery("_id", esId));
+       }
+
+       public void source(JSONObject map, QueryBuilder query) {
+               JSONObject outer = new JSONObject();
+               outer.put("query", query.getInner());
+               JSONObject script = new JSONObject();
+               script.put("lang", "painless");
+               script.put("inline", this.createInline(map));
+               if(this.params!=null) {
+                       script.put("params",this.params);
+               }
+               outer.put("script", script);
+               super.setQuery(outer.toString());
+       }
+
+       private String createInline(JSONObject map) {
+               String s = "", k, pkey;
+               int i = 1;
+               Object value;
+               for (Object key : map.keySet()) {
+                       k = String.valueOf(key);
+                       value = map.get(k);
+                       if (value instanceof JSONObject || value instanceof JSONArray) {
+                               pkey = String.format("p%d", i++);
+                               if (value instanceof JSONObject) {
+                                       this.withParam(pkey, (JSONObject) value);
+                               } else {
+                                       this.withParam(pkey, (JSONArray) value);
+                               }
+
+                               s += String.format("ctx._source['%s']=%s;", key, "params." + pkey);
+                       } else {
+                               s += String.format("ctx._source['%s']=%s;", key, escpaped(value));
+                       }
+               }
+               return s;
+       }
+
+       private UpdateByQueryRequest withParam(String key, JSONArray p) {
+               if (this.params == null) {
+                       this.params = new JSONObject();
+               }
+               this.params.put(key, p);
+               return this;
+       }
+
+       private UpdateByQueryRequest withParam(String key, JSONObject p) {
+               if (this.params == null) {
+                       this.params = new JSONObject();
+               }
+               this.params.put(key, p);
+               return this;
+       }
+
+       private String escpaped(Object value) {
+               String s = "";
+               if (value instanceof Boolean || value instanceof Integer || value instanceof Long || value instanceof Float
+                               || value instanceof Double) {
+                       s = String.valueOf(value);
+               } else {
+                       s = "\"" + String.valueOf(value) + "\"";
+               }
+               return s;
+
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java
new file mode 100644 (file)
index 0000000..adab44d
--- /dev/null
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.requests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UpdateRequest extends BaseRequest {
+
+       private static final Logger LOG = LoggerFactory.getLogger(UpdateRequest.class);
+       private JSONObject params;
+
+       public UpdateRequest(String alias, String dataType, String esId) {
+               super("POST", String.format("/%s/%s/%s/_update", alias, dataType, BaseRequest.urlEncodeValue(esId)));
+               this.params = null;
+       }
+
+       private UpdateRequest withParam(String key, JSONObject p) {
+               if (this.params == null) {
+                       this.params = new JSONObject();
+               }
+               this.params.put(key, p);
+               return this;
+       }
+
+       private UpdateRequest withParam(String key, JSONArray p) {
+               if (this.params == null) {
+                       this.params = new JSONObject();
+               }
+               this.params.put(key, p);
+               return this;
+       }
+       public void source(JSONObject map) {
+               this.source(map,null);
+       }
+       public void source(JSONObject map, List<String> onlyForInsert) {
+               JSONObject outer = new JSONObject();
+               JSONObject script = new JSONObject();
+               script.put("lang", "painless");
+               script.put("source", this.createInline(map,onlyForInsert));
+               if(this.params!=null) {
+                       script.put("params",this.params);
+               }
+               outer.put("script", script);
+               outer.put("upsert", map);
+               LOG.debug("update payload: " + outer.toString());
+               super.setQuery(outer.toString());
+       }
+
+       private String createInline(JSONObject map, List<String> onlyForInsert) {
+               if(onlyForInsert==null) {
+                       onlyForInsert = new ArrayList<String>();
+               }
+               String s = "",k="";
+               Object value;
+               String pkey;
+               int i = 0;
+               for (Object key : map.keySet()) {
+                       k=String.valueOf(key);
+                       if(onlyForInsert.contains(k)) {
+                               continue;
+                       }
+                       value = map.get(k);
+                       if (value instanceof JSONObject || value instanceof JSONArray) {
+                               pkey = String.format("p%d", i++);
+                               if (value instanceof JSONObject) {
+                                       this.withParam(pkey, (JSONObject) value);
+                               } else {
+                                       this.withParam(pkey, (JSONArray) value);
+                               }
+
+                               s += String.format("ctx._source['%s']=%s;", key, "params."+pkey);
+                       } else {
+                               s += String.format("ctx._source['%s']=%s;", key, escpaped(value));
+                       }
+               }
+               return s;
+       }
+
+       private String escpaped(Object value) {
+               String s = "";
+               if (value instanceof Boolean || value instanceof Integer || value instanceof Long || value instanceof Float
+                               || value instanceof Double) {
+                       s = String.valueOf(value);
+               } else {
+                       s = "\"" + String.valueOf(value) + "\"";
+               }
+               return s;
+
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java
new file mode 100644 (file)
index 0000000..291ed51
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+public class AcknowledgedResponse extends BaseResponse{
+
+       private boolean isAcknowledged;
+
+       public AcknowledgedResponse(Response response) {
+               super(response);
+               JSONObject o = this.getJson(response);
+               if(o!=null) {
+                       this.isAcknowledged=o.getBoolean("acknowledged");
+               }
+       }
+
+       public boolean isAcknowledged() {
+               return this.isAcknowledged;
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java
new file mode 100644 (file)
index 0000000..debd5e4
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+public class AggregationEntries extends LinkedHashMap<String,Long>{
+
+       private static final long serialVersionUID = 1L;
+
+       /**
+        * Return page with keys
+        * @param size elements
+        * @param offset start position in list.
+        * @return List<String> with selected values
+        */
+       public String[] getKeysAsPagedStringList(long size, long offset) {
+               List<String> ltps = new ArrayList<String>();
+               String[] keys = keySet().toArray(new String[0]);
+               for (long i = offset; i < keys.length && i < offset + size; i++) {
+                       ltps.add(keys[(int) i]);
+               }
+               return ltps.toArray(new String[0]);
+       }
+
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java
new file mode 100644 (file)
index 0000000..49447f6
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Scanner;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BaseResponse {
+       private static final Logger LOG = LoggerFactory.getLogger(BaseResponse.class);
+       private int responseCode;
+
+       public int getResponseCode() {
+               return this.responseCode;
+       }
+       public boolean isResponseSucceeded() {
+               return this.responseCode<300;
+       }
+       public BaseResponse() {
+       }
+       public BaseResponse(Response response) {
+               this.responseCode = response!=null?response.getStatusLine().getStatusCode():0;
+       }
+       protected JSONObject getJson(Response response) {
+               Scanner s;
+               JSONObject o=null;
+               try {
+                       //input stream used because Scanner ignored whitespaces
+                       InputStream is = response.getEntity().getContent();
+                       long len;
+                       int BUFSIZE=1024;
+                       byte[] buffer = new byte[BUFSIZE];
+                       StringBuffer sresponse = new StringBuffer();
+                        while (true) {
+                 len = is.read(buffer, 0, BUFSIZE);
+                 if (len <= 0) {
+                     break;
+                 }
+
+                 sresponse.append(new String(buffer));
+             }
+
+                       LOG.debug("parsing response={}",sresponse);
+                       o = new JSONObject(sresponse.toString());
+               } catch (UnsupportedOperationException | IOException e) {
+                       LOG.warn("error parsing es response: {}",e.getMessage());
+               }
+
+               return o;
+       }
+       protected JSONObject getJson(String json) {
+               return new JSONObject(json);
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java
new file mode 100644 (file)
index 0000000..3f47ac2
--- /dev/null
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import java.io.IOException;
+import org.elasticsearch.client.Response;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class ClusterHealthResponse extends BaseResponse {
+
+       public static final String HEALTHSTATUS_GREEN = "green";
+       public static final String HEALTHSTATUS_YELLOW = "yellow";
+       public static final String HEALTSTATUS_RED = "red";
+
+       private String status;
+       private boolean timedOut;
+
+       /*
+        * "cluster_name": "docker-cluster", "status": "yellow", "timed_out": false,
+        * "number_of_nodes": 1, "number_of_data_nodes": 1, "active_primary_shards": 5,
+        * "active_shards": 5, "relocating_shards": 0, "initializing_shards": 0,
+        * "unassigned_shards": 5, "delayed_unassigned_shards": 0,
+        * "number_of_pending_tasks": 0, "number_of_in_flight_fetch": 0,
+        * "task_max_waiting_in_queue_millis": 0, "active_shards_percent_as_number": 50
+        */
+       public ClusterHealthResponse(Response response) throws UnsupportedOperationException, IOException, JSONException {
+               super(response);
+               
+               JSONObject o = this.getJson(response);
+               if (o != null) {
+                       this.status = o.getString("status");
+                       this.timedOut = o.getBoolean("timed_out");
+               }
+       }
+
+       public boolean isTimedOut() {
+               return this.timedOut;
+       }
+       public boolean isStatusMinimal(String status) {
+               if (status == null) {
+                       return true;
+               }
+               if (this.status.equals(HEALTHSTATUS_GREEN)) {
+                       return true;
+               }
+               if (this.status.equals(HEALTHSTATUS_YELLOW) && !status.equals(HEALTHSTATUS_GREEN)) {
+                       return true;
+               }
+               if (this.status.equals(status)) {
+                       return true;
+               }
+               return false;
+
+       }
+
+       public String getStatus() {
+               return this.status;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java
new file mode 100644 (file)
index 0000000..429c339
--- /dev/null
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+
+public class CountResponse extends BaseResponse {
+
+       private long count;
+       
+       public CountResponse(Response response) {
+               super(response);
+               
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java
new file mode 100644 (file)
index 0000000..29f7e88
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+
+public class CreateIndexResponse extends AcknowledgedResponse {
+
+       public CreateIndexResponse(Response response) {
+               super(response);
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java
new file mode 100644 (file)
index 0000000..467f7e9
--- /dev/null
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+/**
+ * {"took":1,"batches":0,"retries":{"search":0,"bulk":0},"throttled_millis":0,"total":0,"deleted":0,"noops":0,"requests_per_second":-1,"failures":[],"version_conflicts":0,"throttled_until_millis":0,"timed_out":false}
+ * @author jack
+ *
+ */
+public class DeleteByQueryResponse extends BaseResponse {
+
+       private int deleted;
+
+       public DeleteByQueryResponse(Response response) {
+               super(response);
+               try {
+                       JSONObject o = this.getJson(response);
+                       if (o != null) {
+                               this.deleted = o.getInt("deleted");
+                       }
+               }
+               catch(Exception e) {
+                       this.deleted=0;
+               }
+
+       }
+
+       public int getDeleted() {
+               return this.deleted;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java
new file mode 100644 (file)
index 0000000..7eb0a97
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+
+public class DeleteIndexResponse extends AcknowledgedResponse {
+
+       public DeleteIndexResponse(Response response) {
+               super(response);
+       }
+
+}
\ No newline at end of file
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java
new file mode 100644 (file)
index 0000000..db9124d
--- /dev/null
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+public class DeleteResponse extends BaseResponse {
+
+       private boolean isDeleted;
+
+       public DeleteResponse(Response response) {
+               super(response);
+               int code = response.getStatusLine().getStatusCode();
+               if (code < 210) {
+
+                       JSONObject o = this.getJson(response);
+                       if (o != null) {
+                               this.isDeleted = "deleted".equals(o.getString("result"));
+                       }
+               }
+               else {
+                       this.isDeleted=false;
+               }
+
+       }
+
+       public boolean isDeleted() {
+               return this.isDeleted;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java
new file mode 100644 (file)
index 0000000..49e3ad9
--- /dev/null
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
+
+public class GetResponse extends BaseResponse {
+
+       private boolean found;
+       private SearchHit result;
+
+       public GetResponse(Response response) {
+               super(response);
+               if (this.isResponseSucceeded()) {
+                       JSONObject o = this.getJson(response);
+                       this.found = o.getBoolean("found");
+                       this.result = new SearchHit(o);
+               } else {
+                       this.found = false;
+                       this.result = null;
+               }
+
+       }
+
+       public boolean isExists() {
+               return this.found;
+       }
+
+       public String getSourceAsBytesRef() {
+               return this.result.getSourceAsString();
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java
new file mode 100644 (file)
index 0000000..499cd37
--- /dev/null
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+public class IndexResponse extends BaseResponse{
+
+       private boolean isCreated;
+       private String id;
+       private boolean isUpdated;
+
+       public IndexResponse(Response response) {
+               super(response);
+               JSONObject o = this.getJson(response);
+               this.id=o.getString("_id");
+               this.isCreated="created".equals(o.getString("result"));
+               this.isUpdated="updated".equals(o.getString("result"));
+               //{"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
+       }
+
+       public String getId() {
+               return this.id;
+       }
+
+       public boolean isCreated() {
+               return this.isCreated;
+       }
+       public boolean isUpdated() {
+               return this.isUpdated;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java
new file mode 100644 (file)
index 0000000..3718fd3
--- /dev/null
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class NodeStatsResponse extends BaseResponse {
+
+       private NodesInfo nodesInfo;
+       private Map<String,NodeStats> nodeStats;
+       
+       public NodesInfo getNodesInfo() {
+               return this.nodesInfo;
+       }
+       public Map<String,NodeStats> getNodeStatistics(){
+               return this.nodeStats;
+       }
+       public NodeStatsResponse(Response response) throws UnsupportedOperationException, IOException, JSONException {
+               super(response);
+               
+               JSONObject o = this.getJson(response);
+               String k;
+               if (o != null) {
+                       this.nodesInfo = new NodesInfo(o.getJSONObject("_nodes"));
+                       this.nodeStats = new HashMap<>();
+                       if(this.nodesInfo.successful>0) {
+                               JSONObject stats = o.getJSONObject("nodes");
+                               for (Object key : stats.keySet()) {
+                                       k=String.valueOf(key);
+                                       this.nodeStats.put(k, new NodeStats(k,stats.getJSONObject(k)));
+                               }
+                       }
+               }
+       }
+
+       
+       
+       public static class NodesInfo{
+               @Override
+               public String toString() {
+                       return "NodesInfo [total=" + total + ", successful=" + successful + ", failed=" + failed + "]";
+               }
+
+               public final int total;
+               public final int successful;
+               public final int failed;
+
+               public NodesInfo(JSONObject o) {
+                       this.total =o.getInt("total");
+                       this.successful = o.getInt("successful");
+                       this.failed = o.getInt("failed");
+               }
+       }
+       public static class NodeStats{
+               public final String name;
+               public final NodeTotalDiskStats total;
+               
+               @Override
+               public String toString() {
+                       return "NodeStats [name=" + name + ", total=" + total + "]";
+               }
+
+               public NodeStats(String name,JSONObject o) {
+                       this.name = name;
+                       this.total = new NodeTotalDiskStats(o.getJSONObject("fs").getJSONObject("total"));
+               }
+       }
+       public static class NodeTotalDiskStats{
+               public final long total;
+               public final long available;
+               public final long free;
+
+               @Override
+               public String toString() {
+                       return "NodeTotalDiskStats [total=" + total + ", available=" + available + ", free=" + free
+                                       + ", getUseDiskPercentage()=" + getUseDiskPercentage() + "]";
+               }
+       
+               public float getUseDiskPercentage() {
+                       return (total-available)*100.0f/(float)total;
+               }
+               public NodeTotalDiskStats(JSONObject o) {
+                       this.total = o.getLong("total_in_bytes");
+                       this.available = o.getLong("available_in_bytes");
+                       this.free = o.getLong("free_in_bytes");
+               }
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java
new file mode 100644 (file)
index 0000000..569bef4
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+/**
+ * { "_shards": { "total": 10, "successful": 5, "failed": 0 } }
+ * 
+ * @author jack
+ *
+ */
+public class RefreshIndexResponse extends BaseResponse {
+
+       private boolean succeeded;
+
+       public RefreshIndexResponse(Response response) {
+               super(response);
+               JSONObject o = this.getJson(response);
+               this.succeeded = o.getJSONObject("_shards").getInt("failed") == 0;
+               // {"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
+       }
+
+       public boolean succeeded() {
+               return this.succeeded;
+       }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java
new file mode 100644 (file)
index 0000000..f13ad7d
--- /dev/null
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
+
+public class SearchResponse extends BaseResponse {
+
+       private long total;
+       private SearchHit[] searchHits;
+       private JSONObject aggregations;
+
+       public SearchResponse(Response response) {
+               super(response);
+               this.handleResult(this.getJson(response));
+       }
+
+       public SearchResponse(String json) {
+               super(null);
+               this.handleResult(this.getJson(json));
+       }
+
+       private void handleResult(JSONObject result) {
+               if(result!=null && this.isResponseSucceeded()) {
+                       JSONObject hitsouter=result.getJSONObject("hits");
+                       this.total = hitsouter.getLong("total");
+                       JSONArray a=hitsouter.getJSONArray("hits");
+                       SearchHit[] hits=new SearchHit[a.length()];
+                       for(int i=0;i<a.length();i++) {
+                               hits[i]=new SearchHit(a.getJSONObject(i));
+                       }
+                       this.searchHits=hits;
+                       if(result.has("aggregations")) {
+                               this.aggregations = result.getJSONObject("aggregations");
+                       }
+                       else {
+                               this.aggregations=null;
+                       }
+               }
+               else {
+                       this.searchHits=new SearchHit[0];
+               }
+       }
+       public SearchHit[] getHits() {
+               return this.searchHits;
+       }
+       public long getTotal() {
+               return this.total;
+       }
+       public boolean hasAggregations() {
+               return this.aggregations!=null;
+       }
+       public AggregationEntries getAggregations(String property) {
+               AggregationEntries entries=new AggregationEntries();
+               if(this.aggregations!=null && this.aggregations.has(property)) {
+                       JSONArray a=this.aggregations.getJSONObject(property).getJSONArray("buckets");
+                       for(int i=0;i<a.length();i++) {
+                               entries.put(a.getJSONObject(i).getString("key"),a.getJSONObject(i).getLong("doc_count") );
+                       }
+               }
+               return entries;
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java
new file mode 100644 (file)
index 0000000..6205df7
--- /dev/null
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+/**
+ * {  
+ *   "took":47,
+ *   "timed_out":false,
+ *   "total":1,
+ *   "updated":1,
+ *   "deleted":0,
+ *   "batches":1,
+ *   "version_conflicts":0,
+ *   "noops":0,
+ *   "retries":{
+ *     "bulk":0,
+ *     "search":0
+ *   },
+ *   "throttled_millis":0,
+ *   "requests_per_second":-1.0,
+ *   "throttled_until_millis":0,
+ *   "failures":[]}
+ * @author jack
+ *
+ */
+public class UpdateByQueryResponse extends BaseResponse{
+
+       
+       private int isUpdated;
+       private int failures;
+
+       public UpdateByQueryResponse(Response response) {
+               super(response);
+               JSONObject o = this.getJson(response);
+               
+               this.isUpdated=o.getInt("updated");
+               this.failures = o.getJSONArray("failures").length();
+               //{"_index":"historicalperformance24h","_type":"historicalperformance24h","_id":"CbZxvWwB4xjGPydc9ida","_version":1,"result":"created","_shards":{"total":4,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
+       }
+
+       
+       public boolean isUpdated() {
+               return this.isUpdated>0;
+       }
+       public boolean hasFailures() {
+               return this.failures>0;
+       }
+       @Override
+       public String toString() {
+               return "UpdateByQueryResponse [isUpdated=" + isUpdated + ", failures=" + failures + "]";
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java
new file mode 100644 (file)
index 0000000..5399694
--- /dev/null
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.database.responses;
+
+import org.elasticsearch.client.Response;
+import org.json.JSONObject;
+
+/**
+ {
+"_index": "networkelement-connection-v1",
+"_type": "networkelement-connection",
+"_id": "sim2",
+"_version": 2,
+"result": "updated",
+"_shards": {
+"total": 2,
+"successful": 1,
+"failed": 0
+},
+"_seq_no": 5,
+"_primary_term": 1
+}
+ * @author jack
+ *
+ */
+public class UpdateResponse extends BaseResponse{
+       
+       private String result;
+
+       public UpdateResponse(Response response) {
+               super(response);
+               JSONObject o = this.getJson(response);
+               
+               this.result=o.getString("result");
+       }
+       
+       public boolean succeeded() {
+               if(this.result==null) {
+                       return false;
+               }
+               String s=this.result.toLowerCase();
+               return s.equals("updated") || s.equals("created");
+       }
+
+       @Override
+       public String toString() {
+               return "UpdateResponse [result=" + result + "]";
+       }
+       
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java
new file mode 100644 (file)
index 0000000..89efc45
--- /dev/null
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You 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.
+ */
+
+package org.onap.ccsdk.features.sdnr.wt.common.file;
+
+import java.io.File;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Check every now and then that a certain file has not changed. If it has, then call the
+ * {@link #doOnChange} method.
+ *
+ * @author JunHo Yoon
+ * @since 3.1.1
+ */
+public abstract class FileWatchdog extends Thread {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileWatchdog.class);
+    /**
+     * The default delay between every file modification check, set to 60 seconds.
+     */
+    public static final long DEFAULT_DELAY = 60000;
+    /**
+     * The name of the file to observe for changes.
+     */
+    private final String filename;
+
+    /**
+     * The delay to observe between every check. By default set {@link #DEFAULT_DELAY}.
+     */
+    private long delay = DEFAULT_DELAY;
+
+    private final File file;
+    private long lastModified = 0;
+    private boolean warnedAlready = false;
+
+    protected FileWatchdog(String filename) {
+        this.filename = filename;
+        file = new File(filename);
+        setDaemon(true);
+        checkAndConfigure();
+    }
+
+    /**
+     * Set the delay to observe between each check of the file changes.
+     *
+     * @param delay the frequency of file watch.
+     */
+    public void setDelay(long delay) {
+        this.delay = delay;
+    }
+
+    /**
+     * abstract method to be run when the file is changed.
+     */
+    protected abstract void doOnChange();
+
+    protected void checkAndConfigure() {
+        boolean fileExists;
+        try {
+            fileExists = file.exists();
+        } catch (SecurityException e) {
+            LOGGER.warn("Was not allowed to read check file existence, file:[{}].",filename);
+            this.interrupt(); // there is no point in continuing
+            return;
+        }
+
+        if (fileExists) {
+            long l = file.lastModified(); // this can also throw a
+            if (lastModified == 0) {
+                lastModified = l; // is very unlikely.
+            }
+            if (l > lastModified) { // however, if we reached this point this
+                lastModified = l; // is very unlikely.
+                doOnChange();
+                warnedAlready = false;
+            }
+        } else {
+            if (!warnedAlready) {
+                LOGGER.debug("[{}] does not exist.", filename);
+                warnedAlready = true;
+            }
+        }
+    }
+
+    @Override
+    public void run() {
+        while (!isInterrupted()) {
+            checkAndConfigure();
+            try {
+                Thread.sleep(delay);
+            } catch (InterruptedException e) {
+                LOGGER.debug("Interrupted sleep. {}", e.getMessage());
+                Thread.currentThread().interrupt();
+            }
+        }
+        LOGGER.debug("Stoppen file watchdog for file {}", filename);
+    }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
new file mode 100644 (file)
index 0000000..d415d60
--- /dev/null
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.file;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class PomFile {
+
+       private Document xmlDoc;
+
+       public PomFile(InputStream is) throws ParserConfigurationException, SAXException, IOException {
+               DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
+                       .newInstance();
+//             documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+//             documentBuilderFactory.setFeature(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
+//             documentBuilderFactory.setFeature(XMLInputFactory.SUPPORT_DTD, false);
+
+               DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+               this.xmlDoc = documentBuilder.parse(is);
+       }
+       
+       public String getProperty(String key) {
+               Node props = findChild("properties",this.xmlDoc.getDocumentElement());
+               if(props!=null) {
+                       Node prop = findChild(key, props);
+                       if(prop!=null) {
+                       return getTextValue(prop);
+                       }
+               }
+               return null;
+       }
+       
+       public static String getTextValue(Node node) {
+           StringBuffer textValue = new StringBuffer();
+           for (int i = 0,length = node.getChildNodes().getLength(); i < length; i ++) {
+             Node c = node.getChildNodes().item(i);
+             if (c.getNodeType() == Node.TEXT_NODE) {
+               textValue.append(c.getNodeValue());
+             }
+           }
+           return textValue.toString().trim();
+         }
+
+       private Node findChild(String name,Node root) {
+               List<Element> childs = getChildElementNodes(root);
+               for(Element n : childs) {
+                       if(name.equals(n.getNodeName())) {
+                               return n;
+                       }
+               }
+               return null;
+       }
+         /**
+     * get all child nodes with type ELEMENT_NODE back in a list
+     * @param node parent node
+     * @return List with child nodes
+     */
+    private static List<Element> getChildElementNodes(Node node) {
+        List<Element> res = new ArrayList<>();
+        NodeList childs = node.getChildNodes();
+        Node item;
+        //System.out.println("Query node "+node.getNodeName());
+        for (int n=0; n < childs.getLength(); n++) {
+            item = childs.item(n);
+            //System.out.println(node.getNodeName()+"-"+item.getNodeName()+" "+item.getNodeType());
+            if (item.getNodeType() == Node.ELEMENT_NODE) {
+                res.add((Element)childs.item(n));
+            }
+        }
+        return res;
+    }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java
new file mode 100644 (file)
index 0000000..c1cb984
--- /dev/null
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.file;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Example Content:
+ *   #Generated by org.apache.felix.bundleplugin
+ *   #Tue Nov 19 10:17:57 CET 2019
+ *   version=0.7.0-SNAPSHOT
+ *   groupId=org.onap.ccsdk.features.sdnr.wt
+*    artifactId=sdnr-wt-data-provider-provider
+ * @author jack
+ *
+ */
+public class PomPropertiesFile {
+
+       private Date buildDate;
+       private String version;
+       private String groupId;
+       private String artifactId;
+       
+       public Date getBuildDate() {
+               return this.buildDate;
+       }
+       public String getVersion() {
+               return this.version;
+       }
+       public String getGroupId() {
+               return this.groupId;
+       }
+       public String getArtifactId() {
+               return this.artifactId;
+       }
+       private final DateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
+       public PomPropertiesFile(InputStream is) throws IOException {
+               ByteArrayOutputStream bos = new ByteArrayOutputStream();
+               int intRead;
+               while ((intRead = is.read()) != -1) {
+                       bos.write(intRead);
+               }
+               this.parse(new String(bos.toByteArray()));
+       }
+
+       private void parse(String s) {
+               String[] lines = s.split("\n");
+               for(String line:lines) {
+                       
+                       if(line.startsWith("#Generated")) {
+                               
+                       } else if( line.startsWith("groupId")) {
+                               this.groupId = line.substring("groupId=".length());
+                       }
+                       else if(line.startsWith("artifactId")) {
+                               this.artifactId = line.substring("artifactId=".length());
+                       }
+                       else if(line.startsWith("#")){
+                               try {
+                                       this.buildDate = sdf.parse(line.substring(1));
+                               } catch (ParseException e) {
+                                       
+                               }
+                       }
+                       if(version!=null && this.buildDate!=null && this.groupId!=null && this.artifactId!=null) {
+                               break;
+                       }
+               }
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
new file mode 100644 (file)
index 0000000..0604de3
--- /dev/null
@@ -0,0 +1,328 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.http;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.security.KeyFactory;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+import java.util.Map;
+import javax.annotation.Nonnull;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.xml.bind.DatatypeConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BaseHTTPClient {
+
+    private static Logger LOG = LoggerFactory.getLogger(BaseHTTPClient.class);
+    private static final int SSLCERT_NONE = -1;
+    private static final int SSLCERT_PCKS = 0;
+    private static final int SSLCERT_PEM = 1;
+    private static final int BUFSIZE = 1024;
+    private static final Charset CHARSET = StandardCharsets.UTF_8;
+    private static final String SSLCONTEXT = "TLSv1.2";
+    private static final int DEFAULT_HTTP_TIMEOUT_MS = 30000; // in ms
+
+    private final boolean trustAll;
+    private final String baseUrl;
+
+    private int timeout = DEFAULT_HTTP_TIMEOUT_MS;
+    private SSLContext sc = null;
+
+    public BaseHTTPClient(String base) {
+        this(base, false);
+    }
+
+    public BaseHTTPClient(String base, boolean trustAllCerts) {
+        this(base, trustAllCerts, null, null, SSLCERT_NONE);
+    }
+
+    public BaseHTTPClient(String base, boolean trustAllCerts, String certFilename, String passphrase, int sslCertType) {
+        if(!base.endsWith("/")) {
+               base+="/";
+        }
+       this.baseUrl = base;
+        this.trustAll = trustAllCerts;
+        try {
+            sc = setupSsl(trustAll, certFilename, passphrase, sslCertType);
+        } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException | CertificateException
+                | KeyStoreException | IOException | InvalidKeySpecException e) {
+            LOG.warn("problem ssl setup: " + e.getMessage());
+        }
+    }
+
+    protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers)
+            throws IOException {
+        return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers);
+    }
+
+    protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers)
+            throws IOException {
+        if (uri == null) {
+            uri = "";
+        }
+        String surl = this.baseUrl;
+        if (!surl.endsWith("/") && uri.length() > 0) {
+            surl += "/";
+        }
+        if (uri.startsWith("/")) {
+            uri = uri.substring(1);
+        }
+        surl += uri;
+        LOG.debug("try to send request with url=" + this.baseUrl + uri + " as method=" + method);
+        LOG.trace("body:" + (body == null ? "null" : new String(body, CHARSET)));
+        URL url = new URL(surl);
+        URLConnection http = url.openConnection();
+        http.setConnectTimeout(this.timeout);
+        if (surl.toString().startsWith("https")) {
+            if (sc != null) {
+                ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory());
+                if (trustAll) {
+                    LOG.debug("trusting all certs");
+                    HostnameVerifier allHostsValid = (hostname, session) -> true;
+                    ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid);
+                }
+            } else // Should never happen
+            {
+                LOG.warn("No SSL context available");
+                return new BaseHTTPResponse(-1, "");
+            }
+        }
+        ((HttpURLConnection) http).setRequestMethod(method);
+        http.setDoOutput(true);
+        if (headers != null && headers.size() > 0) {
+            for (String key : headers.keySet()) {
+                http.setRequestProperty(key, headers.get(key));
+                LOG.trace("set http header " + key + ": " + headers.get(key));
+            }
+        }
+        byte[] buffer = new byte[BUFSIZE];
+        int len = 0, lensum = 0;
+        // send request
+        // Send the message to destination
+        if (!method.equals("GET") && body != null && body.length > 0) {
+            try (OutputStream output = http.getOutputStream()) {
+                output.write(body);
+            }
+        }
+        // Receive answer
+        int responseCode = ((HttpURLConnection) http).getResponseCode();
+        String sresponse = "";
+        InputStream response = null;
+        try {
+            if (responseCode >= 200 && responseCode < 300) {
+                response = http.getInputStream();
+            } else {
+                response = ((HttpURLConnection) http).getErrorStream();
+                if (response == null) {
+                    response = http.getInputStream();
+                }
+            }
+            if (response != null) {
+                while (true) {
+                    len = response.read(buffer, 0, BUFSIZE);
+                    if (len <= 0) {
+                        break;
+                    }
+                    lensum += len;
+                    sresponse += new String(buffer, 0, len, CHARSET);
+                }
+            } else {
+                LOG.debug("response is null");
+            }
+        } catch (Exception e) {
+            LOG.debug("No response. ", e);
+        } finally {
+            if (response != null) {
+                response.close();
+            }
+        }
+        LOG.debug("ResponseCode: " + responseCode);
+        LOG.trace("Response (len:{}): {}", String.valueOf(lensum), sresponse);
+        return new BaseHTTPResponse(responseCode, sresponse);
+    }
+
+    public static SSLContext setupSsl(boolean trustall)
+            throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException,
+            IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException {
+
+        return setupSsl(trustall, null, null, SSLCERT_NONE);
+    }
+
+    /**
+     * @param keyFilename filename for key file
+     * @param certFilename filename for cert file
+     * @throws NoSuchAlgorithmException
+     * @throws KeyManagementException
+     * @throws IOException
+     * @throws FileNotFoundException
+     * @throws CertificateException
+     * @throws KeyStoreException
+     * @throws UnrecoverableKeyException
+     * @throws InvalidKeySpecException
+     */
+    /**
+     * Setup of SSLContext
+     *
+     * @param trustall true to switch of certificate verification
+     * @param certFilename filename for certificate file
+     * @param passPhrase for certificate
+     * @param certType of certificate
+     * @return SSL Context according to parameters
+     * @throws NoSuchAlgorithmException according name
+     * @throws KeyManagementException according name
+     * @throws CertificateException according name
+     * @throws FileNotFoundException according name
+     * @throws IOException according name
+     * @throws UnrecoverableKeyException according name
+     * @throws KeyStoreException according name
+     * @throws InvalidKeySpecException according name
+     */
+    public static SSLContext setupSsl(boolean trustall, String certFilename, String passPhrase, int certType)
+            throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException,
+            IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException {
+
+        SSLContext sc = SSLContext.getInstance(SSLCONTEXT);
+        TrustManager[] trustCerts = null;
+        if (trustall) {
+            trustCerts = new TrustManager[] {new javax.net.ssl.X509TrustManager() {
+                @Override
+                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+
+                @Override
+                public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
+
+                @Override
+                public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
+            }};
+
+        }
+        KeyManager[] kms = null;
+        if (certFilename != null && passPhrase != null && !certFilename.isEmpty() && !passPhrase.isEmpty()) {
+            if (certType == SSLCERT_PCKS) {
+                LOG.debug("try to load pcks file " + certFilename + " with passphrase=" + passPhrase);
+                KeyStore keyStore = KeyStore.getInstance("PKCS12");
+                FileInputStream fileInputStream = new FileInputStream(certFilename);
+                keyStore.load(fileInputStream, passPhrase.toCharArray());
+                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+                kmf.init(keyStore, passPhrase.toCharArray());
+                kms = kmf.getKeyManagers();
+                fileInputStream.close();
+                LOG.debug("successful");
+
+            } else if (certType == SSLCERT_PEM) {
+                LOG.debug("try to load pem files cert=" + certFilename + " key=" + passPhrase);
+                File fCert = new File(certFilename);
+                File fKey = new File(passPhrase);
+                KeyStore keyStore = KeyStore.getInstance("JKS");
+                keyStore.load(null);
+                byte[] certBytes = parseDERFromPEM(Files.readAllBytes(fCert.toPath()), "-----BEGIN CERTIFICATE-----",
+                        "-----END CERTIFICATE-----");
+                byte[] keyBytes = parseDERFromPEM(Files.readAllBytes(fKey.toPath()), "-----BEGIN PRIVATE KEY-----",
+                        "-----END PRIVATE KEY-----");
+
+                X509Certificate cert = generateCertificateFromDER(certBytes);
+                RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes);
+                keyStore.setCertificateEntry("cert-alias", cert);
+                keyStore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] {cert});
+
+                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+                kmf.init(keyStore, "changeit".toCharArray());
+                kms = kmf.getKeyManagers();
+                LOG.debug("successful");
+            }
+        }
+        // Init the SSLContext with a TrustManager[] and SecureRandom()
+        sc.init(kms, trustCerts, new java.security.SecureRandom());
+        return sc;
+    }
+
+    protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) {
+        String data = new String(pem);
+        String[] tokens = data.split(beginDelimiter);
+        tokens = tokens[1].split(endDelimiter);
+        return DatatypeConverter.parseBase64Binary(tokens[0]);
+    }
+
+    protected static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes)
+            throws InvalidKeySpecException, NoSuchAlgorithmException {
+        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
+
+        KeyFactory factory = KeyFactory.getInstance("RSA");
+
+        return (RSAPrivateKey) factory.generatePrivate(spec);
+    }
+
+    protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException {
+        CertificateFactory factory = CertificateFactory.getInstance("X.509");
+
+        return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes));
+    }
+
+    public static String getAuthorizationHeaderValue(String username, String password) {
+        return "Basic " + new String(Base64.getEncoder().encode((username + ":" + password).getBytes()));
+    }
+
+    public void setTimeout(int timeout) {
+        this.timeout = timeout;
+    }
+
+    public static int getSslCertPcks() {
+        return SSLCERT_PCKS;
+    }
+
+    public static int getSslCertNone() {
+        return SSLCERT_NONE;
+    }
+
+    public static int getSslCertPEM() {
+        return SSLCERT_PEM;
+    }
+
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java
new file mode 100644 (file)
index 0000000..2ef32fc
--- /dev/null
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.http;
+
+public class BaseHTTPResponse {
+
+       public static final int CODE404 = 404;
+       public static final int CODE200 = 200;
+       public static final BaseHTTPResponse UNKNOWN = new BaseHTTPResponse(-1, "");
+       public final int code;
+       public final String body;
+
+       public BaseHTTPResponse(int code,String body)
+       {
+               this.code=code;
+               this.body=body;
+       }
+
+       @Override
+       public String toString() {
+               return "BaseHTTPResponse [code=" + code + ", body=" + body + "]";
+       }
+
+       public boolean isSuccess() {
+               return this.code==CODE200;
+       }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java
new file mode 100644 (file)
index 0000000..17cc231
--- /dev/null
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class JSONAssert {
+
+       /**
+        * nonstrict comparison means that json array items can be in different orders
+        */
+       private static Comparator<JSONObject> nonStrictComarator = new Comparator<JSONObject>() {
+
+               @Override
+               public int compare(JSONObject o1, JSONObject o2) {
+                       if (o1.equals(o2)) {
+                               return 0;
+                       }
+                       Iterator<?> keys = o1.keys();
+                       while (keys.hasNext()) {
+                               String key = String.valueOf(keys.next());
+                               int x = this.test(o1.get(key), o2.get(key));
+                               if (x != 0) {
+                                       return x;
+                               }
+                       }
+                       return 0;
+               }
+
+               private int test(Object o1, Object o2) {
+                       int x;
+                       if ((o1 instanceof Double) && (o2 instanceof Double)) {
+
+                               return (((Double) o1).doubleValue() - ((Double) o2).doubleValue()) < 0 ? -1 : 1;
+                       } else if ((o1 instanceof Boolean) && (o2 instanceof Boolean)) {
+                               return ((Boolean) o1).booleanValue() == ((Boolean) o2).booleanValue() ? 0 : -1;
+
+                       } else if ((o1 instanceof String) && (o2 instanceof String)) {
+
+                               return ((String) o1).equals(((String) o2)) ? 0 : -1;
+                       } else if ((o1 instanceof JSONObject) && (o2 instanceof JSONObject)) {
+                               if (((JSONObject) o1).length() != ((JSONObject) o2).length()) {
+                                       return ((JSONObject) o1).length() - ((JSONObject) o2).length() < 0 ? -1 : 1;
+                               }
+                               Iterator<?> keys = ((JSONObject) o1).keys();
+                               while (keys.hasNext()) {
+                                       String key = String.valueOf(keys.next());
+                                       if (!((JSONObject) o2).has(key)) {
+                                               return -1;
+                                       }
+                                       x = this.test(((JSONObject) o1).get(key), ((JSONObject) o2).get(key));
+                                       if (x != 0) {
+                                               return x;
+                                       }
+                               }
+                       } else if ((o1 instanceof JSONArray) && (o2 instanceof JSONArray)) {
+                               if (((JSONArray) o1).length() != ((JSONArray) o2).length()) {
+                                       return ((JSONArray) o1).length() - ((JSONArray) o2).length() < 0 ? -1 : 1;
+                               }
+                               for (int i = 0; i < ((JSONArray) o1).length(); i++) {
+                                       x = this.findInArray(((JSONArray) o1).get(i), (JSONArray) o2);
+                                       if (x != 0) {
+                                               return x;
+                                       }
+                               }
+                               for (int i = 0; i < ((JSONArray) o2).length(); i++) {
+                                       x = this.findInArray(((JSONArray) o2).get(i), (JSONArray) o1);
+                                       if (x != 0) {
+                                               return x;
+                                       }
+                               }
+                       }
+                       return 0;
+
+               }
+
+               private int findInArray(Object node, JSONArray o) {
+                       for (int i = 0; i < o.length(); i++) {
+                               if (this.test(o.get(i), node) == 0) {
+                                       return 0;
+                               }
+                       }
+                       return -1;
+               }
+       };
+       /**
+        * strict comparison means that json array items have to be in the same order
+        */
+       private static Comparator<JSONObject> strictComarator = new Comparator<JSONObject>() {
+
+               @Override
+               public int compare(JSONObject o1, JSONObject o2) {
+                       if (o1.equals(o2)) {
+                               return 0;
+                       }
+                       Iterator<?> keys = o1.keys();
+                       while (keys.hasNext()) {
+                               String key = String.valueOf(keys.next());
+                               int x = this.test(o1.get(key), o2.get(key));
+                               if (x != 0) {
+                                       return x;
+                               }
+                       }
+                       return 0;
+               }
+
+               private int test(Object o1, Object o2) {
+                       int x;
+                       if ((o1 instanceof Double) && (o2 instanceof Double)) {
+
+                               return (((Double) o1).doubleValue() - ((Double) o2).doubleValue()) < 0 ? -1 : 1;
+                       } else if ((o1 instanceof Boolean) && (o2 instanceof Boolean)) {
+                               return ((Boolean) o1).booleanValue() == ((Boolean) o2).booleanValue() ? 0 : -1;
+
+                       } else if ((o1 instanceof String) && (o2 instanceof String)) {
+
+                               return ((String) o1).equals(((String) o2)) ? 0 : -1;
+                       } else if ((o1 instanceof JSONObject) && (o2 instanceof JSONObject)) {
+                               if (((JSONObject) o1).length() == 0 && ((JSONObject) o2).length() == 0) {
+                                       return 0;
+                               }
+                               Iterator<?> keys = ((JSONObject) o1).keys();
+                               while (keys.hasNext()) {
+                                       String key = String.valueOf(keys.next());
+                                       if (!((JSONObject) o2).has(key)) {
+                                               return -1;
+                                       }
+                                       x = this.test(((JSONObject) o1).get(key), ((JSONObject) o2).get(key));
+                                       if (x != 0) {
+                                               return x;
+                                       }
+                               }
+                       } else if ((o1 instanceof JSONArray) && (o2 instanceof JSONArray)) {
+                               if (((JSONArray) o1).length() != ((JSONArray) o2).length()) {
+                                       return ((JSONArray) o1).length() - ((JSONArray) o2).length() < 0 ? -1 : 1;
+                               }
+                               for (int i = 0; i < ((JSONArray) o1).length(); i++) {
+                                       x = this.test(((JSONArray) o1).get(i), ((JSONArray) o2).get(i));
+                                       if (x != 0) {
+                                               return x;
+                                       }
+                               }
+                       }
+                       return 0;
+
+               }
+       };
+       public static void assertEquals(String def, String toTest, boolean strict) throws JSONException {
+               assertEquals(null, def, toTest, strict);
+       }
+
+       public static void assertEquals(String message, String def, String toTest, boolean strict) throws JSONException {
+               if (strict) {
+                       assertEqualsStrict(message, def, toTest);
+               } else {
+                       assertEqualsNonStrict(message, def, toTest);
+               }
+       }
+       
+       private static void assertEqualsNonStrict(String message, String def, String toTest) throws JSONException  {
+
+               JSONObject d1 = new JSONObject(def);
+               JSONObject d2 = new JSONObject(toTest);
+               if (nonStrictComarator.compare(d1, d2) != 0) {
+                       throw new AssertionError(message);
+               }
+       }
+
+       private static void assertEqualsStrict(String message, String def, String toTest) throws JSONException {
+               JSONObject d1 = new JSONObject(def);
+               JSONObject d2 = new JSONObject(toTest);
+               if (strictComarator.compare(d1, d2) != 0) {
+                       throw new AssertionError(message);
+               }
+       }
+
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java
new file mode 100644 (file)
index 0000000..af3979c
--- /dev/null
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
+import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPResponse;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+
+@SuppressWarnings("restriction")
+public class TestBaseHttpClient {
+
+       public static final String HTTPMETHOD_GET = "GET";
+       public static final String HTTPMETHOD_POST = "POST";
+       public static final String HTTPMETHOD_PUT = "PUT";
+       public static final String HTTPMETHOD_DELETE = "DELETE";
+       public static final String HTTPMETHOD_OPTIONS = "OPTIONS";
+       public static final String RESPONSE_GET = "This is the response get";
+       public static final String RESPONSE_POST = "This is the response post";
+       public static final String RESPONSE_PUT = "This is the response put";
+       public static final String RESPONSE_DELETE = "This is the response delete";
+       public static final String RESPONSE_OPTIONS = "This is the response options";
+       private static final String TESTURI = "/mwtn/test";
+       private static HttpServer server;
+       private static ExecutorService httpThreadPool;
+       private static final int testPort = 54440;
+
+       @Test
+       public void test() {
+               MyHttpClient httpClient = new MyHttpClient("http://localhost:"+testPort, true);
+               Map<String, String> headers = new HashMap<String,String>();
+               headers.put("Authorization", BaseHTTPClient.getAuthorizationHeaderValue("admin", "admin"));
+               headers.put("Content-Type","application/json");
+               BaseHTTPResponse response=null;
+               try {
+                       response= httpClient.sendRequest(TESTURI, HTTPMETHOD_GET, null, headers );
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertEquals(RESPONSE_GET, response.body);
+               try {
+                       response= httpClient.sendRequest(TESTURI, HTTPMETHOD_POST, "{}", headers );
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertEquals(RESPONSE_POST, response.body);
+               try {
+                       response= httpClient.sendRequest(TESTURI, HTTPMETHOD_PUT, "{}", headers );
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertEquals(RESPONSE_PUT, response.body);
+               try {
+                       response= httpClient.sendRequest(TESTURI, HTTPMETHOD_DELETE, "{}", headers );
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertEquals(RESPONSE_DELETE, response.body);
+
+       }
+
+
+
+
+       @BeforeClass
+       public static void initTestWebserver() throws IOException {
+               server = HttpServer.create(new InetSocketAddress("127.0.0.1", testPort), 0);
+               httpThreadPool = Executors.newFixedThreadPool(5);
+               server.setExecutor(httpThreadPool);
+               server.createContext(TESTURI, new MyHandler());
+               //server.createContext("/", new MyRootHandler());
+               server.setExecutor(null); // creates a default executor
+               server.start();
+               System.out.println("http server started");
+       }
+       @AfterClass
+       public static void stopTestWebserver() {
+               System.out.println("try to stop server");
+               if (server != null) {
+                       server.stop(0);
+                       httpThreadPool.shutdownNow();
+                       System.out.println("http server stopped" );
+               }
+       }
+
+       private class MyHttpClient extends BaseHTTPClient{
+
+               public MyHttpClient(String base, boolean trustAllCerts) {
+                       super(base, trustAllCerts);
+               }
+
+               @Override
+               public BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers)
+                               throws IOException {
+                       return super.sendRequest(uri, method, body, headers);
+               }
+       }
+
+       public static class MyHandler implements HttpHandler {
+
+               @Override
+               public void handle(HttpExchange t) throws IOException {
+                       String method = t.getRequestMethod();
+                       System.out.println(String.format("req received: %s %s" ,method,t.getRequestURI()));
+                       OutputStream os = null;
+                       try {
+                               if (method.equals(HTTPMETHOD_GET)) {
+                                       t.sendResponseHeaders(200, RESPONSE_GET.length());
+                                       os = t.getResponseBody();
+                                       os.write(RESPONSE_GET.getBytes());
+                               } else if (method.equals(HTTPMETHOD_POST)) {
+                                       t.sendResponseHeaders(200, RESPONSE_POST.length());
+                                       os = t.getResponseBody();
+                                       os.write(RESPONSE_POST.getBytes());
+                               } else if (method.equals(HTTPMETHOD_PUT)) {
+                                       t.sendResponseHeaders(200, RESPONSE_PUT.length());
+                                       os = t.getResponseBody();
+                                       os.write(RESPONSE_PUT.getBytes());
+                               } else if (method.equals(HTTPMETHOD_DELETE)) {
+                                       t.sendResponseHeaders(200, RESPONSE_DELETE.length());
+                                       os = t.getResponseBody();
+                                       os.write(RESPONSE_DELETE.getBytes());
+                               } else if (method.equals(HTTPMETHOD_OPTIONS)) {
+                                       t.sendResponseHeaders(200, RESPONSE_OPTIONS.length());
+                                       //os = t.getResponseBody();
+                                       //os.write(RESPONSE_OPTIONS.getBytes());
+                               } else {
+                                       t.sendResponseHeaders(404, 0);
+                               }
+                               System.out.println("req handled successful");
+
+                       } catch (Exception e) {
+                               System.out.println(e.getMessage());
+                       }
+                       finally {
+                               if (os != null)
+                               {
+                                       os.flush();
+                                       os.close();
+                               }
+                       }
+               }
+       }
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java
new file mode 100644 (file)
index 0000000..f6f7411
--- /dev/null
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.Files;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.exception.ConversionException;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.filechange.IConfigChangedListener;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo.Protocol;
+
+public class TestConfig {
+
+       private static final String TESTFILENAME = "test.properties";
+       private static final String TESTKEY1 = "abc";
+       private static final String TESTKEY2 = "def";
+       private static final String TESTKEY3 = "hhh";
+       private static final String TESTKEY4 = "hhv";
+       
+       private static final int TESTVALUE1=123;
+       private static final int TESTVALUE1_2=1234;
+       private static final boolean TESTVALUE2 = true;
+       private static final String TESTVALUE3 = "http://localhost:2223";
+       private static final String TESTVALUE4 = "httasdasdas";
+       private static final String TESTCONTENT1 = "    [test]\n" + 
+                       TESTKEY1+"="+TESTVALUE1+"\n" + 
+                       "#her a comment\n"+
+                       TESTKEY2+"="+TESTVALUE2+"\n" + 
+                       TESTKEY3+"="+TESTVALUE3;
+       
+       
+
+       
+       @After
+       @Before
+       public void init() {
+               File f=new File(TESTFILENAME);
+               if(f.exists()) {
+                       f.delete();
+               }
+       }
+       
+       public void write(String filename,String lines) {
+               
+               try {
+                       Files.write(new File(filename).toPath(), lines.getBytes());
+               } catch (IOException e) {
+                       fail("problem writing file "+filename);
+               }
+       }
+       @Test
+       public void testRead() {
+               this.write(TESTFILENAME, TESTCONTENT1);
+               ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               Section section = confiuration.getSection("test").get();
+               assertNotNull(section);
+               try {
+                       assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0));
+                       assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2));
+                       assertEquals(TESTVALUE3, section.getString(TESTKEY3, ""));
+               } catch (ConversionException e) {
+                       fail(e.getMessage());
+               }
+               this.init();
+       }
+       @Test
+       public void testWrite() {
+               final String SECTIONNAME = "test";
+               //write values
+               ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               Section section=confiuration.addSection(SECTIONNAME);
+               
+               section.setProperty(TESTKEY1, String.valueOf(TESTVALUE1));
+               section.setProperty(TESTKEY2, String.valueOf(TESTVALUE2));
+               section.setProperty(TESTKEY3, String.valueOf(TESTVALUE3));
+               confiuration.save();
+       
+               //verify written
+               ConfigurationFileRepresentation confiuration2=new ConfigurationFileRepresentation(TESTFILENAME);
+               
+               section = confiuration2.getSection(SECTIONNAME).get();
+               assertNotNull(section);
+               try {
+                       assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0));
+                       assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2));
+                       assertEquals(TESTVALUE3, section.getString(TESTKEY3, ""));
+               } catch (ConversionException e) {
+                       fail(e.getMessage());
+               }
+               this.init();
+               
+               //write directly into base
+               confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               section=confiuration.addSection(SECTIONNAME);
+               confiuration.setProperty(SECTIONNAME,TESTKEY1 , TESTVALUE1);
+               confiuration.setProperty(SECTIONNAME,TESTKEY2 , TESTVALUE2);
+               confiuration.setProperty(SECTIONNAME,TESTKEY3 , TESTVALUE3);
+               confiuration.save();
+               
+               //verify
+               confiuration2=new ConfigurationFileRepresentation(TESTFILENAME);
+               section = confiuration2.getSection(SECTIONNAME).get();
+               assertNotNull(section);
+               assertEquals(TESTVALUE1, confiuration.getPropertyLong(SECTIONNAME,TESTKEY1).get().intValue());
+               assertEquals(TESTVALUE2, confiuration.getPropertyBoolean(SECTIONNAME,TESTKEY2));
+               assertEquals(TESTVALUE3, confiuration.getProperty(SECTIONNAME,TESTKEY3));
+               this.init();
+       
+       
+       }
+       @Test
+       public void testOverwrite() {
+               final String SECTIONNAME = "test";
+               //write values
+               ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               Section section=confiuration.addSection(SECTIONNAME);
+               
+               section.setProperty(TESTKEY1, String.valueOf(TESTVALUE1));
+               section.setProperty(TESTKEY2, String.valueOf(TESTVALUE2));
+               section.setProperty(TESTKEY3, String.valueOf(TESTVALUE3));
+               confiuration.save();
+       
+               //verify written
+               ConfigurationFileRepresentation confiuration2=new ConfigurationFileRepresentation(TESTFILENAME);
+               
+               section = confiuration2.getSection(SECTIONNAME).get();
+               
+               assertNotNull(section);
+               try {
+                       assertEquals(TESTVALUE1, section.getInt(TESTKEY1, 0));
+                       assertEquals(TESTVALUE2, section.getBoolean(TESTKEY2, !TESTVALUE2));
+                       assertEquals(TESTVALUE3, section.getString(TESTKEY3, ""));
+               } catch (ConversionException e) {
+                       fail(e.getMessage());
+               }
+                               
+               //write directly into base
+               confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               section=confiuration.addSection(SECTIONNAME);
+               confiuration.setPropertyIfNotAvailable(SECTIONNAME,TESTKEY1 , TESTVALUE1_2);
+               confiuration.setPropertyIfNotAvailable(SECTIONNAME,TESTKEY4 , TESTVALUE4);
+               
+               confiuration.save();
+               
+               //verify
+               confiuration2=new ConfigurationFileRepresentation(TESTFILENAME);
+               section = confiuration2.getSection(SECTIONNAME).get();
+               assertNotNull(section);
+               assertEquals(TESTVALUE1, confiuration.getPropertyLong(SECTIONNAME,TESTKEY1).get().intValue());
+               assertEquals(TESTVALUE2, confiuration.getPropertyBoolean(SECTIONNAME,TESTKEY2));
+               assertEquals(TESTVALUE3, confiuration.getProperty(SECTIONNAME,TESTKEY3));
+               assertEquals(TESTVALUE4, confiuration.getProperty(SECTIONNAME,TESTKEY4));
+               this.init();
+       
+       
+       }
+       static boolean changeFlag=false;
+       @Test
+       public void testChangeListener() {
+               
+               changeFlag=false;
+               this.init();
+               ConfigurationFileRepresentation confiuration=new ConfigurationFileRepresentation(TESTFILENAME);
+               IConfigChangedListener listener = new IConfigChangedListener() {
+                       
+                       @Override
+                       public void onConfigChanged() {
+                               changeFlag=true;
+                       }
+               };
+               confiuration.registerConfigChangedListener(listener );
+               try {
+                       Thread.sleep(2000);
+               } catch (InterruptedException e) {
+                       Thread.interrupted();
+               }
+               this.write(TESTFILENAME, TESTCONTENT1);
+               int i=10;
+               while(i-->0) {
+                       try {
+                               Thread.sleep(1000);
+                       } catch (InterruptedException e) {
+                               Thread.interrupted();
+                       }
+                       if(changeFlag) {
+                               break;
+                       }
+               }
+               confiuration.unregisterConfigChangedListener(listener);
+               assertTrue("changelistener not called",changeFlag);
+       }
+       @Test
+       public void testHostInfo() {
+               HostInfo hi=HostInfo.getDefault();
+               try {
+                       new URL(hi.toUrl());
+               } catch (MalformedURLException e) {
+                       fail("url conversion failed: "+e.getMessage());
+               }
+               hi = new HostInfo("localhost", 44444, Protocol.getValueOf("https"));
+               try {
+                       new URL(hi.toUrl());
+               } catch (MalformedURLException e) {
+                       fail("url conversion failed: "+e.getMessage());
+               }
+               
+       }
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java
new file mode 100644 (file)
index 0000000..2dd74bb
--- /dev/null
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.json.JSONException;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
+
+public class TestDatabaseFilterConversion {
+
+       @Test
+       public void testStartsWith() {
+               String re=DbFilter.createDatabaseRegex("abc*");
+               assertEquals("abc.*", re);
+       }
+       @Test
+       public void testEndsWith() {
+               String re=DbFilter.createDatabaseRegex("*abc");
+               assertEquals(".*abc", re);
+       }
+       @Test
+       public void testMultiple() {
+               String re=DbFilter.createDatabaseRegex("abc*ff*fa");
+               assertEquals("abc.*ff.*fa", re);
+       }
+       
+       @Test
+       public void testPlaceholder() {
+               String re=DbFilter.createDatabaseRegex("abc?ef");
+               assertEquals("abc.{1,1}ef", re);
+       }
+       @Test
+       public void testCombined() {
+               String re=DbFilter.createDatabaseRegex("abc?ff*fa");
+               assertEquals("abc.{1,1}ff.*fa", re);
+       }
+       @Test
+       public void testFilterCheck() {
+               assertTrue(DbFilter.hasSearchParams("abc?"));
+               assertTrue(DbFilter.hasSearchParams("bac*"));
+               assertFalse(DbFilter.hasSearchParams("abc+"));
+       }
+       @Test
+       public void testRangeConversion() {
+               try {
+                       JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"gte\":2230,\"boost\":2}}}}",
+                                       DbFilter.getRangeQuery("port", ">=2230").toJSON(),true);
+                       JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"gt\":2230,\"boost\":2}}}}",
+                                       DbFilter.getRangeQuery("port", ">2230").toJSON(),true);
+                       JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"lte\":2230,\"boost\":2}}}}",
+                                       DbFilter.getRangeQuery("port", "<=2230").toJSON(),true);
+                       JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"port\":{\"lt\":2230,\"boost\":2}}}}",
+                                       DbFilter.getRangeQuery("port", "<2230").toJSON(),true);
+                       JSONAssert.assertEquals("", "{\"query\":{\"range\":{\"timestamp\":{\"lt\":\"2018-01-01T23:59:59.0Z\",\"boost\":2}}}}",
+                                       DbFilter.getRangeQuery("timestamp", "<2018-01-01T23:59:59.0Z").toJSON(),true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+       }
+       
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java
new file mode 100644 (file)
index 0000000..0d46b4d
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+
+public class TestDbClient {
+       
+       private static HtDatabaseClient dbClient;
+       private static HostInfo[] hosts = new HostInfo[] { new HostInfo("localhost", Integer
+                       .valueOf(System.getProperty("databaseport") != null ? System.getProperty("databaseport") : "49200")) };
+
+       @BeforeClass
+       public static void init() {
+
+               dbClient = new HtDatabaseClient(hosts);
+               dbClient.waitForYellowStatus(20000);
+
+       }
+       @Test
+       public void testCRUD() {
+               final String IDX = "test23-knmoinsd";
+               final String ID = "abcddd";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               final String JSON2 = "{\"data\":{\"inner\":\"more2\"}}";
+               //Create
+               String esId=dbClient.doWriteRaw(IDX, ID, JSON);
+               assertEquals("inserted id is wrong",ID,esId);
+               //Read
+               SearchResult<SearchHit> result = dbClient.doReadByQueryJsonData(IDX, QueryBuilders.matchQuery("_id", ID));
+               assertEquals("amount of results is wrong",1,result.getTotal());
+               assertEquals("data not valid", JSON,result.getHits().get(0).getSourceAsString());
+               //Update
+               esId= dbClient.doUpdateOrCreate(IDX, ID, JSON2);
+               assertEquals("update response not successfull",ID,esId);
+               //Verify
+               result = dbClient.doReadByQueryJsonData( IDX, QueryBuilders.matchQuery("_id", ID));
+               assertEquals("amount of results is wrong",1,result.getTotal());
+               assertEquals("data not valid", JSON2,result.getHits().get(0).getSourceAsString());
+               //Delete
+               boolean del=dbClient.doRemove(IDX, ID);
+               assertTrue("item not deleted",del);
+               //Verify
+               result = dbClient.doReadByQueryJsonData(IDX, QueryBuilders.matchQuery("_id", ID));
+               assertEquals("amount of results is wrong",0,result.getTotal());
+       }
+
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java
new file mode 100644 (file)
index 0000000..40c2cfe
--- /dev/null
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.fail;
+
+import org.json.JSONException;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder;
+import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert;
+
+
+public class TestDbQueries {
+
+       private static final String MATCH_ALL_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match_all\" : {\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String MATCH_QUERY_KEY = "is-required";
+       private static final Object MATCH_QUERY_VALUE = true;
+       private static final String MATCH_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match\" : {\n" + 
+                       "            \""+MATCH_QUERY_KEY+"\" : "+MATCH_QUERY_VALUE+"\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String MATCH_QUERY_KEY2 = "node-id";
+       private static final Object MATCH_QUERY_VALUE2 = "sim2";
+       private static final String BOOL_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"bool\": {\n" + 
+                       "            \"must\": [\n" + 
+                       "                {\n" + 
+                       "                    \"match\": {\n" + 
+                       "                        \""+MATCH_QUERY_KEY+"\": "+MATCH_QUERY_VALUE+"\n" + 
+                       "                    }\n" + 
+                       "                },\n" + 
+                       "                {\n" + 
+                       "                    \"match\": {\n" + 
+                       "                        \""+MATCH_QUERY_KEY2+"\":"+MATCH_QUERY_VALUE2+" \n" + 
+                       "                    }\n" + 
+                       "                }\n" + 
+                       "            ]\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String RANGE_QUERY_KEY = "timestamp";
+       private static final String RANGE_QUERY_LTEND = "2017-08-10T20:00:00.0Z";
+       private static final String RANGE_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"range\" : {\n" + 
+                       "            \""+RANGE_QUERY_KEY+"\" : {\n" + 
+                       "                \"lte\" : \""+RANGE_QUERY_LTEND+"\",\n" +
+                       "                \"boost\": 2.0\n" + 
+                       "            }\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String RANGEBOOL_QUERY="{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"bool\": {\n" + 
+                       "            \"must\": [\n" + 
+                       "                {\n" + 
+                       "                    \"match\": {\n" + 
+                       "                        \"is-required\": true\n" + 
+                       "                    }\n" + 
+                       "                },\n" + 
+                       "                {\n" + 
+                       "                    \"regexp\": {\n" + 
+                       "                        \"node-id\": {\n" + 
+                       "                            \"max_determinized_states\": 10000,\n" + 
+                       "                            \"flags\": \"ALL\",\n" + 
+                       "                            \"value\": \"sim.*\"\n" + 
+                       "                        }\n" + 
+                       "                    }\n" + 
+                       "                }\n" + 
+                       "            ]\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String AGG_FIELD = "severity";
+       private static final String AGG_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match_all\": {}\n" + 
+                       "    },\n" + 
+                       "    \"aggs\": {\n" + 
+                       "        \"severity\": {\n" + 
+                       "            \"terms\": {\n" + 
+                       "                \"field\": \""+AGG_FIELD+"\"\n" + 
+                       "            }\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final long FROMANDSIZE_QUERY_SIZE = 20;
+       private static final long FROMANDSIZE_QUERY_FROM = 120;
+       private static final String FROMANDSIZE_QUERY = "{\n" + 
+                       "    \"size\": "+FROMANDSIZE_QUERY_SIZE+",\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match_all\": {}\n" + 
+                       "    },\n" + 
+                       "    \"from\":"+FROMANDSIZE_QUERY_FROM+"\n" + 
+                       "}";
+       private static final String TERMQUERY_KEY = "node-id";
+       private static final String TERMQUERY_VALUE = "abc";
+       private static final String TERM_QUERY = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"term\": {\n" + 
+                       "            \""+TERMQUERY_KEY+"\": \""+TERMQUERY_VALUE+"\"\n" + 
+                       "        }\n" + 
+                       "    }\n" + 
+                       "}";
+       private static final String SORTING_PROPERTY = "node-id";
+       private static final String SORTING_QUERY_ASC = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match_all\": {}\n" + 
+                       "    },\n" + 
+                       "    \"sort\": [\n" + 
+                       "        {\n" + 
+                       "            \""+SORTING_PROPERTY+"\": {\n" + 
+                       "                \"order\": \"asc\"\n" + 
+                       "            }\n" + 
+                       "        }\n" + 
+                       "    ]\n" + 
+                       "}";
+       private static final String SORTING_QUERY_DESC = "{\n" + 
+                       "    \"query\": {\n" + 
+                       "        \"match_all\": {}\n" + 
+                       "    },\n" + 
+                       "    \"sort\": [\n" + 
+                       "        {\n" + 
+                       "            \""+SORTING_PROPERTY+"\": {\n" + 
+                       "                \"order\": \"desc\"\n" + 
+                       "            }\n" + 
+                       "        }\n" + 
+                       "    ]\n" + 
+                       "}";
+       
+       private void testEquals(String message,String json, QueryBuilder query) {
+               this.testEquals(message, json, query,true);
+       }
+       private void testEquals(String message,String json, QueryBuilder query,boolean strict) {
+               
+               try {
+                       System.out.println("===test if "+message+"===================");
+                       System.out.println("orig  : "+trim(json));
+                       System.out.println("totest: "+query.toJSON().trim());
+                       JSONAssert.assertEquals(json,query.toJSON(),strict);
+               } catch (JSONException e) {
+                       fail(message);
+               }
+       }
+       
+       private String trim(String json) {
+               return json.trim().replaceAll("\n","").replaceAll(" ", "");
+       }
+
+       @Test
+       public void testMatchAll() {
+               testEquals("match all query is wrong", MATCH_ALL_QUERY, QueryBuilders.matchAllQuery());
+       }
+       @Test
+       public void testMatch() {
+               testEquals("match query is wrong", MATCH_QUERY, QueryBuilders.matchQuery(MATCH_QUERY_KEY, MATCH_QUERY_VALUE));
+       }
+       @Test
+       public void testBool() {
+               testEquals("bool query is wrong", BOOL_QUERY, 
+                               QueryBuilders.boolQuery().
+                               must(QueryBuilders.matchQuery(MATCH_QUERY_KEY, MATCH_QUERY_VALUE)).
+                               must(QueryBuilders.matchQuery(MATCH_QUERY_KEY2, MATCH_QUERY_VALUE2)));
+       }
+       @Test
+       public void testRange() {
+               testEquals("range query is wrong", RANGE_QUERY, QueryBuilders.rangeQuery(RANGE_QUERY_KEY).lte(RANGE_QUERY_LTEND));
+               
+       }
+       @Test
+       public void testAggregation() {
+               testEquals("aggregation query is wrong",AGG_QUERY, QueryBuilders.matchAllQuery().aggregations(AGG_FIELD));
+       }
+       @Test
+       public void testSizeAndFrom() {
+               testEquals("aggregation query is wrong",FROMANDSIZE_QUERY, QueryBuilders.matchAllQuery().size(FROMANDSIZE_QUERY_SIZE).from(FROMANDSIZE_QUERY_FROM));    
+       }
+       @Test
+       public void testRegex() {
+               testEquals("range and bool query is wrong1",RANGEBOOL_QUERY,QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("is-required", true)).must(QueryBuilders.regex("node-id", DbFilter.createDatabaseRegex("sim*"))),false);
+               BoolQueryBuilder q = QueryBuilders.boolQuery().must(QueryBuilders.regex("node-id", DbFilter.createDatabaseRegex("sim*")));
+               q.must(QueryBuilders.matchQuery("is-required", true));
+               testEquals("range and bool query is wrong2",RANGEBOOL_QUERY,q,false);
+       }
+       @Test
+       public void testTerm() {
+               testEquals("term query is wrong", TERM_QUERY, QueryBuilders.termQuery(TERMQUERY_KEY, TERMQUERY_VALUE));
+       }
+       @Test
+       public void testSorting() {
+               testEquals("sortorder is wrong",SORTING_QUERY_ASC, QueryBuilders.matchAllQuery().sort(SORTING_PROPERTY, SortOrder.ASCENDING));
+               testEquals("sortorder is wrong",SORTING_QUERY_DESC, QueryBuilders.matchAllQuery().sort(SORTING_PROPERTY, SortOrder.DESCENDING));
+       }
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java
new file mode 100644 (file)
index 0000000..36bbebe
--- /dev/null
@@ -0,0 +1,412 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.ClusterHealthRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.CreateIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.GetRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.IndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.NodeStatsRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.RefreshIndexRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateByQueryRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.UpdateRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.ClusterHealthResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.CreateIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteIndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.DeleteResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.GetResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.IndexResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.NodeStatsResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateByQueryResponse;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.UpdateResponse;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class TestDbRequests {
+
+       private static HtDatabaseClient dbClient;
+       private static HostInfo[] hosts = new HostInfo[] { new HostInfo("localhost", Integer
+                       .valueOf(System.getProperty("databaseport") != null ? System.getProperty("databaseport") : "49200")) };
+
+       @BeforeClass
+       public static void init() {
+
+               dbClient = new HtDatabaseClient(hosts);
+
+       }
+       @AfterClass
+       public static void deinit() {
+               if(dbClient!=null) {
+                       dbClient.close();
+               }
+       }
+       @Test
+       public void testHealth() {
+
+               ClusterHealthResponse response = null;
+               ClusterHealthRequest request = new ClusterHealthRequest();
+               request.timeout(10);
+               try {
+                       response = dbClient.health(request);
+               } catch (UnsupportedOperationException | IOException | JSONException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull("response is null", response);
+               assertTrue(response.isStatusMinimal(ClusterHealthResponse.HEALTHSTATUS_YELLOW));
+       }
+
+       @Test
+       public void testCount() {
+
+       }
+
+       @Test
+       public void testCreateAndDeleteIndex() {
+               final String IDX = "testcidx1";
+               CreateIndexRequest request = new CreateIndexRequest(IDX);
+               CreateIndexResponse response = null;
+               try {
+                       response = dbClient.createIndex(request);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+
+               assertTrue("index not existing", dbClient.isExistsIndex(IDX));
+
+               DeleteIndexRequest request2 = new DeleteIndexRequest(IDX);
+
+               DeleteIndexResponse response2 = null;
+               try {
+                       response2 = dbClient.deleteIndex(request2);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response2);
+               assertFalse("index still existing", dbClient.isExistsIndex(IDX));
+               this.deleteIndex(IDX);
+       }
+
+       @Test
+       public void testInsertAndDelete() {
+               final String IDX = "test23-knmoinsd";
+               final String ID = "abcddd";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               this.insert(IDX, ID, JSON);
+               // delete data
+               DeleteRequest request2 = new DeleteRequest(IDX, IDX, ID);
+               DeleteResponse response2 = null;
+               try {
+                       response2 = dbClient.delete(request2);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response2);
+               assertTrue(response2.isDeleted());
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               // verify data deleted
+               GetRequest request4 = new GetRequest(IDX, IDX, ID);
+               GetResponse response4 = null;
+               try {
+                       response4 = dbClient.get(request4);
+               } catch (IOException e1) {
+                       fail(e1.getMessage());
+               }
+               assertNotNull(response4);
+               assertFalse("data still existing", response4.isExists());
+               this.deleteIndex(IDX);
+       }
+
+       @Test
+       public void testInsertAndDeleteByQuery() {
+               final String IDX = "test34-knmoinsd";
+               final String ID = "abcdddseae";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               this.insert(IDX, ID, JSON);
+
+               // delete data
+               DeleteByQueryRequest request2 = new DeleteByQueryRequest(IDX);
+               request2.source(QueryBuilders.matchQuery("_id", ID));
+               DeleteByQueryResponse response2 = null;
+               try {
+                       response2 = dbClient.deleteByQuery(request2);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response2);
+               assertTrue(response2.isResponseSucceeded());
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               // verify data deleted
+               GetRequest request4 = new GetRequest(IDX, IDX, ID);
+               GetResponse response4 = null;
+               try {
+                       response4 = dbClient.get(request4);
+               } catch (IOException e1) {
+                       fail(e1.getMessage());
+               }
+               assertNotNull(response4);
+               assertFalse("data still existing", response4.isExists());
+               this.deleteIndex(IDX);
+       }
+
+       private void insert(String IDX, String ID, String JSON) {
+
+               // create data
+               IndexRequest request = new IndexRequest(IDX, IDX, ID);
+               request.source(JSON);
+               IndexResponse response = null;
+               try {
+                       response = dbClient.index(request);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               if (ID != null) {
+                       assertEquals("id not correct", ID, response.getId());
+               } else {
+                       ID = response.getId();
+               }
+               // do db refresh
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               // verify data exists
+               GetRequest request3 = new GetRequest(IDX, IDX, ID);
+               GetResponse response3 = null;
+               try {
+                       response3 = dbClient.get(request3);
+               } catch (IOException e1) {
+                       fail(e1.getMessage());
+               }
+               assertNotNull(response3);
+               JSONAssert.assertEquals("could not verify update", JSON, response3.getSourceAsBytesRef(), true);
+       }
+
+       @Test
+       public void testSearch() {
+               final String IDX = "test44-moinsd";
+               final String ID = "abe";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               final String ID2 = "abe2";
+               final String JSON2 = "{\"data\":{\"inner\":\"more2\"}}";
+               final String ID3 = "abe3";
+               final String JSON3 = "{\"data\":{\"inner\":\"more3\"}}";
+               this.insert(IDX, ID, JSON);
+               this.insert(IDX, ID2, JSON2);
+               this.insert(IDX, ID3, JSON3);
+               SearchRequest request = new SearchRequest(IDX, IDX);
+               request.setQuery(QueryBuilders.matchAllQuery());
+               SearchResponse response = null;
+               try {
+                       response = dbClient.search(request);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertEquals("not all items found", 3, response.getHits().length);
+               assertEquals("incorrect index",IDX,response.getHits()[0].getIndex());
+               assertEquals("incorrect type",IDX,response.getHits()[0].getType());
+               this.deleteIndex(IDX);
+       }
+
+       @Test
+       public void testUpdate() {
+               final String IDX = "test4534-moinsd";
+               final String ID = "assbe";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               final String JSON2 = "{\"data\":{\"inner\":\"more2\"},\"data2\":\"value2\",\"data3\":true}";
+
+               this.insert(IDX, ID, JSON);
+               UpdateRequest request = new UpdateRequest(IDX, IDX, ID);
+               UpdateResponse response = null;
+               try {
+                       request.source(new JSONObject(JSON2));
+                       response = dbClient.update(request);
+               } catch (JSONException | IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertTrue(response.succeeded());
+               // refresh index
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               // verify update
+               GetRequest request3 = new GetRequest(IDX, IDX, ID);
+               GetResponse response3 = null;
+               try {
+                       response3 = dbClient.get(request3);
+               } catch (IOException e1) {
+                       fail(e1.getMessage());
+               }
+               assertNotNull(response3);
+               JSONAssert.assertEquals("could not verify update", JSON2, response3.getSourceAsBytesRef(), true);
+               this.deleteIndex(IDX);
+       }
+
+       @Test
+       public void testUpdateByQuery() {
+               final String IDX = "test224534-moinsd";
+               final String ID = "asssabe";
+               final String JSON = "{\"data\":{\"inner\":\"more\"}}";
+               final String JSON2 = "{\"data\":{\"inner\":\"more2\"},\"data2\":\"value2\",\"data3\":true}";
+
+               this.insert(IDX, ID, JSON);
+               UpdateByQueryRequest request = new UpdateByQueryRequest(IDX, IDX);
+               UpdateByQueryResponse response = null;
+               try {
+                       request.source(ID, new JSONObject(JSON2));
+                       response = dbClient.update(request);
+               } catch (JSONException | IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertTrue(response.isUpdated());
+               // refresh index
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               // verify update
+               GetRequest request3 = new GetRequest(IDX, IDX, ID);
+               GetResponse response3 = null;
+               try {
+                       response3 = dbClient.get(request3);
+               } catch (IOException e1) {
+                       fail(e1.getMessage());
+               }
+               assertNotNull(response3);
+               JSONAssert.assertEquals("could not verify update", JSON2, response3.getSourceAsBytesRef(), true);
+               this.deleteIndex(IDX);
+       }
+
+       @Test
+       public void testAggregations() {
+               final String IDX = "test3227533677-moisnsd";
+               final String JSON = "{ \"node-id\":\"sim1\",\"severity\":\"critical\"}";
+               final String JSON2 = "{ \"node-id\":\"sim2\",\"severity\":\"critical\"}";
+               final String JSON3 = "{ \"node-id\":\"sim3\",\"severity\":\"minor\"}";
+               final String JSON4 = "{ \"node-id\":\"sim4\",\"severity\":\"warning\"}";
+               final String JSON5 = "{ \"node-id\":\"sim5\",\"severity\":\"major\"}";
+               final String MAPPINGS = "{\""+IDX+"\":{\"properties\":{\"node-id\": {\"type\": \"keyword\"},\"severity\": {\"type\": \"keyword\"}}}}";
+               //create index with mapping keyword
+               CreateIndexRequest irequest = new CreateIndexRequest(IDX);
+               irequest.mappings(new JSONObject(MAPPINGS));
+               CreateIndexResponse iresponse = null;
+               try {
+                       iresponse = dbClient.createIndex(irequest);
+               } catch (IOException e1) {
+                       fail("unable to create index: "+e1.getMessage());
+               }
+               assertNotNull(iresponse);
+               assertTrue(iresponse.isAcknowledged());
+               // fill index
+               this.insert(IDX, null, JSON);
+               this.insert(IDX, null, JSON2);
+               this.insert(IDX, null, JSON3);
+               this.insert(IDX, null, JSON4);
+               this.insert(IDX, null, JSON5);
+               // refresh index
+               try {
+                       dbClient.refreshIndex(new RefreshIndexRequest(IDX));
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+
+               SearchRequest request = new SearchRequest(IDX, IDX);
+               request.setQuery(QueryBuilders.matchAllQuery().aggregations("severity").size(0));
+               SearchResponse response = null;
+               try {
+                       response = dbClient.search(request);
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(response);
+               assertTrue(response.hasAggregations());
+               assertEquals("aggregation size not correct", 4, response.getAggregations("severity").size());
+
+               List<String> items1 = Arrays.asList(response.getAggregations("severity").getKeysAsPagedStringList(2, 0));
+               List<String> items2 = Arrays.asList(response.getAggregations("severity").getKeysAsPagedStringList(2, 2));
+               assertEquals("pagination does not work", 2,items1.size());
+               assertEquals("pagination does not work", 2,items2.size());
+               for(String s:items1) {
+                       assertFalse("pagination overlap is not allowed",items2.contains(s));
+               }
+               for(String s:items2) {
+                       assertFalse("pagination overlap is not allowed",items1.contains(s));
+               }
+
+               this.deleteIndex(IDX);
+       }
+       
+       @Test
+       public void testStatistics() {
+               NodeStatsResponse stats=null;
+               try {
+                       stats = dbClient.stats(new NodeStatsRequest());
+               } catch (IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(stats);
+               System.out.println(stats.getNodesInfo());
+               System.out.println(stats.getNodeStatistics());
+       }
+       private void deleteIndex(String idx) {
+               try {
+                       dbClient.deleteIndex( new DeleteIndexRequest(idx));
+               } catch (IOException e) {
+
+               }
+       }
+
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java
new file mode 100644 (file)
index 0000000..e4e8f94
--- /dev/null
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.*;
+
+import org.json.JSONException;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert;
+
+public class TestJsonAssert {
+
+       @Test
+       public void testGenericTypes() {
+               try {
+                       JSONAssert.assertEquals("test boolean","{ \"test\":true}","{ \"test\":true}",true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+               try {
+                       JSONAssert.assertEquals("test int","{ \"test\":2}","{ \"test\":2}",true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+               try {
+                       JSONAssert.assertEquals("test string","{ \"test\":\"abc\"}","{ \"test\":\"abc\"}",true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+               
+       }
+       @Test
+       public void testGenericTypesFails() {
+               try {
+                       JSONAssert.assertEquals("test boolean","{ \"test\":true}","{ \"test\":false}",true);
+                       fail("test boolean not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }catch(AssertionError e) {
+                       
+               }
+               try {
+                       JSONAssert.assertEquals("test int","{ \"test\":2}","{ \"test\":3}",true);
+                       fail("test int not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               } catch(AssertionError e) {
+                       
+               }
+               try {
+                       JSONAssert.assertEquals("test string","{ \"test\":\"abc\"}","{ \"test\":\"abcd\"}",true);
+                       fail("test string not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }catch(AssertionError e) {
+                       
+               }
+               
+       }
+       @Test
+       public void testObject() {
+               try {
+                       JSONAssert.assertEquals("test object","{ \"test\":{\"more\":{\"x\":1,\"y\":\"2\",\"z\":{}}}}","{ \"test\":{\"more\":{\"x\":1,\"z\":{},\"y\":\"2\"}}}",true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+       }       
+       @Test
+       public void testObjectFails() {
+               try {
+                       JSONAssert.assertEquals("test object","{ \"test\":{\"more\":{\"x\":1,\"y\":\"2\",\"z\":{}}}}","{ \"test\":{\"more\":{\"x\":1,\"z\":{}}}}",true);
+                       fail("test object not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }
+               catch(AssertionError e) {
+                       
+               }
+       }
+       @Test
+       public void testArrayStrict() {
+               try {
+                       JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"b\",\"c\"]}",true);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+       }       
+       @Test
+       public void testArrayStrictFails() {
+               try {
+                       JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\"]}",true);
+                       fail("test object not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }
+               catch(AssertionError e) {
+                       
+               }
+       }
+       @Test
+       public void testArrayNonStrict() {
+               try {
+                       JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\"]}",false);
+               } catch (JSONException e) {
+                       fail(e.getMessage());
+               }
+       }       
+       @Test
+       public void testArrayNonStrictFails() {
+               try {
+                       JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"c\",\"b\",\"d\"]}",false);
+                       fail("test object not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }
+               catch(AssertionError e) {
+                       
+               }
+               try {
+                       JSONAssert.assertEquals("test array strict","{ \"test\":[\"a\",\"b\",\"c\"]}","{ \"test\":[\"a\",\"b\",\"d\"]}",false);
+                       fail("test object not failed, but has to");
+               } catch (JSONException e) {
+                       fail("problem with json");
+               }
+               catch(AssertionError e) {
+                       
+               }
+       }
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java
new file mode 100644 (file)
index 0000000..9c2ade9
--- /dev/null
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
+
+public class TestPageHashMap {
+
+       @Test
+       public void testGenericTypes() {
+               AggregationEntries agg = new AggregationEntries();
+
+               for (int t=0; t < 100; t++) {
+                       agg.put("Key"+t, Long.valueOf(t));
+               }
+
+               int x =0;
+               for (String k : agg.keySet()) {
+                       if (x++ >= 10)
+                               break;
+                   System.out.println("Keys: "+k);
+               }
+
+               String[] res;
+
+               res = agg.getKeysAsPagedStringList(5, 10);
+               System.out.println("Entries: "+res.length);
+               for (int t=0; t < res.length; t++) {
+                       System.out.println("Entry "+t+": "+res[t]);
+               }
+
+               res = agg.getKeysAsPagedStringList(5, 10);
+               System.out.println("Entries: "+res.length);
+               for (int t=0; t < res.length; t++) {
+                       System.out.println("Entry "+t+": "+res[t]);
+               }
+
+
+       }
+
+
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java
new file mode 100644 (file)
index 0000000..49e0445
--- /dev/null
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * ============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==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.file.PomFile;
+import org.onap.ccsdk.features.sdnr.wt.common.file.PomPropertiesFile;
+import org.xml.sax.SAXException;
+
+public class TestPomfile {
+
+       private static final String TESTPROPERTY_KEY="elasticsearch.version";
+       private static final String TESTPROPERTY_VALUE = "6.4.3";
+       private static final String POMFILENAME = "pom.xml";
+       private static final String POM_PROPERTY = "#Generated by org.apache.felix.bundleplugin\n" + 
+                       "#Tue Nov 19 11:20:33 CET 2019\n" + 
+                       "version=0.7.0-SNAPSHOT\n" + 
+                       "groupId=org.onap.ccsdk.features.sdnr.wt\n" + 
+                       "artifactId=sdnr-wt-data-provider-provider\n";
+       //private static final Date DATE_EXPECTED = new Date(119, 10, 19, 11, 20, 33);
+       
+       @Test
+       public void test() {
+               PomFile pom=null;
+               try {
+                       pom = new PomFile(new FileInputStream(POMFILENAME));
+               } catch (ParserConfigurationException | SAXException | IOException e) {
+                       fail(e.getMessage());
+               }
+               assertNotNull(pom);
+               assertEquals(TESTPROPERTY_VALUE, pom.getProperty(TESTPROPERTY_KEY));
+               
+       }
+       @Test
+       public void testProp() {
+               PomPropertiesFile file = null;
+               try {
+                       file = new PomPropertiesFile(new ByteArrayInputStream(POM_PROPERTY.getBytes()));
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               assertNotNull(file);
+               assertNotNull(file.getBuildDate());
+       }
+}
diff --git a/sdnr/wt/common/src/test/resources/log4j.properties b/sdnr/wt/common/src/test/resources/log4j.properties
new file mode 100644 (file)
index 0000000..142663b
--- /dev/null
@@ -0,0 +1,12 @@
+log4j.rootLogger=INFO, out
+
+log4j.logger.org.apache.camel.impl.converter=WARN
+log4j.logger.org.apache.camel.management=WARN
+log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
+log4j.logger.org.springframework=ERROR
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
diff --git a/sdnr/wt/common/src/test/resources/log4j2.xml b/sdnr/wt/common/src/test/resources/log4j2.xml
new file mode 100644 (file)
index 0000000..164e93f
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration package="log4j.test" 
+               status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Logger name="log4j.test.Log4jTest" level="debug">
+            <AppenderRef ref="Console"/>
+        </Logger>
+        <Root level="trace">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/sdnr/wt/common/src/test/resources/simplelogger.properties b/sdnr/wt/common/src/test/resources/simplelogger.properties
new file mode 100644 (file)
index 0000000..a2f1e7e
--- /dev/null
@@ -0,0 +1,6 @@
+org.slf4j.simpleLogger.defaultLogLevel=debug
+org.slf4j.simpleLogger.showDateTime=true
+#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
+#org.slf4j.simpleLogger.showThreadName=true
+org.slf4j.simpleLogger.showLogName=true
+org.slf4j.simpleLogger.showShortLogName=false
\ No newline at end of file
diff --git a/sdnr/wt/data-provider/database/src/main/resources/es-init.sh b/sdnr/wt/data-provider/database/src/main/resources/es-init.sh
new file mode 100755 (executable)
index 0000000..be7d487
--- /dev/null
@@ -0,0 +1,437 @@
+#!/bin/bash
+# ============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==========================================================================
+#
+# Version 2
+# Usage .. see help below
+
+SDNRNAME=sdnrdb
+REPLICAS=1
+SHARDS=5
+PREFIX=""
+VERSION="-v1"
+VERBOSE=0
+INITFILENAME="Init.script"
+
+#declare -a ALIAS
+#declare -a MAPPING
+
+# ------------------------------------------------------------
+# Function with definition of mappings
+# $1: alias name for index
+# $2: mapping properties and additonal parameter for this section
+
+set_definition() {
+  def "connectionlog" '{"node-id": {"type": "keyword"},"timestamp": {"type": "date"},"status": {"type": "keyword"}}'
+  def "maintenancemode" '{"node-id": {"type": "keyword"},"active": {"type": "boolean"}},"date_detection":false}}'
+  def "faultlog" '{"node-id": {"type": "keyword"},"severity": {"type": "keyword"},"timestamp": {"type": "date"},"problem": {"type": "keyword"},"counter": {"type": "keyword"},"object-id":{"type": "keyword"}}'
+  def "faultcurrent" '{"node-id": {"type": "keyword"},"severity": {"type": "keyword"},"timestamp": {"type": "date"},"problem": {"type": "keyword"},"counter": {"type": "keyword"},"object-id":{"type": "keyword"}}'
+  def "eventlog" '{"node-id": {"type": "keyword"},"timestamp": {"type": "date"},"new-value": {"type": "keyword"},"attribute-name": {"type": "keyword"},"counter": {"type": "keyword"},"object-id": {"type": "keyword"}}'
+  def "inventoryequipment" '{"date": {"type": "keyword"},"model-identifier": {"type": "keyword"},"manufacturer-identifier": {"type": "keyword"},"type-name": {"type": "keyword"},"description": {"type": "keyword"},"uuid": {"type": "keyword"},"version": {"type": "keyword"},"parent-uuid": {"type": "keyword"},"contained-holder": {"type": "keyword"},"node-id": {"type": "keyword"},"tree-level": {"type": "long"},"part-type-id": {"type": "keyword"},"serial": {"type": "keyword"}}'
+  def "historicalperformance24h" '{"node-name":{"type": "keyword"},"timestamp":{"type": "date"},"suspect-interval-flag":{"type":"boolean"},"scanner-id":{"type": "keyword"},"uuid-interface":{"type": "keyword"},"layer-protocol-name":{"type": "keyword"},"granularity-period":{"type": "keyword"},"radio-signal-id":{"type": "keyword"}}'
+  def "historicalperformance15min" '{"node-name":{"type": "keyword"},"timestamp":{"type": "date"},"suspect-interval-flag":{"type":"boolean"},"scanner-id":{"type": "keyword"},"uuid-interface":{"type": "keyword"},"layer-protocol-name":{"type": "keyword"},"granularity-period":{"type": "keyword"},"radio-signal-id":{"type": "keyword"}}'
+  def "mediator-server" '{"url":{"type": "keyword"},"name":{"type": "keyword"}}'
+  def "networkelement-connection" '{"node-id": {"type": "keyword"},"host": {"type": "keyword"},"port": {"type": "long"},"username": {"type": "keyword"},"password": {"type": "keyword"},"core-model-capability": {"type": "keyword"},"device-type": {"type": "keyword"},"is-required": {"type": "boolean"},"status": {"type": "keyword"}},"date_detection":false'
+}
+
+# ------------------------------------------------------------
+# Functions
+
+# Get ip of container with database
+getsdnrurl() {
+  if [ ! -z "$DBURL" ]; then
+    return
+  fi
+  cmd=$(which docker)
+  if [ ! -z "$cmd" ]; then
+    SDNRIP=$($cmd inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$SDNRNAME")
+    if [ "$?" = "1" ] ; then
+      echo "WARN: Container $SDNRNAME not running. Start the sdnrdb container or enter a database url."
+      echo "continuing with localhost"
+      SDNRIP="localhost"
+    fi
+  else
+    # if no docker and no db url given
+    if [ -z "$DBURL" ]; then
+      echo "WARN: Please enter a database url."
+      echo "continuing with localhost"
+      SDNRIP="localhost"
+    fi
+  fi
+  DBURL="http://$SDNRIP:9200"
+}
+
+# Add elements to the array ALIAS and MAPPING
+# $1 alias
+# $2 mapping properties
+def() {
+   ALIAS=("${ALIAS[@]}" "$1")
+   MAPPING=("${MAPPING[@]}" "$2")
+}
+
+# $1 Response
+print_response() {
+    response="$1"
+    body=$(echo $response | sed -E 's/HTTPSTATUS\:[0-9]{3}$//')
+    code=$(echo $response | tr -d '\n' | sed -E 's/.*HTTPSTATUS:([0-9]{3})$/\1/')
+    if [ "$VERBOSE" = "0" -a "$code" -ne "200" ] ; then
+          echo "Error response $code $body"
+          exit 2
+    fi
+    if [ "$VERBOSE" -ge 1 ] ; then
+          echo "response $code"
+    fi
+    if [ "$VERBOSE" -ge 2 ] ; then
+       echo "content: $body"
+    fi
+}
+
+#Write ini file for elasticsearch
+# $1 index
+# $1 data
+file_append() {
+    echo "PUT:"$1"/:"$2 >> $INITFILENAME
+}
+
+# Send get request to database
+# USes DBURL
+# $1 url path
+# $2 data
+http_get_request() {
+    url="$DBURL/$1"
+    if [ "$VERBOSE" -ge 2 ] ; then
+       echo "PUT to $url data $data"
+    fi
+    response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X GET -H "Content-Type: application/json" "$url")
+    print_response "$response"
+}
+
+# Send put request to database
+# USes DBURL
+# $1 url path
+# $2 data
+http_put_request() {
+    url="$DBURL/$1"
+    if [ "$VERBOSE" -ge 2 ] ; then
+       echo "PUT to $url data $data"
+    fi
+    response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X PUT -H "Content-Type: application/json" -d "$2" "$url")
+    print_response "$response"
+}
+
+# Send delete request to database
+# $1 url
+http_delete_request() {
+    url="$DBURL/$1"
+    if [ "$VERBOSE" -ge 2 ] ; then
+       echo "DELETE to $url"
+    fi
+    echo "DELETE to $url"
+    response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X DELETE -H "Content-Type: application/json" $url)
+    print_response "$response"
+}
+
+# Delete index and alias
+# $1 alias
+delete_index_alias() {
+
+    echo "deleting alias $alias"
+     # Delete alias
+    alias="$PREFIX$1"
+    index="$PREFIX$1$VERSION"
+
+    url="$index/_alias/$alias"
+    http_delete_request "$url"
+
+     # Delete index
+    echo "deleting index $index"
+    url="$index"
+    http_delete_request "$url"
+}
+
+# Write mappings
+# Uses version, SHARDS and REPLICAS parameters
+# $1 alias and datatype "mydatatype"
+# $2 mapping properties
+# $3 filename or empty for WEB
+create_index_alias() {
+   # Create index
+    alias="$PREFIX$1"
+    index="$PREFIX$1$VERSION"
+    mappings='"mappings":{"'$1'":{"properties":'$2'}}'
+    settings='"settings":{"index":{"number_of_shards":'$SHARDS',"number_of_replicas":'$REPLICAS'},"analysis":{"analyzer":{"content":{"type":"custom","tokenizer":"whitespace"}}}}'
+
+    if [ -z "$mappings" ]; then
+        data="{$settings}"
+    else
+        data="{$settings,$mappings}"
+    fi
+
+    url=$index
+       echo "creating index $index"
+       if [ -z "$3" ] ; then
+           http_put_request "$url" "$data"
+    else
+        file_append "$url" "$data"
+    fi
+
+    #Create alias
+    url="$index/_alias/$alias"
+    echo "creating alias $alias for $index"
+    if [ -z "$3" ] ; then
+       http_put_request "$url"
+    else
+        file_append "$url" "{}"
+    fi
+}
+
+# Wait for status
+# $1 time to wait
+es_wait_yellow() {
+  ESSTATUS="yellow"
+  attempt_counter=0
+  max_attempts=5
+  echo "Wait up to $max_attempts attempts for $DBURL availability"
+  until $(curl --output /dev/null --silent --head --fail $DBURL); do
+    if [ ${attempt_counter} -eq ${max_attempts} ];then
+      echo "Error: Max attempts reached."
+      exit 3
+    fi
+       attempt_counter=$(($attempt_counter+1))
+    printf '.'
+    sleep 5
+  done
+  sleep 2
+  echo "Wait up to $1 for status $ESSTATUS"
+  RES=$(curl GET "$DBURL/_cluster/health?wait_for_status=$ESSTATUS&timeout=$1&pretty" 2>/dev/null)
+  if [ "$?" = "0" ] ; then
+    if [[ "$RES" =~ .*status.*:.*yellow.* || "$RES" =~ .*status.*:.*green.* ]] ; then
+      echo "Status $ESSTATUS reached: $RES"
+    else
+      echo "Error: DB Reachable, but status $ESSTATUS not reached"
+         exit 2
+    fi
+  else
+    echo "Error: $DBURL not reachable"
+    exit 2
+  fi
+}
+
+# Commands
+
+cmd_create() {
+    if [ -n "$WAITYELLOW" ] ; then
+       es_wait_yellow "$WAITYELLOW"
+    fi
+       for i in "${!ALIAS[@]}"; do
+               create_index_alias "${ALIAS[$i]}" "${MAPPING[$i]}"
+       done
+}
+
+cmd_delete() {
+    if [ -n "$WAITYELLOW" ] ; then
+       es_wait_yellow "$WAITYELLOW"
+    fi
+       for i in "${!ALIAS[@]}"; do
+               delete_index_alias "${ALIAS[$i]}"
+       done
+}
+cmd_purge() {
+#    http_get_request '_cat/aliases'
+#    body=$(echo $response | sed -E 's/HTTPSTATUS\:[0-9]{3}$//')
+#    echo "$response" | awk '/^([^ ]*)[ ]*([^ ]*).*$/{ print $2"/_alias/"$1 }'
+#    http_get_request '_cat/indices'
+#    echo "indices"
+#    echo "$response"
+#    echo "$response" | awk '/^[^ ]*[ ]*[^ ]*[ ]*([^ ]*).*$/{ print $3 }'
+    echo "not yet implemented"
+}
+cmd_initfile() {
+    echo "Create script initfile: $INITFILENAME"
+    if [ -f "$INITFILENAME" ] ; then
+       rm $INITFILENAME
+    fi
+       for i in "${!ALIAS[@]}"; do
+               create_index_alias "${ALIAS[$i]}" "${MAPPING[$i]}" file
+       done
+}
+
+# Prepare database startup
+cmd_startup() {
+   ESWAIT=30s
+   echo "Startup ElasticSearch DBURL=$DBURL CMD=$STARTUP_CMD CLUSTER=$CLUSTER_ENABLED INDEX=$NODE_INDEX"
+   if $CLUSTER_ENABLED ; then
+     if [ "$NODE_INDEX" = "0" ] ; then
+       echo "Cluster node 0 detected .. create"
+       es_wait_yellow $ESWAIT
+       cmd_create
+     else
+       echo "Cluster node > 0 detected .. do nothing"
+     fi
+   else
+     echo "No cluster"
+     es_wait_yellow $ESWAIT
+     cmd_create
+   fi
+}
+
+# Parse arguments
+parse_args() {
+    while [[ $# -gt 0 ]]
+    do
+      par=($(echo $1 | tr '=' '\n'))
+      echo ""
+      if [ ${#par[@]} == "2" ] ; then
+        # Equal sign found
+        key=${par[0]}
+        value=${par[1]}
+      else
+        # No equal sign
+        key="$1"
+        value="$2"
+      fi
+      shift
+      #Further shift if parameter is used
+      case $key in
+        -db|--dburl|--database)
+          DBURL="$value"
+          shift
+          ;;
+        -r|--replicas)
+          REPLICAS="$value"
+          shift
+          ;;
+        -s|--shards)
+          SHARDS="$value"
+          shift
+          ;;
+        -p|--prefix)
+          PREFIX="$value"
+          shift
+          ;;
+        -f|--file)
+          INITFILENAME="$value"
+          shift
+                 ;;
+               -x|--verbose)
+                 VERBOSE="${value:-0}"
+                 shift
+                 ;;
+               -v|--version)
+                 VERSION="${value:--v1}"
+                 shift
+                 ;;
+               -vx|--versionx)
+                 VERSION=""
+                 ;;
+               -w|--wait)
+          WAITYELLOW="${value:-30s}"
+                 shift
+                 ;;
+        --cmd)
+          STARTUP_CMD="$value"
+          shift
+          ;;
+        --odlcluster)
+          CLUSTER_ENABLED="$value"
+          shift
+          ;;
+           --index)
+             NODE_INDEX="$value"
+             shift
+             ;;
+        *)
+          ;;
+      esac;
+    done
+}
+
+# -----------------------------------------
+# Main starts here
+
+TASK=$1
+shift
+parse_args "$@"
+
+set_definition
+
+
+echo "------------------------------"
+echo "Elasticsearch for SDN-R helper"
+echo "------------------------------"
+echo "Uses database container $SDNRNAME"
+echo "Database url $DBURL"
+echo "  shards=$SHARDS replicas=$REPLICAS prefix=$PREFIX verbose=$VERBOSE version='$VERSION'"
+
+
+case "$TASK" in
+    "create")
+               getsdnrurl
+               if [ -z "$DBURL" ] ; then
+                 echo "Error: unable to detect database url."
+                 exit 1
+               fi
+        cmd_create
+        ;;
+    "delete")
+               getsdnrurl
+               if [ -z "$DBURL" ] ; then
+                 echo "Error: unable to detect database url."
+                 exit 1
+               fi
+        cmd_delete
+        ;;
+    "purge")
+               getsdnrurl
+               if [ -z "$DBURL" ] ; then
+                 echo "Error: unable to detect database url."
+                 exit 1
+               fi
+        cmd_purge
+        ;;
+    "initfile")
+        cmd_initfile
+       ;;
+    "startup")
+        cmd_startup
+        ;;
+     *)
+        echo "usage:"
+        echo "  es-init.sh COMMAND [OPTIONS]"
+        echo "    Commands:"
+        echo "       create           create SDN-R used indices and aliases"
+        echo "       delete           delete SDN-R used indices and aliases"
+        echo "       initfile         Create initfile for java unit tests"
+        echo "       purge            Clear complete database (indices and aliases)"
+        echo "       startup          Initial database write if node number 01"
+        echo "    Options:"
+        echo -e "      -db\--database   DATABASEURL"
+        echo -e "      -r\--replicas    REPLICAS"
+        echo -e "      -s\--shards      SHARDS"
+        echo -e "      -p\--prefix      DATABASE-PREFIX"
+        echo -e "      -f\--file        init filename"
+        echo -e "      -x\--verbose     Verbose level less 0 .. 2 full"
+        echo -e "      -v\--version     Version prefix"
+        echo -e "      -vx\--versionx   Version prefix empty"
+        echo -e "      -i\--ignore      Ignore error responses"
+        echo -e "      --odlcluster     true/false if odl configured as cluster"
+        echo -e "      --index          Cluster node 0.."
+        echo -e "      --cmd            startup sub command"
+        echo " examples:"
+        echo "   single node db:"
+        echo "      es-init.sh create -db http://sdnrdb:9200 -r 0"
+       ;;
+esac
index 595bcd8..94fa46e 100644 (file)
@@ -36,6 +36,7 @@
     <description>SDN-R wireless transport micro-services</description>
 
     <modules>
+      <module>common</module>
       <module>apigateway</module>
       <module>devicemodel</module>
       <module>websocketmanager2</module>