aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/common
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/common')
-rw-r--r--sdnr/wt/common/pom.xml275
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/HtAssert.java35
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/Resources.java25
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/ResourcesFromDeviceManager.java340
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java26
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClientFromDevicemanager.java327
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponseFromDevicemanager.java38
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/Environment.java46
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/FileWatchdog.java129
9 files changed, 1076 insertions, 165 deletions
diff --git a/sdnr/wt/common/pom.xml b/sdnr/wt/common/pom.xml
index 144cb6648..adce977c3 100644
--- a/sdnr/wt/common/pom.xml
+++ b/sdnr/wt/common/pom.xml
@@ -16,147 +16,150 @@
============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>
+ <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>
- <parent>
- <groupId>org.onap.ccsdk.parent</groupId>
- <artifactId>binding-parent</artifactId>
- <version>1.5.1-SNAPSHOT</version>
- <relativePath/>
- </parent>
+ <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+ <artifactId>sdnr-wt-common</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
- <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>
+ <name>ccsdk-features :: ${project.artifactId}</name>
+ <licenses>
+ <license>
+ <name>Apache License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+ </license>
+ </licenses>
- <licenses>
- <license>
- <name>Apache License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0</url>
- </license>
- </licenses>
+ <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>
- <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>
+ <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>
- </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>
+ <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>bash</executable>
+ <arguments>
+ <argument>${basedir}/../data-provider/database/src/main/resources/es-init.sh</argument>
+ <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.16</version>
+ <configuration>
+ <clusterName>testCluster</clusterName>
+ <transportPort>9500</transportPort>
+ <httpPort>${databaseport}</httpPort>
+ <version>6.5.0</version>
+ <timeout>120</timeout>
+ <pathInitScript>${project.build.directory}/EsInit.script</pathInitScript>
+ <skip>${skipTests}</skip>
+ </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/HtAssert.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/HtAssert.java
new file mode 100644
index 000000000..873b5c947
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/HtAssert.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;
+
+public class HtAssert {
+
+
+ public static class HtNullable<T> {
+ }
+
+ public static void nonnull(Object ... oList) {
+ for (Object o : oList) {
+ if (o == null) {
+ throw new IllegalArgumentException("Null not allowed here.");
+ }
+ }
+ };
+
+}
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
index 3597f2e57..fe608a503 100644
--- 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
@@ -20,22 +20,15 @@ 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;
@@ -48,7 +41,7 @@ public class Resources {
private static final String RESSOURCEROOT = "src/main/resources";
private static URL getFileURL(Class<?> cls,String resFile) {
- Bundle b = FrameworkUtil.getBundle(cls);
+ Bundle b = FrameworkUtil.getBundle(cls);
URL u = null;
LOG.debug("try to get file {}", resFile);
if (b == null) {
@@ -83,7 +76,7 @@ public class Resources {
private static String readFile(final InputStream s) throws IOException {
// read file
- final String LR = "\n";
+ final String LR = "\n";
BufferedReader in = new BufferedReader(new InputStreamReader(s));
StringBuilder sb = new StringBuilder();
String inputLine;
@@ -97,7 +90,7 @@ public class Resources {
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 -> {
@@ -185,7 +178,7 @@ public class Resources {
// return list;
// }
public static String getFileContent( Class<?> cls, String resFile) {
- LOG.debug("loading file {} from res", resFile);
+ LOG.debug("loading file {} from res", resFile);
URL u = getFileURL(cls,resFile);
String s=null;
if (u == null) {
@@ -199,7 +192,7 @@ public class Resources {
}
return s;
- }
+ }
// public static JSONObject getJSONFile(Class<?> cls,String resFile) {
// LOG.debug("loading json file {} from res", resFile);
// JSONObject o = null;
@@ -269,11 +262,11 @@ public class Resources {
// Collection<URL> urlCollection = new ArrayList<>();
// URL url = getUrlForRessource(cls,folder);
// if(url==null) {
-// return Collections.enumeration(urlCollection);
+// return Collections.enumeration(urlCollection);
// }
// String path = url.getPath();
// File[] files = new File(path).listFiles();
-//
+//
// if (files != null) {
// for (File f : files) {
// try {
@@ -290,7 +283,7 @@ public class Resources {
// }
//
// return Collections.enumeration(urlCollection);
-//
+//
// }
public static URL getUrlForRessource(Class<?> cls,String fileOrDirectory) {
@@ -298,7 +291,7 @@ public class Resources {
ClassLoader loader = cls.getClassLoader();
URL url = loader.getResource(fileOrDirectory);
if(url==null && fileOrDirectory.startsWith("/")) {
- url = loader.getResource(fileOrDirectory.substring(1));
+ url = loader.getResource(fileOrDirectory.substring(1));
}
return url;
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/ResourcesFromDeviceManager.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/ResourcesFromDeviceManager.java
new file mode 100644
index 000000000..32a21a801
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/ResourcesFromDeviceManager.java
@@ -0,0 +1,340 @@
+/*******************************************************************************
+ * ============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 ResourcesFromDeviceManager {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ResourcesFromDeviceManager.class);
+
+ private static final String RESSOURCEROOT = "src/main/resources";
+
+ private static URL getFileURL(String resFile) {
+ Bundle b = FrameworkUtil.getBundle(ResourcesFromDeviceManager.class);
+ URL u = null;
+ LOG.debug("try to get file {}", resFile);
+ if (b == null) {
+ LOG.info("Load resource as file: {}", resFile);
+ u = getUrlForRessource(resFile);
+ } else {
+ LOG.info("Load resource from bundle: {}", resFile);
+ u = b.getEntry(resFile);
+ }
+ return u;
+ }
+
+ private static File getFile(String resFile) {
+ Bundle b = FrameworkUtil.getBundle(ResourcesFromDeviceManager.class);
+ 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
+ BufferedReader in = new BufferedReader(new InputStreamReader(s));
+ StringBuilder sb = new StringBuilder();
+ String inputLine;
+ while ((inputLine = in.readLine()) != null) {
+ sb.append(inputLine);
+ }
+ in.close();
+ s.close();
+ return sb.toString();
+ }
+
+ public static List<URL> getFileURLs(String folder, final String filter, final boolean recursive)
+ throws IOException {
+ Bundle b = FrameworkUtil.getBundle(ResourcesFromDeviceManager.class);
+ 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(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(String folder, boolean recursive) {
+ List<JSONObject> list = new ArrayList<>();
+ List<URL> urls;
+ try {
+ urls = getFileURLs(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 JSONObject getJSONFile(String resFile) {
+ LOG.debug("loading json file {} from res", resFile);
+ URL u = getFileURL(resFile);
+ if (u == null) {
+ LOG.warn("cannot find resfile: {}", resFile);
+ return null;
+ }
+ JSONObject o = null;
+ try {
+ // parse to jsonobject
+ o = new JSONObject(readFile(u));
+ } 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(String resFolder, String dstFolder, String rootDirToRemove) {
+
+ Enumeration<URL> urls = null;
+ Bundle b = FrameworkUtil.getBundle(ResourcesFromDeviceManager.class);
+ if (b == null) {
+ LOG.info("Running in file text.");
+ urls = getResourceFolderFiles(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(String folder) {
+ LOG.debug("Get resource: {}", folder);
+ URL url = getUrlForRessource(folder);
+ String path = url.getPath();
+ File[] files = new File(path).listFiles();
+ Collection<URL> urlCollection = new ArrayList<>();
+
+ if (files != null) {
+ for (File f : files) {
+ try {
+ if (f.isDirectory()) {
+ urlCollection.addAll(Collections.list(getResourceFolderFiles(folder + "/" + f.getName())));
+ } else {
+ urlCollection.add(f.toURI().toURL());
+ }
+ } catch (MalformedURLException e) {
+ LOG.error("Can not read ressources", e);
+ break;
+ }
+ }
+ }
+
+ Enumeration<URL> urls = Collections.enumeration(urlCollection);
+ return urls;
+ }
+
+ private static URL getUrlForRessource(String fileOrDirectory) {
+ //ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ ClassLoader loader = ResourcesFromDeviceManager.class.getClassLoader();
+ URL url = loader.getResource(fileOrDirectory);
+ if(url==null && fileOrDirectory.startsWith("/")) {
+ url = loader.getResource(fileOrDirectory.substring(1));
+ }
+ return url;
+ }
+
+ public static boolean extractFileTo(String resFile, File oFile) {
+ if (oFile == null) {
+ return false;
+ }
+ LOG.debug("try to copy {} from res to {}", resFile, oFile.getAbsolutePath());
+ URL u = getFileURL(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/subtypes/Section.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/configuration/subtypes/Section.java
index a0e21be01..094da6389 100644
--- 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
@@ -50,7 +50,7 @@ public class Section {
}
public String getProperty(String key) {
- return this.getProperty(key, null);
+ return this.getProperty(key, "");
}
public String getProperty(String key, String defValue) {
@@ -61,7 +61,7 @@ public class Section {
}
public String getName() {
- return name;
+ return name;
}
public void setProperty(String key, String value) {
@@ -70,7 +70,7 @@ public class Section {
key = key.substring(1);
}
if (this.values.containsKey(key)) {
- this.values.get(key).setValue(value).setIsUncommented(isuncommented);
+ this.values.get(key).setValue(value).setIsUncommented(isuncommented);
} else {
this.values.put(key, new SectionValue(value,isuncommented));
}
@@ -128,7 +128,7 @@ public class Section {
lines.add("[" + this.name + "]");
}
for (Entry<String, SectionValue> entry : this.values.entrySet()) {
- SectionValue sectionValue = entry.getValue();
+ SectionValue sectionValue = entry.getValue();
if (sectionValue.getComments().size() > 0) {
for (String comment : sectionValue.getComments()) {
lines.add(comment);
@@ -173,11 +173,11 @@ public class Section {
public Optional<Long> getLong(String key) {
String v = this.getProperty(key);
- try {
- return Optional.of(Long.parseLong(v));
- } catch (NumberFormatException e) {
- }
- return Optional.empty();
+ try {
+ return Optional.of(Long.parseLong(v));
+ } catch (NumberFormatException e) {
+ }
+ return Optional.empty();
}
public boolean hasValues() {
@@ -188,9 +188,9 @@ public class Section {
return this.values.containsKey(key);
}
- @Override
- public String toString() {
- return "Section [name=" + name + ", rawLines=" + rawLines + ", values=" + values + "]";
- }
+ @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/http/BaseHTTPClientFromDevicemanager.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClientFromDevicemanager.java
new file mode 100644
index 000000000..e330fb42a
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClientFromDevicemanager.java
@@ -0,0 +1,327 @@
+/*******************************************************************************
+ * ============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 BaseHTTPClientFromDevicemanager {
+
+ private static Logger LOG = LoggerFactory.getLogger(BaseHTTPClientFromDevicemanager.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 BaseHTTPClientFromDevicemanager(String base) {
+ this(base, false);
+ }
+
+ public BaseHTTPClientFromDevicemanager(String base, boolean trustAllCerts) {
+ this(base, trustAllCerts, null, null, SSLCERT_NONE);
+ }
+
+ public BaseHTTPClientFromDevicemanager(String base, boolean trustAllCerts, String certFilename, String passphrase, int sslCertType) {
+ 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 BaseHTTPResponseFromDevicemanager 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 BaseHTTPResponseFromDevicemanager 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 BaseHTTPResponseFromDevicemanager(-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 BaseHTTPResponseFromDevicemanager(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/BaseHTTPResponseFromDevicemanager.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponseFromDevicemanager.java
new file mode 100644
index 000000000..0fd0a6459
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPResponseFromDevicemanager.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.http;
+
+public class BaseHTTPResponseFromDevicemanager {
+
+ public static final int CODE404 = 404;
+ public static final int CODE200 = 200;
+ public static final BaseHTTPResponseFromDevicemanager UNKNOWN = new BaseHTTPResponseFromDevicemanager(-1, "");
+ public final int code;
+ public final String body;
+
+ public BaseHTTPResponseFromDevicemanager(int code,String body)
+ {
+ this.code=code;
+ this.body=body;
+ }
+
+ @Override
+ public String toString() {
+ return "BaseHTTPResponse [code=" + code + ", body=" + body + "]";
+ }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/Environment.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/Environment.java
new file mode 100644
index 000000000..1ac55ad15
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/Environment.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.util;
+
+import java.net.Inet4Address;
+import java.net.UnknownHostException;
+import java.util.Map;
+
+public class Environment {
+
+ public static String getVar(String v)
+ {
+ if(v.equals("$HOSTNAME"))
+ {
+ String s=null;
+ try {
+ s = Inet4Address.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+
+ }
+ if(s!=null && s.length()>0)
+ return s;
+ }
+ Map<String, String> env = System.getenv();
+ for (String envName : env.keySet()) {
+ if(envName!=null && envName.equals(v))
+ return env.get(envName);
+ }
+ return null;
+ }
+}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/FileWatchdog.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/FileWatchdog.java
new file mode 100644
index 000000000..55fe83300
--- /dev/null
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/util/FileWatchdog.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * ============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.util;
+
+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);
+ }
+}