diff options
Diffstat (limited to 'sdnr/wt/common')
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); + } +} |