diff options
Diffstat (limited to 'sdnr/wt/odlux/core')
26 files changed, 1778 insertions, 0 deletions
diff --git a/sdnr/wt/odlux/core/features/pom.xml b/sdnr/wt/odlux/core/features/pom.xml new file mode 100644 index 000000000..a643ec2fe --- /dev/null +++ b/sdnr/wt/odlux/core/features/pom.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- * ============LICENSE_START======================================================= + * ONAP : CCSDK.feature.sdnr.wt * ================================================================================ + * Copyright (C) 2018 highstreet technologies GmbH Intellectual Property. + * All rights reserved. * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); * you may + not use this file except in compliance with the License. * You may obtain + a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software * distributed + under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES + OR CONDITIONS OF ANY KIND, either express or implied. * See the License for + the specific language governing permissions and * limitations under the License. + * ============LICENSE_END========================================================= --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-feature</artifactId> + <version>0.7.0-SNAPSHOT</version> + <packaging>feature</packaging> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId} :: feature</name> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>single-feature-parent</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.opendaylight.controller</groupId> + <artifactId>mdsal-artifacts</artifactId> + <version>${odl.controller.mdsal.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-core-provider</artifactId> + <version>${project.version}</version> + </dependency> + + </dependencies> +</project> diff --git a/sdnr/wt/odlux/core/installer/pom.xml b/sdnr/wt/odlux/core/installer/pom.xml new file mode 100755 index 000000000..98a4fd50f --- /dev/null +++ b/sdnr/wt/odlux/core/installer/pom.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-installer</artifactId> + <version>0.7.0-SNAPSHOT</version> + <packaging>pom</packaging> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent-lite</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + + <properties> + <application.name>sdnr-wt-odlux-core</application.name> + <include.transitive.dependencies>false</include.transitive.dependencies> + </properties> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>${application.name}-feature</artifactId> + <version>${project.version}</version> + <type>xml</type> + <classifier>features</classifier> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>${application.name}-provider</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>maven-repo-zip</id> + <goals> + <goal>single</goal> + </goals> + <phase>package</phase> + <configuration> + <attach>true</attach> + <finalName>stage/${application.name}-${project.version}</finalName> + <descriptors> + <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor> + </descriptors> + <appendAssemblyId>true</appendAssemblyId> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-nested-dependencies</id> + <goals> + <goal>copy-dependencies</goal> + </goals> + <phase>prepare-package</phase> + <configuration> + <transitive>true</transitive> + <outputDirectory>${project.build.directory}/assembly/system</outputDirectory> + <overWriteReleases>false</overWriteReleases> + <overWriteSnapshots>true</overWriteSnapshots> + <overWriteIfNewer>true</overWriteIfNewer> + <useRepositoryLayout>true</useRepositoryLayout> + <addParentPoms>false</addParentPoms> + <copyPom>false</copyPom> + <!--<includeArtifactIds>sdnr-wt-apigateway-provider,${application.name}</includeArtifactIds> --> + <!--<scope>provided</scope> --> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/sdnr/wt/odlux/core/installer/src/assembly/assemble_mvnrepo_zip.xml b/sdnr/wt/odlux/core/installer/src/assembly/assemble_mvnrepo_zip.xml new file mode 100644 index 000000000..c4eb9aa25 --- /dev/null +++ b/sdnr/wt/odlux/core/installer/src/assembly/assemble_mvnrepo_zip.xml @@ -0,0 +1,49 @@ +<!-- + ============LICENSE_START======================================================= + ONAP : CCSDK + ================================================================================ + Copyright (C) 2017 AT&T 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========================================================= + --> + +<!-- Defines how we build the .zip file which is our distribution. --> + +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> + <id>repo</id> + <formats> + <format>zip</format> + </formats> + + <!-- we want "system" and related files right at the root level + as this file is suppose to be unzip on top of a karaf + distro. --> + <includeBaseDirectory>false</includeBaseDirectory> + + <fileSets> + <fileSet> + <directory>target/assembly/</directory> + <outputDirectory>.</outputDirectory> + <excludes> + </excludes> + </fileSet> + </fileSets> + + + +</assembly> diff --git a/sdnr/wt/odlux/core/model/pom.xml b/sdnr/wt/odlux/core/model/pom.xml new file mode 100644 index 000000000..1618e7aa1 --- /dev/null +++ b/sdnr/wt/odlux/core/model/pom.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-model</artifactId> + <version>0.7.0-SNAPSHOT</version> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <packaging>bundle</packaging> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>binding-parent</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Import-Package>*</Import-Package> + <Export-Package>org.onap.ccsdk.features.sdnr.wt.odlux.*,com.opensymphony.*</Export-Package> + </instructions> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java b/sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java new file mode 100644 index 000000000..133b08494 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java @@ -0,0 +1,238 @@ +/* + * Copyright 2002-2003,2009 The Apache Software Foundation. + * + * 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. + */ +package com.opensymphony.xwork2.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.*; + + +/** + * This class is extremely useful for loading resources and classes in a fault tolerant manner + * that works across different applications servers. + * + * It has come out of many months of frustrating use of multiple application servers at Atlassian, + * please don't change things unless you're sure they're not going to break in one server or another! + * + * It was brought in from oscore trunk revision 147. + * + * @author $Author$ + * @version $Revision$ + */ +public class ClassLoaderUtil { + //~ Methods //////////////////////////////////////////////////////////////// + + /** + * Load all resources with a given name, potentially aggregating all results + * from the searched classloaders. If no results are found, the resource name + * is prepended by '/' and tried again. + * + * This method will try to load the resources using the following methods (in order): + * <ul> + * <li>From Thread.currentThread().getContextClassLoader() + * <li>From ClassLoaderUtil.class.getClassLoader() + * <li>callingClass.getClassLoader() + * </ul> + * + * @param resourceName The name of the resources to load + * @param callingClass The Class object of the calling object + */ + public static Iterator<URL> getResources(String resourceName, Class<?> callingClass, boolean aggregate) throws IOException { + + AggregateIterator<URL> iterator = new AggregateIterator<>(); + + iterator.addEnumeration(Thread.currentThread().getContextClassLoader().getResources(resourceName)); + + if (!iterator.hasNext() || aggregate) { + iterator.addEnumeration(ClassLoaderUtil.class.getClassLoader().getResources(resourceName)); + } + + if (!iterator.hasNext() || aggregate) { + ClassLoader cl = callingClass.getClassLoader(); + + if (cl != null) { + iterator.addEnumeration(cl.getResources(resourceName)); + } + } + + if (!iterator.hasNext() && resourceName != null && (resourceName.length() == 0 || resourceName.charAt(0) != '/')) { + return getResources('/' + resourceName, callingClass, aggregate); + } + + return iterator; + } + + /** + * Load a given resource. + * + * This method will try to load the resource using the following methods (in order): + * <ul> + * <li>From Thread.currentThread().getContextClassLoader() + * <li>From ClassLoaderUtil.class.getClassLoader() + * <li>callingClass.getClassLoader() + * </ul> + * + * @param resourceName The name IllegalStateException("Unable to call ")of the resource to load + * @param callingClass The Class object of the calling object + */ + public static URL getResource(String resourceName, Class<?> callingClass) { + URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName); + + if (url == null) { + url = ClassLoaderUtil.class.getClassLoader().getResource(resourceName); + } + + if (url == null) { + ClassLoader cl = callingClass.getClassLoader(); + + if (cl != null) { + url = cl.getResource(resourceName); + } + } + + if (url == null && resourceName != null && (resourceName.length() == 0 || resourceName.charAt(0) != '/')) { + return getResource('/' + resourceName, callingClass); + } + + return url; + } + + /** + * This is a convenience method to load a resource as a stream. + * + * The algorithm used to find the resource is given in getResource() + * + * @param resourceName The name of the resource to load + * @param callingClass The Class object of the calling object + */ + public static InputStream getResourceAsStream(String resourceName, Class<?> callingClass) { + URL url = getResource(resourceName, callingClass); + + try { + return url != null ? url.openStream() : null; + } catch (IOException e) { + return null; + } + } + + /** + * Load a class with a given name. + * + * It will try to load the class in the following order: + * <ul> + * <li>From Thread.currentThread().getContextClassLoader() + * <li>Using the basic Class.forName() + * <li>From ClassLoaderUtil.class.getClassLoader() + * <li>From the callingClass.getClassLoader() + * </ul> + * + * @param className The name of the class to load + * @param callingClass The Class object of the calling object + * @throws ClassNotFoundException If the class cannot be found anywhere. + */ + public static Class<?> loadClass(String className, Class<?> callingClass) throws ClassNotFoundException { + try { + return Thread.currentThread().getContextClassLoader().loadClass(className); + } catch (ClassNotFoundException e) { + try { + return Class.forName(className); + } catch (ClassNotFoundException ex) { + try { + return ClassLoaderUtil.class.getClassLoader().loadClass(className); + } catch (ClassNotFoundException exc) { + return callingClass.getClassLoader().loadClass(className); + } + } + } + } + + /** + * Aggregates Enumeration instances into one iterator and filters out duplicates. Always keeps one + * ahead of the enumerator to protect against returning duplicates. + */ + static class AggregateIterator<E> implements Iterator<E> { + + LinkedList<Enumeration<E>> enums = new LinkedList<>(); + Enumeration<E> cur = null; + E next = null; + Set<E> loaded = new HashSet<>(); + + public AggregateIterator<E> addEnumeration(Enumeration<E> e) { + if (e.hasMoreElements()) { + if (cur == null) { + cur = e; + next = e.nextElement(); + loaded.add(next); + } else { + enums.add(e); + } + } + return this; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public E next() { + if (next != null) { + E prev = next; + next = loadNext(); + return prev; + } else { + throw new NoSuchElementException(); + } + } + + private Enumeration<E> determineCurrentEnumeration() { + if (cur != null && !cur.hasMoreElements()) { + if (enums.size() > 0) { + cur = enums.removeLast(); + } else { + cur = null; + } + } + return cur; + } + + private E loadNext() { + if (determineCurrentEnumeration() != null) { + E tmp = cur.nextElement(); + int loadedSize = loaded.size(); + while (loaded.contains(tmp)) { + tmp = loadNext(); + if (tmp == null || loaded.size() > loadedSize) { + break; + } + } + if (tmp != null) { + loaded.add(tmp); + } + return tmp; + } + return null; + + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/ClassLoaderUtilExt.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/ClassLoaderUtilExt.java new file mode 100644 index 000000000..4b58aac44 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/ClassLoaderUtilExt.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +import java.io.IOException; +import java.net.URL; +import java.util.Iterator; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.opensymphony.xwork2.util.ClassLoaderUtil; + +public class ClassLoaderUtilExt { + + final static Logger LOG = LoggerFactory.getLogger(ClassLoaderUtilExt.class); + + public static URL getResource(String resourceName, Class<?> callingClass) { + + Iterator<URL> urls = null; + URL url = null; + try { + urls = getResources(resourceName, callingClass, true); + } catch (IOException e) { + LOG.debug("No resource {}",resourceName); + } + if (urls != null) { + while (urls.hasNext()) { + URL u = urls.next(); + LOG.debug("found " + u.toString()); + url = u; + break; + } + } + if (url == null) { + LOG.debug("res currently not found. try to find with bundle"); + Bundle b = FrameworkUtil.getBundle(callingClass); + if(b!=null) + { + url = b.getEntry(resourceName); + } + else { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + url = loader.getResource(resourceName); + } + + } + return url; + } + + public static Iterator<URL> getResources(String resourceName, Class<?> callingClass, boolean aggregate) + throws IOException { + return ClassLoaderUtil.getResources(resourceName, callingClass, aggregate); + } + +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/IndexOdlBundle.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/IndexOdlBundle.java new file mode 100644 index 000000000..d193edb04 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/IndexOdlBundle.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +public interface IndexOdlBundle { + +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundle.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundle.java new file mode 100644 index 000000000..4e2332b4e --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundle.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * ============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.odlux.model.bundles; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; + +/** + * At startup of each karaf bundle, each UI module creates an instance of this class via blueprint. + * Initialize method gets called at loading of bundle. + */ + +public class OdluxBundle { + + final static Logger LOG = LoggerFactory.getLogger(OdluxBundle.class); + private static final String LR = "\n"; + + private String bundleName; + private OdluxBundleLoader loader; + private int index; + + /** + * @return the index + */ + public int getIndex() { + return index; + } + + /** + * @param index the index to set + */ + public void setIndex(int index) { + this.index = index; + } + + public OdluxBundleLoader getLoader() { + return loader; + } + + public void setLoader(OdluxBundleLoader loader) { + this.loader = loader; + } + + public void setBundleName(String bundleName) { + this.bundleName = bundleName; + } + + public String getBundleName() { + return this.bundleName; + } + + public OdluxBundle() {} + + protected OdluxBundle(final OdluxBundleLoader loader, final String bundleName) { + this.loader = loader; + this.bundleName = bundleName; + } + + public void initialize() { + + LOG.info("Registering resources"); + if (this.loader != null) { + if (this.bundleName == null) + LOG.error("bundle name is missing. Bundle can not be registered with odlux"); + else { + LOG.info("Registering bunlde {}", this.bundleName); + this.loader.addBundle(this); + } + } + } + + public void clean() { + LOG.info("Unregistering resources"); + + if (this.loader != null) { + this.loader.removeBundle(this); + } + } + + public boolean hasResource(String filename) { + return this.getResource(filename) != null; + } + + public String getResourceFileContent(String filename) { + return this.loadFileContent(this.getResource(filename)); + } + + protected URL getResource(String filename) { + return ClassLoaderUtilExt.getResource(filename, this.getClass()); + } + + protected String loadFileContent(final URL url ) { + if (url == null) + return null; + LOG.debug("try to load res " + url.toString()); + StringBuilder sb = new StringBuilder(); + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader(url.openStream())); + + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine + LR); + } + } catch (IOException e) { + LOG.warn("could not load resfile " + url.toString() + ": " + e.getMessage()); + return null; + } + finally { + if(in!=null) { + try { + in.close(); + } catch (IOException e) { + + } + } + } + + return sb.toString(); + } + +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoader.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoader.java new file mode 100644 index 000000000..ce003c664 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoader.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +public interface OdluxBundleLoader { + + public void addBundle(OdluxBundle bundle); + + public void removeBundle(OdluxBundle bundle); + + public int getNumberOfBundles(); + + public String getResourceContent(String fn, OdluxBundleResourceAccess indexBundle); + +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleResourceAccess.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleResourceAccess.java new file mode 100644 index 000000000..d7ac3e9c4 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleResourceAccess.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +import java.util.List; + +public interface OdluxBundleResourceAccess { + + boolean hasResource(String fn); + String getResourceFileContent(String fn, List<String> bundleNames); + String getBundleName(); + +} diff --git a/sdnr/wt/odlux/core/pom.xml b/sdnr/wt/odlux/core/pom.xml new file mode 100644 index 000000000..c41075a10 --- /dev/null +++ b/sdnr/wt/odlux/core/pom.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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"> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>odlparent-lite</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + + + <modelVersion>4.0.0</modelVersion> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-top</artifactId> + <version>0.7.0-SNAPSHOT</version> + <packaging>pom</packaging> + <name>odlux-core</name> + + <properties> + <feature-name>sdnr-wt-odlux-core</feature-name> + </properties> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + + <modules> + <module>model</module> + <module>provider</module> + <module>features</module> + <module>installer</module> + </modules> +</project> diff --git a/sdnr/wt/odlux/core/provider/pom.xml b/sdnr/wt/odlux/core/provider/pom.xml new file mode 100644 index 000000000..84838a05f --- /dev/null +++ b/sdnr/wt/odlux/core/provider/pom.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-provider</artifactId> + <version>0.7.0-SNAPSHOT</version> + <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name> + <packaging>bundle</packaging> + + <parent> + <groupId>org.onap.ccsdk.parent</groupId> + <artifactId>binding-parent</artifactId> + <version>1.5.1-SNAPSHOT</version> + <relativePath/> + </parent> + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0</url> + </license> + </licenses> + <dependencies> + <dependency> + <groupId>org.onap.ccsdk.features.sdnr.wt</groupId> + <artifactId>sdnr-wt-odlux-core-model</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>sdnr-wt-odlux-framework</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <artifactId>maven-checkstyle-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Import-Package>org.onap.ccsdk.features.sdnr.wt.odlux.*;resolution:=optional,*; + </Import-Package> + <Embed-Dependency>sdnr-wt-odlux-framework;inline=true</Embed-Dependency> + <Embed-Transitive>true</Embed-Transitive> + <Export-Package>${project.groupId}.*</Export-Package> + </instructions> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java new file mode 100644 index 000000000..73d61a7b3 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * ============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.odlux; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleResourceAccess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexOdluxBundle extends OdluxBundle implements OdluxBundleResourceAccess { + + private static Logger LOG = LoggerFactory.getLogger(IndexOdluxBundle.class); + + private static final String LR = "\n"; + private static final String BUNDLENAME_APP = "run"; + private static final String regexRequire = "require\\(\\[(\"" + BUNDLENAME_APP + "\")\\]"; + private static final String regexFunction = "function[\\ ]*\\((" + BUNDLENAME_APP + ")\\)[\\ ]*\\{"; + private static final String regexFunctionBody = "(" + BUNDLENAME_APP + "\\.runApplication\\(\\);)"; + private static final Pattern patternRequire = Pattern.compile(regexRequire); + private static final Pattern patternFunction = Pattern.compile(regexFunction); + private static final Pattern patternFunctionBody = Pattern.compile(regexFunctionBody); + + public IndexOdluxBundle() { + super(null, BUNDLENAME_APP); + + } + @Override + protected String loadFileContent(URL url) + { + return loadFileContent(url, OdluxBundleLoaderImpl.getInstance().getLoadedBundles(this.getBundleName())); + } + + @Override + public String getResourceFileContent(String fn, List<String> bundleNames) { + return loadFileContent(this.getResource(fn),bundleNames); + } + + private static String loadFileContent(URL url, List<String> bundlesNamesList) { + if (url == null) { + return null; + } + LOG.debug("try to load res " + url.toString()); + StringBuilder sb = new StringBuilder(); + Matcher matcher; + BufferedReader in=null; + try { + in = new BufferedReader(new InputStreamReader(url.openStream())); + + String inputLine; + while ((inputLine = in.readLine()) != null) { + if (url.getFile().endsWith("index.html")) { + matcher = patternRequire.matcher(inputLine); + if (matcher.find()) { + inputLine = inputLine.substring(0, matcher.start(1)) + "\"" + String.join("\",\"", bundlesNamesList) + + "\"" + inputLine.substring(matcher.end(1)); + } + matcher = patternFunction.matcher(inputLine); + if (matcher.find()) { + inputLine = inputLine.substring(0, matcher.start(1)) + String.join(",", bundlesNamesList) + + inputLine.substring(matcher.end(1)); + } + matcher = patternFunctionBody.matcher(inputLine); + if (matcher.find()) { + String hlp = ""; + for (String bundle : bundlesNamesList) { + if (!bundle.equals(BUNDLENAME_APP)) { + hlp += bundle + ".register();" + LR; + } + } + inputLine = inputLine.substring(0, matcher.start(1)) + hlp + + inputLine.substring(matcher.start(1)); + } + } + sb.append(inputLine + LR); + } + + } catch (IOException e) { + LOG.warn("could not load resfile {} : {}", url, e.getMessage()); + return null; + } + finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + + } + } + + return sb.toString(); + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexServlet.java b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexServlet.java new file mode 100644 index 000000000..d6d466ab9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexServlet.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.nio.file.Files; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexServlet extends HttpServlet { + + private static final long serialVersionUID = 3039669437157215355L; + private static Logger LOG = LoggerFactory.getLogger(IndexServlet.class); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (req.getRequestURI() != null && req.getRequestURI().contains("favicon.ico")) { + this.sendFile(resp, "etc/favicon.ico","image/x-icon"); + } else { + + LOG.debug("redirect to odlux/index.html"); + resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); + resp.setHeader("Location", "odlux/index.html"); + } + } + + private void sendFile(HttpServletResponse response, String filename, String mimeType) { + File f = new File(filename); + if (f.exists()) { + try { + byte[] bytes = Files.readAllBytes(f.toPath()); + response.setContentType(mimeType); + response.setContentLength(bytes.length); + response.setStatus(HttpURLConnection.HTTP_OK); + OutputStream os = response.getOutputStream(); + os.write(bytes); + os.flush(); + os.close(); + } catch (IOException e) { + LOG.debug("problem sending {}: {}", filename, e); + } + } else { + LOG.debug("file not found: {}",filename); + response.setStatus(HttpURLConnection.HTTP_NOT_FOUND); + } + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/OdluxBundleLoaderImpl.java b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/OdluxBundleLoaderImpl.java new file mode 100644 index 000000000..205c96129 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/OdluxBundleLoaderImpl.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * ============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.odlux; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ConcurrentSkipListSet; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleResourceAccess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OdluxBundleLoaderImpl implements OdluxBundleLoader { + + private final static Logger LOG = LoggerFactory.getLogger(OdluxBundleLoaderImpl.class); + + private static OdluxBundleLoaderImpl singleton = null; + + private Object lock; + // private List<OdluxBundle> bundles; + private ConcurrentSkipListSet<OdluxBundle> bundles2; + private Comparator<OdluxBundle> sortorderbundlecomparator; + + public OdluxBundleLoaderImpl() { + if (singleton != null) { + LOG.error("Multiple intializations of singleton"); + } else { + lock = new Object(); + sortorderbundlecomparator = (arg0, arg1) -> { + int diff = arg0.getIndex() - arg1.getIndex(); + return diff > 0 ? 1 : diff < 0 ? -1 : 0; + }; + bundles2 = new ConcurrentSkipListSet<>(sortorderbundlecomparator); + + singleton = this; + } + } + + public static OdluxBundleLoaderImpl getInstance() { + if (singleton == null) { + LOG.warn("Test initialization order"); + new OdluxBundleLoaderImpl(); + } + return singleton; + } + + @Override + public int getNumberOfBundles() { + synchronized (lock) { + return this.bundles2.size(); + } + } + + @Override + public void addBundle(OdluxBundle bundle) { + LOG.debug("odlux bundle " + bundle.getBundleName() + " added"); + this.bundles2.add(bundle); + + + } + + @Override + public void removeBundle(OdluxBundle bundle) { + this.bundles2.remove(bundle); + LOG.debug("odlux bundle " + bundle.getBundleName() + " removed"); + + } + + public List<String> getLoadedBundles(String myBundleName) { + List<String> list = new ArrayList<>(); + for (OdluxBundle b : bundles2) { + list.add(b.getBundleName()); + } + list.add(myBundleName); + return list; + } + + private List<String> getBundleNames(String myBundleName) { + final List<String> names = new ArrayList<>(); + for (OdluxBundle b : bundles2) { + names.add(b.getBundleName()); + } + names.add(myBundleName); + return names; + } + + public String getResourceContent(String fn, OdluxBundleResourceAccess indexBundle) { + String fileContent = null; + + if (indexBundle.hasResource(fn)) { + fileContent = indexBundle.getResourceFileContent(fn, getBundleNames(indexBundle.getBundleName())); + } else { + LOG.debug("not found in framework res. try to find in applications"); + final Iterator<OdluxBundle> it = bundles2.iterator(); + while (it.hasNext()) { + OdluxBundle b = it.next(); + if (b.hasResource(fn)) { + LOG.debug("found res in " + b.getBundleName()); + fileContent = b.getResourceFileContent(fn); + break; + } + } + } + return fileContent; + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java new file mode 100644 index 000000000..fe00662aa --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * ============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.odlux; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResFilesServlet extends HttpServlet { + + private static final long serialVersionUID = -6807215213921798293L; + private static Logger LOG = LoggerFactory.getLogger(ResFilesServlet.class); + + + private final IndexOdluxBundle indexBundle; + + public ResFilesServlet() { + super(); + indexBundle = new IndexOdluxBundle(); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + final String fn = req.getRequestURI(); + LOG.debug("Get request with for URI: {}", fn); + + OdluxBundleLoader odluxBundleLoader = OdluxBundleLoaderImpl.getInstance(); + if (odluxBundleLoader != null) { + String fileContent = odluxBundleLoader.getResourceContent(fn, indexBundle); + if (fileContent != null) { + //Store header info + String mimeType = getMimeType(fn); + byte[] byteContent = fileContent.getBytes(java.nio.charset.StandardCharsets.UTF_8); + int length = byteContent.length; + + LOG.debug("Found file in resources. Name {} mimetype {} length {} and write to output stream", fn, mimeType, length); + resp.setContentType(mimeType); + resp.setContentLength(length); + resp.setStatus(HttpURLConnection.HTTP_OK); + OutputStream os = resp.getOutputStream(); + os.write(byteContent); + os.flush(); + os.close(); + } else { + LOG.debug("File {} not found in res.", fn); + resp.setStatus(HttpURLConnection.HTTP_NOT_FOUND); + } + } else { + LOG.debug("BundleLoaderInstance to found.", fn); + resp.setStatus(HttpURLConnection.HTTP_NOT_FOUND); + } + } + + public String loadFileContent(String filename) { + return this.indexBundle.getResourceFileContent(filename); + } + + //Provide own function that can be overloaded for test + public String getMimeType(String fileName) { + return getServletContext().getMimeType(fileName); + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100644 index 000000000..5dab578de --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs"> + + <bean id="indexServlet" + class="org.onap.ccsdk.features.sdnr.wt.odlux.IndexServlet"> + </bean> + + <service interface="javax.servlet.http.HttpServlet" ref="indexServlet"> + <service-properties> + <entry key="alias" value="/index2.html" /> + </service-properties> + </service> + + <bean id="indexServlet2" + class="org.onap.ccsdk.features.sdnr.wt.odlux.IndexServlet"> + </bean> + + <service interface="javax.servlet.http.HttpServlet" ref="indexServlet2"> + <service-properties> + <entry key="alias" value="/favicon.ico" /> + </service-properties> + </service> + + <bean id="resFilesServlet" + class="org.onap.ccsdk.features.sdnr.wt.odlux.ResFilesServlet"> + </bean> + + <service interface="javax.servlet.http.HttpServlet" ref="resFilesServlet"> + <service-properties> + <entry key="alias" value="/odlux" /> + </service-properties> + </service> + <bean id="loadersvc" class="org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl"/> + <service id="serviceRegistration" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader" ref="loadersvc"/> + +</blueprint> diff --git a/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestBundleLoaderImpl.java b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestBundleLoaderImpl.java new file mode 100644 index 000000000..bebbffdcf --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestBundleLoaderImpl.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * ============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.odlux.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader; + +public class TestBundleLoaderImpl { + + @Test + public void test() { + OdluxBundleLoader loader = OdluxBundleLoaderImpl.getInstance(); + int loaded = loader.getNumberOfBundles(); + + OdluxBundle bundle1 = new OdluxBundle(); + bundle1.setBundleName("b1"); + bundle1.setIndex(0); + bundle1.setLoader(loader); + OdluxBundle bundle2 = new OdluxBundle(); + bundle2.setBundleName("b2"); + bundle2.setIndex(55); + bundle2.setLoader(loader); + bundle1.initialize(); + bundle2.initialize(); + assertNotNull(bundle1.getResourceFileContent("index.html")); + assertNotNull(bundle2.getResourceFileContent("index2.html")); + assertEquals(loaded+2, loader.getNumberOfBundles()); + loader.addBundle(bundle1); + loader.addBundle(bundle2); + assertEquals(loaded+2, loader.getNumberOfBundles()); + loader.removeBundle(bundle1); + loader.removeBundle(bundle2); + assertEquals(loaded, loader.getNumberOfBundles()); + + assertTrue(bundle1.hasResource("index.html")); + assertTrue(bundle2.hasResource("index2.html")); + assertNotNull(bundle1.getLoader()); + assertEquals(0,bundle1.getIndex()); + bundle1.clean(); + bundle2.clean(); + assertEquals(loaded,loader.getNumberOfBundles()); + + + } +} diff --git a/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestLoadResources.java b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestLoadResources.java new file mode 100644 index 000000000..3c9ad4308 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestLoadResources.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.odlux.test; +import static org.junit.Assert.*; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.odlux.ResFilesServlet; + +public class TestLoadResources { + + @Test + public void test() { + ResFilesServlet servlet = new ResFilesServlet(); + String indexhtml=null; + indexhtml=servlet.loadFileContent("odlux/index.html"); + assertNotNull(indexhtml); + final String regex = "require\\(\\[.*\"run\".*\\]"; + final Pattern pattern = Pattern.compile(regex,Pattern.MULTILINE); + System.out.println(indexhtml); + final Matcher matcher = pattern.matcher(indexhtml); + assertTrue("Can not find patter '"+regex+"'",matcher.find()); + } + @Test + public void test2() { + + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestRedirect.java b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestRedirect.java new file mode 100644 index 000000000..78d5eb8fe --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestRedirect.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.odlux.test; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.odlux.IndexServlet; + +import static org.mockito.Mockito.*; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class TestRedirect { + + private static final int RESPONSECODE_REDIRECT = 301; + + @Test + public void test() { + PublicIndexServlet servlet =new PublicIndexServlet(); + HttpServletRequest req = mock(HttpServletRequest.class); + HttpServletResponse resp = mock(HttpServletResponse.class); + try { + servlet.doGet(req,resp); + } catch (Exception e) { + fail(e.getMessage()); + } + verify(resp).setStatus(RESPONSECODE_REDIRECT); + } + + private static class PublicIndexServlet extends IndexServlet{ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + super.doGet(req, resp); + } + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestResFileServlet.java b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestResFileServlet.java new file mode 100644 index 000000000..217735c40 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestResFileServlet.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * ============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.odlux.test; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.io.StringWriter; +import java.net.HttpURLConnection; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import static org.mockito.Mockito.*; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl; +import org.onap.ccsdk.features.sdnr.wt.odlux.ResFilesServlet; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader; + +public class TestResFileServlet { + + PublicResFilesServlet servlet; + + @Test + public void test() throws ServletException { + servlet = new PublicResFilesServlet(); + servlet.init(); + + OdluxBundleLoader loader = OdluxBundleLoaderImpl.getInstance(); + OdluxBundle b = new OdluxBundle(); + b.setBundleName("b1"); + b.setIndex(9); + b.setLoader(loader); + b.initialize(); + System.out.println("Subtest1"); + testResReq("odlux/index.html", HttpURLConnection.HTTP_OK); + System.out.println("Subtest2"); + testResReq("odlux/fragmich.txt", HttpURLConnection.HTTP_NOT_FOUND); + System.out.println("Done"); + } + + private void testResReq(String res, int responseCode) { + HttpServletRequest req = mock(HttpServletRequest.class); + HttpServletResponse resp = mock(HttpServletResponse.class); + when(req.getRequestURI()).thenReturn(res); + StringWriter out = new StringWriter(); + ServletOutputStream printOut = new ServletOutputStream() { + + @Override + public void write(int arg0) throws IOException { + out.write(arg0); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + }; + try { + when(resp.getOutputStream()).thenReturn(printOut); + servlet.doGet(req, resp); + } catch (ServletException | IOException e) { + fail(e.getMessage()); + } + verify(resp).setStatus(responseCode); + } + + + @SuppressWarnings("serial") + private class PublicResFilesServlet extends ResFilesServlet { + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + super.doGet(req, resp); + } + @Override + public String getMimeType(String fileName) { + return "mimetype"; + } + } +} diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/index.html b/sdnr/wt/odlux/core/provider/src/test/resources/index.html new file mode 100644 index 000000000..4f4584dd9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <!-- <link rel="stylesheet" href="./vendor.css" > -->
+ <title>O D L UX</title>
+</head>
+
+<body>
+ <div id="app"></div>
+ <script type="text/javascript" src="./require.js"></script>
+ <script type="text/javascript" src="./config.js"></script>
+ <script>
+ // run the application
+ require(["run"], function (run) {
+ run.runApplication();
+ });
+ </script>
+</body>
+
+</html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/index2.html b/sdnr/wt/odlux/core/provider/src/test/resources/index2.html new file mode 100644 index 000000000..4f4584dd9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/index2.html @@ -0,0 +1,24 @@ +<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <!-- <link rel="stylesheet" href="./vendor.css" > -->
+ <title>O D L UX</title>
+</head>
+
+<body>
+ <div id="app"></div>
+ <script type="text/javascript" src="./require.js"></script>
+ <script type="text/javascript" src="./config.js"></script>
+ <script>
+ // run the application
+ require(["run"], function (run) {
+ run.runApplication();
+ });
+ </script>
+</body>
+
+</html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index.html b/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index.html new file mode 100644 index 000000000..4f4584dd9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index.html @@ -0,0 +1,24 @@ +<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <!-- <link rel="stylesheet" href="./vendor.css" > -->
+ <title>O D L UX</title>
+</head>
+
+<body>
+ <div id="app"></div>
+ <script type="text/javascript" src="./require.js"></script>
+ <script type="text/javascript" src="./config.js"></script>
+ <script>
+ // run the application
+ require(["run"], function (run) {
+ run.runApplication();
+ });
+ </script>
+</body>
+
+</html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index2.html b/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index2.html new file mode 100644 index 000000000..4f4584dd9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/odlux/index2.html @@ -0,0 +1,24 @@ +<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
+ <!-- <link rel="stylesheet" href="./vendor.css" > -->
+ <title>O D L UX</title>
+</head>
+
+<body>
+ <div id="app"></div>
+ <script type="text/javascript" src="./require.js"></script>
+ <script type="text/javascript" src="./config.js"></script>
+ <script>
+ // run the application
+ require(["run"], function (run) {
+ run.runApplication();
+ });
+ </script>
+</body>
+
+</html>
\ No newline at end of file diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/simplelogger.properties b/sdnr/wt/odlux/core/provider/src/test/resources/simplelogger.properties new file mode 100644 index 000000000..426f84834 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/simplelogger.properties @@ -0,0 +1,38 @@ +# SLF4J's SimpleLogger configuration file +# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err. + +# Default logging detail level for all instances of SimpleLogger. +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, defaults to "info". +org.slf4j.simpleLogger.defaultLogLevel=debug + +# Logging detail level for a SimpleLogger instance named "xxx.yyy.zzz". +# Must be one of ("trace", "debug", "info", "warn", or "error"). +# If not specified, the default logging detail level is used. +# org.slf4j.simpleLogger.log.xxx.yyy=debug +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager=info +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.archiveservice=debug +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources=info +org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container=info + +# Set to true if you want the current date and time to be included in output messages. +# Default is false, and will output the number of milliseconds elapsed since startup. +#org.slf4j.simpleLogger.showDateTime=false + +# The date and time format to be used in the output messages. +# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat. +# If the format is not specified or is invalid, the default format is used. +# The default format is yyyy-MM-dd HH:mm:ss:SSS Z. +#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z + +# Set to true if you want to output the current thread name. +# Defaults to true. +#org.slf4j.simpleLogger.showThreadName=true + +# Set to true if you want the Logger instance name to be included in output messages. +# Defaults to true. +#org.slf4j.simpleLogger.showLogName=true + +# Set to true if you want the last component of the name to be included in output messages. +# Defaults to false. +#org.slf4j.simpleLogger.showShortLogName=false |