aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sdnr/wt/common/pom.xml162
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java23
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java352
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java28
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java235
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java22
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java27
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java27
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java57
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java22
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java196
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java73
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java162
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java216
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java286
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java32
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java37
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java50
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java63
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java78
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java62
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java43
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java62
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java97
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java46
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java85
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java43
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java33
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java75
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java31
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java28
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java63
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java35
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java27
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java29
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java30
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java38
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java28
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java33
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java102
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java112
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java38
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java44
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java75
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java76
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java30
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java28
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java50
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java28
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java47
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java50
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java49
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java109
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java44
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java81
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java70
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java65
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java128
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java100
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java92
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java328
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java42
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java196
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java180
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java233
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java81
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java71
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java223
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java412
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java144
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java58
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java70
-rw-r--r--sdnr/wt/common/src/test/resources/log4j.properties12
-rw-r--r--sdnr/wt/common/src/test/resources/log4j2.xml17
-rw-r--r--sdnr/wt/common/src/test/resources/simplelogger.properties6
-rwxr-xr-xsdnr/wt/data-provider/database/src/main/resources/es-init.sh437
-rw-r--r--sdnr/wt/pom.xml1
81 files changed, 7069 insertions, 0 deletions
diff --git a/sdnr/wt/common/pom.xml b/sdnr/wt/common/pom.xml
new file mode 100644
index 000000000..144cb6648
--- /dev/null
+++ b/sdnr/wt/common/pom.xml
@@ -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
index 000000000..3fa9b6982
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/PropertyService.java
@@ -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
index 000000000..3597f2e57
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java
@@ -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
index 000000000..619191766
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/Configuration.java
@@ -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
index 000000000..36673d318
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ConfigurationFileRepresentation.java
@@ -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
index 000000000..f6d3601e9
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/ISubConfigHandler.java
@@ -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
index 000000000..18ed409a7
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConfigurationException.java
@@ -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
index 000000000..d261c73f0
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/exception/ConversionException.java
@@ -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
index 000000000..78f116641
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/ConfigFileObserver.java
@@ -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
index 000000000..32f11cd57
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/filechange/IConfigChangedListener.java
@@ -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
index 000000000..a0e21be01
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java
@@ -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
index 000000000..8af072493
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/SectionValue.java
@@ -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
index 000000000..78501a8db
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseClient.java
@@ -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
index 000000000..828ae8bb0
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/DatabaseConfig.java
@@ -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
index 000000000..0e544acec
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
@@ -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
index 000000000..c3bd7c5eb
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/HtDatabaseClient.java
@@ -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
index 000000000..c7d27204a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/InvalidProtocolException.java
@@ -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
index 000000000..a5c7df6bb
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/IsEsObject.java
@@ -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
index 000000000..e86c5c36b
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchHit.java
@@ -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
index 000000000..eedc45c77
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java
@@ -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
index 000000000..11554b5b6
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/config/HostInfo.java
@@ -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
index 000000000..19cb82669
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
@@ -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
index 000000000..a753122ac
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/EsObject.java
@@ -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
index 000000000..5edc2613d
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/BoolQueryBuilder.java
@@ -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
index 000000000..c1f372cc9
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilder.java
@@ -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
index 000000000..b9271c22b
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
@@ -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
index 000000000..e9df263ea
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RangeQueryBuilder.java
@@ -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
index 000000000..d9f9c1069
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/RegexQueryBuilder.java
@@ -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
index 000000000..aae7f6433
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/SortOrder.java
@@ -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
index 000000000..e00cd1a03
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/BaseRequest.java
@@ -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
index 000000000..4c1d85870
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/ClusterHealthRequest.java
@@ -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
index 000000000..0e00d5d49
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CountRequest.java
@@ -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
index 000000000..c7e27ee4a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/CreateIndexRequest.java
@@ -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
index 000000000..b02f027b2
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteByQueryRequest.java
@@ -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
index 000000000..f673c53a4
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteIndexRequest.java
@@ -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
index 000000000..fb84ce4a9
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/DeleteRequest.java
@@ -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
index 000000000..2a56b2160
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetIndexRequest.java
@@ -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
index 000000000..855a7c4a6
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/GetRequest.java
@@ -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
index 000000000..521760c21
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndexRequest.java
@@ -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
index 000000000..e9436e946
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/IndicesAliasesRequest.java
@@ -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
index 000000000..e77a39a0a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/NodeStatsRequest.java
@@ -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
index 000000000..e7cdd0c1a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/RefreshIndexRequest.java
@@ -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
index 000000000..86fa8a91f
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/SearchRequest.java
@@ -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
index 000000000..b1469a57e
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateByQueryRequest.java
@@ -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
index 000000000..adab44df9
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/requests/UpdateRequest.java
@@ -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
index 000000000..291ed5190
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AcknowledgedResponse.java
@@ -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
index 000000000..debd5e4ef
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/AggregationEntries.java
@@ -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
index 000000000..49447f660
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/BaseResponse.java
@@ -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
index 000000000..3f47ac286
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/ClusterHealthResponse.java
@@ -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
index 000000000..429c3394d
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CountResponse.java
@@ -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
index 000000000..29f7e886e
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/CreateIndexResponse.java
@@ -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
index 000000000..467f7e95a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteByQueryResponse.java
@@ -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
index 000000000..7eb0a97ba
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteIndexResponse.java
@@ -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
index 000000000..db9124df7
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/DeleteResponse.java
@@ -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
index 000000000..49e3ad9a7
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/GetResponse.java
@@ -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
index 000000000..499cd3719
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/IndexResponse.java
@@ -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
index 000000000..3718fd342
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/NodeStatsResponse.java
@@ -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
index 000000000..569bef4a8
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/RefreshIndexResponse.java
@@ -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
index 000000000..f13ad7d34
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/SearchResponse.java
@@ -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
index 000000000..6205df7cb
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateByQueryResponse.java
@@ -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
index 000000000..539969438
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/responses/UpdateResponse.java
@@ -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
index 000000000..89efc45e7
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/FileWatchdog.java
@@ -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
index 000000000..d415d601f
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomFile.java
@@ -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
index 000000000..c1cb984d0
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/file/PomPropertiesFile.java
@@ -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
index 000000000..0604de3bf
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
@@ -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
index 000000000..2ef32fce1
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponse.java
@@ -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
index 000000000..17cc231a2
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/test/JSONAssert.java
@@ -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
index 000000000..af3979c50
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java
@@ -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
index 000000000..f6f741197
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestConfig.java
@@ -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
index 000000000..2dd74bbec
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDatabaseFilterConversion.java
@@ -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
index 000000000..0d46b4d20
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbClient.java
@@ -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
index 000000000..40c2cfe9a
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbQueries.java
@@ -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
index 000000000..36bbebefd
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestDbRequests.java
@@ -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
index 000000000..e4e8f9477
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestJsonAssert.java
@@ -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
index 000000000..9c2ade992
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPageHashMap.java
@@ -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
index 000000000..49e0445a1
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestPomfile.java
@@ -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
index 000000000..142663bd2
--- /dev/null
+++ b/sdnr/wt/common/src/test/resources/log4j.properties
@@ -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
index 000000000..164e93f54
--- /dev/null
+++ b/sdnr/wt/common/src/test/resources/log4j2.xml
@@ -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
index 000000000..a2f1e7e76
--- /dev/null
+++ b/sdnr/wt/common/src/test/resources/simplelogger.properties
@@ -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
index 000000000..be7d487f7
--- /dev/null
+++ b/sdnr/wt/data-provider/database/src/main/resources/es-init.sh
@@ -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
diff --git a/sdnr/wt/pom.xml b/sdnr/wt/pom.xml
index 595bcd80c..94fa46e75 100644
--- a/sdnr/wt/pom.xml
+++ b/sdnr/wt/pom.xml
@@ -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>