From 3d202a04b99f0e61b6ccf8b7a5610e1a15ca58e7 Mon Sep 17 00:00:00 2001 From: Herbert Eiselt Date: Mon, 11 Feb 2019 14:54:12 +0100 Subject: Add sdnr wt odlux Add complete sdnr wireless transport app odlux core and apps Change-Id: I5dcbfb8f3b790e3bda7c8df67bd69d81958f65e5 Issue-ID: SDNC-576 Signed-off-by: Herbert Eiselt --- sdnr/wt/odlux/core/README.md | 1 + sdnr/wt/odlux/core/features/pom.xml | 67 ++++++ sdnr/wt/odlux/core/installer/pom.xml | 101 +++++++++ .../src/assembly/assemble_mvnrepo_zip.xml | 49 +++++ sdnr/wt/odlux/core/model/pom.xml | 54 +++++ .../opensymphony/xwork2/util/ClassLoaderUtil.java | 235 +++++++++++++++++++++ .../wt/odlux/model/bundles/ClassLoaderUtilExt.java | 64 ++++++ .../sdnr/wt/odlux/model/bundles/OdluxBundle.java | 184 ++++++++++++++++ .../wt/odlux/model/bundles/OdluxBundleList.java | 20 ++ .../wt/odlux/model/bundles/OdluxBundleLoader.java | 25 +++ .../odlux/model/bundles/OdluxBundleLoaderImpl.java | 62 ++++++ sdnr/wt/odlux/core/pom.xml | 37 ++++ sdnr/wt/odlux/core/provider/pom.xml | 104 +++++++++ .../features/sdnr/wt/odlux/IndexOdluxBundle.java | 132 ++++++++++++ .../ccsdk/features/sdnr/wt/odlux/IndexServlet.java | 40 ++++ .../features/sdnr/wt/odlux/ResFilesServlet.java | 101 +++++++++ .../ccsdk/features/sdnr/wt/odlux/RootServlet.java | 43 ++++ .../resources/OSGI-INF/blueprint/blueprint.xml | 40 ++++ .../provider/src/test/java/LoadResourcesTest.java | 26 +++ .../provider/src/test/resources/log4j.properties | 12 ++ .../provider/src/test/resources/odlux/index.html | 24 +++ 21 files changed, 1421 insertions(+) create mode 100644 sdnr/wt/odlux/core/README.md create mode 100644 sdnr/wt/odlux/core/features/pom.xml create mode 100755 sdnr/wt/odlux/core/installer/pom.xml create mode 100644 sdnr/wt/odlux/core/installer/src/assembly/assemble_mvnrepo_zip.xml create mode 100644 sdnr/wt/odlux/core/model/pom.xml create mode 100644 sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java create mode 100644 sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/ClassLoaderUtilExt.java create mode 100644 sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundle.java create mode 100644 sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleList.java create mode 100644 sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoader.java create mode 100644 sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoaderImpl.java create mode 100644 sdnr/wt/odlux/core/pom.xml create mode 100644 sdnr/wt/odlux/core/provider/pom.xml create mode 100644 sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java create mode 100644 sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexServlet.java create mode 100644 sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java create mode 100644 sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/RootServlet.java create mode 100644 sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml create mode 100644 sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java create mode 100644 sdnr/wt/odlux/core/provider/src/test/resources/log4j.properties create mode 100644 sdnr/wt/odlux/core/provider/src/test/resources/odlux/index.html (limited to 'sdnr/wt/odlux/core') diff --git a/sdnr/wt/odlux/core/README.md b/sdnr/wt/odlux/core/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/sdnr/wt/odlux/core/README.md @@ -0,0 +1 @@ + diff --git a/sdnr/wt/odlux/core/features/pom.xml b/sdnr/wt/odlux/core/features/pom.xml new file mode 100644 index 000000000..66b860292 --- /dev/null +++ b/sdnr/wt/odlux/core/features/pom.xml @@ -0,0 +1,67 @@ + + + + + 4.0.0 + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-feature + 0.4.1-SNAPSHOT + feature + ccsdk-features-sdnr-wt :: ${project.artifactId} :: feature + + + org.onap.ccsdk.parent + single-feature-parent + 1.2.1-SNAPSHOT + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + + + org.opendaylight.mdsal.model + mdsal-model-artifacts + ${odl.mdsal.model.version} + pom + import + + + org.opendaylight.controller + mdsal-artifacts + ${odl.controller.mdsal.version} + pom + import + + + + + + + + ${project.groupId} + sdnr-wt-odlux-core-provider + ${project.version} + + + + diff --git a/sdnr/wt/odlux/core/installer/pom.xml b/sdnr/wt/odlux/core/installer/pom.xml new file mode 100755 index 000000000..94d2e7266 --- /dev/null +++ b/sdnr/wt/odlux/core/installer/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-installer + 0.4.1-SNAPSHOT + pom + ccsdk-features-sdnr-wt :: ${project.artifactId} + + + org.onap.ccsdk.parent + odlparent-lite + 1.2.1-SNAPSHOT + + + + + sdnr-wt-odlux-core + false + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + + org.onap.ccsdk.features.sdnr.wt + ${application.name}-feature + ${project.version} + xml + features + + + * + * + + + + + org.onap.ccsdk.features.sdnr.wt + ${application.name}-provider + ${project.version} + + + + + + + maven-assembly-plugin + + + maven-repo-zip + + single + + package + + true + stage/${application.name}-${project.version} + + src/assembly/assemble_mvnrepo_zip.xml + + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-nested-dependencies + + copy-dependencies + + prepare-package + + true + ${project.build.directory}/assembly/system + false + true + true + true + false + false + + + + + + + + + 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 @@ + + + + + + repo + + zip + + + + false + + + + target/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..c027e5ad8 --- /dev/null +++ b/sdnr/wt/odlux/core/model/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-model + 0.4.1-SNAPSHOT + ccsdk-features-sdnr-wt :: ${project.artifactId} + bundle + + + org.onap.ccsdk.parent + binding-parent + 1.2.1-SNAPSHOT + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + + org.osgi + org.osgi.core + + + org.osgi + org.osgi.compendium + + + org.slf4j + slf4j-api + + + + + + org.apache.felix + maven-bundle-plugin + true + + + * + org.onap.ccsdk.features.sdnr.wt.odlux.*,com.opensymphony.* + + + + + + \ No newline at end of file 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..10705b0ea --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java @@ -0,0 +1,235 @@ +/* + * 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): + * + * + * @param resourceName The name of the resources to load + * @param callingClass The Class object of the calling object + */ + public static Iterator getResources(String resourceName, Class callingClass, boolean aggregate) throws IOException { + + AggregateIterator 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): + *
    + *
  • From Thread.currentThread().getContextClassLoader() + *
  • From ClassLoaderUtil.class.getClassLoader() + *
  • callingClass.getClassLoader() + *
+ * + * @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: + *
    + *
  • From Thread.currentThread().getContextClassLoader() + *
  • Using the basic Class.forName() + *
  • From ClassLoaderUtil.class.getClassLoader() + *
  • From the callingClass.getClassLoader() + *
+ * + * @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 implements Iterator { + + LinkedList> enums = new LinkedList>(); + Enumeration cur = null; + E next = null; + Set loaded = new HashSet(); + + public AggregateIterator addEnumeration(Enumeration e) { + if (e.hasMoreElements()) { + if (cur == null) { + cur = e; + next = e.nextElement(); + loaded.add(next); + } else { + enums.add(e); + } + } + return this; + } + + public boolean hasNext() { + return (next != null); + } + + public E next() { + if (next != null) { + E prev = next; + next = loadNext(); + return prev; + } else { + throw new NoSuchElementException(); + } + } + + private Enumeration 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; + + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } +} \ No newline at end of file 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..08d243666 --- /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,64 @@ +/******************************************************************************* + * ============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 urls = null; + URL url = null; + try { + urls = getResources(resourceName, callingClass, true); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + 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); + url = b.getEntry(resourceName); + } + return url; + } + + public static Iterator 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/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..448169fad --- /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,184 @@ +/******************************************************************************* + * ============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.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +/** + * 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"); + try { + List resources = this.getResourceFiles("/odlux"); + if (resources.size() > 0) { + for (String res : resources) { + LOG.debug("found res " + res); + } + } else { + String res = "/odlux/" + this.getBundleName() + ".js"; + if (this.hasResource(res)) { + LOG.debug("found res " + res); + } else + LOG.warn("no resources found in bundle"); + } + } catch (IOException e) { + LOG.debug("problem searching for resources: " + e.getMessage()); + } + 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; + try { + in = new BufferedReader(new InputStreamReader(url.openStream())); + + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine + LR); + } + in.close(); + } catch (IOException e) { + LOG.warn("could not load resfile " + url.toString() + ": " + e.getMessage()); + return null; + } + + return sb.toString(); + } + + private List getResourceFiles(String path) throws IOException { + List filenames = new ArrayList<>(); + + try { + + InputStream in = getResourceAsStream(path); + if (in != null) { + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + if (br != null) { + String resource; + + while ((resource = br.readLine()) != null) { + filenames.add(resource); + } + } + } + } catch (Exception e) { + LOG.warn("problem loading res " + path); + } + + return filenames; + } + + private InputStream getResourceAsStream(String resource) { + final InputStream in = getContextClassLoader().getResourceAsStream(resource); + + return in == null ? getClass().getResourceAsStream(resource) : in; + } + + private ClassLoader getContextClassLoader() { + return Thread.currentThread().getContextClassLoader(); + } +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleList.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleList.java new file mode 100644 index 000000000..c2a514399 --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleList.java @@ -0,0 +1,20 @@ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +import java.util.ArrayList; +import java.util.List; + +public class OdluxBundleList extends ArrayList{ + + /** + * + */ + private static final long serialVersionUID = 8365348398621906220L; + + public List getNames(){ + final List names=new ArrayList(); + for(OdluxBundle b:this) + names.add(b.getBundleName()); + return names; + } + +} 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..e288ee3ec --- /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,25 @@ +/******************************************************************************* + * ============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); +} diff --git a/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoaderImpl.java b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoaderImpl.java new file mode 100644 index 000000000..5b15be35c --- /dev/null +++ b/sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoaderImpl.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class OdluxBundleLoaderImpl implements OdluxBundleLoader { + + final static Logger LOG = LoggerFactory.getLogger(OdluxBundleLoaderImpl.class); + private static OdluxBundleLoaderImpl mObj; + + public static OdluxBundleLoaderImpl getInstance() { + if (mObj == null) + mObj = new OdluxBundleLoaderImpl(); + return mObj; + } + + private final List bundles; + + public synchronized List getBundles() { + return this.bundles; + } + + public OdluxBundleLoaderImpl() { + this.bundles = Collections.synchronizedList(new ArrayList()); + mObj = this; + } + + @Override + public synchronized void addBundle(OdluxBundle bundle) { + LOG.debug("odlux bundle " + bundle.getBundleName() + " added"); + this.bundles.add(bundle); + + } + + @Override + public synchronized void removeBundle(OdluxBundle bundle) { + this.bundles.remove(bundle); + LOG.debug("odlux bundle " + bundle.getBundleName() + " removed"); + + } + +} diff --git a/sdnr/wt/odlux/core/pom.xml b/sdnr/wt/odlux/core/pom.xml new file mode 100644 index 000000000..71f17f104 --- /dev/null +++ b/sdnr/wt/odlux/core/pom.xml @@ -0,0 +1,37 @@ + + + + + org.onap.ccsdk.parent + odlparent-lite + 1.2.1-SNAPSHOT + + + + + 4.0.0 + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-top + 0.4.1-SNAPSHOT + pom + odlux-core + + + sdnr-wt-odlux-core + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + model + provider + features + installer + + diff --git a/sdnr/wt/odlux/core/provider/pom.xml b/sdnr/wt/odlux/core/provider/pom.xml new file mode 100644 index 000000000..3ba52803e --- /dev/null +++ b/sdnr/wt/odlux/core/provider/pom.xml @@ -0,0 +1,104 @@ + + 4.0.0 + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-provider + 0.4.1-SNAPSHOT + ccsdk-features-sdnr-wt :: ${project.artifactId} + bundle + + + org.onap.ccsdk.parent + binding-parent + 1.2.1-SNAPSHOT + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-odlux-core-model + ${project.version} + + + ${project.groupId} + sdnr-wt-odlux-framework + ${project.version} + + + org.eclipse.jetty + jetty-server + test + + + + org.osgi + org.osgi.core + + + org.osgi + org.osgi.compendium + + + org.slf4j + slf4j-api + + + com.google.guava + guava + + + javax.servlet + javax.servlet-api + + + junit + junit + test + + + org.slf4j + slf4j-simple + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-checkstyle-plugin + + true + + + + org.apache.felix + maven-bundle-plugin + true + + + org.onap.ccsdk.features.sdnr.wt.odlux.*;resolution:=optional,*; + + sdnr-wt-odlux-framework;inline=true + true + ${project.groupId}.* + + + + + + \ No newline at end of file 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..ae0d0496b --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java @@ -0,0 +1,132 @@ +/******************************************************************************* + * ============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.ArrayList; +import java.util.Comparator; +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.OdluxBundleList; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoaderImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexOdluxBundle extends OdluxBundle { + + private static final String LR = "\n"; + private static Logger LOG = LoggerFactory.getLogger(IndexOdluxBundle.class); + 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 this.loadFileContent(url, null); + } + + protected String loadFileContent(URL url, List bundles) { + if (url == null) + return null; + LOG.debug("try to load res " + url.toString()); + StringBuilder sb = new StringBuilder(); + Matcher matcher; + BufferedReader in; + try { + in = new BufferedReader(new InputStreamReader(url.openStream())); + + String inputLine; + if (bundles == null) { + bundles = this.getLoadedBundles(); + } + 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("\",\"", bundles) + + "\"" + inputLine.substring(matcher.end(1)); + } + matcher = patternFunction.matcher(inputLine); + if (matcher.find()) { + inputLine = inputLine.substring(0, matcher.start(1)) + String.join(",", bundles) + + inputLine.substring(matcher.end(1)); + } + matcher = patternFunctionBody.matcher(inputLine); + if (matcher.find()) { + String hlp = ""; + for (String bundle : bundles) { + 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); + } + in.close(); + } catch (IOException e) { + LOG.warn("could not load resfile " + url.toString() + ": " + e.getMessage()); + return null; + } + + return sb.toString(); + } + + private List getLoadedBundles() { + List bundles = OdluxBundleLoaderImpl.getInstance().getBundles(); + List list = new ArrayList(); + bundles.sort(sortorderbundlecomparator); + for (OdluxBundle b : bundles) { + list.add(b.getBundleName()); + } + list.add(this.getBundleName()); + return list; + } + + private final Comparator sortorderbundlecomparator = new Comparator() { + + @Override + public int compare(OdluxBundle arg0, OdluxBundle arg1) { + + int diff = arg0.getIndex() - arg1.getIndex(); + return diff > 0 ? 1 : diff < 0 ? -1 : 0; + } + }; + + public String getResourceFileContent(String fn, List bundleNames) { + return this.loadFileContent(this.getResource(fn),bundleNames); + } + public Comparator getBundleSorter() { + return this.sortorderbundlecomparator; + } +} 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..8b92774f9 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexServlet.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * ============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 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 { + LOG.debug("redirect to odlux/index.html"); + resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); + resp.setHeader("Location", "odlux/index.html"); + } + +} 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..31544c2eb --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * ============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.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +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.IndexOdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleList; +import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoaderImpl; +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(); + OdluxBundleLoaderImpl.getInstance(); + } + + private List getBundleNames(final List bundles) { + final List names = new ArrayList(); + for (OdluxBundle b : bundles) + names.add(b.getBundleName()); + names.add(this.indexBundle.getBundleName()); + return names; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + LOG.debug("get req: " + req.getRequestURI().toString()); + final String fn = req.getRequestURI().toString(); + String fileContent = null; + final List bundles = OdluxBundleLoaderImpl.getInstance().getBundles(); + if (indexBundle.hasResource(fn)) { + bundles.sort(this.indexBundle.getBundleSorter()); + fileContent = indexBundle.getResourceFileContent(fn, this.getBundleNames(bundles)); + } else { + LOG.debug("not found in framework res. try to find in applications"); + synchronized (bundles) { + final Iterator it = bundles.iterator(); + while (it.hasNext()) { + OdluxBundle b = it.next(); + if (b.hasResource(fn)) { + LOG.debug("found res in " + b.getBundleName()); + fileContent = b.getResourceFileContent(fn); + break; + } + } + } + } + if (fileContent != null) { + LOG.debug("found " + fn + " in res. write to output stream"); + resp.setStatus(200); + OutputStream os = resp.getOutputStream(); + os.write(fileContent.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + os.flush(); + } else { + LOG.debug("file " + fn + " not found in res."); + resp.setStatus(404); + + } + } + + public String loadFileContent(String filename) { + return this.indexBundle.getResourceFileContent(filename); + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/RootServlet.java b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/RootServlet.java new file mode 100644 index 000000000..fa49536ca --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/RootServlet.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + ******************************************************************************/ +package org.onap.ccsdk.features.sdnr.wt.odlux; + +import java.io.IOException; +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 RootServlet extends HttpServlet { + + + /** + * + */ + private static final long serialVersionUID = -2622614831559561459L; + private static Logger LOG = LoggerFactory.getLogger(RootServlet.class); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + LOG.debug("redirect to index2.html"); + resp.sendRedirect("index2.html"); + } +} 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..bf726ac93 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java b/sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java new file mode 100644 index 000000000..b8a68f166 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java @@ -0,0 +1,26 @@ +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; + +import com.opensymphony.xwork2.util.ClassLoaderUtil; + +public class LoadResourcesTest { + + @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); + final Matcher matcher = pattern.matcher(indexhtml); + System.out.println(indexhtml); + assertTrue(matcher.find()); + } + +} diff --git a/sdnr/wt/odlux/core/provider/src/test/resources/log4j.properties b/sdnr/wt/odlux/core/provider/src/test/resources/log4j.properties new file mode 100644 index 000000000..142663bd2 --- /dev/null +++ b/sdnr/wt/odlux/core/provider/src/test/resources/log4j.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=INFO, out + +log4j.logger.org.apache.camel.impl.converter=WARN +log4j.logger.org.apache.camel.management=WARN +log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN +log4j.logger.org.springframework=ERROR + +# CONSOLE appender not used by default +log4j.appender.out=org.apache.log4j.ConsoleAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + diff --git a/sdnr/wt/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 @@ + + + + + + + + + O D L UX + + + +
+ + + + + + \ No newline at end of file -- cgit 1.2.3-korg