UX extensions 60/79360/1
authorHerbert Eiselt <herbert.eiselt@highstreet-technologies.com>
Thu, 28 Feb 2019 14:23:42 +0000 (15:23 +0100)
committerHerbert Eiselt <herbert.eiselt@highstreet-technologies.com>
Thu, 28 Feb 2019 14:24:28 +0000 (15:24 +0100)
UX Maintenance client and further changes

Change-Id: I7643661d17db5fc3d3f94b58cb42ed0be558c64f
Issue-ID: SDNC-583
Signed-off-by: Herbert Eiselt <herbert.eiselt@highstreet-technologies.com>
93 files changed:
sdnr/wt/odlux/.gitignore
sdnr/wt/odlux/README.md [new file with mode: 0644]
sdnr/wt/odlux/apps/apiDemo/pom.xml
sdnr/wt/odlux/apps/apiDemo/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/apiDemo/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/app-feature/pom.xml
sdnr/wt/odlux/apps/app-installer/pom.xml
sdnr/wt/odlux/apps/connectApp/pom.xml
sdnr/wt/odlux/apps/connectApp/src/actions/mountedNetworkElementsActions.ts
sdnr/wt/odlux/apps/connectApp/src/actions/requiredNetworkElementsActions.ts
sdnr/wt/odlux/apps/connectApp/src/components/editNetworkElementDialog.tsx
sdnr/wt/odlux/apps/connectApp/src/components/requiredNetworkElements.tsx
sdnr/wt/odlux/apps/connectApp/src/components/unknownNetworkElements.tsx
sdnr/wt/odlux/apps/connectApp/src/handlers/connectAppRootHandler.tsx
sdnr/wt/odlux/apps/connectApp/src/handlers/mountedNetworkElementsHandler.tsx
sdnr/wt/odlux/apps/connectApp/src/index.html
sdnr/wt/odlux/apps/connectApp/src/plugin.tsx
sdnr/wt/odlux/apps/connectApp/src/services/connectService.ts
sdnr/wt/odlux/apps/connectApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/connectApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/demoApp/pom.xml
sdnr/wt/odlux/apps/demoApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/demoApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/faultApp/pom.xml
sdnr/wt/odlux/apps/faultApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/faultApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/helpApp/pom.xml
sdnr/wt/odlux/apps/helpApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/helpApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/inventoryApp/pom.xml
sdnr/wt/odlux/apps/inventoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/inventoryApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/.babelrc [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/package.json [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/pom.xml [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/components/editMaintenenceEntryDialog.tsx [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenenceEntriesHandler.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/index.html [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/models/maintenenceEntryType.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/utils/timeUtils.ts [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src2/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/MyOdluxBundle.java [moved from sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoaderImpl.java with 53% similarity]
sdnr/wt/odlux/apps/maintenanceApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/tsconfig.json [new file with mode: 0644]
sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js [new file with mode: 0644]
sdnr/wt/odlux/apps/mediatorApp/pom.xml
sdnr/wt/odlux/apps/mediatorApp/src/components/editMediatorConfigDialog.tsx
sdnr/wt/odlux/apps/mediatorApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/mediatorApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/apps/minimumApp/.fbExcludeFilterFile [new file with mode: 0644]
sdnr/wt/odlux/apps/minimumApp/pom.xml
sdnr/wt/odlux/apps/minimumApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java [new file with mode: 0644]
sdnr/wt/odlux/apps/minimumApp/src2/test/resources/test.js [new file with mode: 0644]
sdnr/wt/odlux/core/README.md [deleted file]
sdnr/wt/odlux/core/model/pom.xml
sdnr/wt/odlux/core/model/src/main/java/com/opensymphony/xwork2/util/ClassLoaderUtil.java
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/ClassLoaderUtilExt.java
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/IndexOdlBundle.java [new file with mode: 0644]
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundle.java
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleList.java [deleted file]
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleLoader.java
sdnr/wt/odlux/core/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/model/bundles/OdluxBundleResourceAccess.java [new file with mode: 0644]
sdnr/wt/odlux/core/provider/pom.xml
sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/IndexOdluxBundle.java
sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/OdluxBundleLoaderImpl.java [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/ResFilesServlet.java
sdnr/wt/odlux/core/provider/src/main/resources/OSGI-INF/blueprint/blueprint.xml
sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java [deleted file]
sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestBundleLoaderImpl.java [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestLoadResources.java [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestRedirect.java [moved from sdnr/wt/odlux/core/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/odlux/RootServlet.java with 62% similarity]
sdnr/wt/odlux/core/provider/src/test/java/org/onap/ccsdk/features/sdnr/odlux/test/TestResFileServlet.java [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/test/resources/index.html [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/test/resources/index2.html [new file with mode: 0644]
sdnr/wt/odlux/core/provider/src/test/resources/odlux/index2.html [new file with mode: 0644]
sdnr/wt/odlux/framework/README.md [deleted file]
sdnr/wt/odlux/framework/package.json
sdnr/wt/odlux/framework/pom.xml
sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts
sdnr/wt/odlux/framework/src/components/material-table/index.tsx
sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx
sdnr/wt/odlux/framework/src/components/titleBar.tsx
sdnr/wt/odlux/framework/src/index.html
sdnr/wt/odlux/framework/src/models/elasticSearch.ts
sdnr/wt/odlux/package.json
sdnr/wt/odlux/pom.xml
sdnr/wt/odlux/yarn.lock

index e3918fa..1577b0b 100644 (file)
@@ -1,5 +1,7 @@
 package-lock.json
 npm
+yarn-error.log
 node/
 node_modules/
 dist/
+.vscode/
diff --git a/sdnr/wt/odlux/README.md b/sdnr/wt/odlux/README.md
new file mode 100644 (file)
index 0000000..a0b23fe
--- /dev/null
@@ -0,0 +1,259 @@
+# Developing a ODLUX application
+
+## Prerequisites
+
+* Node: 8.10 or higher
+* Yarn: 1.12.3 or higher
+* Lerna: 3.10.7 or higher
+
+You can install these globally or let it be installed by maven due "mvn clean install"
+
+* Maven: 3 or higher
+* Java: 8 or higher
+
+## Dev-Environment Installation
+
+ * install NodeJS LTS https://nodejs.org/en/ or via packetmanager
+ * sudo npm install -g yarn
+ * sudo yarn global add lerna
+ * get framework from repository: git clone https://gerrit.onap.org/r/ccsdk/features
+ * in features/sdnr/wt/odlux you find a structure like this:
+ ```
+  odlux
+  |-apps
+  |-core
+  |-framework
+
+ ```
+ * go to features/sdnr/wt/odlux/apps and create your app: 
+ ```
+ mvn archetype:generate -DarchetypeGroupId=org.onap.ccsdk.features.sdnr.wt \
+  -DarchetypeArtifactId=odlux-app-archetype \
+  -DgroupId=<groupId> \
+  -DartifactId=<artifactId> \
+  -Dversion=<version> \
+  -DappName=<applicationName>
+ ```
+
+ * your start folder for your web application is src/
+ * in src2/main/java are located the Java files and in src2/main/resources/ is the blueprint located
+ * with ```yarn start``` you can run your application due runtime in your application folder
+ * by default this will run on http://localhost:3100/index.html
+ * if you have added new dependencies you have to run ```lerna bootstrap``` in odlux/
+ * build your app for development version you can use ```yarn run build``` or ```yarn run build:dev``` 
+ * build for karaf with ```mvn clean install```
+
+
+## Including app into karaf environment
+
+ * copy maven repository files to karaf repository e.g.: ```cp ~/.m2/repository/path/of/groupId/artifactId $KARAF_HOME/system/path/of/groupId/```
+ * check if odlux-core is started in karaf console: ```feature:list | grep odlux```
+ * if not install: ```sdnr-wt-odlux-core-feature```
+ * start your app in karaf console: ```bundle:install -s mvn:<groupId>/<artifactId>/<version>```
+
+## Including into ONAP sdnc docker container
+
+ * add maven module to odlux/pom.xml
+ * add dependency to odlux/apps/app-feature/pom.xml and odlux/apps/app-installer/pom.xml
+ * build odlux/pom.xml
+ * this will automatically package your app into the packaged zip file of the installer
+
+## Details
+
+### Default menu positions
+
+ * from 0 for top to 999 for bottom.
+```
+0      Connect
+10     Fault
+20     Maintenance
+30     Configuration
+40     Protection
+50     Performance
+60     Security
+70     Inventory
+80     Topology
+90     Mediator
+100    Help
+```
+
+### blueprint.xml
+
+```
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+    <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/>
+    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
+        <property name="loader" ref="loadersvc"/>
+        <property name="bundleName" value="demoApp"/>
+        <property name="index" value="999"/>
+    </bean>
+</blueprint>
+```
+ * bundleName defines the applicationName => default javascript file: <applicationName>.js
+ * index defines the menu position.
+
+### MyOdluxBundle.java
+
+ * is just for getting access to the resources of its bundle (implemented because of OSGi access restrictions)
+
+### pom.xml
+
+```
+<?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</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-demoApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-demoApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
+your
+```
+
+* a modified frontend-maven-plugin installs node, yarn and (optionally lerna) to compile the typescript sources to javascript. These will be build into the dist folder.
+
index 797c316..8e7559e 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-apiDemo</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-apiDemo</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-apiDemo</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-apiDemo</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</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>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/apiDemo/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/apiDemo/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..e2ffb59
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
+import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
+import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoader loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles() == 1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles() == 0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/apiDemo/src2/test/resources/test.js b/sdnr/wt/odlux/apps/apiDemo/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
index aadee55..6c4e138 100644 (file)
                        <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId>
                        <version>${project.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
        </dependencies>
 </project>
index 999082f..a91cc35 100755 (executable)
                        <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId>
                        <version>${project.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>${project.groupId}</groupId>
+                       <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
        </dependencies>
 
        <build>
index d5216ca..858b32a 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-connectApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-connectApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-connectApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-connectApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
index e342f63..1cf528a 100644 (file)
@@ -21,7 +21,7 @@ export class AllMountedNetworkElementsLoadedAction extends BaseAction {
 }
 
 /** Represents an action causing the store to update all mounted network elements. */
-export class AddMountedNetworkElement extends BaseAction {
+export class AddOrUpdateMountedNetworkElement extends BaseAction {
   constructor(public mountedNetworkElement: MountedNetworkElementType | null, public error?: string) {
     super();
   }
@@ -47,43 +47,58 @@ export class UpdateRequiredMountedNetworkElement extends BaseAction {
 }
 
 /**
- *  An actioncrator for a async thunk action to add an allready mounted element to the state of this app. 
- *  Note: Use this action to add created object notified by the websocket. 
+ *  Represents an action crator for a async thunk action to add an allready mounted element to the state of this app.
+ *  Note: Use this action to add created object notified by the websocket.
 */
 export const addMountedNetworkElementAsyncActionCreator = (mountId: string) => async (dispatch: Dispatch) => {
-  connectService.getMountedNetworkElementByMountId(mountId).then(mountedNetworkElement => {
-    mountedNetworkElement && dispatch(new AddMountedNetworkElement(mountedNetworkElement));
+  return connectService.getMountedNetworkElementByMountId(mountId).then(mountedNetworkElement => {
+    mountedNetworkElement && dispatch(new AddOrUpdateMountedNetworkElement(mountedNetworkElement));
   }).catch(error => {
-    dispatch(new AddMountedNetworkElement(null, error));
+    dispatch(new AddOrUpdateMountedNetworkElement(null, error));
+  });
+};
+
+export const updateMountedNetworkElementAsyncActionCreator = (mountId: string) => async (dispatch: Dispatch) => {
+  return connectService.getMountedNetworkElementByMountId(mountId).then(mountedNetworkElement => {
+    if (mountedNetworkElement) {
+      dispatch(new AddOrUpdateMountedNetworkElement(mountedNetworkElement));
+    } else {
+      dispatch(new RemoveMountedNetworkElement(mountId));
+    }
+  }).catch(error => {
+    dispatch(new AddOrUpdateMountedNetworkElement(null, error));
   });
 };
 
 /** Represents an async thunk action to load all mounted network elements. */
 export const loadAllMountedNetworkElementsAsync = (dispatch: Dispatch) => {
   dispatch(new LoadAllMountedNetworkElementsAction());
-    connectService.getMountedNetworkElementsList().then(mountedNetworkElements => { 
+  return connectService.getMountedNetworkElementsList().then(mountedNetworkElements => {
       mountedNetworkElements && dispatch(new AllMountedNetworkElementsLoadedAction(mountedNetworkElements));
   }).catch(error => {
     dispatch(new AllMountedNetworkElementsLoadedAction(null, error));
   });
 };
 
-/** Represents an async thunk action to load all mounted network elements. */
-export const mountNetworkElementActionCreatorAsync = (networkElement: RequiredNetworkElementType) => (dispatch: Dispatch) => {
-  connectService.mountNetworkElement(networkElement).then((success) => {
-    success && dispatch(new AddSnackbarNotification({ message: `Requesting mount [${ networkElement.mountId }]`, options: { variant: 'info' } }))
-      || dispatch(new AddSnackbarNotification({ message: `Failed to mount [${ networkElement.mountId }]`, options: { variant: 'warning' } }));
+/** Represents an action crator for a async thunk action to mount a network element. */
+export const mountNetworkElementAsyncActionCreator = (networkElement: RequiredNetworkElementType) => (dispatch: Dispatch) => {
+  return connectService.mountNetworkElement(networkElement).then((success) => {
+    success && (
+      dispatch(addMountedNetworkElementAsyncActionCreator(networkElement.mountId)) &&
+      dispatch(new AddSnackbarNotification({ message: `Requesting mount [${networkElement.mountId}]`, options: { variant: 'info' } }))
+     ) || dispatch(new AddSnackbarNotification({ message: `Failed to mount [${ networkElement.mountId }]`, options: { variant: 'warning' } }));
   }).catch(error => {
-    dispatch(new AddMountedNetworkElement(null, error));
+    dispatch(new AddOrUpdateMountedNetworkElement(null, error));
   });
 };
 
-export const unmountNetworkElementActionCreatorAsync = (mountId: string) => (dispatch: Dispatch) => {
-  connectService.unmountNetworkElement(mountId).then((success) => {
+/** Represents an action crator for a async thunk action to unmount a network element. */
+export const unmountNetworkElementAsyncActionCreator = (mountId: string) => (dispatch: Dispatch) => {
+  return connectService.unmountNetworkElement(mountId).then((success) => {
     success && dispatch(new AddSnackbarNotification({ message: `Requesting unmount [${ mountId }]`, options: { variant: 'info' } }))
       || dispatch(new AddSnackbarNotification({ message: `Failed to unmount [${ mountId }]`, options: { variant: 'warning' } }));
   }).catch(error => {
-    dispatch(new AddMountedNetworkElement(null, error));
+    dispatch(new AddOrUpdateMountedNetworkElement(null, error));
   });
 };
 
index 9793219..387ab8f 100644 (file)
@@ -12,7 +12,7 @@ import { connectService } from '../services/connectService';
 export class BaseAction extends Action { }
 
 
-/** Represents an async thunk action that will add an element to the required network elements. */
+/** Represents an async thunk action creator to add an element to the required network elements. */
 export const addToRequiredNetworkElementsAsyncActionCreator = (element: RequiredNetworkElementType) => (dispatch: Dispatch) => {
   connectService.insertRequiredNetworkElement(element).then(_ => {
     window.setTimeout(() => {
@@ -23,7 +23,7 @@ export const addToRequiredNetworkElementsAsyncActionCreator = (element: Required
   });
 };
 
-/** Represents an async thunk action that will delete an element from the required network elements. */
+/** Represents an async thunk action creator to delete an element from the required network elements. */
 export const removeFromRequiredNetworkElementsAsyncActionCreator = (element: RequiredNetworkElementType) => (dispatch: Dispatch) => {
   connectService.deleteRequiredNetworkElement(element).then(_ => {
     window.setTimeout(() => {
index ee876e8..c2db266 100644 (file)
@@ -15,8 +15,9 @@ import {
   removeFromRequiredNetworkElementsAsyncActionCreator
 } from '../actions/requiredNetworkElementsActions';
 
+import { unmountNetworkElementAsyncActionCreator, mountNetworkElementAsyncActionCreator } from '../actions/mountedNetworkElementsActions';
 import { RequiredNetworkElementType } from '../models/requiredNetworkElements';
-import { unmountNetworkElementActionCreatorAsync, mountNetworkElementActionCreatorAsync } from '../actions/mountedNetworkElementsActions';
+
 export enum EditNetworkElementDialogMode {
   None = "none",
   UnknownNetworkElementToRequiredNetworkElements = "unknownNetworkElementToRequiredNetworkElements",
@@ -35,14 +36,14 @@ const mapDispatch = (dispatcher: IDispatcher) => ({
     dispatcher.dispatch(removeFromRequiredNetworkElementsAsyncActionCreator(element));
   },
   mountNetworkElement: (element: RequiredNetworkElementType) => {
-    dispatcher.dispatch(mountNetworkElementActionCreatorAsync(element));
+    dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element));
   },
   mountAndRquireNetworkElement: (element: RequiredNetworkElementType) => {
     dispatcher.dispatch(addToRequiredNetworkElementsAsyncActionCreator(element));
-    dispatcher.dispatch(mountNetworkElementActionCreatorAsync(element));
+    dispatcher.dispatch(mountNetworkElementAsyncActionCreator(element));
   },
   unmountNetworkElement: (element: RequiredNetworkElementType) => {
-    dispatcher.dispatch(unmountNetworkElementActionCreatorAsync(element && element.mountId));
+    dispatcher.dispatch(unmountNetworkElementAsyncActionCreator(element && element.mountId));
   }
 }
 );
@@ -70,7 +71,7 @@ const settings: { [key: string]: DialogSettings } = {
   [EditNetworkElementDialogMode.UnknownNetworkElementToRequiredNetworkElements] : {
     dialogTitle: "Add to required network elements" ,
     dialogDescription: "Create a new NetworkElement in planning database as clone of existing real NetworkElement." ,
-    applyButtonText: "Add to required network elements" , 
+    applyButtonText: "Add to required network elements" ,
     cancelButtonText: "Cancel",
     enableMountIdEditor: false,
     enableUsernameEditor: true,
@@ -136,7 +137,7 @@ type EditNetworkElementDialogComponentState = RequiredNetworkElementType & {
 class EditNetworkElementDialogComponent extends React.Component<EditNetworkElementDialogComponentProps, EditNetworkElementDialogComponentState> {
   constructor(props: EditNetworkElementDialogComponentProps) {
     super(props);
-    
+
     this.state = {
       mountId: this.props.initialNetworkElement.mountId,
       host: this.props.initialNetworkElement.host,
index 13f5fec..9cbc368 100644 (file)
@@ -14,7 +14,6 @@ import { IApplicationStoreState } from '../../../../framework/src/store/applicat
 import { connect, Connect, IDispatcher } from '../../../../framework/src/flux/connect';
 import { NavigateToApplication } from '../../../../framework/src/actions/navigationActions';
 
-
 import { RequiredNetworkElementType } from '../models/requiredNetworkElements';
 import { createRequiredNetworkElementsActions, createRequiredNetworkElementsProperties } from '../handlers/requiredNetworkElementsHandler';
 
@@ -27,7 +26,7 @@ const styles = (theme: Theme) => createStyles({
     color: 'darkgreen',
   },
   connectionStatusConnecting: {
-    color: theme.palette.primary.main,
+    color: 'blue',
   },
   connectionStatusDisconnected: {
     color: 'red',
index 4321031..fe2c58c 100644 (file)
@@ -48,7 +48,7 @@ type UnknownNetworkElementDisplayType = NetworkElementBaseType & {
 type UnknownNetworkElementsListProps = WithStyles<typeof styles> & Connect<typeof mapProps, typeof mapDispatch> & {}
 
 type UnknownNetworkElementsListState = {
-  
+
   unknownNetworkElements: UnknownNetworkElementDisplayType[];
 
   networkElementToEdit: RequiredNetworkElementType;
@@ -73,7 +73,7 @@ export class UnknownNetworkElementsListComponent extends React.Component<Unknown
   static getDerivedStateFromProps(props: UnknownNetworkElementsListProps, state: UnknownNetworkElementsListState & { _mountedNetworkElements: IMountedNetworkElementsState }) {
     if (props.mountedNetworkElements != state._mountedNetworkElements) {
       state.unknownNetworkElements = props.mountedNetworkElements.elements.filter(element => !element.required).map(element => {
-        
+
         // handle onfCoreModelRevision
         const onfCoreModelRevision = element.capabilities.find((cap) => {
           return cap.module === 'core-model' || cap.module === 'CoreModel-CoreNetworkModule-ObjectClasses' ;
@@ -94,7 +94,7 @@ export class UnknownNetworkElementsListComponent extends React.Component<Unknown
     }
     return state;
   }
-  
+
   render(): JSX.Element {
     const { classes } = this.props;
     const { networkElementToEdit, networkElementEditorMode, unknownNetworkElements } = this.state;
@@ -125,7 +125,6 @@ export class UnknownNetworkElementsListComponent extends React.Component<Unknown
                 <div className={ classes.spacer }>
                   <Tooltip title={ "Info" } ><Button className={ classes.button } >I</Button></Tooltip>
                 </div>
-                <div className={ classes.spacer }>
                   <div className={ classes.spacer }>
                     <Tooltip title={ "Fault" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("faultApp", rowData) } >F</Button></Tooltip>
                     <Tooltip title={ "Configure" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("configureApp", rowData) } >C</Button></Tooltip>
@@ -133,14 +132,13 @@ export class UnknownNetworkElementsListComponent extends React.Component<Unknown
                     <Tooltip title={ "Performance" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("performanceApp", rowData) }>P</Button></Tooltip>
                     <Tooltip title={ "Security" } ><Button className={ classes.button } onClick={ this.navigateToApplicationHandlerCreator("securityApp", rowData) }>S</Button></Tooltip>
                   </div>
-                </div>                
               </>
             )
           },
         ] } idProperty="mountId" >
         </UnknownNetworkElementTable>
-        
-        <EditNetworkElementDialog 
+
+        <EditNetworkElementDialog
           mode={ networkElementEditorMode }
           initialNetworkElement={ networkElementToEdit }
           onClose={ this.onCloseEditNetworkElementDialog }
index 26d02c4..dd9e3e1 100644 (file)
@@ -4,7 +4,6 @@ import { IMountedNetworkElementsState, mountedNetworkElementsActionHandler } fro
 import { IConnectionStatusLogState, connectionStatusLogActionHandler } from './connectionStatusLogHandler';
 
 export interface IConnectAppStoreState {
-
   requiredNetworkElements: IRequiredNetworkElementsState;
   mountedNetworkElements: IMountedNetworkElementsState;
   connectionStatusLog: IConnectionStatusLogState;
index 70b4d8f..db86b99 100644 (file)
@@ -1,7 +1,7 @@
 import { IActionHandler } from '../../../../framework/src/flux/action';
 
 import {
-  AddMountedNetworkElement,
+  AddOrUpdateMountedNetworkElement,
   AllMountedNetworkElementsLoadedAction,
   LoadAllMountedNetworkElementsAction,
   RemoveMountedNetworkElement,
@@ -28,7 +28,7 @@ export const mountedNetworkElementsActionHandler: IActionHandler<IMountedNetwork
       ...state,
       busy: true
     };
-  
+
   } else if (action instanceof AllMountedNetworkElementsLoadedAction) {
     if (!action.error && action.mountedNetworkElements) {
       state = {
@@ -42,11 +42,24 @@ export const mountedNetworkElementsActionHandler: IActionHandler<IMountedNetwork
         busy: false
       };
     }
-  } else if (action instanceof AddMountedNetworkElement) {
-    action.mountedNetworkElement && (state = {
-      ...state,
-      elements: [...state.elements, action.mountedNetworkElement],
-    });
+  } else if (action instanceof AddOrUpdateMountedNetworkElement) {
+    if (!action.mountedNetworkElement) return state; // should handle error here
+    const index = state.elements.findIndex(el => el.mountId === (action.mountedNetworkElement && action.mountedNetworkElement.mountId));
+    if (index > -1) {
+      state = {
+        ...state,
+        elements: [
+          ...state.elements.slice(0, index),
+          action.mountedNetworkElement,
+          ...state.elements.slice(index + 1)
+        ]
+      }
+    } else {
+      state = {
+        ...state,
+        elements: [...state.elements, action.mountedNetworkElement],
+      }
+    };
   } else if (action instanceof RemoveMountedNetworkElement) {
     state = {
       ...state,
index c28708a..0f95005 100644 (file)
@@ -6,7 +6,7 @@
   <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>Document</title>
+  <title>connectApp</title>
 </head>
 
 <body>
@@ -18,7 +18,7 @@
     require(["app","connectApp", "faultApp"], function (app, connectApp, faultApp) {
       connectApp.register();
       faultApp.register();
-      app("./app.tsx")
+      app("./app.tsx").runApplication();
     });
   </script>
 </body>
index 4e61c32..4a02b9f 100644 (file)
@@ -6,7 +6,12 @@ import { subscribe, IFormatedMessage } from '../../../framework/src/services/not
 
 import connectAppRootHandler from './handlers/connectAppRootHandler';
 import ConnectApplication  from './views/connectView';
-import { RemoveMountedNetworkElement, addMountedNetworkElementAsyncActionCreator } from './actions/mountedNetworkElementsActions' ;
+
+import {
+  addMountedNetworkElementAsyncActionCreator,
+  updateMountedNetworkElementAsyncActionCreator
+} from './actions/mountedNetworkElementsActions';
+
 import { AddSnackbarNotification } from '../../../framework/src/actions/snackbarActions';
 
 type ObjectNotification = {
@@ -32,8 +37,8 @@ export function register() {
       store.dispatch(addMountedNetworkElementAsyncActionCreator(msg.objectId));
       store.dispatch(new AddSnackbarNotification({ message: `Adding network element [${ msg.objectId }]`, options: { variant: 'info' } }));
     } else if (msg && msg.notifType === "ObjectDeletionNotification" && store) {
-      store.dispatch(new AddSnackbarNotification({ message: `Removing network element [${ msg.objectId }]`, options: { variant: 'info' } }));
-      store.dispatch(new RemoveMountedNetworkElement(msg.objectId));
+      store.dispatch(new AddSnackbarNotification({ message: `Updating network element [${ msg.objectId }]`, options: { variant: 'info' } }));
+      store.dispatch(updateMountedNetworkElementAsyncActionCreator(msg.objectId));
     }
   }));
-}                                     
\ No newline at end of file
+}
\ No newline at end of file
index 0adcd49..91891de 100644 (file)
@@ -1,6 +1,6 @@
 import { RequiredNetworkElementType } from '../models/requiredNetworkElements';
-import { MountedNetworkElementType } from 'models/mountedNetworkElements';
-import { Topology, TopologyNode } from 'models/topologyNetconf';
+import { MountedNetworkElementType } from '../models/mountedNetworkElements';
+import { Topology, TopologyNode } from '../models/topologyNetconf';
 
 import { requestRest } from '../../../../framework/src/services/restService';
 import { Result, HitEntry } from '../../../../framework/src/models/elasticSearch';
@@ -40,7 +40,6 @@ class ConnectService {
       username: result._source.username,
       password: result._source.password,
     } || null;
-
   }
 
   /**
@@ -61,13 +60,9 @@ class ConnectService {
     return result || null;
   }
 
-  
-
   private static mapTopologyNode = (mountPoint: TopologyNode, required: boolean ) => {
     // handle onfCapabilities
     let onfCapabilities: { module: string, revision: string }[] | undefined = undefined;
-    let onfCoreModelRevision: string[] | undefined = undefined;
-    let onfAirInterfaceRevision: string[] | undefined = undefined;
 
     const capId = 'netconf-node-topology:available-capabilities';
     if (mountPoint[capId] && mountPoint[capId]['available-capability']) {
@@ -161,17 +156,16 @@ class ConnectService {
       '</node>'].join('');
     
     try {
-      const result = await requestRest<{}>(path, {
+      const result = await requestRest<string>(path, {
         method: 'PUT',
         headers: {
           'Content-Type': 'application/xml',
-          'Accept': 'application/xml',
-          'Authorization': 'Basic YWRtaW46YWRtaW4='
+          'Accept': 'application/xml'
         },
         body: mountXml
       }, true);
       // expect an empty answer
-      return result === null; 
+      return result !== null; 
     } catch {
       return false;
     }
@@ -182,16 +176,15 @@ class ConnectService {
     const path = 'restconf/config/network-topology:network-topology/topology/topology-netconf/node/' + mountId;
   
     try {
-      const result = await requestRest<{}>(path, {
+      const result = await requestRest<string>(path, {
         method: 'DELETE',
         headers: {
           'Content-Type': 'application/xml',
-          'Accept': 'application/xml',
-          'Authorization': 'Basic YWRtaW46YWRtaW4='
+          'Accept': 'application/xml'
         },
       }, true);
       // expect an empty answer
-      return result === null; 
+      return result !== null; 
       
     } catch {
       return false;
diff --git a/sdnr/wt/odlux/apps/connectApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/connectApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..edf68e0
--- /dev/null
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * ============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.bundles.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
+import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/connectApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/connectApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
index 1c7a121..be518d5 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-demoApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-demoApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-demoApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-demoApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/demoApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/demoApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..edf68e0
--- /dev/null
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * ============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.bundles.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
+import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/demoApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/demoApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
index dc5485a..b81e3b9 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
 
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-faultApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-faultApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-faultApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-faultApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/faultApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/faultApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..edf68e0
--- /dev/null
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * ============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.bundles.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.odlux.OdluxBundleLoaderImpl;
+import org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/faultApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/faultApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
index 1c1b99c..5fd94f5 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-helpApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-helpApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-helpApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-helpApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/helpApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/helpApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..d0fbe63
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.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.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/helpApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/helpApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
index cbc2f63..6ff0958 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-inventoryApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-inventoryApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-inventoryApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/inventoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/inventoryApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..d0fbe63
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.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.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/inventoryApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/inventoryApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/.babelrc b/sdnr/wt/odlux/apps/maintenanceApp/.babelrc
new file mode 100644 (file)
index 0000000..3d8cd12
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "presets": [
+    ["@babel/preset-react"],
+    ["@babel/preset-env", {
+      "targets": {
+        "chrome": "66"
+      },
+      "spec": true,
+      "loose": false,
+      "modules": false,
+      "debug": false,
+      "useBuiltIns": "usage",
+      "forceAllTransforms": true
+    }]
+  ],
+  "plugins": []
+}
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/package.json b/sdnr/wt/odlux/apps/maintenanceApp/package.json
new file mode 100644 (file)
index 0000000..617dde2
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "name": "@odlux/maintenance-app",
+  "version": "0.1.0",
+  "description": "A react based modular UI for the maintenance app.",
+  "main": "index.js",
+  "scripts": {
+    "start": "webpack-dev-server --env debug",
+    "build": "webpack --env release --config webpack.config.js",
+    "build:dev": "webpack --env debug --config webpack.config.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://git.mfico.de/highstreet-technologies/odlux.git"
+  },
+  "keywords": [
+    "reactjs",
+    "redux",
+    "ui",
+    "framework"
+  ],
+  "author": "Matthias Fischer",
+  "license": "MIT",
+   "dependencies": {
+     "@odlux/framework": "*",
+     "@odlux/connect-app": "*"
+   },
+  "peerDependencies": {
+    "@types/react": "16.4.14",
+    "@types/react-dom": "16.0.8",
+    "@types/react-router-dom": "4.3.1",
+    "@material-ui/core": "3.8.3",
+    "@material-ui/icons": "3.0.2",
+    "@types/classnames": "2.2.6",
+    "@types/flux": "3.1.8",
+    "@types/jquery": "3.3.10",
+    "jquery": "3.3.1",
+    "react": "16.5.2",
+    "react-dom": "16.5.2",
+    "react-router-dom": "4.3.1"
+  }
+}
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/pom.xml b/sdnr/wt/odlux/apps/maintenanceApp/pom.xml
new file mode 100644 (file)
index 0000000..18db101
--- /dev/null
@@ -0,0 +1,158 @@
+<?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</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-maintenanceApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-maintenanceApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
+                                               <fileset>
+                                                       <directory>bin</directory>
+                                                       <followSymlinks>false</followSymlinks>
+                                               </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/actions/maintenenceActions.ts
new file mode 100644 (file)
index 0000000..753c118
--- /dev/null
@@ -0,0 +1,95 @@
+import { Action } from '../../../../framework/src/flux/action';
+import { Dispatch } from '../../../../framework/src/flux/store';
+import { MaintenenceEntry, spoofSymbol } from '../models/maintenenceEntryType';
+
+import { AddSnackbarNotification } from '../../../../framework/src/actions/snackbarActions';
+import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
+
+import { maintenenceService } from '../services/maintenenceService';
+
+export class BaseAction extends Action { }
+
+export class LoadAllMainteneceEntriesAction extends BaseAction { }
+
+export class AllMainteneceEntriesLoadedAction extends BaseAction {
+
+  constructor (public maintenenceEntries: MaintenenceEntry[] | null, error?:string) {
+    super();
+
+  }
+}
+
+
+export const loadAllMainteneceEntriesAsyncAction = (dispatch: Dispatch , getState: () => IApplicationStoreState) => {
+  dispatch(new LoadAllMainteneceEntriesAction());
+  // frist get all entries from the maintenance index
+  maintenenceService.getAllMaintenenceEntries().then(entries => {
+    if (!entries) {
+      dispatch(new AddSnackbarNotification({ message: `Error reading maintenece sessings.`, options: { variant: 'error' } }));
+      return;
+    }
+
+    // combine ell entries from the maintenance index with all networkelements
+    const networkElements = getState().connectApp.mountedNetworkElements;
+    const maintenenceEntries = networkElements.elements.reduce((acc, cur) => {
+      const entry = entries.find(e => e.mountId === cur.mountId);
+      acc.push(entry || {
+        [spoofSymbol]: true,
+        _id: cur.mountId,
+        mountId: cur.mountId,
+        description : "",
+        start: "",
+        end: "",
+        active: false
+      });
+      return acc;
+    }, [] as MaintenenceEntry[]);
+
+    // all all entries from the maintenance index which are not in all networkelements
+    entries.forEach(entry => {
+      if (maintenenceEntries.findIndex(e => e.mountId === entry.mountId) < 0) {
+        maintenenceEntries.push(entry);
+      };
+    });
+
+    dispatch(new AllMainteneceEntriesLoadedAction(maintenenceEntries));
+  }).catch(error => dispatch(new AllMainteneceEntriesLoadedAction(null, error)));
+}
+
+export class UpdateMaintenanceEntry extends BaseAction {
+  constructor(public maintenenceEntry: MaintenenceEntry) {
+    super();
+  }
+}
+
+/** Represents an async thunk action creator to add an element to the maintenence entries. */
+export const addOrUpdateMaintenenceEntryAsyncActionCreator = (entry: MaintenenceEntry) => (dispatch: Dispatch) => {
+  maintenenceService.writeMaintenenceEntry(entry).then(result => {
+    result && window.setTimeout(() => {
+      // dispatch(loadAllMountedNetworkElementsAsync);
+      dispatch(new UpdateMaintenanceEntry(entry));
+      dispatch(new AddSnackbarNotification({ message: `Successfully ${result && result.created ? "created" : "updated"} maintenece sessings for [${entry.mountId}]`, options: { variant: 'success' } }));
+    }, 900);
+  });
+};
+
+/** Represents an async thunk action creator to delete an element from the maintenence entries. */
+export const removeFromMaintenenceEntrysAsyncActionCreator = (entry: MaintenenceEntry) => (dispatch: Dispatch) => {
+  maintenenceService.deleteMaintenenceEntry(entry).then(result => {
+    result && window.setTimeout(() => {
+      //dispatch(loadAllMountedNetworkElementsAsync);
+      dispatch(new UpdateMaintenanceEntry({
+        [spoofSymbol]: true,
+        _id: entry._id,
+        mountId: entry.mountId,
+        description : "",
+        start: "",
+        end: "",
+        active: false
+      }));
+      dispatch(new AddSnackbarNotification({ message: `Successfully removed [${entry.mountId}]`, options: { variant: 'success' } }));
+    }, 900);
+  });
+};
+
+// Hint: since there is no notification of changed required network elements, this code is not aware of changes caused outiside of this browser.
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/components/editMaintenenceEntryDialog.tsx b/sdnr/wt/odlux/apps/maintenanceApp/src/components/editMaintenenceEntryDialog.tsx
new file mode 100644 (file)
index 0000000..04f6d2d
--- /dev/null
@@ -0,0 +1,177 @@
+import * as React from 'react';
+
+import Button from '@material-ui/core/Button';
+import TextField from '@material-ui/core/TextField';
+import Dialog from '@material-ui/core/Dialog';
+import DialogActions from '@material-ui/core/DialogActions';
+import DialogContent from '@material-ui/core/DialogContent';
+import DialogContentText from '@material-ui/core/DialogContentText';
+import DialogTitle from '@material-ui/core/DialogTitle';
+
+import { IDispatcher, connect, Connect } from '../../../../framework/src/flux/connect';
+
+import {
+  addOrUpdateMaintenenceEntryAsyncActionCreator,
+  removeFromMaintenenceEntrysAsyncActionCreator
+} from '../actions/maintenenceActions';
+
+import { MaintenenceEntry } from '../models/maintenenceEntryType';
+import { FormControl, InputLabel, Select, MenuItem } from '@material-ui/core';
+
+export enum EditMaintenenceEntryDialogMode {
+  None = "none",
+  AddMaintenenceEntry = "addMaintenenceEntry",
+  EditMaintenenceEntry = "editMaintenenceEntry",
+  RemoveMaintenenceEntry = "removeMaintenenceEntry"
+}
+
+const mapDispatch = (dispatcher: IDispatcher) => ({
+  addOrUpdateMaintenenceEntry: (entry: MaintenenceEntry) => {
+    dispatcher.dispatch(addOrUpdateMaintenenceEntryAsyncActionCreator(entry));
+  },
+  removeMaintenenceEntry: (entry: MaintenenceEntry) => {
+    dispatcher.dispatch(removeFromMaintenenceEntrysAsyncActionCreator(entry));
+  },
+});
+
+type DialogSettings = {
+  dialogTitle: string,
+  dialogDescription: string,
+  applyButtonText: string,
+  cancelButtonText: string,
+  enableMountIdEditor: boolean,
+  enableTimeEditor: boolean,
+}
+
+const settings: { [key: string]: DialogSettings } = {
+  [EditMaintenenceEntryDialogMode.None]: {
+    dialogTitle: "",
+    dialogDescription: "",
+    applyButtonText: "",
+    cancelButtonText: "",
+    enableMountIdEditor: false,
+    enableTimeEditor: false,
+  },
+  [EditMaintenenceEntryDialogMode.AddMaintenenceEntry]: {
+    dialogTitle: "Add new maintenence entry",
+    dialogDescription: "",
+    applyButtonText: "Add",
+    cancelButtonText: "Cancel",
+    enableMountIdEditor: true,
+    enableTimeEditor: true,
+  },
+  [EditMaintenenceEntryDialogMode.EditMaintenenceEntry]: {
+    dialogTitle: "Edit maintenence entry",
+    dialogDescription: "",
+    applyButtonText: "Save",
+    cancelButtonText: "Cancel",
+    enableMountIdEditor: false,
+    enableTimeEditor: true,
+  },
+  [EditMaintenenceEntryDialogMode.RemoveMaintenenceEntry]: {
+    dialogTitle: "Remove maintenence entry",
+    dialogDescription: "",
+    applyButtonText: "Remove",
+    cancelButtonText: "Cancel",
+    enableMountIdEditor: false,
+    enableTimeEditor: false,
+  },
+}
+
+type EditMaintenenceEntryDIalogComponentProps = Connect<undefined, typeof mapDispatch> & {
+  mode: EditMaintenenceEntryDialogMode;
+  initialMaintenenceEntry: MaintenenceEntry;
+  onClose: () => void;
+};
+
+type EditMaintenenceEntryDIalogComponentState = MaintenenceEntry;
+
+class EditMaintenenceEntryDIalogComponent extends React.Component<EditMaintenenceEntryDIalogComponentProps, EditMaintenenceEntryDIalogComponentState> {
+  constructor (props: EditMaintenenceEntryDIalogComponentProps) {
+    super(props);
+
+    this.state = {
+      ...this.props.initialMaintenenceEntry
+    };
+  }
+
+  render(): JSX.Element {
+    const setting = settings[this.props.mode];
+    return (
+      <Dialog open={this.props.mode !== EditMaintenenceEntryDialogMode.None}>
+        <DialogTitle id="form-dialog-title">{setting.dialogTitle}</DialogTitle>
+        <DialogContent>
+          <DialogContentText>
+            {setting.dialogDescription}
+          </DialogContentText>
+          <TextField disabled={!setting.enableMountIdEditor} spellCheck={false} autoFocus margin="dense" id="name" label="Name" type="text" fullWidth value={this.state.mountId} onChange={(event) => { this.setState({ mountId: event.target.value }); }} />
+          <TextField disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="start" label="Start" type="datetime-local" fullWidth value={this.state.start} onChange={(event) => { this.setState({ start: event.target.value }); }} />
+          <TextField disabled={!setting.enableTimeEditor} spellCheck={false} autoFocus margin="dense" id="end" label="End" type="datetime-local" fullWidth value={this.state.end} onChange={(event) => { this.setState({ end: event.target.value }); }} />
+          <FormControl fullWidth disabled={!setting.enableTimeEditor}>
+            <InputLabel htmlFor="active">Active</InputLabel>
+            <Select value={ this.state.active || false } onChange={(event) => {
+              this.setState({ active: event.target.value as any as boolean });
+            }} inputProps={{ name: 'active', id: 'active' }} fullWidth >
+              <MenuItem value={true as any as string}>active</MenuItem>
+              <MenuItem value={false as any as string}>not active</MenuItem>
+            </Select>
+          </FormControl>
+        </DialogContent>
+        <DialogActions>
+          <Button onClick={(event) => {
+            this.onApply({
+              _id: this.state._id || this.state.mountId,
+              mountId: this.state.mountId,
+              description: this.state.description,
+              start: this.state.start,
+              end: this.state.end,
+              active: this.state.active
+            });
+            event.preventDefault();
+            event.stopPropagation();
+          }} > {setting.applyButtonText} </Button>
+          <Button onClick={(event) => {
+            this.onCancel();
+            event.preventDefault();
+            event.stopPropagation();
+          }} color="secondary"> {setting.cancelButtonText} </Button>
+        </DialogActions>
+      </Dialog>
+    )
+  }
+
+  private onApply = (entry: MaintenenceEntry) => {
+    this.props.onClose && this.props.onClose();
+    switch (this.props.mode) {
+      case EditMaintenenceEntryDialogMode.AddMaintenenceEntry:
+        entry && this.props.addOrUpdateMaintenenceEntry(entry);
+        break;
+      case EditMaintenenceEntryDialogMode.EditMaintenenceEntry:
+        entry && this.props.addOrUpdateMaintenenceEntry(entry);
+        break;
+      case EditMaintenenceEntryDialogMode.RemoveMaintenenceEntry:
+        entry && this.props.removeMaintenenceEntry(entry);
+        break;
+    }
+  };
+
+
+  private onCancel = () => {
+    this.props.onClose && this.props.onClose();
+  }
+
+  static getDerivedStateFromProps(props: EditMaintenenceEntryDIalogComponentProps, state: EditMaintenenceEntryDIalogComponentState & { _initialMaintenenceEntry: MaintenenceEntry }): EditMaintenenceEntryDIalogComponentState & { _initialMaintenenceEntry: MaintenenceEntry } {
+    if (props.initialMaintenenceEntry !== state._initialMaintenenceEntry) {
+      state = {
+        ...state,
+        ...props.initialMaintenenceEntry,
+        _initialMaintenenceEntry: props.initialMaintenenceEntry,
+      };
+    }
+    return state;
+  }
+
+}
+
+export const EditMaintenenceEntryDIalog = connect(undefined, mapDispatch)(EditMaintenenceEntryDIalogComponent);
+export default EditMaintenenceEntryDIalog;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenanceAppRootHandler.ts
new file mode 100644 (file)
index 0000000..956d058
--- /dev/null
@@ -0,0 +1,27 @@
+// main state handler
+
+import { combineActionHandler } from '../../../../framework/src/flux/middleware';
+
+import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
+
+import { IConnectAppStoreState } from '../../../connectApp/src/handlers/connectAppRootHandler';
+
+import { IMaintenenceEntriesState, maintenenceEntriesActionHandler } from './maintenenceEntriesHandler';
+
+export interface IMaintenanceAppStoreState {
+  maintenenceEntries : IMaintenenceEntriesState
+}
+
+declare module '../../../../framework/src/store/applicationStore' {
+  interface IApplicationStoreState {
+    maintenanceApp: IMaintenanceAppStoreState,
+    connectApp: IConnectAppStoreState
+  }
+}
+
+const actionHandlers = {
+  maintenenceEntries: maintenenceEntriesActionHandler
+};
+
+export const maintenanceAppRootHandler = combineActionHandler<IMaintenanceAppStoreState>(actionHandlers);
+export default maintenanceAppRootHandler;
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenenceEntriesHandler.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/handlers/maintenenceEntriesHandler.ts
new file mode 100644 (file)
index 0000000..13f4a3b
--- /dev/null
@@ -0,0 +1,40 @@
+import { IActionHandler } from '../../../../framework/src/flux/action';
+
+import { MaintenenceEntry } from '../models/maintenenceEntryType';
+import { LoadAllMainteneceEntriesAction, AllMainteneceEntriesLoadedAction, UpdateMaintenanceEntry } from '../actions/maintenenceActions';
+
+export interface IMaintenenceEntriesState {
+  entries: MaintenenceEntry[];
+  busy: boolean;
+}
+
+const maintenanceEntriesStateInit: IMaintenenceEntriesState = {
+  entries: [],
+  busy: false
+};
+
+export const maintenenceEntriesActionHandler: IActionHandler<IMaintenenceEntriesState> = (state = maintenanceEntriesStateInit, action) => {
+  if (action instanceof LoadAllMainteneceEntriesAction){
+    state = {
+      ...state,
+      busy: true,
+    }
+  } else if (action instanceof AllMainteneceEntriesLoadedAction){
+    state = {
+      ...state,
+      entries: action.maintenenceEntries || [],
+      busy: false,
+    }
+  } else if (action instanceof UpdateMaintenanceEntry) {
+    const index = state.entries.findIndex(e => action.maintenenceEntry.mountId === e.mountId);
+    state = {
+      ...state,
+      entries: index > -1 ? [
+        ...state.entries.slice(0, index),
+        action.maintenenceEntry,
+        ...state.entries.slice(index+1),
+      ] : [...state.entries, action.maintenenceEntry]
+    }
+  }
+  return state;
+}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/index.html b/sdnr/wt/odlux/apps/maintenanceApp/src/index.html
new file mode 100644 (file)
index 0000000..c84aece
--- /dev/null
@@ -0,0 +1,26 @@
+<!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>Minimal App</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(["app","connectApp", "maintenanceApp"], function (app, connectApp, maintenanceApp) {
+      connectApp.register();
+      maintenanceApp.register();
+      app("./app.tsx").runApplication();
+    });
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/models/maintenenceEntryType.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/models/maintenenceEntryType.ts
new file mode 100644 (file)
index 0000000..fca70f2
--- /dev/null
@@ -0,0 +1,28 @@
+/** Represents the elestic search db type for maintenence enrties */
+export type MaintenenceEntryType = {
+    node: string;
+    // According to the arrangement from 2019.02.15 there will be currently only one element in the filters array.
+    filter: [{
+      definition: { "object-id-ref": string ,problem: string},
+      description: string,
+      /** The end date for the maintenence mode formated as ISO date string in UTC.  */
+      end: string,
+      /** The start date for the maintenence mode formated as ISO date string in UTC.  */
+      start: string
+    }],
+    /** Determines if the filter set is activated or not. */
+    active: boolean;
+}
+
+export const spoofSymbol = Symbol("Spoof");
+
+/** Represents the type for an maintenence entry. */
+export type MaintenenceEntry = {
+  [spoofSymbol]?: boolean;
+  _id: string;
+  mountId: string;
+  description: string;
+  start: string;
+  end: string;
+  active: boolean;
+}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx b/sdnr/wt/odlux/apps/maintenanceApp/src/plugin.tsx
new file mode 100644 (file)
index 0000000..19e188e
--- /dev/null
@@ -0,0 +1,27 @@
+// app configuration and main entry point for the app
+
+import * as React from "react";
+
+import { faLock } from '@fortawesome/free-solid-svg-icons';  // select app icon
+
+import applicationManager from '../../../framework/src/services/applicationManager';
+
+import { maintenanceAppRootHandler } from './handlers/maintenanceAppRootHandler';
+
+import MaintenenceView from "./views/maintenenceView";
+
+const App : React.SFC = (props) => {
+  return <MaintenenceView />
+};
+
+export function register() {
+  applicationManager.registerApplication({
+    name: "maintenanceApp",
+    icon: faLock,
+    rootComponent: App,
+    rootActionHandler: maintenanceAppRootHandler,
+    menuEntry: "Maintenance App"
+  });
+}
+
+
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts
new file mode 100644 (file)
index 0000000..5e15a4c
--- /dev/null
@@ -0,0 +1,82 @@
+import { requestRest } from '../../../../framework/src/services/restService';
+import { Result, HitEntry, PostResponse, DeleteResponse } from '../../../../framework/src/models/elasticSearch';
+
+import { MaintenenceEntryType, MaintenenceEntry } from '../models/maintenenceEntryType';
+import { convertToLocaleString, convertToGMTString } from '../utils/timeUtils';
+
+export const maintenenceEntryDatabasePath = "mwtn/maintenancemode";
+
+/**
+ * Represents a web api accessor service for all maintenence entries related actions.
+ */
+class MaintenenceService {
+  /**
+    * Gets all maintenence entries from the backend.
+    */
+  public async getAllMaintenenceEntries(): Promise<(MaintenenceEntry[]) | null> {
+    const path = `database/${maintenenceEntryDatabasePath}/_search`;
+    const query = { "query": { "match_all": {} } };
+
+    const result = await requestRest<Result<MaintenenceEntryType>>(path, { method: "POST", body: JSON.stringify(query) });
+    return result && result.hits && result.hits.hits && result.hits.hits.map(me => me._source && me._source.filter[0] && ({
+      _id: me._id,
+      mountId: me._source.node,
+      description: me._source.filter[0].description,
+      start: me._source.filter[0].start && convertToLocaleString(me._source.filter[0].start),
+      end: me._source.filter[0].end && convertToLocaleString(me._source.filter[0].end),
+      active: me._source.active
+    })) || null;
+  }
+
+  /**
+    * Gets one maintenence entry by its mountId from the backend.
+    */
+  public async getMaintenenceEntryByMountId(mountId: string): Promise<(MaintenenceEntry) | null> {
+    const path = `database/${maintenenceEntryDatabasePath}/${mountId}`;
+
+    const result = await requestRest<HitEntry<MaintenenceEntryType> & { found: boolean }>(path, { method: "GET" });
+    return result && result.found && result._source && result._source.filter[0] && {
+      _id: result._id,
+      mountId: result._source.node,
+      description: result._source.filter[0].description,
+      start: result._source.filter[0].start && convertToLocaleString(result._source.filter[0].start),
+      end: result._source.filter[0].end && convertToLocaleString(result._source.filter[0].end),
+      active: result._source.active
+    } || null;
+  }
+
+  /**
+  * Adds or updates one maintenence entry to the backend.
+  */
+  public async writeMaintenenceEntry(maintenenceEntry: MaintenenceEntry): Promise<PostResponse | null> {
+    const path = `database/${maintenenceEntryDatabasePath}/${maintenenceEntry._id}`;
+    const data: MaintenenceEntryType = {
+      node: maintenenceEntry.mountId,
+      filter: [
+        {
+          definition: { "object-id-ref": "", problem: "" },
+          description: "",
+          start: convertToGMTString(maintenenceEntry.start),
+          end: convertToGMTString(maintenenceEntry.end)
+        }
+      ],
+      active: maintenenceEntry.active
+    };
+
+    const result = await requestRest<PostResponse>(path, { method: "POST", body: JSON.stringify(data) });
+    return result || null;
+  }
+
+  /**
+  * Deletes one maintenence entry by its mountId from the backend.
+  */
+  public async deleteMaintenenceEntry(maintenenceEntry: MaintenenceEntry): Promise<(DeleteResponse) | null> {
+    const path = `database/${maintenenceEntryDatabasePath}/${maintenenceEntry._id}`;
+
+    const result = await requestRest<DeleteResponse>(path, { method: "DELETE" });
+    return result || null;
+  }
+}
+
+export const maintenenceService = new MaintenenceService();
+export default maintenenceService;
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/utils/timeUtils.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/utils/timeUtils.ts
new file mode 100644 (file)
index 0000000..92bc2ba
--- /dev/null
@@ -0,0 +1,22 @@
+export function convertToGMTString(dateString: string): string {
+  const date = new Date(dateString);
+  const pad = (n: number) => (n < 10) ? '0' + n : n;
+
+  return date.getUTCFullYear() +
+    '-' + pad(date.getUTCMonth() + 1) +
+    '-' + pad(date.getUTCDate()) +
+    'T' + pad(date.getUTCHours()) +
+    ':' + pad(date.getUTCMinutes()) +
+    '+00:00';
+}
+
+export function convertToLocaleString(rawDate: string| number): string {
+  const date = new Date(rawDate);
+  const pad = (n: number) => (n < 10) ? '0' + n : n;
+
+  return date.getFullYear() +
+    '-' + pad(date.getMonth() + 1) +
+    '-' + pad(date.getDate()) +
+    'T' + pad(date.getHours()) +
+    ':' + pad(date.getMinutes());
+}
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx b/sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx
new file mode 100644 (file)
index 0000000..f048d6c
--- /dev/null
@@ -0,0 +1,200 @@
+import * as React from 'react';
+
+import { Theme, createStyles, WithStyles, withStyles, Tooltip } from '@material-ui/core';
+
+import AddIcon from '@material-ui/icons/Add';
+import EditIcon from '@material-ui/icons/Edit';
+import RemoveIcon from '@material-ui/icons/RemoveCircleOutline';
+
+import Button from '@material-ui/core/Button';
+import IconButton from '@material-ui/core/IconButton';
+
+import connect, { IDispatcher, Connect } from '../../../../framework/src/flux/connect';
+import MaterialTable, { MaterialTableCtorType, ColumnType } from '../../../../framework/src/components/material-table';
+import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
+
+import { loadAllMountedNetworkElementsAsync } from '../../../connectApp/src/actions/mountedNetworkElementsActions';
+
+import { loadAllMainteneceEntriesAsyncAction } from '../actions/maintenenceActions';
+import { MaintenenceEntry, spoofSymbol } from '../models/maintenenceEntryType';
+
+import EditMaintenenceEntryDialog, { EditMaintenenceEntryDialogMode } from '../components/editMaintenenceEntryDialog';
+import { convertToLocaleString } from '../utils/timeUtils';
+
+const styles = (theme: Theme) => createStyles({
+  button: {
+    margin: 0,
+    padding: "6px 6px",
+    minWidth: 'unset'
+  },
+  spacer: {
+    marginLeft: theme.spacing.unit,
+    marginRight: theme.spacing.unit,
+    display: "inline"
+  }
+});
+
+const MaintenenceEntriesTable = MaterialTable as MaterialTableCtorType<MaintenenceEntry>;
+
+const mapProps = (state: IApplicationStoreState) => ({
+   maintenenceEntries: state.maintenanceApp.maintenenceEntries.entries,
+   busy: state.maintenanceApp.maintenenceEntries.busy
+});
+
+const mapDispatcher = (dispatcher: IDispatcher) => ({
+  onLoadMenteneceEntries: async () => {
+    await dispatcher.dispatch(loadAllMountedNetworkElementsAsync)
+    dispatcher.dispatch(loadAllMainteneceEntriesAsyncAction);
+  }
+});
+
+const emptyMaintenenceEntry: MaintenenceEntry = {
+  _id: '',
+  mountId: '',
+  description: '',
+  start: convertToLocaleString(new Date().valueOf()),
+  end: convertToLocaleString(new Date().valueOf()),
+  active: false,
+};
+
+type MaintenenceViewComponentProps = Connect<typeof mapProps, typeof mapDispatcher> & WithStyles<typeof styles> & {
+
+}
+
+type MaintenenceViewComponentState = {
+  maintenenceEntryToEdit: MaintenenceEntry;
+  maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode;
+}
+
+class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentProps, MaintenenceViewComponentState> {
+
+  constructor (props: MaintenenceViewComponentProps) {
+    super(props);
+
+    this.state = {
+      maintenenceEntryToEdit: emptyMaintenenceEntry,
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.None,
+    };
+
+  }
+
+  render() {
+    const { classes } = this.props;
+    const addMaintenenceEntryAction = {
+      icon: AddIcon, tooltip: 'Add', onClick: () => {
+        const startTime = (new Date().valueOf());
+        const endTime = startTime;
+        this.setState({
+          maintenenceEntryToEdit: {
+            ...emptyMaintenenceEntry,
+            start: convertToLocaleString(startTime),
+            end: convertToLocaleString(endTime),
+          },
+          maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.AddMaintenenceEntry
+        });
+      }
+    };
+    return (
+      <>
+        <MaintenenceEntriesTable asynchronus rows={this.props.maintenenceEntries} customActionButtons={[ addMaintenenceEntryAction ]} columns={
+        [
+          { property: "mountId", title: "Mount Id", type: ColumnType.text },
+          { property: "active", title: "Active", type: ColumnType.boolean, labels: { "true": "active", "false": "not active" }, },
+          { property: "start", title: "Start Date", type: ColumnType.text },
+          { property: "end", title: "End Date", type: ColumnType.text },
+          { property: "actions", title: "Actions", type: ColumnType.custom, customControl : ({ rowData })=>(
+            <>
+              <div className={classes.spacer}>
+                <Tooltip title={"1h from now"} ><Button className={classes.button} onClick={ (event) => this.onOpenPlus1hEditMaintenenceEntryDialog(event, rowData)} >+1h</Button></Tooltip>
+                <Tooltip title={"8h from now"} ><Button className={classes.button} onClick={(event) => this.onOpenPlus8hEditMaintenenceEntryDialog(event, rowData)} >+8h</Button></Tooltip>
+              </div>
+              <div className={classes.spacer}>
+                <Tooltip title={"Edit"} ><IconButton className={classes.button} onClick={(event) => this.onOpenEditMaintenenceEntryDialog(event, rowData)} ><EditIcon /></IconButton></Tooltip>
+                <Tooltip title={"Remove"} ><IconButton disabled={ !!rowData[spoofSymbol] } className={classes.button} onClick={(event) => this.onOpenRemoveMaintenenceEntryDialog(event, rowData)} ><RemoveIcon /></IconButton></Tooltip>
+              </div>
+            </>
+          ) },
+        ]
+        } idProperty={'_id'}> </MaintenenceEntriesTable>
+        <EditMaintenenceEntryDialog initialMaintenenceEntry={this.state.maintenenceEntryToEdit} mode={this.state.maintenenceEntryEditorMode}
+          onClose={ this.onCloseEditMaintenenceEntryDialog } />
+       </>
+    );
+  }
+
+  componentDidMount(){
+    this.props.onLoadMenteneceEntries();
+  }
+
+  private onOpenPlus1hEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
+    event.preventDefault();
+    event.stopPropagation();
+    const startTime = (new Date().valueOf());
+    const endTime = startTime + (1 * 60 * 60 * 1000);
+    this.setState({
+      maintenenceEntryToEdit: {
+        ...entry,
+        start: convertToLocaleString(startTime),
+        end: convertToLocaleString(endTime),
+      },
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
+    });
+  }
+
+  private onOpenPlus8hEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
+    event.preventDefault();
+    event.stopPropagation();
+    const startTime = (new Date().valueOf());
+    const endTime = startTime + (8 * 60 * 60 * 1000);
+    this.setState({
+      maintenenceEntryToEdit: {
+        ...entry,
+        start: convertToLocaleString(startTime),
+        end: convertToLocaleString(endTime),
+      },
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
+    });
+  }
+
+  private onOpenEditMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
+    event.preventDefault();
+    event.stopPropagation();
+    const startTime = (new Date().valueOf());
+    const endTime = startTime ;
+    this.setState({
+      maintenenceEntryToEdit: {
+        ...entry,
+        ...(entry.start && endTime)
+          ? { start: entry.start, end: entry.end }
+          : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime)}
+      },
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.EditMaintenenceEntry
+    });
+  }
+
+  private onOpenRemoveMaintenenceEntryDialog = (event: React.MouseEvent<HTMLElement>, entry: MaintenenceEntry) => {
+    event.preventDefault();
+    event.stopPropagation();
+    const startTime = (new Date().valueOf());
+    const endTime = startTime;
+    this.setState({
+      maintenenceEntryToEdit: {
+        ...entry,
+        ...(entry.start && endTime)
+          ? { start: entry.start, end: entry.end }
+          : { start: convertToLocaleString(startTime), end: convertToLocaleString(endTime) }
+      },
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.RemoveMaintenenceEntry
+    });
+  }
+
+  private onCloseEditMaintenenceEntryDialog = () => {
+    this.setState({
+      maintenenceEntryToEdit: emptyMaintenenceEntry,
+      maintenenceEntryEditorMode: EditMaintenenceEntryDialogMode.None,
+    });
+  }
+}
+
+export const MaintenenceView = withStyles(styles)(connect(mapProps, mapDispatcher)(MaintenenceViewComponent));
+export default MaintenenceView;
\ No newline at end of file
  * the License.
  * ============LICENSE_END==========================================================================
  ******************************************************************************/
-package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles;
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundle;
+import org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader;
 
-public class OdluxBundleLoaderImpl implements OdluxBundleLoader {
+public class MyOdluxBundle extends OdluxBundle {
 
-    final static Logger LOG = LoggerFactory.getLogger(OdluxBundleLoaderImpl.class);
-    private static OdluxBundleLoaderImpl mObj;
-
-    public static OdluxBundleLoaderImpl getInstance() {
-        if (mObj == null)
-            mObj = new OdluxBundleLoaderImpl();
-        return mObj;
+    @Override
+    public void initialize() {
+        super.initialize();
     }
 
-    private final List<OdluxBundle> bundles;
+    @Override
+    public void clean() {
+        super.clean();
+    }
 
-    public synchronized List<OdluxBundle> getBundles() {
-        return this.bundles;
+    @Override
+    public String getResourceFileContent(String filename) {
+        return super.getResourceFileContent(filename);
     }
 
-    public OdluxBundleLoaderImpl() {
-        this.bundles = Collections.synchronizedList(new ArrayList<OdluxBundle>());
-        mObj = this;
+    @Override
+    public boolean hasResource(String filename) {
+        return super.hasResource(filename);
     }
 
     @Override
-    public synchronized void addBundle(OdluxBundle bundle) {
-        LOG.debug("odlux bundle " + bundle.getBundleName() + " added");
-        this.bundles.add(bundle);
+    public void setBundleName(String bundleName) {
+        super.setBundleName(bundleName);
+    }
 
+    @Override
+    public void setLoader(OdluxBundleLoader loader) {
+        super.setLoader(loader);
     }
 
     @Override
-    public synchronized void removeBundle(OdluxBundle bundle) {
-        this.bundles.remove(bundle);
-        LOG.debug("odlux bundle " + bundle.getBundleName() + " removed");
+    public String getBundleName() {
+        return super.getBundleName();
+    }
 
+    @Override
+    public OdluxBundleLoader getLoader() {
+        return super.getLoader();
     }
 
+    public MyOdluxBundle() {
+        super();
+    }
 }
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wt/odlux/apps/maintenanceApp/src2/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644 (file)
index 0000000..2dd79d7
--- /dev/null
@@ -0,0 +1,9 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+    <reference id="loadersvc" availability="mandatory" activation="eager" interface="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoader"/>
+
+    <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.onap.ccsdk.features.sdnr.wt.odlux.bundles.MyOdluxBundle">
+        <property name="loader" ref="loadersvc"/>
+        <property name="bundleName" value="maintenanceApp"/>
+               <property name="index" value="20" />
+    </bean>
+</blueprint>
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/maintenanceApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..d0fbe63
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.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.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/maintenanceApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/tsconfig.json b/sdnr/wt/odlux/apps/maintenanceApp/tsconfig.json
new file mode 100644 (file)
index 0000000..a66b5d8
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "compilerOptions": {
+    "baseUrl": "./src",
+    "outDir": "./dist",
+    "sourceMap": true,
+    "forceConsistentCasingInFileNames": true,
+    "allowSyntheticDefaultImports": false,
+    "allowUnreachableCode": false,
+    "allowUnusedLabels": false,
+    "noFallthroughCasesInSwitch": true,
+    "noImplicitAny": true,
+    "noImplicitReturns": true,
+    "noImplicitThis": true,
+    "strictNullChecks": true,
+    "pretty": true,
+    "newLine": "LF",
+    "module": "es2015",
+    "target": "es2016",
+    "moduleResolution": "node",
+    "experimentalDecorators": true,
+    "jsx": "preserve",
+    "lib": [
+      "dom",
+      "es2015",
+      "es2016"
+    ],
+    "types": [
+      "prop-types",
+      "react",
+      "react-dom"
+    ]
+  },
+  "exclude": [
+    "dist",
+    "node_modules"
+  ]
+}
diff --git a/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js b/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js
new file mode 100644 (file)
index 0000000..0a2f5ab
--- /dev/null
@@ -0,0 +1,140 @@
+/**
+ * Webpack 4 configuration file
+ * see https://webpack.js.org/configuration/
+ * see https://webpack.js.org/configuration/dev-server/
+ */
+
+"use strict";
+
+const path = require("path");
+const webpack = require("webpack");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const TerserPlugin = require('terser-webpack-plugin');
+
+// const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname());
+
+module.exports = (env) => {
+  const distPath = path.resolve(__dirname, env === "release" ? "." : "../..", "dist");
+  const frameworkPath = path.resolve(__dirname, env === "release" ? "../../framework" : "../..", "dist");
+  return [{
+    name: "App",
+
+    mode: "none", //disable default behavior
+
+    target: "web",
+
+    context: path.resolve(__dirname, "src"),
+
+    entry: {
+      maintenanceApp: ["./plugin.tsx"]
+    },
+
+    devtool: env === "release" ? false : "source-map",
+
+    resolve: {
+      extensions: [".ts", ".tsx", ".js", ".jsx"]
+    },
+
+    output: {
+      path: distPath,
+      filename: "[name].js",
+      library: "[name]",
+      libraryTarget: "umd2",
+      chunkFilename: "[name].js"
+    },
+    module: {
+      rules: [{
+        test: /\.tsx?$/,
+        exclude: /node_modules/,
+        use: [{
+          loader: "babel-loader"
+        }, {
+          loader: "ts-loader"
+        }]
+      }, {
+        test: /\.jsx?$/,
+        exclude: /node_modules/,
+        use: [{
+          loader: "babel-loader"
+        }]
+      }]
+    },
+
+    optimization: {
+      noEmitOnErrors: true,
+      namedModules: env !== "release",
+      minimize: env === "release",
+      minimizer: env !== "release" ? [] : [new TerserPlugin({
+        terserOptions: {
+          warnings: false, // false, true, "verbose"
+          compress: {
+            drop_console: true,
+            drop_debugger: true,
+          }
+        }
+      })],
+    },
+
+    plugins: [
+      new webpack.DllReferencePlugin({
+        context: path.resolve(__dirname, "../../framework/src"),
+        manifest: require(path.resolve(frameworkPath, "vendor-manifest.json")),
+        sourceType: "umd2"
+      }),
+      new webpack.DllReferencePlugin({
+        context: path.resolve(__dirname, "../../framework/src"),
+        manifest: require(path.resolve(frameworkPath, "app-manifest.json")),
+        sourceType: "umd2"
+      }),
+      ...(env === "release") ? [
+        new webpack.DefinePlugin({
+          "process.env": {
+            NODE_ENV: "'production'",
+            VERSION: JSON.stringify(require("./package.json").version)
+          }
+        }),
+      ] : [
+          new webpack.DefinePlugin({
+            "process.env": {
+              NODE_ENV: "'development'",
+              VERSION: JSON.stringify(require("./package.json").version)
+            }
+          }),
+          new CopyWebpackPlugin([{
+            from: 'index.html',
+            to: distPath
+          }]),
+        ]
+    ],
+
+    devServer: {
+      public: "http://localhost:3100",
+      contentBase: frameworkPath,
+
+      compress: true,
+      headers: {
+        "Access-Control-Allow-Origin": "*"
+      },
+      host: "0.0.0.0",
+      port: 3100,
+      disableHostCheck: true,
+      historyApiFallback: true,
+      inline: true,
+      hot: false,
+      quiet: false,
+      stats: {
+        colors: true
+      },
+      proxy: {
+        "/restconf": {
+          target: "http://localhost:8181",
+          secure: false
+        },
+        "/database": {
+          target: "http://localhost:8181",
+          secure: false
+        }
+      }
+    }
+  }];
+}
index 8bec6d5..8bdf42a 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.1.2</version>
-               <relativePath />
-       </parent>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.1.2</version>
+        <relativePath />
+    </parent>
 
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-mediatorApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-mediatorApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-mediatorApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
index 889b05e..c1167c4 100644 (file)
@@ -112,7 +112,7 @@ const settings: { [key: string]: DialogSettings } = {
     readonlyName: true,
   },
   [EditMediatorConfigDialogMode.AddMediatorConfig]: {
-    dialogTitle: "Add Medator Configuration",
+    dialogTitle: "Add Mediator Configuration",
     dialogDescription: "",
     applyButtonText: "Add",
     cancelButtonText: "Cancel",
@@ -120,7 +120,7 @@ const settings: { [key: string]: DialogSettings } = {
     readonlyName: false,
   },
   [EditMediatorConfigDialogMode.EditMediatorConfig]: {
-    dialogTitle: "Edit Medator Configuration",
+    dialogTitle: "Edit Mediator Configuration",
     dialogDescription: "",
     applyButtonText: "Update",
     cancelButtonText: "Cancel",
diff --git a/sdnr/wt/odlux/apps/mediatorApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/mediatorApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..d0fbe63
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.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.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/mediatorApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/mediatorApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/apps/minimumApp/.fbExcludeFilterFile b/sdnr/wt/odlux/apps/minimumApp/.fbExcludeFilterFile
new file mode 100644 (file)
index 0000000..3cd2303
--- /dev/null
@@ -0,0 +1,25 @@
+<FindBugsFilter>
+  <Match>
+    <Or>
+      <Package name="~.*protobuff\.messages.*" />
+      <Package name="~org\.opendaylight\.yang\.gen\..*" />
+      <Package name="~org\.opendaylight\.controller\.config\.yang\.config\..*" />
+    </Or>
+  </Match>
+
+  <Match>
+    <Or>
+      <!-- Anonymous inner classes are very common in ODL. -->
+      <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
+
+      <!-- We use static slf4j Logger (this rule is from KengoTODA/findbugs-slf4j jp.skypencil.findbugs.slf4:bug-pattern) -->
+      <Bug pattern="SLF4J_LOGGER_SHOULD_BE_NON_STATIC" />
+
+      <!-- Guava 23.6+ uses @NullableDecl which FindBugs doesn't know about; fixed in SpotBugs 3.1.2+ -->
+      <Bug pattern="NP_NONNULL_PARAM_VIOLATION" />
+      <Bug pattern="NP_NULL_PARAM_DEREF" />
+      <Bug pattern="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" />
+      <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" />
+    </Or>
+  </Match>
+</FindBugsFilter>
index f5ceb9d..cdc354f 100644 (file)
 <?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">
+    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</artifactId>
-               <version>1.2.1-SNAPSHOT</version>
-               <relativePath />
-       </parent>
-       <modelVersion>4.0.0</modelVersion>
-       <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-       <artifactId>sdnr-wt-odlux-app-minimumApp</artifactId>
-       <version>0.4.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-       <name>sdnr-wt-odlux-app-minimumApp</name>
-       <licenses>
-               <license>
-                       <name>Apache License, Version 2.0</name>
-                       <url>http://www.apache.org/licenses/LICENSE-2.0</url>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>${project.groupId}</groupId>
-                       <artifactId>sdnr-wt-odlux-core-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-       </dependencies>
-       <build>
-               <sourceDirectory>src2/main/java</sourceDirectory>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <version>2.5</version>
-                               <configuration>
-                                       <filesets>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>odlparent</artifactId>
+        <version>1.2.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-app-minimumApp</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>sdnr-wt-odlux-app-minimumApp</name>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+        </license>
+    </licenses>
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sdnr-wt-odlux-core-provider</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src2/main/java</sourceDirectory>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>dist</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>../node_modules</directory>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <!-- eclipse bug build bin folder in basedir -->
                                                <fileset>
-                                                       <directory>dist</directory>
+                                                       <directory>bin</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.8.1-SNAPSHOT</version>
-                               <executions>
-                                       <execution>
-                                               <id>install node and yarn</id>
-                                               <goals>
-                                                       <goal>install-node-and-yarn</goal>
-                                               </goals>
-                                               <!-- optional: default phase is "generate-resources" -->
-                                               <phase>initialize</phase>
-                                               <configuration>
-                                                       <nodeVersion>v8.10.0</nodeVersion>
-                                                       <yarnVersion>v1.12.3</yarnVersion>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>yarn build</id>
-                                               <goals>
-                                                       <goal>yarn</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-jar-plugin</artifactId>
-                       </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.model.*,com.opensymphony.*</Import-Package>
-                                               <Private-Package></Private-Package>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-               </plugins>
-               <resources>
-                       <resource>
-                               <directory>dist</directory>
-                               <targetPath>odlux</targetPath>
-                       </resource>
-                       <resource>
-                               <directory>src2/main/resources</directory>
-                       </resource>
-               </resources>
-       </build>
-       <pluginRepositories>
-               <pluginRepository>
-                       <id>highstreet repo</id>
-                       <url>https://cloud-highstreet-technologies.com/mvn/</url>
-                       <snapshots>
-                               <enabled>true</enabled>
-                               <updatePolicy>always</updatePolicy>
-                       </snapshots>
-               </pluginRepository>
-       </pluginRepositories>
-</project>
\ No newline at end of file
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-test-source</id>
+                        <phase>generate-test-sources</phase>
+                        <goals>
+                            <goal>add-test-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src2/test/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.8.1-SNAPSHOT</version>
+                <executions>
+                    <execution>
+                        <id>install node and yarn</id>
+                        <goals>
+                            <goal>install-node-and-yarn</goal>
+                        </goals>
+                        <!-- optional: default phase is "generate-resources" -->
+                        <phase>initialize</phase>
+                        <configuration>
+                            <nodeVersion>v8.10.0</nodeVersion>
+                            <yarnVersion>v1.12.3</yarnVersion>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>yarn build</id>
+                        <goals>
+                            <goal>yarn</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+            </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.model.*,com.opensymphony.*</Import-Package>
+                        <Private-Package></Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>dist</directory>
+                <targetPath>odlux</targetPath>
+            </resource>
+            <resource>
+                <directory>src2/main/resources</directory>
+            </resource>
+            <resource>
+                <directory>src2/test/resources</directory>
+            </resource>
+        </resources>
+    </build>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>highstreet repo</id>
+            <url>https://cloud-highstreet-technologies.com/mvn/</url>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>
diff --git a/sdnr/wt/odlux/apps/minimumApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java b/sdnr/wt/odlux/apps/minimumApp/src2/test/java/org/onap/ccsdk/features/sdnr/wt/odlux/bundles/test/TestBundleRes.java
new file mode 100644 (file)
index 0000000..d0fbe63
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.odlux.bundles.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.bundles.MyOdluxBundle;
+
+public class TestBundleRes {
+
+    @Test
+    public void test() {
+        OdluxBundleLoaderImpl loader = OdluxBundleLoaderImpl.getInstance();
+        MyOdluxBundle b = new MyOdluxBundle();
+        b.setLoader(loader);
+        b.setIndex(0);
+        b.setBundleName("abc");
+        b.initialize();
+        assertTrue(loader.getNumberOfBundles()==1);
+        assertNotNull(b.getLoader());
+        assertEquals("abc",b.getBundleName());
+        assertTrue(b.hasResource("test.js"));
+        assertNotNull(b.getResourceFileContent("test.js"));
+        b.clean();
+        assertTrue(loader.getNumberOfBundles()==0);
+    }
+
+}
diff --git a/sdnr/wt/odlux/apps/minimumApp/src2/test/resources/test.js b/sdnr/wt/odlux/apps/minimumApp/src2/test/resources/test.js
new file mode 100644 (file)
index 0000000..b47fdc3
--- /dev/null
@@ -0,0 +1,5 @@
+asdac sad 
+as
+d 
+sad
+ sadfa
\ No newline at end of file
diff --git a/sdnr/wt/odlux/core/README.md b/sdnr/wt/odlux/core/README.md
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
index c027e5a..f06f994 100644 (file)
@@ -1,54 +1,55 @@
 <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>
+    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.4.1-SNAPSHOT</version>
-       <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name>
-       <packaging>bundle</packaging>
+    <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+    <artifactId>sdnr-wt-odlux-core-model</artifactId>
+    <version>0.4.1-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.2.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>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>1.2.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>
\ No newline at end of file
+    <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>
index 10705b0..133b084 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * 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.
@@ -27,7 +27,7 @@ import java.util.*;
  *
  * 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$
@@ -37,7 +37,7 @@ public class ClassLoaderUtil {
     //~ Methods ////////////////////////////////////////////////////////////////
 
     /**
-     * Load all resources with a given name, potentially aggregating all results 
+     * 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.
      *
@@ -51,9 +51,9 @@ public class ClassLoaderUtil {
      * @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 {
+     public static Iterator<URL> getResources(String resourceName, Class<?> callingClass, boolean aggregate) throws IOException {
 
-         AggregateIterator<URL> iterator = new AggregateIterator<URL>();
+         AggregateIterator<URL> iterator = new AggregateIterator<>();
 
          iterator.addEnumeration(Thread.currentThread().getContextClassLoader().getResources(resourceName));
 
@@ -69,7 +69,7 @@ public class ClassLoaderUtil {
              }
          }
 
-         if (!iterator.hasNext() && (resourceName != null) && ((resourceName.length() == 0) || (resourceName.charAt(0) != '/'))) { 
+         if (!iterator.hasNext() && resourceName != null && (resourceName.length() == 0 || resourceName.charAt(0) != '/')) {
              return getResources('/' + resourceName, callingClass, aggregate);
          }
 
@@ -89,7 +89,7 @@ public class ClassLoaderUtil {
     * @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) {
+    public static URL getResource(String resourceName, Class<?> callingClass) {
         URL url = Thread.currentThread().getContextClassLoader().getResource(resourceName);
 
         if (url == null) {
@@ -104,7 +104,7 @@ public class ClassLoaderUtil {
             }
         }
 
-        if ((url == null) && (resourceName != null) && ((resourceName.length() == 0) || (resourceName.charAt(0) != '/'))) { 
+        if (url == null && resourceName != null && (resourceName.length() == 0 || resourceName.charAt(0) != '/')) {
             return getResource('/' + resourceName, callingClass);
         }
 
@@ -119,11 +119,11 @@ public class ClassLoaderUtil {
     * @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) {
+    public static InputStream getResourceAsStream(String resourceName, Class<?> callingClass) {
         URL url = getResource(resourceName, callingClass);
 
         try {
-            return (url != null) ? url.openStream() : null;
+            return url != null ? url.openStream() : null;
         } catch (IOException e) {
             return null;
         }
@@ -144,7 +144,7 @@ public class ClassLoaderUtil {
     * @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 {
+    public static Class<?> loadClass(String className, Class<?> callingClass) throws ClassNotFoundException {
         try {
             return Thread.currentThread().getContextClassLoader().loadClass(className);
         } catch (ClassNotFoundException e) {
@@ -166,10 +166,10 @@ public class ClassLoaderUtil {
      */
     static class AggregateIterator<E> implements Iterator<E> {
 
-        LinkedList<Enumeration<E>> enums = new LinkedList<Enumeration<E>>();
+        LinkedList<Enumeration<E>> enums = new LinkedList<>();
         Enumeration<E> cur = null;
         E next = null;
-        Set<E> loaded = new HashSet<E>();
+        Set<E> loaded = new HashSet<>();
 
         public AggregateIterator<E> addEnumeration(Enumeration<E> e) {
             if (e.hasMoreElements()) {
@@ -184,10 +184,12 @@ public class ClassLoaderUtil {
             return this;
         }
 
+        @Override
         public boolean hasNext() {
-            return (next != null);
+            return next != null;
         }
 
+        @Override
         public E next() {
             if (next != null) {
                 E prev = next;
@@ -228,8 +230,9 @@ public class ClassLoaderUtil {
 
         }
 
+        @Override
         public void remove() {
             throw new UnsupportedOperationException();
         }
     }
-}
\ No newline at end of file
+}
index 08d2436..4b58aac 100644 (file)
@@ -6,9 +6,9 @@
  * =================================================================================================
  * 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
@@ -30,15 +30,14 @@ public class ClassLoaderUtilExt {
 
     final static Logger LOG = LoggerFactory.getLogger(ClassLoaderUtilExt.class);
 
-    public static URL getResource(String resourceName, Class callingClass) {
+    public static URL getResource(String resourceName, Class<?> callingClass) {
 
         Iterator<URL> urls = null;
         URL url = null;
         try {
             urls = getResources(resourceName, callingClass, true);
         } catch (IOException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            LOG.debug("No resource {}",resourceName);
         }
         if (urls != null) {
             while (urls.hasNext()) {
@@ -51,12 +50,20 @@ public class ClassLoaderUtilExt {
         if (url == null) {
             LOG.debug("res currently not found. try to find with bundle");
             Bundle b = FrameworkUtil.getBundle(callingClass);
-            url = b.getEntry(resourceName);
+            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)
+    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 (file)
index 0000000..66ff565
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles;
+
+public interface IndexOdlBundle {
+
+}
index 448169f..e85c88b 100644 (file)
@@ -21,11 +21,8 @@ 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.
@@ -81,22 +78,6 @@ public class OdluxBundle {
     public void initialize() {
 
         LOG.info("Registering resources");
-        try {
-            List<String> 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");
@@ -149,36 +130,4 @@ public class OdluxBundle {
         return sb.toString();
     }
 
-    private List<String> getResourceFiles(String path) throws IOException {
-        List<String> 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
deleted file mode 100644 (file)
index c2a5143..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class OdluxBundleList extends ArrayList<OdluxBundle>{
-       
-       /**
-        * 
-        */
-       private static final long serialVersionUID = 8365348398621906220L;
-
-       public List<String> getNames(){
-               final List<String> names=new ArrayList<String>();
-               for(OdluxBundle b:this)
-                       names.add(b.getBundleName());
-               return names;
-       }
-
-}
index e288ee3..5c8231e 100644 (file)
@@ -6,9 +6,9 @@
  * =================================================================================================
  * 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
@@ -22,4 +22,7 @@ public interface OdluxBundleLoader {
     public void addBundle(OdluxBundle bundle);
 
     public void removeBundle(OdluxBundle bundle);
+
+    public int getNumberOfBundles();
+
 }
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 (file)
index 0000000..e2ec04f
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+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();
+
+}
index 3ba5280..2eab5b2 100644 (file)
                <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>
index ae0d049..dfd450f 100644 (file)
@@ -6,9 +6,9 @@
  * =================================================================================================
  * 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
@@ -21,112 +21,88 @@ 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.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleResourceAccess;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class IndexOdluxBundle extends OdluxBundle {
+public class IndexOdluxBundle extends OdluxBundle implements OdluxBundleResourceAccess {
 
-       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);
+    private static Logger LOG = LoggerFactory.getLogger(IndexOdluxBundle.class);
 
-       public IndexOdluxBundle() {
-               super(null, BUNDLENAME_APP);
+    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);
 
-       }
-       @Override
-       protected String loadFileContent(URL url)
-       {
-               return this.loadFileContent(url, null);
-       }
-       
-       protected String loadFileContent(URL url, List<String> 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()));
+    public IndexOdluxBundle() {
+        super(null, BUNDLENAME_APP);
 
-                       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;
-               }
+    }
+    @Override
+    protected String loadFileContent(URL url)
+    {
+        return loadFileContent(url, OdluxBundleLoaderImpl.getInstance().getLoadedBundles(this.getBundleName()));
+    }
 
-               return sb.toString();
-       }
 
-       private List<String> getLoadedBundles() {
-               List<OdluxBundle> bundles = OdluxBundleLoaderImpl.getInstance().getBundles();
-               List<String> list = new ArrayList<String>();
-               bundles.sort(sortorderbundlecomparator);
-               for (OdluxBundle b : bundles) {
-                       list.add(b.getBundleName());
-               }
-               list.add(this.getBundleName());
-               return list;
-       }
+    @Override
+    public String getResourceFileContent(String fn, List<String> bundleNames) {
+        return loadFileContent(this.getResource(fn),bundleNames);
+    }
 
-       private final Comparator<OdluxBundle> sortorderbundlecomparator = new Comparator<OdluxBundle>() {
+    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;
+        try {
+            in = new BufferedReader(new InputStreamReader(url.openStream()));
 
-               @Override
-               public int compare(OdluxBundle arg0, OdluxBundle arg1) {
+            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);
+            }
+            in.close();
+        } catch (IOException e) {
+            LOG.warn("could not load resfile " + url.toString() + ": " + e.getMessage());
+            return null;
+        }
 
-                       int diff = arg0.getIndex() - arg1.getIndex();
-                       return diff > 0 ? 1 : diff < 0 ? -1 : 0;
-               }
-       };
+        return sb.toString();
+    }
 
-       public String getResourceFileContent(String fn, List<String> bundleNames) {
-               return this.loadFileContent(this.getResource(fn),bundleNames);
-       }
-       public Comparator<OdluxBundle> getBundleSorter() {
-               return this.sortorderbundlecomparator;
-       }
 }
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 (file)
index 0000000..be27102
--- /dev/null
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * ============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");
+
+    }
+
+    private Comparator<OdluxBundle> getBundleSorter() {
+        return this.sortorderbundlecomparator;
+    }
+
+
+    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 getResource(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;
+    }
+
+}
index 31544c2..41d10ad 100644 (file)
@@ -6,9 +6,9 @@
  * =================================================================================================
  * 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
@@ -19,83 +19,54 @@ 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;
+    /**
+     *
+     */
+    private static final long serialVersionUID = -6807215213921798293L;
+    private static Logger LOG = LoggerFactory.getLogger(ResFilesServlet.class);
+    private final IndexOdluxBundle indexBundle;
+
+    public ResFilesServlet() {
+        super();
+        indexBundle = new IndexOdluxBundle();
+    }
+
 
-       public ResFilesServlet() {
-               super();
-               indexBundle = new IndexOdluxBundle();
-               OdluxBundleLoaderImpl.getInstance();
-       }
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
-       private List<String> getBundleNames(final List<OdluxBundle> bundles) {
-               final List<String> names = new ArrayList<String>();
-               for (OdluxBundle b : bundles)
-                       names.add(b.getBundleName());
-               names.add(this.indexBundle.getBundleName());
-               return names;
-       }
+        LOG.debug("get req: " + req.getRequestURI().toString());
+        final String fn = req.getRequestURI().toString();
+        String fileContent = null;
 
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        fileContent = OdluxBundleLoaderImpl.getInstance().getResource(fn, indexBundle);
 
-               LOG.debug("get req: " + req.getRequestURI().toString());
-               final String fn = req.getRequestURI().toString();
-               String fileContent = null;
-               final List<OdluxBundle> 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<OdluxBundle> 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);
+        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();
+            os.close();
+        } else {
+            LOG.debug("file " + fn + " not found in res.");
+            resp.setStatus(404);
 
-               }
-       }
+        }
+    }
 
-       public String loadFileContent(String filename) {
-               return this.indexBundle.getResourceFileContent(filename);
-       }
+    public String loadFileContent(String filename) {
+        return this.indexBundle.getResourceFileContent(filename);
+    }
 
 }
index bf726ac..76be145 100644 (file)
@@ -13,16 +13,6 @@ xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs">
             <entry key="alias" value="/index2.html" />
         </service-properties>
     </service>
-    
-<!--     <bean id="rootServlet" -->
-<!--         class="com.highstreet.technologies.odlux.RootServlet"> -->
-<!--     </bean> -->
-
-<!--    <service interface="javax.servlet.http.HttpServlet" ref="rootServlet"> -->
-<!--         <service-properties> -->
-<!--             <entry key="alias" value="/" /> -->
-<!--         </service-properties> -->
-<!--     </service> -->
 
     <bean id="resFilesServlet"
         class="org.onap.ccsdk.features.sdnr.wt.odlux.ResFilesServlet">
@@ -33,8 +23,7 @@ xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs">
             <entry key="alias" value="/odlux" />
         </service-properties>
     </service>
-    
-    <bean id="loadersvc" class="org.onap.ccsdk.features.sdnr.wt.odlux.model.bundles.OdluxBundleLoaderImpl"/>
+    <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/LoadResourcesTest.java b/sdnr/wt/odlux/core/provider/src/test/java/LoadResourcesTest.java
deleted file mode 100644 (file)
index b8a68f1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-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/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 (file)
index 0000000..bebbffd
--- /dev/null
@@ -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 (file)
index 0000000..3c9ad43
--- /dev/null
@@ -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() {
+
+    }
+
+}
  * the License.
  * ============LICENSE_END==========================================================================
  ******************************************************************************/
-package org.onap.ccsdk.features.sdnr.wt.odlux;
+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.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RootServlet extends HttpServlet {
 
+public class TestRedirect {
 
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2622614831559561459L;
-    private static Logger LOG = LoggerFactory.getLogger(RootServlet.class);
+       private static final int RESPONSECODE_REDIRECT = 301;
 
-    @Override
-    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+       @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);
+               }
+       }
 
-        LOG.debug("redirect to index2.html");
-        resp.sendRedirect("index2.html");
-    }
 }
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 (file)
index 0000000..287ed70
--- /dev/null
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * ============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 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;
+
+    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);
+    }
+
+    @Test
+    public void test() {
+        servlet = new PublicResFilesServlet();
+        OdluxBundleLoader loader = OdluxBundleLoaderImpl.getInstance();
+        OdluxBundle b = new OdluxBundle();
+        b.setBundleName("b1");
+        b.setIndex(9);
+        b.setLoader(loader);
+        b.initialize();
+        testResReq("odlux/index.html", 200);
+        testResReq("odlux/fragmich.txt", 404);
+
+    }
+
+    @SuppressWarnings("serial")
+    private class PublicResFilesServlet extends ResFilesServlet {
+        @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/resources/index.html b/sdnr/wt/odlux/core/provider/src/test/resources/index.html
new file mode 100644 (file)
index 0000000..4f4584d
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html>\r
+<html lang="en">\r
+\r
+<head>\r
+  <meta charset="UTF-8">\r
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">\r
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">\r
+  <!-- <link rel="stylesheet" href="./vendor.css" > -->\r
+  <title>O D L UX</title>\r
+</head>\r
+\r
+<body>\r
+  <div id="app"></div>\r
+  <script type="text/javascript" src="./require.js"></script>\r
+  <script type="text/javascript" src="./config.js"></script>\r
+  <script>\r
+    // run the application\r
+     require(["run"], function (run) {\r
+      run.runApplication();\r
+    });\r
+  </script>\r
+</body>\r
+\r
+</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 (file)
index 0000000..4f4584d
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html>\r
+<html lang="en">\r
+\r
+<head>\r
+  <meta charset="UTF-8">\r
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">\r
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">\r
+  <!-- <link rel="stylesheet" href="./vendor.css" > -->\r
+  <title>O D L UX</title>\r
+</head>\r
+\r
+<body>\r
+  <div id="app"></div>\r
+  <script type="text/javascript" src="./require.js"></script>\r
+  <script type="text/javascript" src="./config.js"></script>\r
+  <script>\r
+    // run the application\r
+     require(["run"], function (run) {\r
+      run.runApplication();\r
+    });\r
+  </script>\r
+</body>\r
+\r
+</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 (file)
index 0000000..4f4584d
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html>\r
+<html lang="en">\r
+\r
+<head>\r
+  <meta charset="UTF-8">\r
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">\r
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">\r
+  <!-- <link rel="stylesheet" href="./vendor.css" > -->\r
+  <title>O D L UX</title>\r
+</head>\r
+\r
+<body>\r
+  <div id="app"></div>\r
+  <script type="text/javascript" src="./require.js"></script>\r
+  <script type="text/javascript" src="./config.js"></script>\r
+  <script>\r
+    // run the application\r
+     require(["run"], function (run) {\r
+      run.runApplication();\r
+    });\r
+  </script>\r
+</body>\r
+\r
+</html>
\ No newline at end of file
diff --git a/sdnr/wt/odlux/framework/README.md b/sdnr/wt/odlux/framework/README.md
deleted file mode 100644 (file)
index 322450b..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-## Erste Schritte
-### Einrichtung der Arbeitsumgebung unter Linux
-1. NodeJS LTS installieren: [https://nodejs.org/en/](https://nodejs.org/en/) 
-2. Yarn installieren: `sudo npm install -g yarn`
-3. Lerna installieren: `sudo yarn global add lerna`
-4. Arbeitsverzeichnis erstellen z.B. `~/work`
-5. In das Arbeitsverzeichnis wechseln cd `~/work`
-6. Repository klonen: `git clone https://adresse.des/reposerory`
-7. in der Verzeichnis `cd odlux` wechseln
-8. Lerna initialisieren npm parakete laden: `lerna bootstrap`
-### Einrichtung der Arbeitsumgebung unter Windows
-1. NodeJS LTS installieren: [https://nodejs.org/en/](https://nodejs.org/en/) 
-2. Yarn installieren: `npm install -g yarn`
-3. Lerna installieren: `yarn global add lerna`
-4. Arbeitsverzeichnis erstellen z.B. `c:\work`
-5. In das Arbeitsverzeichnis wechseln cd `c:\work`
-6. Repository klonen: `git clone https://git-highstreet-technologies.com/highstreet/odlux.git`
-7. in der Verzeichnis `cd odlux` wechseln
-8. Lerna initialisieren npm parakete laden: `lerna bootstrap`
-
-### Anpassen an die Lokale Umgebung
-1. In das Framework Verzeichnis wechseln: `cd framework`
-2. Datei `webpack.config.js` bearbeiten
-3. Eintrag `devServer: { /* ... */ }` suchen
-4. Abschitt `proxy` suchen
-5. Alle Pfade, die von dem ODL-Backend verwendet werden sollen hinzufügen. Beispiel, wenn der Pfad `/api` auf  `http://localhost:3001/api` zeigen soll ist folgen der Eintrag hinzuzufügen, wobei `http://localhost:3001` die Addresse des ODL Backends auf dem Computer ist:
-   ```json
-     devServer: {
-       // ...
-       proxy: {
-         "/api": {
-            target: "http://localhost:3001/api",
-            secure: false
-         }
-       }
-    }
-   ```
-6. Diese Schritte sind für **ALLE** Anwendungen (App) im `apps`-Verzeichnis ebenfalls zu wiederholen.
-
-### Framework OHNE Anwendung starten
-1. In das Framework Verzeichnis wechseln: `cd framework`
-2. Project erstellen: `yarn run build` für Release oder `yarn run build:dev` für Entwicklungsversion
-3. Projekt sarten: `yarn start`
-4. Webbbrowser Ã¶ffnen: `http://localhost:3100/
-
-H> **Hinweis:** Der Port kann in der Datei `webpack.config.js` im Abschitt `devServer` unter `public` ggf. angepaßt werden.
-
-### Anwendung einzeln starten
-1. Einmal das Framework erstellen (siehe vorheriger Abschitt)
-2. In das Verzeichnis der Anwendung wechseln: z.B. `cd apps/demoApp`
-3. Optional: Project erstellen: `yarn run build` für die Erstellung einer Release.
-4. Projekt sarten: `yarn start`
-5. Webbbrowser Ã¶ffnen: `http://localhost:3100/
-
-H> **Hinweis:** Der Port kann in der Datei `webpack.config.js` im Abschitt `devServer` unter `public` ggf. angepaßt werden.
-
-T> **Profitip**: In der Datei `index.html` befindet sich der Aufruf zum laden der einzelnen Apps. Hier könnnen weitere Apps hinzugefügt werden. Dazu ist es allerdings erforderlich entsprechende Proxy Regeln für den Webpack-Dev-Server mit den jeweiligen Pfaden zu erstellen, so dass die Module gefunden werden können. 
-
-## Eigene Anwendung erstellen
-### Kopieren der Schablone
-Zur Zeit gibt es noch keine automatisierte Schablone oder Maven Artefakt Vorlage, die automatisch eine neue Anwendung erstellt. Aus diesem Grund ist der einfachste Weg, die Muster App `demoApp` unter  `apps` zu kopieren. 
-
-Anschließend sind die folgenden Anpassungen vorzunehmen.
-
-1. Mindestens **Name**, **Version** und **Beschreibung** in der Datei `packages.json` anpassen : `"name": "@odlux/demo-app",` 
-   H> Hinweis: Anstelle von Großbuchstaben nur Bindestrich Buchstabe verwenden. demoApp wird zu demo-app.
-2. Datei `webpack.config.js` prüfen ob alle Backend Pfade koniguriert sind (siehe Anpassen der lokalen Umgebung)
-3. Name des Modules in der Webpack-Config anpassen (demoApp). Dieser wird gefolgt von dem Pfad zu der Einstiegsdatei (`./plugin.tsx`).
-   ```js
-     entry: {
-       demoApp: ["./plugin.tsx"]
-     },
-   ```
-   H> Hinweis: Keine Bindesriche oder Sonderzeichen verwenden. 
-4. Optional kann in dem gleichen Eintrag festgelegt werden wie die Einstiegsdatei für dieses Module / diese App heißen soll. Default ist `plugin.tsx`.
-5. In der Datei `index.html` ist das zu ladende Module (`demoApp`) auszutauschen, gegen das eigene Modul:
-   ```js
-    // run the application
-    require(["app","demoApp"], function (app) {
-      app("./app.tsx")
-    });
-   ``` 
-   H> Hinweis: Der Name dieses Modules wurde in Schritt 3. festgelgt.
-
-### Anpassen der Konfiguration der App
-Die Konfiguration der neuen App erfolgt innerhalb der Einstiegsdatei(default: `plugin.tsx`). Hier wird der eindeutige Name, das Icon, der Titel der Menueintrag usw. festgelegt.
-
-1. Icon aus der Bibliothek `fontawsome 5` auswählen.
-   ```ts
-     import { faAddressBook } from '@fortawesome/free-solid-svg-icons';
-   ```
-
-2. Anpassen der Registration der App in der Einstiegsdatei.    
-Der eindeutige Name wird vom Framework verwendet, um die Apps voneinander zu unterscheiden. Das Icon wird für die Navigation und die Title-Leiste genutzt. Die Root-Komponente ist die Ã¤ußrste Komponente dieser App. Der Menu-Eintrag ist optional um einen Namen für dieser App in der Navigation darzustellen.
-   ```js
-    applicationManager.registerApplication({ 
-      name: "demoApp",         // eindeutiger Name der App
-      icon: faAddressBook,     // Icon der App 
-      rootComponent: FinalApp, // Wurzelkomponente der App
-      menuEntry: "Demo App"    // Menu Eintrag 
-    });
-   ```
-
-3. Wenn diese Application einen eigenen Action-Handler enthällt, so ist dieser ebenfalls zu konfigurieren. Die Erstellung von Action Handlern wird ein einem Seperatem Abschitt genauer betrachtet.
-   ```js
-    applicationManager.registerApplication({ 
-      // ...
-      rootActionHandler: demoAppRootHandler,
-    });
-   ```
-
-4. Wenn diese Application eigene Komponenten für andere Apps bereit stellen soll, so sind diese auch zu konfigurieren. Dabei ist der Schlüssel der Name mit dem später auf die Komponete zugegriffen werden kann, sowie der Wert die zu exportierende Komponente.
-   ```js
-    applicationManager.registerApplication({ 
-      // ...
-      exportedComponents: { counter: Counter },
-    });
-   ```
-
-5. Optional kann ein Pfad angegeben werden unter dem die App ereicht werden soll. Wird dieser nicht festgelegt wird der Name als Pfad genutzt. 
-   ```js
-    applicationManager.registerApplication({ 
-      // ...
-      path: "demoApp",
-    });
-   ```
-
-Hier können z.B. URL-Parameter spezififiert werden, die der App Ã¼bergeben werden sollen.          
-   ```js
-    applicationManager.registerApplication({ 
-      // ...
-      path: "demoApp/:param1",
-    });
-   ```
-
-6. Abhänig davon ob die App einen oder mehrere URL Prameter bekommen soll sind diese als generische TypeParameter für die `RouteComponentProps` der `AppProps` mit anzugeben.
-  ```ts
-    // Beispiel ohne Parameter
-    type AppProps = RouteComponentProps & Connect;
-
-    // Beispiel mit einem Parameter
-    type AppProps = RouteComponentProps<{ param1: number }> & Connect;
-  ``` 
-
-  7. Wenn Sub-Routen innerhalb der App verwendet werden sollen, sind diese innerhalb der Root-Komponente anzugeben. Sonst kann direkt mit der Programmierung der Hauptansicht begonnne werden. 
-  ```ts
-    const App = (props: AppProps) => (
-      <Switch>
-        <Route exact path={ `${ props.match.path }/authors` } 
-               component={AuthorsList} /> 
-        <Route path={ `${ props.match.path }/authors/:authorId` } 
-               component={EditAuthor } /> 
-        <Redirect to={ `${ props.match.path }/authors` } />
-       </Switch>
-    ); 
-  ```
-8. In jedem Fall ist die App unter Verwendung von `withRouter` mit dem Router zu verbinden.
-  ```ts
-    const FinalApp = withRouter(connect()(App)); 
-  ```
-
-### Erstellen der Datenmodelle bzw Dienste 
-Alle Datenmodelle, die innerhalb dieser App verwendet werden sollen werden innerhalb des Ordners `models` bzw. in einem Unterordner in diesem Ordner erstellt. Beispiel: `Author` für die Darstellen von Autoren.
-   ```ts
-    /**
-     * Represents an author.
-     */
-    export interface IAuthor {
-      /**
-       * Defines the unique id of the autor. 
-       */
-      id: number;
-    
-      /**
-       * Defines the first name of this author.
-       */
-      firstName: string;
-    
-      /**
-       * Defines the last name of this author.
-       */
-      lastName: string;
-    }
-   ```
-
-Alle Dienste die diese App verwenden soll liegen in dem Ordner `services` oder einem darin befindlichem Unterordner. In der Aktuellen Version werden Dienste als **Singleton** erstellt. Dazu exportiert die Datei mit der Implementierung eine einzelne Instanz als `default`.
-   ```ts   
-    class AuthorService {
-      // ...
-    }
-    // return as a singleton
-    export const authorService = new AuthorService();
-    export default authorService;
-   ```
-
-### Erstellen / Anpassen eigener Action-Handler
-Jede Application kann einen `Root-State` definieren, der alle Zustände speziell für diese App repräsentiert. Dieser sollte als Schnittstelle definiert werden mit dem Namen der sich aus I**AppName**StoreState zusammensetzt. Für die `demoApp` würde dieser also `IDemoAppStoreState` heißen.
-   ```ts
-    export interface IDemoAppStoreState {
-      listAuthors: IListAuthors;
-      editAuthor: IEditAuthor;
-    }
-   ```
-
-Es bietet sich an, diesesn **StoreState** innerhalb der Datei mit dem `Root-Action-Handler` zu erstellen. Der Name sieser Datei sollte aich wie folgt zusammen setzen **appName**RootHandler.ts im Verzeichnis `handlers`. Für die `demoApp` wäre das `demoAppRootHandler.ts`.
-
-Um mit der Typesicherheit von TypeScript auf den Gesamt-Anwendugs-Zustand korreckt zugreifen zu können, ist es erforderlich diesen innerhalb dieser Datei, um den Anwendungszustand der App wie folgt zu erweitern.
-   ```ts
-     declare module '../../../../framework/src/store/applicationStore' {
-       interface IApplicationStoreState {
-         demoApp: IDemoAppStoreState
-       }
-     }
-   ```
-
-Sollte sich der Zusatand der App aus mehreren ActionHandlern zusammensetzen, so sind diese vor dem exportieren zu verbinden mit der Funktion `combineActionHandler` des Frameworks.
-   ```ts
-    const actionHandlers = {
-      listAuthors: listAuthorsHandler,
-      editAuthor: editAuthorHandler,
-    };
-     
-    export const demoAppRootHandler = combineActionHandler <IDemoAppStoreState>(actionHandlers);
-    export default demoAppRootHandler;
-   ```
-
-## Bibliotheken
-Das O-D-L-UX Framework unterscheidt in Bibliotheken, die nur einer einzelnen App zugeordnet werden. Diese können nicht mit anderen Apps geteilt werden und müssen in jeder App seperat installiert werden. Was zur Folge hat, dass diese auch in dem Bundle jeder App enthalten sind.
-
-Sowie Bibliotheken, die zwischen alle Apps geteilt werden. Diese müssen nicht in jeder App installiert werden und sind auch nur einmal in dem Bundle des Frameworks vorhanden.
-
-### Hinzufügen einer geteilte Bibliothek
-Beispiele für geteilte Bibliotheken sind `react`, `react-dom`, `jQuery` oder `lodash`. Diese Bibliothek wird zunächst den Abhägnigkeiten der Ã¼bergeordneten `package.json` Datei (im Root-Verzeichnis von O-D-L-UX) im Abschnitt `dependencies` hinzugefügt. 
-   ```json
-    "dependencies": {
-      "@types/react": "16.4.14",
-      "@types/react-dom": "16.0.8",
-      "@types/react-router-dom": "4.3.1",
-      "@material-ui/core": "3.1.1",
-      "@material-ui/icons": "3.0.1",
-      "@types/classnames": "2.2.6",
-      "@types/flux": "3.1.8",
-      "@types/jquery": "3.3.10",
-      "jquery": "3.3.1",
-      "react": "16.5.2",
-      "react-dom": "16.5.2",
-      "react-router-dom": "4.3.1",
-      "@fortawesome/react-fontawesome": "0.1.3",
-      "@fortawesome/fontawesome-svg-core": "1.2.4",
-      "@fortawesome/free-solid-svg-icons": "5.3.1",
-      "jsonwebtoken": "8.3.0",
-      "@types/jsonwebtoken": "7.2.8"
-    },
-   ```
-
-Anschließend werden die Abhägigkeiten, die jeweils für das Framework und/oder die App erforderlich sind in die `package.json` Datei des Frameworks bzw. der App in den Abschitt `peerDependencies` Ã¼bernommen, die jeweils von den geteilten Abhänigkeiten erforderlich sind.
-   ```json
-    "peerDependencies": {
-      "@types/react": "16.4.14",
-      "@types/react-dom": "16.0.8",
-      "@types/react-router-dom": "4.3.1",
-      "@material-ui/core": "3.1.1",
-      "@material-ui/icons": "3.0.1",
-      "@types/classnames": "2.2.6",
-      "@types/flux": "3.1.8",
-      "@types/jquery": "3.3.10",
-      "jquery": "3.3.1",
-      "react": "16.5.2",
-      "react-dom": "16.5.2",
-      "react-router-dom": "4.3.1"
-    }
-   ```
-
-Nachdem **ALLE** erforderlichen Apps und das Framework mit der neuen Abhägnigkeit konfiguiert wurden wird der Befehl: `lerna bootstrap` ausgeführt, um die Abhägigkeiten herunter zu laden und bereit zu stellen für die Apps sowie das Framework.
-
-### Hinzufügen einer exclusiven Bibliothek
-Wenn eine App eine Bibiotjek verwenden solle, diese aber nicht mit den anderen Apps teilen soll, so ist diese Abhägigkeit nur in die `package.json` Datei des App in dem Abschnitt `dependencies`einzufügen. 
-   ```json
-     "dependencies": {
-       "object-assign": "3.2.1"
-     }
-   ```
-
-Auch in diesem Fall ist `lerna bootstrap` im Root-Verzeichnis von O-D-L-UX auszuführen.
-
-## Eigene Bibliothklen 
-Eigene Bibliotheken können in einem jeweils in einem seperatem Projekt-Ordner unterhalb des `lib` Ordners entwickelt werden.
index e71cca0..51449b6 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "name": "@odlux/framework",\r
-  "version": "0.1.3",\r
+  "version": "0.1.4",\r
   "description": "A react based modular UI framework",\r
   "main": "index.js",\r
   "scripts": {\r
   "author": "Matthias Fischer",\r
   "license": "MIT",\r
   "peerDependencies": {\r
-    "@fortawesome/fontawesome-svg-core": "1.2.12",\r
-    "@fortawesome/free-solid-svg-icons": "5.6.3",\r
-    "@fortawesome/react-fontawesome": "0.1.3",\r
+    "@types/react": "16.4.14",\r
+    "@types/react-dom": "16.0.8",\r
+    "@types/react-router-dom": "4.3.1",\r
     "@material-ui/core": "3.8.3",\r
     "@material-ui/icons": "3.0.2",\r
     "@types/classnames": "2.2.6",\r
     "@types/flux": "3.1.8",\r
     "@types/jquery": "3.3.10",\r
-    "@types/jsonwebtoken": "7.2.8",\r
-    "@types/react": "16.4.14",\r
-    "@types/react-dom": "16.0.8",\r
-    "@types/react-router-dom": "4.3.1",\r
     "jquery": "3.3.1",\r
-    "jsonwebtoken": "8.3.0",\r
     "react": "16.5.2",\r
     "react-dom": "16.5.2",\r
-    "react-router-dom": "4.3.1"\r
+    "react-router-dom": "4.3.1",\r
+    "@fortawesome/react-fontawesome": "0.1.3",\r
+    "@fortawesome/fontawesome-svg-core": "1.2.12",\r
+    "@fortawesome/free-solid-svg-icons": "5.6.3",\r
+    "jsonwebtoken": "8.3.0",\r
+    "@types/jsonwebtoken": "7.2.8"\r
   },\r
   "dependencies": {\r
-    "http-server": "^0.11.1",\r
-    "lerna": "^3.10.7"\r
+    "http-server": "^0.11.1"\r
   }\r
 }\r
index 1c68673..e60b698 100644 (file)
                                                        <directory>../node_modules</directory>
                                                        <followSymlinks>false</followSymlinks>
                                                </fileset>
+                                               <!-- eclipse bug build bin folder in basedir -->
+                                               <fileset>
+                                                       <directory>bin</directory>
+                                                       <followSymlinks>false</followSymlinks>
+                                               </fileset>
                                        </filesets>
                                </configuration>
                        </plugin>
index 6acea01..42a0bb4 100644 (file)
@@ -4,17 +4,23 @@ import * as React from 'react';
 export enum ColumnType {\r
   text,\r
   numeric,\r
+  boolean,\r
   custom\r
 }\r
 \r
 type CustomControl<TData> = {\r
-  rowData: TData\r
+  className?: string;\r
+  style?: React.CSSProperties;\r
+  rowData: TData;\r
 }\r
 \r
 export type ColumnModel<TData> = {\r
   title?: string;\r
   disablePadding?: boolean;\r
   width?: string | number;\r
+  className?: string;\r
+  style?: React.CSSProperties;\r
+  align?: 'inherit' | 'left' | 'center' | 'right' | 'justify';\r
   disableSorting?: boolean;\r
   disableFilter?: boolean;\r
 } & ({\r
@@ -23,5 +29,9 @@ export type ColumnModel<TData> = {
   customControl: React.ComponentType<CustomControl<TData>>;\r
 } | {\r
   property: keyof TData;\r
-  type?: ColumnType.numeric | ColumnType.text;\r
+  type: ColumnType.boolean;\r
+  labels?: { "true": string, "false": string };\r
+} | {\r
+    property: keyof TData;\r
+    type?: ColumnType.numeric | ColumnType.text;\r
 });
\ No newline at end of file
index 3b906cf..61a990d 100644 (file)
@@ -84,7 +84,7 @@ type MaterialTableComponentBaseProps<TData> = WithStyles<typeof styles> & {
   disableSorting?: boolean;\r
   disableFilter?: boolean;\r
   customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void  }[];\r
-  onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void; \r
+  onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void;\r
 };\r
 \r
 type MaterialTableComponentPropsWithRows<TData={}> = MaterialTableComponentBaseProps<TData> & { rows: TData[]; asynchronus?: boolean; };\r
@@ -142,7 +142,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
 \r
     if (isMaterialTableComponentPropsWithRequestData(this.props)) {\r
       this.update();\r
-    \r
+\r
       if (this.props.tableApi) {\r
         this.props.tableApi.forceRefresh = () => this.update();\r
       }\r
@@ -168,11 +168,11 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
               onSelectAllClick={ this.handleSelectAllClick }\r
               onRequestSort={ this.onHandleRequestSort }\r
               rowCount={ rows.length }\r
-              enableSelection={ this.props.enableSelection } \r
+              enableSelection={ this.props.enableSelection }\r
             />\r
             <TableBody>\r
               { showFilter && <EnhancedTableFilter columns={ columns } filter={ filter } onFilterChanged={ this.onFilterChanged } enableSelection={this.props.enableSelection} /> || null }\r
-              { rows // may need ordering here \r
+              { rows // may need ordering here\r
                 .map((entry: TData & { [key: string]: any }) => {\r
                   const entryId = getId(entry);\r
                   const isSelected = this.isSelected(entryId);\r
@@ -186,21 +186,23 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
                       key={ entryId }\r
                       selected={ isSelected }\r
                     >\r
-                      { this.props.enableSelection \r
+                      { this.props.enableSelection\r
                        ? <TableCell padding="checkbox" style={ { width: "50px" } }>\r
                           <Checkbox checked={ isSelected } />\r
                         </TableCell>\r
                        : null\r
-                      }  \r
+                      }\r
                       {\r
                         this.props.columns.map(\r
                           col => {\r
-                            const style = col.width ? { width: col.width } : {};\r
+                            const style = col.width ? { width: col.width } : { };\r
                             return (\r
-                              <TableCell key={ col.property } align={ col.type === ColumnType.numeric ? 'right' : 'left' } style={ style }>\r
+                              <TableCell key={ col.property } align={ col.type === ColumnType.numeric && !col.align ? "right": col.align } style={ style }>\r
                                 { col.type === ColumnType.custom && col.customControl\r
-                                  ? <col.customControl rowData={ entry } />\r
-                                  : entry[col.property]\r
+                                  ? <col.customControl className={col.className} style={col.style} rowData={ entry } />\r
+                                  : col.type === ColumnType.boolean\r
+                                    ? <span className={col.className} style={col.style}>{col.labels ? col.labels[entry[col.property] ? "true": "false"] : String(entry[col.property]) }</span>\r
+                                    : <span className={col.className} style={col.style}>{String(entry[col.property])}</span>\r
                                 }\r
                               </TableCell>\r
                             );\r
@@ -270,10 +272,10 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
       if (state.showFilter) {\r
         Object.keys(filter).forEach(prop => {\r
           const exp = filter[prop];\r
-          filtered = filtered || !!exp;\r
-          data = exp ? data.filter((val) => {\r
+          filtered = filtered || exp !== undefined;\r
+          data = exp !== undefined ? data.filter((val) => {\r
             const value = val[prop];\r
-            return value && value.toString().indexOf(exp) > -1;\r
+            return (value == exp) || (value && value.toString().indexOf(String(exp)) > -1);\r
           }) : data;\r
         });\r
       }\r
@@ -341,7 +343,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
   };\r
 \r
   handleSelectAllClick: () => {};\r
\r
+\r
   private onHandleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, page: number) => {\r
     if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {\r
       this.props.onHandleChangePage(page);\r
@@ -378,7 +380,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
     }\r
     if (!this.props.enableSelection){\r
       return;\r
-    } \r
+    }\r
     let selected = this.state.selected || [];\r
     const selectedIndex = selected.indexOf(id);\r
     if (selectedIndex > -1) {\r
index 68e47d7..e21855a 100644 (file)
@@ -7,6 +7,7 @@ import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/s
 import TableCell from '@material-ui/core/TableCell';
 import TableRow from '@material-ui/core/TableRow';
 import Input from '@material-ui/core/Input';
+import { Select, FormControl, InputLabel, MenuItem } from '@material-ui/core';
 
 
 const styles = (theme: Theme) => createStyles({
@@ -27,7 +28,7 @@ interface IEnhancedTableFilterComponentProps extends WithStyles<typeof styles> {
 }
 
 class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterComponentProps> {
-  createFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLInputElement>) => {
+  createFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement>) => {
     this.props.onFilterChanged && this.props.onFilterChanged(property, event.target.value);
   };
 
@@ -35,11 +36,11 @@ class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterC
     const { columns, filter, classes } = this.props;
     return (
       <TableRow>
-         { this.props.enableSelection 
+         { this.props.enableSelection
            ? <TableCell padding="checkbox" style={ { width: "50px" } }>
              </TableCell>
            : null
-         }  
+         }
         { columns.map(col => {
           const style = col.width ? { width: col.width } : {};
           return (
@@ -48,14 +49,17 @@ class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterC
               padding={ col.disablePadding ? 'none' : 'default' }
               style={ style }
             >
-              { col.disableFilter || (col.type === ColumnType.custom) ? null : <Input
-                className={ classes.input }
-                inputProps={ {
-                  'aria-label': 'Filter',
-                } }
-                value={ filter[col.property] || '' }
-                onChange={ this.createFilterHandler(col.property) }
-              /> }
+              { col.disableFilter || (col.type === ColumnType.custom)
+                ? null
+                : (col.type === ColumnType.boolean)
+                  ? <Select className={classes.input} value={filter[col.property] !== undefined ? filter[col.property] : ''} onChange={this.createFilterHandler(col.property)} inputProps={{ name: `${col.property}-bool`, id: `${col.property}-bool` }} >
+                    <MenuItem value={undefined}>
+                      <em>None</em>
+                    </MenuItem>
+                    <MenuItem value={true as any as string}>{ col.labels ? col.labels["true"]:"true"}</MenuItem>
+                    <MenuItem value={false as any as string}>{ col.labels ? col.labels["false"] : "false"}</MenuItem>
+                  </Select>
+                  : <Input className={classes.input} inputProps={{ 'aria-label': 'Filter' }} value={filter[col.property] || ''} onChange={this.createFilterHandler(col.property)} />}
             </TableCell>
           );
         }, this) }
index d4d17d2..ed6eb2c 100644 (file)
@@ -31,8 +31,7 @@ const styles = (theme: Theme) => createStyles({
     marginRight: 20,\r
   },\r
   icon: {\r
-    marginRight: 8,\r
-    marginLeft: 24,\r
+    marginRight: 12\r
   }\r
 });\r
 \r
index 36d9377..3c59b15 100644 (file)
@@ -16,7 +16,7 @@
   <script>\r
     // run the application\r
     require(["run"], function (run) {\r
-      run.runApplication();\r
+       run.runApplication();\r
     });\r
   </script>\r
 </body>\r
index 504b2cf..7c12f97 100644 (file)
@@ -20,3 +20,24 @@ export type HitEntry<TSource extends {}> = {
   _score: number;\r
   _source: TSource;\r
 }\r
+\r
+type ActionResponse ={\r
+  _index: string;\r
+  _type: string;\r
+  _id: string;\r
+  _shards: {\r
+    total: number,\r
+    successful: number,\r
+    failed: number\r
+    },\r
+   \r
+}\r
+\r
+export type PostResponse = ActionResponse & {\r
+  created: boolean\r
+}\r
+\r
+export type DeleteResponse = ActionResponse & {\r
+  found: boolean\r
+}\r
+\r
index f0d4fd7..b102d37 100644 (file)
     "terser-webpack-plugin": "1.2.1",
     "ts-jest": "23.10.5",
     "ts-loader": "5.2.1",
+    "tslint": "5.12.1",
+    "tslint-config-airbnb": "5.11.1",
+    "tslint-config-airbnb-base": "0.2.0",
+    "tslint-config-prettier": "1.17.0",
+    "tslint-eslint-rules": "4.1.1",
+    "tslint-react": "3.6.0",
+    "tslint-react-recommended": "1.0.15",
     "typescript": "3.2.2",
     "typings-for-css-modules-loader": "1.7.0",
     "url-loader": "1.1.2",
     "webpack": "4.28.4",
     "webpack-cli": "3.2.1",
-    "webpack-dev-server": "3.1.9"
+    "webpack-dev-server": "3.1.14"
   }
 }
index 78c3ffe..9f58856 100644 (file)
@@ -28,6 +28,7 @@
                <module>apps/helpApp</module>
                <module>apps/inventoryApp</module>
                <module>apps/mediatorApp</module>
+               <module>apps/maintenanceApp</module>
                <module>apps/minimumApp</module>
                <module>apps/app-feature</module>
                <module>apps/app-installer</module>
index 79c0112..26c0d75 100644 (file)
     lodash "^4.17.10"
     to-fast-properties "^2.0.0"
 
+"@fimbul/bifrost@^0.17.0":
+  version "0.17.0"
+  resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4"
+  integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==
+  dependencies:
+    "@fimbul/ymir" "^0.17.0"
+    get-caller-file "^2.0.0"
+    tslib "^1.8.1"
+    tsutils "^3.5.0"
+
+"@fimbul/ymir@^0.17.0":
+  version "0.17.0"
+  resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815"
+  integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==
+  dependencies:
+    inversify "^5.0.0"
+    reflect-metadata "^0.1.12"
+    tslib "^1.8.1"
+
 "@fortawesome/fontawesome-common-types@^0.2.12":
   version "0.2.12"
   resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.12.tgz#42baa71f97ca06faeb0b6718fa5ed20c5eefdf07"
     humps "^2.0.1"
     prop-types "^15.5.10"
 
-"@lerna/add@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.10.6.tgz#6f2c6b26eb905c40fef4180f3ffa34ad9dbb860b"
-  integrity sha512-FxQ5Bmyb5fF+3BQiNffM6cTeGCrl4uaAuGvxFIWF6Pgz6U14tUc1e16xgKDvVb1CurzJgIV5sLOT5xmCOqv1kA==
-  dependencies:
-    "@lerna/bootstrap" "3.10.6"
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/npm-conf" "3.7.0"
-    "@lerna/validation-error" "3.6.0"
-    dedent "^0.7.0"
-    libnpm "^2.0.1"
-    p-map "^1.2.0"
-    semver "^5.5.0"
-
 "@lerna/add@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.13.1.tgz#2cd7838857edb3b43ed73e3c21f69a20beb9b702"
     pacote "^9.5.0"
     semver "^5.5.0"
 
-"@lerna/batch-packages@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/batch-packages/-/batch-packages-3.10.6.tgz#2d6dfc9be13ea4da49244dd84bfcd46c3d62f4d0"
-  integrity sha512-sInr3ZQJFMh9Zq+ZUoVjX8R67j9ViRkVy0uEMsOfG+jZlXj1lRPRMPRiRgU0jXSYEwCdwuAB5pTd9tTx0VCJUw==
-  dependencies:
-    "@lerna/package-graph" "3.10.6"
-    "@lerna/validation-error" "3.6.0"
-    libnpm "^2.0.1"
-
 "@lerna/batch-packages@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/batch-packages/-/batch-packages-3.13.0.tgz#697fde5be28822af9d9dca2f750250b90a89a000"
     "@lerna/validation-error" "3.13.0"
     npmlog "^4.1.2"
 
-"@lerna/bootstrap@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.10.6.tgz#d250baa9cfe9026c4f78e6cf7c9761a90b24e363"
-  integrity sha512-qbGjAxRpV/eiI9CboUIpsPPGpSogs8mN2/iDaAUBTaWVFVz/YyU64nui84Gll0kbdaHOyPput+kk2S8NCSCCdg==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/has-npm-version" "3.10.0"
-    "@lerna/npm-install" "3.10.0"
-    "@lerna/package-graph" "3.10.6"
-    "@lerna/pulse-till-done" "3.7.1"
-    "@lerna/rimraf-dir" "3.10.0"
-    "@lerna/run-lifecycle" "3.10.5"
-    "@lerna/run-parallel-batches" "3.0.0"
-    "@lerna/symlink-binary" "3.10.0"
-    "@lerna/symlink-dependencies" "3.10.0"
-    "@lerna/validation-error" "3.6.0"
-    dedent "^0.7.0"
-    get-port "^3.2.0"
-    libnpm "^2.0.1"
-    multimatch "^2.1.0"
-    p-finally "^1.0.0"
-    p-map "^1.2.0"
-    p-map-series "^1.0.0"
-    p-waterfall "^1.0.0"
-    read-package-tree "^5.1.6"
-    semver "^5.5.0"
-
 "@lerna/bootstrap@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.13.1.tgz#f2edd7c8093c8b139e78b0ca5f845f23efd01f08"
     read-package-tree "^5.1.6"
     semver "^5.5.0"
 
-"@lerna/changed@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.10.6.tgz#48fed2e6c890b39a71f1dac29e42a6f853956d71"
-  integrity sha512-nZDVq/sKdhgoAg1BVnpqjqUUz5+zedG+AnU+6mjEN2f23YVtRCsW55N4I9eEdW2pxXUaCY85Hj/HPSA74BYaFg==
-  dependencies:
-    "@lerna/collect-updates" "3.10.1"
-    "@lerna/command" "3.10.6"
-    "@lerna/listable" "3.10.6"
-    "@lerna/output" "3.6.0"
-    "@lerna/version" "3.10.6"
-
 "@lerna/changed@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.13.1.tgz#dc92476aad43c932fe741969bbd0bcf6146a4c52"
     "@lerna/output" "3.13.0"
     "@lerna/version" "3.13.1"
 
-"@lerna/check-working-tree@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.10.0.tgz#5ed9f2c5c942bee92afcd8cb5361be44ed0251e3"
-  integrity sha512-NdIPhDgEtGHfeGjB9F0oAoPLywgMpjnJhLLwTNQkelDHo2xNAVpG8kV+A2UJ+cU5UXCZA4RZFxKNmw86rO+Drw==
-  dependencies:
-    "@lerna/describe-ref" "3.10.0"
-    "@lerna/validation-error" "3.6.0"
-
 "@lerna/check-working-tree@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-3.13.0.tgz#1ddcd4d9b1aceb65efaaa4cd1333a66706d67c9c"
     execa "^1.0.0"
     strong-log-transformer "^2.0.0"
 
-"@lerna/child-process@3.3.0":
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-3.3.0.tgz#71184a763105b6c8ece27f43f166498d90fe680f"
-  integrity sha512-q2d/OPlNX/cBXB6Iz1932RFzOmOHq6ZzPjqebkINNaTojHWuuRpvJJY4Uz3NGpJ3kEtPDvBemkZqUBTSO5wb1g==
-  dependencies:
-    chalk "^2.3.1"
-    execa "^1.0.0"
-    strong-log-transformer "^2.0.0"
-
-"@lerna/clean@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.10.6.tgz#31e4a12a722e57ca7adc0c9bc30ba70d55572bb8"
-  integrity sha512-MuL8HOwnyvVtr6GOiAN/Ofjbx+BJdCrtjrM1Uuh8FFnbnZTPVf+0MPxL2jVzPMo0PmoIrX3fvlwvzKNk/lH0Ug==
-  dependencies:
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/prompt" "3.6.0"
-    "@lerna/pulse-till-done" "3.7.1"
-    "@lerna/rimraf-dir" "3.10.0"
-    p-map "^1.2.0"
-    p-map-series "^1.0.0"
-    p-waterfall "^1.0.0"
-
 "@lerna/clean@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.13.1.tgz#9a7432efceccd720a51da5c76f849fc59c5a14ce"
     p-map-series "^1.0.0"
     p-waterfall "^1.0.0"
 
-"@lerna/cli@3.10.7":
-  version "3.10.7"
-  resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.10.7.tgz#2f88ae4a3c53fa4d3a4f61b5f447bbbcc69546e2"
-  integrity sha512-yuoz/24mIfYit3neKqoE5NVs42Rj9A6A6SlkNPDfsy3v/Vh7SgYkU3cwiGyvwBGzIdhqL4/SWYo8H7YJLs0C+g==
-  dependencies:
-    "@lerna/global-options" "3.10.6"
-    dedent "^0.7.0"
-    libnpm "^2.0.1"
-    yargs "^12.0.1"
-
 "@lerna/cli@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-3.13.0.tgz#3d7b357fdd7818423e9681a7b7f2abd106c8a266"
     npmlog "^4.1.2"
     yargs "^12.0.1"
 
-"@lerna/collect-updates@3.10.1":
-  version "3.10.1"
-  resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.10.1.tgz#3ad60aa31826c0c0cfdf8bf41e58e6c5c86aeb3a"
-  integrity sha512-vb0wEJ8k63G+2CR/ud1WeVHNJ21Fs6Ew6lbdGZXnF4ZvaFWxWJZpoHeWwzjhMdJ75QdTzUaIhTG1hnH9faQNMw==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/describe-ref" "3.10.0"
-    libnpm "^2.0.1"
-    minimatch "^3.0.4"
-    slash "^1.0.0"
-
 "@lerna/collect-updates@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-3.13.0.tgz#f0828d84ff959ff153d006765659ffc4d68cdefc"
     npmlog "^4.1.2"
     slash "^1.0.0"
 
-"@lerna/command@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.10.6.tgz#709bd1c66220da67f65dbe1fc88bb7ba5bb85446"
-  integrity sha512-jPZswMZXOpAaIuSF5hrz+eaWQzbDrvwbrkCoRJKfiAHx7URAkE6MQe9DeAnqrTKMqwfg0RciSrZLc8kWYfrzCQ==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/package-graph" "3.10.6"
-    "@lerna/project" "3.10.0"
-    "@lerna/validation-error" "3.6.0"
-    "@lerna/write-log-file" "3.6.0"
-    dedent "^0.7.0"
-    execa "^1.0.0"
-    is-ci "^1.0.10"
-    libnpm "^2.0.1"
-    lodash "^4.17.5"
-
 "@lerna/command@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.13.1.tgz#b60dda2c0d9ffbb6030d61ddf7cceedc1e8f7e6e"
     lodash "^4.17.5"
     npmlog "^4.1.2"
 
-"@lerna/conventional-commits@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.10.0.tgz#284cc16bd3c387f841ff6bec42bcadaa2d13d8e4"
-  integrity sha512-8FvO0eR8g/tEgkb6eRVYaD39TsqMKsOXp17EV48jciciEqcrF/d1Ypu6ilK1GDp6R/1m2mbjt/b52a/qrO+xaw==
-  dependencies:
-    "@lerna/validation-error" "3.6.0"
-    conventional-changelog-angular "^5.0.2"
-    conventional-changelog-core "^3.1.5"
-    conventional-recommended-bump "^4.0.4"
-    fs-extra "^7.0.0"
-    get-stream "^4.0.0"
-    libnpm "^2.0.1"
-    semver "^5.5.0"
-
 "@lerna/conventional-commits@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-3.13.0.tgz#877aa225ca34cca61c31ea02a5a6296af74e1144"
     fs-extra "^7.0.0"
     npmlog "^4.1.2"
 
-"@lerna/create-symlink@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-3.6.0.tgz#f1815cde2fc9d8d2315dfea44ee880f2f1bc65f1"
-  integrity sha512-YG3lTb6zylvmGqKU+QYA3ylSnoLn+FyLH5XZmUsD0i85R884+EyJJeHx/zUk+yrL2ZwHS4RBUgJfC24fqzgPoA==
-  dependencies:
-    cmd-shim "^2.0.2"
-    fs-extra "^7.0.0"
-    libnpm "^2.0.1"
-
-"@lerna/create@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.10.6.tgz#85c7398cad912516c0ac6054a5c0c4145ab6cadb"
-  integrity sha512-OddQtGBHM2/eJONggLWoTE6275XGbnJ6dIVF+fLsKS93o4GC6g+qcc6Y7lUWHm5bfpeOwNOVKwj0tvqBZ6MgoA==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/command" "3.10.6"
-    "@lerna/npm-conf" "3.7.0"
-    "@lerna/validation-error" "3.6.0"
-    camelcase "^4.1.0"
-    dedent "^0.7.0"
-    fs-extra "^7.0.0"
-    globby "^8.0.1"
-    init-package-json "^1.10.3"
-    libnpm "^2.0.1"
-    p-reduce "^1.0.0"
-    pify "^3.0.0"
-    semver "^5.5.0"
-    slash "^1.0.0"
-    validate-npm-package-license "^3.0.3"
-    validate-npm-package-name "^3.0.0"
-    whatwg-url "^7.0.0"
-
 "@lerna/create@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.13.1.tgz#2c1284cfdc59f0d2b88286d78bc797f4ab330f79"
     validate-npm-package-name "^3.0.0"
     whatwg-url "^7.0.0"
 
-"@lerna/describe-ref@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.10.0.tgz#266380feece6013ab9674f52bd35bf0be5b0460d"
-  integrity sha512-fouh3FQS07QxJJp/mW8LkGnH0xMRAzpBlejtZaiRwfDkW2kd6EuHaj8I/2/p21Wsprcvuu4dqmyia2YS1xFb/w==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    libnpm "^2.0.1"
-
 "@lerna/describe-ref@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-3.13.0.tgz#fb4c3863fd6bcccad67ce7b183887a5fc1942bb6"
     "@lerna/child-process" "3.13.0"
     npmlog "^4.1.2"
 
-"@lerna/diff@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.10.6.tgz#b4c5a50d8c7e79619376e2c913ec1c627dfd0cdf"
-  integrity sha512-0MqFhosjrqsIdXiKIu7t3CiJELqiU9mkjFBhYPB7JruAzpPwjMXJnC6/Ur5/7LXJYYVpqGQwZI9ZaZlOYJhhrw==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/command" "3.10.6"
-    "@lerna/validation-error" "3.6.0"
-    libnpm "^2.0.1"
-
 "@lerna/diff@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.13.1.tgz#5c734321b0f6c46a3c87f55c99afef3b01d46520"
     "@lerna/validation-error" "3.13.0"
     npmlog "^4.1.2"
 
-"@lerna/exec@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.10.6.tgz#5564b614b7e39c1f034f5e0736c9e020945f2f12"
-  integrity sha512-cdHqaRBMYceJu8rZLO8b4ZeR27O+xKPHgzi13OOOfBJQjrTuacjMWyHgmpy8jWc/0f7QnTl4VsHks7VJ3UK+vw==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    "@lerna/child-process" "3.3.0"
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/run-parallel-batches" "3.0.0"
-    "@lerna/validation-error" "3.6.0"
-
 "@lerna/exec@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.13.1.tgz#4439e90fb0877ec38a6ef933c86580d43eeaf81b"
     "@lerna/run-parallel-batches" "3.13.0"
     "@lerna/validation-error" "3.13.0"
 
-"@lerna/filter-options@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.10.6.tgz#e05a8b8de6efc16c47c83f0ac58291008efba4b8"
-  integrity sha512-r/dQbqN+RGFKZNn+DyWehswFmAkny/fkdMB2sRM2YVe7zRTtSl95YxD9DtdYnpJTG/jbOVICS/L5QJakrI6SSw==
-  dependencies:
-    "@lerna/collect-updates" "3.10.1"
-    "@lerna/filter-packages" "3.10.0"
-    dedent "^0.7.0"
-
 "@lerna/filter-options@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-3.13.0.tgz#976e3d8b9fcd47001ab981d276565c1e9f767868"
     "@lerna/filter-packages" "3.13.0"
     dedent "^0.7.0"
 
-"@lerna/filter-packages@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.10.0.tgz#75f9a08184fc4046da2057e0218253cd6f493f05"
-  integrity sha512-3Acdj+jbany6LnQSuImU4ttcK5ULHSVug8Gh/EvwTewKCDpHAuoI3eyuzZOnSBdMvDOjE03uIESQK0dNNsn6Ow==
-  dependencies:
-    "@lerna/validation-error" "3.6.0"
-    libnpm "^2.0.1"
-    multimatch "^2.1.0"
-
 "@lerna/filter-packages@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-3.13.0.tgz#f5371249e7e1a15928e5e88c544a242e0162c21c"
   dependencies:
     npmlog "^4.1.2"
 
-"@lerna/get-npm-exec-opts@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.6.0.tgz#ea595eb28d1f34ba61a92ee8391f374282b4b76e"
-  integrity sha512-ruH6KuLlt75aCObXfUIdVJqmfVq7sgWGq5mXa05vc1MEqxTIiU23YiJdWzofQOOUOACaZkzZ4K4Nu7wXEg4Xgg==
-  dependencies:
-    libnpm "^2.0.1"
-
 "@lerna/get-packed@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.13.0.tgz#335e40d77f3c1855aa248587d3e0b2d8f4b06e16"
     ssri "^6.0.1"
     tar "^4.4.8"
 
-"@lerna/get-packed@3.7.0":
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-3.7.0.tgz#549c7738f7be5e3b1433e82ed9cda9123bcd1ed5"
-  integrity sha512-yuFtjsUZIHjeIvIYQ/QuytC+FQcHwo3peB+yGBST2uWCLUCR5rx6knoQcPzbxdFDCuUb5IFccFGd3B1fHFg3RQ==
-  dependencies:
-    fs-extra "^7.0.0"
-    ssri "^6.0.1"
-    tar "^4.4.8"
-
 "@lerna/github-client@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-3.13.1.tgz#cb9bf9f01685a0cee0fac63f287f6c3673e45aa3"
     git-url-parse "^11.1.2"
     npmlog "^4.1.2"
 
-"@lerna/global-options@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.10.6.tgz#c491a64b0be47eca4ffc875011958a5ee70a9a3e"
-  integrity sha512-k5Xkq1M/uREFC2R9uwN5gcvIgjj4iOXo0YyeEXCMWBiW3j2GL9xN4d1MmAIcrYlAzVYh6kLlWaFWl/rNIneHIw==
-
 "@lerna/global-options@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-3.13.0.tgz#217662290db06ad9cf2c49d8e3100ee28eaebae1"
   integrity sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==
 
-"@lerna/has-npm-version@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.10.0.tgz#d3a73c0fedd2f2e9c6fbe166c41809131dc939d2"
-  integrity sha512-N4RRYxGeivuaKgPDzrhkQOQs1Sg4tOnxnEe3akfqu1wDA4Ng5V6Y2uW3DbkAjFL3aNJhWF5Vbf7sBsGtfgDQ8w==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    semver "^5.5.0"
-
 "@lerna/has-npm-version@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-3.13.0.tgz#6e1f7e9336cce3e029066f0175f06dd9d51ad09f"
     "@lerna/child-process" "3.13.0"
     semver "^5.5.0"
 
-"@lerna/import@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.10.6.tgz#36b65854857e8ab5dfd98a1caea4d365ecc06578"
-  integrity sha512-LlGxhfDhovoNoBJLF3PYd3j/G2GFTnfLh0V38+hBQ6lomMNJbjkACfiLVomQxPWWpYLk0GTlpWYR8YGv6L7Ifw==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/command" "3.10.6"
-    "@lerna/prompt" "3.6.0"
-    "@lerna/pulse-till-done" "3.7.1"
-    "@lerna/validation-error" "3.6.0"
-    dedent "^0.7.0"
-    fs-extra "^7.0.0"
-    p-map-series "^1.0.0"
-
 "@lerna/import@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.13.1.tgz#69d641341a38b79bd379129da1c717d51dd728c7"
     fs-extra "^7.0.0"
     p-map-series "^1.0.0"
 
-"@lerna/init@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.10.6.tgz#b5c5166b2ddf00ea0f2742a1f53f59221478cf9a"
-  integrity sha512-RIlEx+ofWLYRNjxCkkV3G0XQPM+/KA5RXRDb5wKQLYO1f+tZAaHoUh8fHDIvxGf/ohY/OIjYYGSsU+ysimfwiQ==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/command" "3.10.6"
-    fs-extra "^7.0.0"
-    p-map "^1.2.0"
-    write-json-file "^2.3.0"
-
 "@lerna/init@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.13.1.tgz#0392c822abb3d63a75be4916c5e761cfa7b34dda"
     p-map "^1.2.0"
     write-json-file "^2.3.0"
 
-"@lerna/link@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.10.6.tgz#4201cabbfc27bebaf1a400f8cfbd238f285dd3c7"
-  integrity sha512-dwD6qftRWitgLDYbqtDrgO7c8uF5C0fHVew5M6gU5m9tBJidqd7cDwHv/bXboLEI63U7tt5y6LY+wEpYUFsBRw==
-  dependencies:
-    "@lerna/command" "3.10.6"
-    "@lerna/package-graph" "3.10.6"
-    "@lerna/symlink-dependencies" "3.10.0"
-    p-map "^1.2.0"
-    slash "^1.0.0"
-
 "@lerna/link@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.13.1.tgz#7d8ed4774bfa198d1780f790a14abb8722a3aad1"
     p-map "^1.2.0"
     slash "^1.0.0"
 
-"@lerna/list@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.10.6.tgz#7c43c09301ea01528f4dab3b22666f021e8ba9a5"
-  integrity sha512-3ElQBj2dOB4uUkpsjC1bxdeZwEzRBuV1pBBs5E1LncwsZf7D9D99Z32fuZsDaCHpEMgHAD4/j8juI3/7m5dkaQ==
-  dependencies:
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/listable" "3.10.6"
-    "@lerna/output" "3.6.0"
-
 "@lerna/list@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.13.1.tgz#f9513ed143e52156c10ada4070f903c5847dcd10"
     "@lerna/listable" "3.13.0"
     "@lerna/output" "3.13.0"
 
-"@lerna/listable@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.10.6.tgz#cea92de89d9f293c6d63e00be662bed03f85c496"
-  integrity sha512-F7ZuvesSgeuMiJf99eOum5p1MQGQStykcmHH1ek+LQRMiGGF1o3PkBxPvHTZBADGOFarek8bFA5TVmRAMX7NIw==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    chalk "^2.3.1"
-    columnify "^1.5.4"
-
 "@lerna/listable@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-3.13.0.tgz#babc18442c590b549cf0966d20d75fea066598d4"
     has-unicode "^2.0.1"
     npmlog "^4.1.2"
 
-"@lerna/log-packed@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-3.6.0.tgz#bed96c2bdd47f076d9957d0c6069b2edc1518145"
-  integrity sha512-T/J41zMkzpWB5nbiTRS5PmYTFn74mJXe6RQA2qhkdLi0UqnTp97Pux1loz3jsJf2yJtiQUnyMM7KuKIAge0Vlw==
-  dependencies:
-    byte-size "^4.0.3"
-    columnify "^1.5.4"
-    has-unicode "^2.0.1"
-    libnpm "^2.0.1"
-
 "@lerna/npm-conf@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.13.0.tgz#6b434ed75ff757e8c14381b9bbfe5d5ddec134a7"
     config-chain "^1.1.11"
     pify "^3.0.0"
 
-"@lerna/npm-conf@3.7.0":
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-3.7.0.tgz#f101d4fdf07cefcf1161bcfaf3c0f105b420a450"
-  integrity sha512-+WSMDfPKcKzMfqq283ydz9RRpOU6p9wfx0wy4hVSUY/6YUpsyuk8SShjcRtY8zTM5AOrxvFBuuV90H4YpZ5+Ng==
-  dependencies:
-    config-chain "^1.1.11"
-    pify "^3.0.0"
-
 "@lerna/npm-dist-tag@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.13.0.tgz#49ecbe0e82cbe4ad4a8ea6de112982bf6c4e6cd4"
     npm-registry-fetch "^3.9.0"
     npmlog "^4.1.2"
 
-"@lerna/npm-dist-tag@3.8.5":
-  version "3.8.5"
-  resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-3.8.5.tgz#5ce22a72576badc8cb6baf85550043d63e66ea44"
-  integrity sha512-VO57yKTB4NC2LZuTd4w0LmlRpoFm/gejQ1gqqLGzSJuSZaBXmieElFovzl21S07cqiy7FNVdz75x7/a6WCZ6XA==
-  dependencies:
-    figgy-pudding "^3.5.1"
-    libnpm "^2.0.1"
-
-"@lerna/npm-install@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.10.0.tgz#fcd6688a3a2cd0e702a03c54c22eb7ae8b3dacb0"
-  integrity sha512-/6/XyLY9/4jaMPBOVYUr4wZxQURIfwoELY0qCQ8gZ5zv4cOiFiiCUxZ0i4fxqFtD7nJ084zq1DsZW0aH0CIWYw==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/get-npm-exec-opts" "3.6.0"
-    fs-extra "^7.0.0"
-    libnpm "^2.0.1"
-    signal-exit "^3.0.2"
-    write-pkg "^3.1.0"
-
 "@lerna/npm-install@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-3.13.0.tgz#88f4cc39f4f737c8a8721256b915ea1bcc6a7227"
     signal-exit "^3.0.2"
     write-pkg "^3.1.0"
 
-"@lerna/npm-publish@3.10.7":
-  version "3.10.7"
-  resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.10.7.tgz#9326b747b905a7f0e69d4be3f557859c3e359649"
-  integrity sha512-oU3/Q+eHC1fRjh7bk6Nn4tRD1OLR6XZVs3v+UWMWMrF4hVSV61pxcP5tpeI1n4gDQjSgh7seI4EzKVJe/WfraA==
-  dependencies:
-    "@lerna/run-lifecycle" "3.10.5"
-    figgy-pudding "^3.5.1"
-    fs-extra "^7.0.0"
-    libnpm "^2.0.1"
-
 "@lerna/npm-publish@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-3.13.0.tgz#5c74808376e778865ffdc5885fe83935e15e60c3"
     pify "^3.0.0"
     read-package-json "^2.0.13"
 
-"@lerna/npm-run-script@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.10.0.tgz#49a9204eddea136da15a8d8d9eba2c3175b77ddd"
-  integrity sha512-c21tBXLF1Wje4tx/Td9jKIMrlZo/8QQiyyadjdKpwyyo7orSMsVNXGyJwvZ4JVVDcwC3GPU6HQvkt63v7rcyaw==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    "@lerna/get-npm-exec-opts" "3.6.0"
-    libnpm "^2.0.1"
-
 "@lerna/npm-run-script@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-3.13.0.tgz#e5997f045402b9948bdc066033ebb36bf94fc9e4"
   dependencies:
     npmlog "^4.1.2"
 
-"@lerna/output@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/output/-/output-3.6.0.tgz#a69384bc685cf3b21aa1bfc697eb2b9db3333d0b"
-  integrity sha512-9sjQouf6p7VQtVCRnzoTGlZyURd48i3ha3WBHC/UBJnHZFuXMqWVPKNuvnMf2kRXDyoQD+2mNywpmEJg5jOnRg==
-  dependencies:
-    libnpm "^2.0.1"
-
-"@lerna/pack-directory@3.10.5":
-  version "3.10.5"
-  resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.10.5.tgz#9bdabceacb74e1f54e47bae925e193978f2aae51"
-  integrity sha512-Ulj24L9XdgjJIxBr6ZjRJEoBULVH3c10lqunUdW41bswXhzhirRtQIxv0+5shngNjDwgMmJfOBcuCVKPSez4tg==
-  dependencies:
-    "@lerna/get-packed" "3.7.0"
-    "@lerna/package" "3.7.2"
-    "@lerna/run-lifecycle" "3.10.5"
-    figgy-pudding "^3.5.1"
-    libnpm "^2.0.1"
-    npm-packlist "^1.1.12"
-    tar "^4.4.8"
-    temp-write "^3.4.0"
-
 "@lerna/pack-directory@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-3.13.1.tgz#5ad4d0945f86a648f565e24d53c1e01bb3a912d1"
     tar "^4.4.8"
     temp-write "^3.4.0"
 
-"@lerna/package-graph@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.10.6.tgz#8940d1ed7003100117cb1b618f7690585c00db81"
-  integrity sha512-mpIOJbhi+xLqT9BcUrLVD4We8WUdousQf/QndbEWl8DWAW1ethtRHVsCm9ufdBB3F9nj4PH/hqnDWWwqE+rS4w==
-  dependencies:
-    "@lerna/validation-error" "3.6.0"
-    libnpm "^2.0.1"
-    semver "^5.5.0"
-
 "@lerna/package-graph@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-3.13.0.tgz#607062f8d2ce22b15f8d4a0623f384736e67f760"
     npm-package-arg "^6.1.0"
     write-pkg "^3.1.0"
 
-"@lerna/package@3.7.2":
-  version "3.7.2"
-  resolved "https://registry.yarnpkg.com/@lerna/package/-/package-3.7.2.tgz#03c69fd7fb965c372c8c969165a2f7d6dfe2dfcb"
-  integrity sha512-8A5hN2CekM1a0Ix4VUO/g+REo+MsnXb8lnQ0bGjr1YGWzSL5NxYJ0Z9+0pwTfDpvRDYlFYO0rMVwBUW44b4dUw==
-  dependencies:
-    libnpm "^2.0.1"
-    load-json-file "^4.0.0"
-    write-pkg "^3.1.0"
-
-"@lerna/project@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.10.0.tgz#98272bf2eb93e9b21850edae568d696bf7fdebda"
-  integrity sha512-9QRl8aGHuyU4zVEELQmNPnJTlS7XHqX7w9I9isCXdnilKc2R0MyvUs21lj6Yyt6xTuQnqD158TR9tbS4QufYQQ==
-  dependencies:
-    "@lerna/package" "3.7.2"
-    "@lerna/validation-error" "3.6.0"
-    cosmiconfig "^5.0.2"
-    dedent "^0.7.0"
-    dot-prop "^4.2.0"
-    glob-parent "^3.1.0"
-    globby "^8.0.1"
-    libnpm "^2.0.1"
-    load-json-file "^4.0.0"
-    p-map "^1.2.0"
-    resolve-from "^4.0.0"
-    write-json-file "^2.3.0"
-
 "@lerna/project@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.13.1.tgz#bce890f60187bd950bcf36c04b5260642e295e79"
     inquirer "^6.2.0"
     npmlog "^4.1.2"
 
-"@lerna/prompt@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-3.6.0.tgz#b17cc464dec9d830619723e879dc747367378217"
-  integrity sha512-nyAjPMolJ/ZRAAVcXrUH89C4n1SiWvLh4xWNvWYKLcf3PI5yges35sDFP/HYrM4+cEbkNFuJCRq6CxaET4PRsg==
-  dependencies:
-    inquirer "^6.2.0"
-    libnpm "^2.0.1"
-
-"@lerna/publish@3.10.7":
-  version "3.10.7"
-  resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.10.7.tgz#8c5a3268398152e1f7993ff7bb6722a0363797af"
-  integrity sha512-Qd8pml2l9s6GIvNX1pTnia+Ddjsm9LF3pRRoOQeugAdv2IJNf45c/83AAEyE9M2ShG5VjgxEITNW4Lg49zipjQ==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    "@lerna/check-working-tree" "3.10.0"
-    "@lerna/child-process" "3.3.0"
-    "@lerna/collect-updates" "3.10.1"
-    "@lerna/command" "3.10.6"
-    "@lerna/describe-ref" "3.10.0"
-    "@lerna/log-packed" "3.6.0"
-    "@lerna/npm-conf" "3.7.0"
-    "@lerna/npm-dist-tag" "3.8.5"
-    "@lerna/npm-publish" "3.10.7"
-    "@lerna/output" "3.6.0"
-    "@lerna/pack-directory" "3.10.5"
-    "@lerna/prompt" "3.6.0"
-    "@lerna/pulse-till-done" "3.7.1"
-    "@lerna/run-lifecycle" "3.10.5"
-    "@lerna/run-parallel-batches" "3.0.0"
-    "@lerna/validation-error" "3.6.0"
-    "@lerna/version" "3.10.6"
-    figgy-pudding "^3.5.1"
-    fs-extra "^7.0.0"
-    libnpm "^2.0.1"
-    p-finally "^1.0.0"
-    p-map "^1.2.0"
-    p-pipe "^1.2.0"
-    p-reduce "^1.0.0"
-    semver "^5.5.0"
-
 "@lerna/publish@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.13.1.tgz#217e401dcb5824cdd6d36555a36303fb7520c514"
   dependencies:
     npmlog "^4.1.2"
 
-"@lerna/pulse-till-done@3.7.1":
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-3.7.1.tgz#a9e55380fa18f6896a3e5b23621a4227adfb8f85"
-  integrity sha512-MzpesZeW3Mc+CiAq4zUt9qTXI9uEBBKrubYHE36voQTSkHvu/Rox6YOvfUr+U7P6k8frFPeCgGpfMDTLhiqe6w==
-  dependencies:
-    libnpm "^2.0.1"
-
 "@lerna/resolve-symlink@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.13.0.tgz#3e6809ef53b63fe914814bfa071cd68012e22fbb"
     npmlog "^4.1.2"
     read-cmd-shim "^1.0.1"
 
-"@lerna/resolve-symlink@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-3.6.0.tgz#985344796b704ff32afa923901e795e80741b86e"
-  integrity sha512-TVOAEqHJSQVhNDMFCwEUZPaOETqHDQV1TQWQfC8ZlOqyaUQ7veZUbg0yfG7RPNzlSpvF0ZaGFeR0YhYDAW03GA==
-  dependencies:
-    fs-extra "^7.0.0"
-    libnpm "^2.0.1"
-    read-cmd-shim "^1.0.1"
-
-"@lerna/rimraf-dir@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.10.0.tgz#2d9435054ab7bbc5519db0a2654c5d8cacd27f98"
-  integrity sha512-RSKSfxPURc58ERCD/PuzorR86lWEvIWNclXYGvIYM76yNGrWiDF44pGHQvB4J+Lxa5M+52ZtZC/eOC7A7YCH4g==
-  dependencies:
-    "@lerna/child-process" "3.3.0"
-    libnpm "^2.0.1"
-    path-exists "^3.0.0"
-    rimraf "^2.6.2"
-
 "@lerna/rimraf-dir@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-3.13.0.tgz#bb1006104b4aabcb6985624273254648f872b278"
     path-exists "^3.0.0"
     rimraf "^2.6.2"
 
-"@lerna/run-lifecycle@3.10.5":
-  version "3.10.5"
-  resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.10.5.tgz#ea4422bb70c0f8d4382ecb2a626c8ba0ca88550b"
-  integrity sha512-YPmXviaxVlhcKM6IkDTIpTq24mxOuMCilo+MTr1RLoafgB9ZTmP2AHRiFt/sy14wOsq2Zqr0wJyj8KFlDYLTkA==
-  dependencies:
-    "@lerna/npm-conf" "3.7.0"
-    figgy-pudding "^3.5.1"
-    libnpm "^2.0.1"
-
 "@lerna/run-lifecycle@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-3.13.0.tgz#d8835ee83425edee40f687a55f81b502354d3261"
     npm-lifecycle "^2.1.0"
     npmlog "^4.1.2"
 
-"@lerna/run-parallel-batches@3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz#468704934084c74991d3124d80607857d4dfa840"
-  integrity sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==
-  dependencies:
-    p-map "^1.2.0"
-    p-map-series "^1.0.0"
-
 "@lerna/run-parallel-batches@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/run-parallel-batches/-/run-parallel-batches-3.13.0.tgz#0276bb4e7cd0995297db82d134ca2bd08d63e311"
     p-map "^1.2.0"
     p-map-series "^1.0.0"
 
-"@lerna/run@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.10.6.tgz#4c159a719b0ec010409dfe8f9535c9a3c3f3e06a"
-  integrity sha512-KS2lWbu/8WUUscQPi9U8sPO6yYpzf/0GmODjpruR1nRi1u/tuncdjTiG+hjGAeFC1BD7YktT9Za6imIpE8RXmA==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    "@lerna/command" "3.10.6"
-    "@lerna/filter-options" "3.10.6"
-    "@lerna/npm-run-script" "3.10.0"
-    "@lerna/output" "3.6.0"
-    "@lerna/run-parallel-batches" "3.0.0"
-    "@lerna/timer" "3.5.0"
-    "@lerna/validation-error" "3.6.0"
-    p-map "^1.2.0"
-
 "@lerna/run@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.13.1.tgz#87e174c1d271894ddd29adc315c068fb7b1b0117"
     "@lerna/validation-error" "3.13.0"
     p-map "^1.2.0"
 
-"@lerna/symlink-binary@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.10.0.tgz#5acdde86dfd50c9270d7d2a93bade203cff41b3d"
-  integrity sha512-6mQsG+iVjBo8cD8s24O+YgFrwDyUGfUQbK4ryalAXFHI817Zd4xlI3tjg3W99whCt6rt6D0s1fpf8eslMN6dSw==
-  dependencies:
-    "@lerna/create-symlink" "3.6.0"
-    "@lerna/package" "3.7.2"
-    fs-extra "^7.0.0"
-    p-map "^1.2.0"
-
 "@lerna/symlink-binary@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-3.13.0.tgz#36a9415d468afcb8105750296902f6f000a9680d"
     fs-extra "^7.0.0"
     p-map "^1.2.0"
 
-"@lerna/symlink-dependencies@3.10.0":
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.10.0.tgz#a20226e8e97af6a6bc4b416bfc28c0c5e3ba9ddd"
-  integrity sha512-vGpg5ydwGgQCuWNX5y7CRL38mGpuLhf1GRq9wMm7IGwnctEsdSNqvvE+LDgqtwEZASu5+vffYUkL0VlFXl8uWA==
-  dependencies:
-    "@lerna/create-symlink" "3.6.0"
-    "@lerna/resolve-symlink" "3.6.0"
-    "@lerna/symlink-binary" "3.10.0"
-    fs-extra "^7.0.0"
-    p-finally "^1.0.0"
-    p-map "^1.2.0"
-    p-map-series "^1.0.0"
-
 "@lerna/symlink-dependencies@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-3.13.0.tgz#76c23ecabda7824db98a0561364f122b457509cf"
   resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.13.0.tgz#bcd0904551db16e08364d6c18e5e2160fc870781"
   integrity sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==
 
-"@lerna/timer@3.5.0":
-  version "3.5.0"
-  resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-3.5.0.tgz#8dee6acf002c55de64678c66ef37ca52143f1b9b"
-  integrity sha512-TAb99hqQN6E3JBGtG9iyZNPq1/DbmqgBOeNrKtdJsGvIeX/NGLgUDWMrj2h04V4O+jpBFmSf6HIld6triKmxCA==
-
 "@lerna/validation-error@3.13.0":
   version "3.13.0"
   resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.13.0.tgz#c86b8f07c5ab9539f775bd8a54976e926f3759c3"
   dependencies:
     npmlog "^4.1.2"
 
-"@lerna/validation-error@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-3.6.0.tgz#550cf66bb2ef88edc02e36017b575a7a9100d5d8"
-  integrity sha512-MWltncGO5VgMS0QedTlZCjFUMF/evRjDMMHrtVorkIB2Cp5xy0rkKa8iDBG43qpUWeG1giwi58yUlETBcWfILw==
-  dependencies:
-    libnpm "^2.0.1"
-
-"@lerna/version@3.10.6":
-  version "3.10.6"
-  resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.10.6.tgz#c31c2bb1aabbdc851407534155567b5cdf48e0fb"
-  integrity sha512-77peW2ROlHHl1e/tHBUmhpb8tsO6CIdlx34XapZhUuIVykrkOuqVFFxqMecrGG8SJe0e3l1G+Fah7bJTQcG0kw==
-  dependencies:
-    "@lerna/batch-packages" "3.10.6"
-    "@lerna/check-working-tree" "3.10.0"
-    "@lerna/child-process" "3.3.0"
-    "@lerna/collect-updates" "3.10.1"
-    "@lerna/command" "3.10.6"
-    "@lerna/conventional-commits" "3.10.0"
-    "@lerna/output" "3.6.0"
-    "@lerna/prompt" "3.6.0"
-    "@lerna/run-lifecycle" "3.10.5"
-    "@lerna/validation-error" "3.6.0"
-    chalk "^2.3.1"
-    dedent "^0.7.0"
-    libnpm "^2.0.1"
-    minimatch "^3.0.4"
-    p-map "^1.2.0"
-    p-pipe "^1.2.0"
-    p-reduce "^1.0.0"
-    p-waterfall "^1.0.0"
-    semver "^5.5.0"
-    slash "^1.0.0"
-    temp-write "^3.4.0"
-
 "@lerna/version@3.13.1":
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.13.1.tgz#5e919d13abb13a663dcc7922bb40931f12fb137b"
     npmlog "^4.1.2"
     write-file-atomic "^2.3.0"
 
-"@lerna/write-log-file@3.6.0":
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-3.6.0.tgz#b8d5a7efc84fa93cbd67d724d11120343b2a849a"
-  integrity sha512-OkLK99V6sYXsJsYg+O9wtiFS3z6eUPaiz2e6cXJt80mfIIdI1t2dnmyua0Ib5cZWExQvx2z6Y32Wlf0MnsoNsA==
-  dependencies:
-    libnpm "^2.0.1"
-    write-file-atomic "^2.3.0"
-
 "@material-ui/core@3.8.3":
   version "3.8.3"
   resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.8.3.tgz#5173ceb114e781b01d239a02d851ff6ffbdbc0b0"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
 "@octokit/endpoint@^3.1.1":
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.2.tgz#22b5aa8596482fbefc3f1ce22c24ad217aed60fa"
-  integrity sha512-iRx4kDYybAv9tOrHDBE6HwlgiFi8qmbZl8SHliZWtxbUFuXLZXh2yv8DxGIK9wzD9J0wLDMZneO8vNYJNUSJ9Q==
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.3.tgz#f6e9c2521b83b74367600e474b24efec2b0471c4"
+  integrity sha512-vAWzeoj9Lzpl3V3YkWKhGzmDUoMfKpyxJhpq74/ohMvmLXDoEuAGnApy/7TRi3OmnjyX2Lr+e9UGGAD0919ohA==
   dependencies:
-    deepmerge "3.1.0"
+    deepmerge "3.2.0"
     is-plain-object "^2.0.4"
     universal-user-agent "^2.0.1"
     url-template "^2.0.8"
@@ -2460,12 +1887,12 @@ append-transform@^0.4.0:
   dependencies:
     default-require-extensions "^1.0.0"
 
-aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2:
+aproba@^1.0.3, aproba@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
-"aproba@^1.1.2 || 2", aproba@^2.0.0:
+aproba@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
   integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
@@ -2666,7 +2093,7 @@ aws4@^1.6.0, aws4@^1.8.0:
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
   integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
 
-babel-code-frame@^6.26.0:
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
   integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
@@ -2882,17 +2309,6 @@ big.js@^3.1.3:
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
   integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
 
-bin-links@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757"
-  integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==
-  dependencies:
-    bluebird "^3.5.0"
-    cmd-shim "^2.0.2"
-    gentle-fs "^2.0.0"
-    graceful-fs "^4.1.11"
-    write-file-atomic "^2.3.0"
-
 binary-extensions@^1.0.0:
   version "1.12.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
@@ -2905,16 +2321,16 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
-bluebird@^3.5.0, bluebird@^3.5.3:
-  version "3.5.3"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
-  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
-
 bluebird@^3.5.1:
   version "3.5.2"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
   integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==
 
+bluebird@^3.5.3:
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
+
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@@ -3124,7 +2540,7 @@ buffer@^4.3.0:
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
-builtin-modules@^1.0.0:
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
   integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
@@ -3525,6 +2941,11 @@ commander@2.17.x, commander@~2.17.1:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
   integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
+commander@^2.12.1:
+  version "2.19.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+  integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -3618,14 +3039,6 @@ content-type@~1.0.4:
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
   integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 
-conventional-changelog-angular@^5.0.2:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz#39d945635e03b6d0c9d4078b1df74e06163dc66a"
-  integrity sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==
-  dependencies:
-    compare-func "^1.3.1"
-    q "^1.5.1"
-
 conventional-changelog-angular@^5.0.3:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0"
@@ -3634,25 +3047,6 @@ conventional-changelog-angular@^5.0.3:
     compare-func "^1.3.1"
     q "^1.5.1"
 
-conventional-changelog-core@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.1.5.tgz#c2edf928539308b54fe1b90a2fc731abc021852c"
-  integrity sha512-iwqAotS4zk0wA4S84YY1JCUG7X3LxaRjJxuUo6GI4dZuIy243j5nOg/Ora35ExT4DOiw5dQbMMQvw2SUjh6moQ==
-  dependencies:
-    conventional-changelog-writer "^4.0.2"
-    conventional-commits-parser "^3.0.1"
-    dateformat "^3.0.0"
-    get-pkg-repo "^1.0.0"
-    git-raw-commits "2.0.0"
-    git-remote-origin-url "^2.0.0"
-    git-semver-tags "^2.0.2"
-    lodash "^4.2.1"
-    normalize-package-data "^2.3.5"
-    q "^1.5.1"
-    read-pkg "^3.0.0"
-    read-pkg-up "^3.0.0"
-    through2 "^2.0.0"
-
 conventional-changelog-core@^3.1.6:
   version "3.1.6"
   resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.1.6.tgz#ac1731a461c50d150d29c1ad4f33143293bcd32f"
@@ -3677,22 +3071,6 @@ conventional-changelog-preset-loader@^2.0.2:
   resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.2.tgz#81d1a07523913f3d17da3a49f0091f967ad345b0"
   integrity sha512-pBY+qnUoJPXAXXqVGwQaVmcye05xi6z231QM98wHWamGAmu/ghkBprQAwmF5bdmyobdVxiLhPY3PrCfSeUNzRQ==
 
-conventional-changelog-writer@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz#eb493ed84269e7a663da36e49af51c54639c9a67"
-  integrity sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==
-  dependencies:
-    compare-func "^1.3.1"
-    conventional-commits-filter "^2.0.1"
-    dateformat "^3.0.0"
-    handlebars "^4.0.2"
-    json-stringify-safe "^5.0.1"
-    lodash "^4.2.1"
-    meow "^4.0.0"
-    semver "^5.5.0"
-    split "^1.0.0"
-    through2 "^2.0.0"
-
 conventional-changelog-writer@^4.0.3:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz#916a2b302d0bb5ef18efd236a034c13fb273cde1"
@@ -3827,16 +3205,6 @@ cosmiconfig@^4.0.0:
     parse-json "^4.0.0"
     require-from-string "^2.0.1"
 
-cosmiconfig@^5.0.2:
-  version "5.0.7"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
-  integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
-  dependencies:
-    import-fresh "^2.0.0"
-    is-directory "^0.3.1"
-    js-yaml "^3.9.0"
-    parse-json "^4.0.0"
-
 cosmiconfig@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.1.0.tgz#6c5c35e97f37f985061cdf653f114784231185cf"
@@ -4045,7 +3413,7 @@ debounce@^1.1.0:
   resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
   integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==
 
-debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9:
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -4066,6 +3434,20 @@ debug@^3.1.0:
   dependencies:
     ms "^2.1.1"
 
+debug@^3.2.5:
+  version "3.2.6"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+  dependencies:
+    ms "^2.1.1"
+
+debug@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+  dependencies:
+    ms "^2.1.1"
+
 debuglog@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
@@ -4116,16 +3498,21 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-deepmerge@3.1.0, deepmerge@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.1.0.tgz#a612626ce4803da410d77554bfd80361599c034d"
-  integrity sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg==
+deepmerge@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e"
+  integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==
 
 deepmerge@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
   integrity sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w==
 
+deepmerge@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.1.0.tgz#a612626ce4803da410d77554bfd80361599c034d"
+  integrity sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg==
+
 default-gateway@^2.6.0:
   version "2.7.2"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f"
@@ -4249,7 +3636,7 @@ detect-newline@^2.1.0:
   resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
   integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
 
-detect-node@^2.0.3:
+detect-node@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
   integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
@@ -4304,6 +3691,14 @@ dns-txt@^2.0.2:
   dependencies:
     buffer-indexof "^1.0.0"
 
+doctrine@0.7.2, doctrine@^0.7.2:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
+  integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=
+  dependencies:
+    esutils "^1.1.6"
+    isarray "0.0.1"
+
 dom-converter@~0.1:
   version "0.1.4"
   resolved "http://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
@@ -4523,9 +3918,9 @@ es-to-primitive@^1.1.1:
     is-symbol "^1.0.1"
 
 es6-promise@^4.0.3:
-  version "4.2.5"
-  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
-  integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
+  version "4.2.6"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f"
+  integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==
 
 es6-promisify@^5.0.0:
   version "5.0.0"
@@ -4586,6 +3981,11 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
   integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
 
+esutils@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
+  integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=
+
 esutils@^2.0.0, esutils@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -4606,12 +4006,12 @@ events@^1.0.0:
   resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
   integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
 
-eventsource@0.1.6:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
-  integrity sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=
+eventsource@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
+  integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
   dependencies:
-    original ">=0.0.5"
+    original "^1.0.0"
 
 evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
   version "1.0.3"
@@ -4868,7 +4268,7 @@ faye-websocket@^0.10.0:
   dependencies:
     websocket-driver ">=0.5.1"
 
-faye-websocket@~0.11.0:
+faye-websocket@~0.11.1:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
   integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=
@@ -4980,11 +4380,6 @@ find-cache-dir@^2.0.0:
     make-dir "^1.0.0"
     pkg-dir "^3.0.0"
 
-find-npm-prefix@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
-  integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==
-
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -5111,15 +4506,6 @@ fs-minipass@^1.2.5:
   dependencies:
     minipass "^2.2.1"
 
-fs-vacuum@^1.2.10:
-  version "1.2.10"
-  resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
-  integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY=
-  dependencies:
-    graceful-fs "^4.1.2"
-    path-is-inside "^1.0.1"
-    rimraf "^2.5.2"
-
 fs-write-stream-atomic@^1.0.8:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -5192,25 +4578,16 @@ genfun@^5.0.0:
   resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
   integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
 
-gentle-fs@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687"
-  integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==
-  dependencies:
-    aproba "^1.1.2"
-    fs-vacuum "^1.2.10"
-    graceful-fs "^4.1.11"
-    iferr "^0.1.5"
-    mkdirp "^0.5.1"
-    path-is-inside "^1.0.2"
-    read-cmd-shim "^1.0.1"
-    slide "^1.1.6"
-
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
   integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
 
+get-caller-file@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.1.tgz#25835260d3a2b9665fcdbb08cb039a7bbf7011c0"
+  integrity sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==
+
 get-pkg-repo@^1.0.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d"
@@ -5450,12 +4827,12 @@ growly@^1.3.0:
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
   integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
 
-handle-thing@^1.2.5:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
-  integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=
+handle-thing@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
+  integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
 
-handlebars@^4.0.2, handlebars@^4.0.3:
+handlebars@^4.0.3:
   version "4.0.12"
   resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
   integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==
@@ -5969,7 +5346,7 @@ inherits@2.0.1:
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
   integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
 
-ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
+ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
   integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@@ -6027,6 +5404,11 @@ invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
   dependencies:
     loose-envify "^1.0.0"
 
+inversify@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e"
+  integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==
+
 invert-kv@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
@@ -7085,29 +6467,6 @@ left-pad@^1.3.0:
   resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
   integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
 
-lerna@^3.10.7:
-  version "3.10.7"
-  resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.10.7.tgz#9d308b1fee1697f89fe90e6bc37e51c03b531557"
-  integrity sha512-ha/dehl/L3Nw0pbdir5z6Hrv2oYBg5ym2fTcuk8HCLe7Zdb/ylIHdrgW8CU9eTVZkwr4et8RdVtxFA/+xa65/Q==
-  dependencies:
-    "@lerna/add" "3.10.6"
-    "@lerna/bootstrap" "3.10.6"
-    "@lerna/changed" "3.10.6"
-    "@lerna/clean" "3.10.6"
-    "@lerna/cli" "3.10.7"
-    "@lerna/create" "3.10.6"
-    "@lerna/diff" "3.10.6"
-    "@lerna/exec" "3.10.6"
-    "@lerna/import" "3.10.6"
-    "@lerna/init" "3.10.6"
-    "@lerna/link" "3.10.6"
-    "@lerna/list" "3.10.6"
-    "@lerna/publish" "3.10.7"
-    "@lerna/run" "3.10.6"
-    "@lerna/version" "3.10.6"
-    import-local "^1.0.0"
-    libnpm "^2.0.1"
-
 lerna@^3.13.1:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.13.1.tgz#feaff562176f304bd82329ca29ce46ab6c033463"
@@ -7169,32 +6528,6 @@ levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-libnpm@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/libnpm/-/libnpm-2.0.1.tgz#a48fcdee3c25e13c77eb7c60a0efe561d7fb0d8f"
-  integrity sha512-qTKoxyJvpBxHZQB6k0AhSLajyXq9ZE/lUsZzuHAplr2Bpv9G+k4YuYlExYdUCeVRRGqcJt8hvkPh4tBwKoV98w==
-  dependencies:
-    bin-links "^1.1.2"
-    bluebird "^3.5.3"
-    find-npm-prefix "^1.0.2"
-    libnpmaccess "^3.0.1"
-    libnpmconfig "^1.2.1"
-    libnpmhook "^5.0.2"
-    libnpmorg "^1.0.0"
-    libnpmpublish "^1.1.0"
-    libnpmsearch "^2.0.0"
-    libnpmteam "^1.0.1"
-    lock-verify "^2.0.2"
-    npm-lifecycle "^2.1.0"
-    npm-logical-tree "^1.2.1"
-    npm-package-arg "^6.1.0"
-    npm-profile "^4.0.1"
-    npm-registry-fetch "^3.8.0"
-    npmlog "^4.1.2"
-    pacote "^9.2.3"
-    read-package-json "^2.0.13"
-    stringify-package "^1.0.0"
-
 libnpmaccess@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-3.0.1.tgz#5b3a9de621f293d425191aa2e779102f84167fa8"
@@ -7205,36 +6538,7 @@ libnpmaccess@^3.0.1:
     npm-package-arg "^6.1.0"
     npm-registry-fetch "^3.8.0"
 
-libnpmconfig@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0"
-  integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==
-  dependencies:
-    figgy-pudding "^3.5.1"
-    find-up "^3.0.0"
-    ini "^1.3.5"
-
-libnpmhook@^5.0.2:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-5.0.2.tgz#d12817b0fb893f36f1d5be20017f2aea25825d94"
-  integrity sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g==
-  dependencies:
-    aproba "^2.0.0"
-    figgy-pudding "^3.4.1"
-    get-stream "^4.0.0"
-    npm-registry-fetch "^3.8.0"
-
-libnpmorg@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-1.0.0.tgz#979b868c48ba28c5820e3bb9d9e73c883c16a232"
-  integrity sha512-o+4eVJBoDGMgRwh2lJY0a8pRV2c/tQM/SxlqXezjcAg26Qe9jigYVs+Xk0vvlYDWCDhP0g74J8UwWeAgsB7gGw==
-  dependencies:
-    aproba "^2.0.0"
-    figgy-pudding "^3.4.1"
-    get-stream "^4.0.0"
-    npm-registry-fetch "^3.8.0"
-
-libnpmpublish@^1.1.0, libnpmpublish@^1.1.1:
+libnpmpublish@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-1.1.1.tgz#ff0c6bb0b4ad2bda2ad1f5fba6760a4af37125f0"
   integrity sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g==
@@ -7249,25 +6553,6 @@ libnpmpublish@^1.1.0, libnpmpublish@^1.1.1:
     semver "^5.5.1"
     ssri "^6.0.1"
 
-libnpmsearch@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-2.0.0.tgz#de05af47ada81554a5f64276a69599070d4a5685"
-  integrity sha512-vd+JWbTGzOSfiOc+72MU6y7WqmBXn49egCCrIXp27iE/88bX8EpG64ST1blWQI1bSMUr9l1AKPMVsqa2tS5KWA==
-  dependencies:
-    figgy-pudding "^3.5.1"
-    get-stream "^4.0.0"
-    npm-registry-fetch "^3.8.0"
-
-libnpmteam@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-1.0.1.tgz#ff704b1b6c06ea674b3b1101ac3e305f5114f213"
-  integrity sha512-gDdrflKFCX7TNwOMX1snWojCoDE5LoRWcfOC0C/fqF7mBq8Uz9zWAX4B2RllYETNO7pBupBaSyBDkTAC15cAMg==
-  dependencies:
-    aproba "^2.0.0"
-    figgy-pudding "^3.4.1"
-    get-stream "^4.0.0"
-    npm-registry-fetch "^3.8.0"
-
 lightercollective@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300"
@@ -7344,14 +6629,6 @@ locate-path@^3.0.0:
     p-locate "^3.0.0"
     path-exists "^3.0.0"
 
-lock-verify@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.0.2.tgz#148e4f85974915c9e3c34d694b7de9ecb18ee7a8"
-  integrity sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==
-  dependencies:
-    npm-package-arg "^5.1.2 || 6"
-    semver "^5.4.1"
-
 lodash._reinterpolate@~3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -8159,12 +7436,12 @@ nopt@^4.0.1:
     osenv "^0.1.4"
 
 normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0:
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2"
-  integrity sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw==
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
   dependencies:
     hosted-git-info "^2.1.4"
-    is-builtin-module "^1.0.0"
+    resolve "^1.10.0"
     semver "2 || 3 || 4 || 5"
     validate-npm-package-license "^3.0.1"
 
@@ -8224,12 +7501,7 @@ npm-lifecycle@^2.1.0:
     umask "^1.1.0"
     which "^1.3.1"
 
-npm-logical-tree@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88"
-  integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==
-
-"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", "npm-package-arg@^5.1.2 || 6", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
   integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==
@@ -8239,10 +7511,10 @@ npm-logical-tree@^1.2.1:
     semver "^5.5.0"
     validate-npm-package-name "^3.0.0"
 
-npm-packlist@^1.1.12:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f"
-  integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==
+npm-packlist@^1.1.12, npm-packlist@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
+  integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
   dependencies:
     ignore-walk "^3.0.1"
     npm-bundled "^1.0.1"
@@ -8255,14 +7527,6 @@ npm-packlist@^1.1.6:
     ignore-walk "^3.0.1"
     npm-bundled "^1.0.1"
 
-npm-packlist@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
-  integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
-  dependencies:
-    ignore-walk "^3.0.1"
-    npm-bundled "^1.0.1"
-
 npm-pick-manifest@^2.2.3:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40"
@@ -8272,15 +7536,6 @@ npm-pick-manifest@^2.2.3:
     npm-package-arg "^6.0.0"
     semver "^5.4.1"
 
-npm-profile@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.1.tgz#d350f7a5e6b60691c7168fbb8392c3603583f5aa"
-  integrity sha512-NQ1I/1Q7YRtHZXkcuU1/IyHeLy6pd+ScKg4+DQHdfsm769TGq6HPrkbuNJVJS4zwE+0mvvmeULzQdWn2L2EsVA==
-  dependencies:
-    aproba "^1.1.2 || 2"
-    figgy-pudding "^3.4.1"
-    npm-registry-fetch "^3.8.0"
-
 npm-registry-fetch@^3.8.0, npm-registry-fetch@^3.9.0:
   version "3.9.0"
   resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856"
@@ -8391,7 +7646,7 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-obuf@^1.0.0, obuf@^1.1.1:
+obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
   integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
@@ -8459,7 +7714,7 @@ optionator@^0.8.1:
     type-check "~0.3.2"
     wordwrap "~1.0.0"
 
-original@>=0.0.5:
+original@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
   integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
@@ -8604,39 +7859,6 @@ p-waterfall@^1.0.0:
   dependencies:
     p-reduce "^1.0.0"
 
-pacote@^9.2.3:
-  version "9.4.1"
-  resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.4.1.tgz#f0af2a52d241bce523d39280ac810c671db62279"
-  integrity sha512-YKSRsQqmeHxgra0KCdWA2FtVxDPUlBiCdmew+mSe44pzlx5t1ViRMWiQg18T+DREA+vSqYfKzynaToFR4hcKHw==
-  dependencies:
-    bluebird "^3.5.3"
-    cacache "^11.3.2"
-    figgy-pudding "^3.5.1"
-    get-stream "^4.1.0"
-    glob "^7.1.3"
-    lru-cache "^5.1.1"
-    make-fetch-happen "^4.0.1"
-    minimatch "^3.0.4"
-    minipass "^2.3.5"
-    mississippi "^3.0.0"
-    mkdirp "^0.5.1"
-    normalize-package-data "^2.4.0"
-    npm-package-arg "^6.1.0"
-    npm-packlist "^1.1.12"
-    npm-pick-manifest "^2.2.3"
-    npm-registry-fetch "^3.8.0"
-    osenv "^0.1.5"
-    promise-inflight "^1.0.1"
-    promise-retry "^1.1.1"
-    protoduck "^5.0.1"
-    rimraf "^2.6.2"
-    safe-buffer "^5.1.2"
-    semver "^5.6.0"
-    ssri "^6.0.1"
-    tar "^4.4.8"
-    unique-filename "^1.1.1"
-    which "^1.3.1"
-
 pacote@^9.5.0:
   version "9.5.0"
   resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.0.tgz#85f3013a3f6dd51c108b0ccabd3de8102ddfaeda"
@@ -8797,7 +8019,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+path-is-inside@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
   integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
@@ -9370,9 +8592,9 @@ read-cmd-shim@^1.0.1:
     graceful-fs "^4.1.2"
 
 read-package-tree@^5.1.6:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63"
-  integrity sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.2.tgz#4b6a0ef2d943c1ea36a578214c9a7f6b7424f7a8"
+  integrity sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA==
   dependencies:
     debuglog "^1.0.1"
     dezalgo "^1.0.0"
@@ -9421,7 +8643,7 @@ read@1, read@~1.0.1:
   dependencies:
     mute-stream "~0.0.4"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
   version "2.3.6"
   resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -9444,6 +8666,15 @@ readable-stream@1.0:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
+readable-stream@^3.0.6:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06"
+  integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
 readdir-scoped-modules@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
@@ -9498,6 +8729,11 @@ redent@^2.0.0:
     indent-string "^3.0.0"
     strip-indent "^2.0.0"
 
+reflect-metadata@^0.1.12:
+  version "0.1.13"
+  resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+  integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
 regenerate-unicode-properties@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
@@ -9765,7 +9001,7 @@ resolve@1.1.7:
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
   integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
 
-resolve@1.x:
+resolve@1.x, resolve@^1.10.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
   integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
@@ -9804,13 +9040,6 @@ rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6
   dependencies:
     glob "^7.0.5"
 
-rimraf@^2.5.2:
-  version "2.6.3"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
-  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
-  dependencies:
-    glob "^7.1.3"
-
 ripemd160@^2.0.0, ripemd160@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -10150,17 +9379,17 @@ snapdragon@^0.8.1:
     source-map-resolve "^0.5.0"
     use "^3.1.0"
 
-sockjs-client@1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83"
-  integrity sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=
+sockjs-client@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177"
+  integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==
   dependencies:
-    debug "^2.6.6"
-    eventsource "0.1.6"
-    faye-websocket "~0.11.0"
-    inherits "^2.0.1"
+    debug "^3.2.5"
+    eventsource "^1.0.7"
+    faye-websocket "~0.11.1"
+    inherits "^2.0.3"
     json3 "^3.3.2"
-    url-parse "^1.1.8"
+    url-parse "^1.4.3"
 
 sockjs@0.3.19:
   version "0.3.19"
@@ -10272,30 +9501,28 @@ spdx-license-ids@^3.0.0:
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f"
   integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==
 
-spdy-transport@^2.0.18:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1"
-  integrity sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==
+spdy-transport@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+  integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
   dependencies:
-    debug "^2.6.8"
-    detect-node "^2.0.3"
+    debug "^4.1.0"
+    detect-node "^2.0.4"
     hpack.js "^2.1.6"
-    obuf "^1.1.1"
-    readable-stream "^2.2.9"
-    safe-buffer "^5.0.1"
-    wbuf "^1.7.2"
+    obuf "^1.1.2"
+    readable-stream "^3.0.6"
+    wbuf "^1.7.3"
 
-spdy@^3.4.1:
-  version "3.4.7"
-  resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
-  integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=
+spdy@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
+  integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
   dependencies:
-    debug "^2.6.8"
-    handle-thing "^1.2.5"
+    debug "^4.1.0"
+    handle-thing "^2.0.0"
     http-deceiver "^1.2.7"
-    safe-buffer "^5.0.1"
     select-hose "^2.0.0"
-    spdy-transport "^2.0.18"
+    spdy-transport "^3.0.0"
 
 split-string@^3.0.1, split-string@^3.0.2:
   version "3.1.0"
@@ -10452,16 +9679,18 @@ string_decoder@^1.0.0, string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
+string_decoder@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
+  integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
+  dependencies:
+    safe-buffer "~5.1.0"
+
 string_decoder@~0.10.x:
   version "0.10.31"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
   integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
 
-stringify-package@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b"
-  integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==
-
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -10851,11 +10080,128 @@ ts-loader@5.2.1:
     micromatch "^3.1.4"
     semver "^5.0.1"
 
-tslib@^1.9.0:
+tslib@1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
+  integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==
+
+tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
   integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
 
+tslint-config-airbnb-base@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/tslint-config-airbnb-base/-/tslint-config-airbnb-base-0.2.0.tgz#d3398daa62df820734f56dee801b79b69def4765"
+  integrity sha512-aYkkvnnaAioFEME6FaMSsKgZvU3hsTbnTuVa3I5y4/SK2CpPOIh1xo9daTBgxhvmpXuFApI1g4zgdUQwf0vyzQ==
+  dependencies:
+    tslint-consistent-codestyle "^1.13.2"
+    tslint-eslint-rules "^5.3.1"
+
+tslint-config-airbnb@5.11.1:
+  version "5.11.1"
+  resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz#51a27fbb8bf24c144d064a274a71da47e7ece617"
+  integrity sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ==
+  dependencies:
+    tslint-consistent-codestyle "^1.14.1"
+    tslint-eslint-rules "^5.4.0"
+    tslint-microsoft-contrib "~5.2.1"
+
+tslint-config-prettier@1.17.0:
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz#946ed6117f98f3659a65848279156d87628c33dc"
+  integrity sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==
+
+tslint-consistent-codestyle@^1.13.2, tslint-consistent-codestyle@^1.14.1:
+  version "1.15.0"
+  resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.0.tgz#a3acf8d0a3ca0dc7d1285705102ba1fe4a17c4cb"
+  integrity sha512-6BNDBbZh2K0ibRXe70Mkl9gfVttxQ3t3hqV1BRDfpIcjrUoOgD946iH4SrXp+IggDgeMs3dJORjD5tqL5j4jXg==
+  dependencies:
+    "@fimbul/bifrost" "^0.17.0"
+    tslib "^1.7.1"
+    tsutils "^2.29.0"
+
+tslint-eslint-rules@4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba"
+  integrity sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=
+  dependencies:
+    doctrine "^0.7.2"
+    tslib "^1.0.0"
+    tsutils "^1.4.0"
+
+tslint-eslint-rules@^5.3.1, tslint-eslint-rules@^5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5"
+  integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==
+  dependencies:
+    doctrine "0.7.2"
+    tslib "1.9.0"
+    tsutils "^3.0.0"
+
+tslint-microsoft-contrib@~5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81"
+  integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==
+  dependencies:
+    tsutils "^2.27.2 <2.29.0"
+
+tslint-react-recommended@1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/tslint-react-recommended/-/tslint-react-recommended-1.0.15.tgz#4166dc7d87b57280110673c99315a35ac5a76a7e"
+  integrity sha1-QWbcfYe1coARBnPJkxWjWsWnan4=
+
+tslint-react@3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-3.6.0.tgz#7f462c95c4a0afaae82507f06517ff02942196a1"
+  integrity sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==
+  dependencies:
+    tsutils "^2.13.1"
+
+tslint@5.12.1:
+  version "5.12.1"
+  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1"
+  integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==
+  dependencies:
+    babel-code-frame "^6.22.0"
+    builtin-modules "^1.1.1"
+    chalk "^2.3.0"
+    commander "^2.12.1"
+    diff "^3.2.0"
+    glob "^7.1.1"
+    js-yaml "^3.7.0"
+    minimatch "^3.0.4"
+    resolve "^1.3.2"
+    semver "^5.3.0"
+    tslib "^1.8.0"
+    tsutils "^2.27.2"
+
+tsutils@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0"
+  integrity sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=
+
+tsutils@^2.13.1, tsutils@^2.27.2, tsutils@^2.29.0:
+  version "2.29.0"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+  integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+  dependencies:
+    tslib "^1.8.1"
+
+"tsutils@^2.27.2 <2.29.0":
+  version "2.28.0"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1"
+  integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==
+  dependencies:
+    tslib "^1.8.1"
+
+tsutils@^3.0.0, tsutils@^3.5.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5"
+  integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==
+  dependencies:
+    tslib "^1.8.1"
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -11045,7 +10391,7 @@ url-loader@1.1.2:
     mime "^2.0.3"
     schema-utils "^1.0.0"
 
-url-parse@^1.1.8, url-parse@^1.4.3:
+url-parse@^1.4.3:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15"
   integrity sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==
@@ -11071,7 +10417,7 @@ use@^3.1.0:
   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
   integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
 
-util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -11209,7 +10555,7 @@ watchpack@^1.5.0:
     graceful-fs "^4.1.2"
     neo-async "^2.5.0"
 
-wbuf@^1.1.0, wbuf@^1.7.2:
+wbuf@^1.1.0, wbuf@^1.7.3:
   version "1.7.3"
   resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
   integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
@@ -11257,10 +10603,10 @@ webpack-dev-middleware@3.4.0:
     range-parser "^1.0.3"
     webpack-log "^2.0.0"
 
-webpack-dev-server@3.1.9:
-  version "3.1.9"
-  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.9.tgz#8b32167624d2faff40dcedc2cbce17ed1f34d3e0"
-  integrity sha512-fqPkuNalLuc/hRC2QMkVYJkgNmRvxZQo7ykA2e1XRg/tMJm3qY7ZaD6d89/Fqjxtj9bOrn5wZzLD2n84lJdvWg==
+webpack-dev-server@3.1.14:
+  version "3.1.14"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469"
+  integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==
   dependencies:
     ansi-html "0.0.7"
     bonjour "^3.5.0"
@@ -11281,12 +10627,14 @@ webpack-dev-server@3.1.9:
     portfinder "^1.0.9"
     schema-utils "^1.0.0"
     selfsigned "^1.9.1"
+    semver "^5.6.0"
     serve-index "^1.7.2"
     sockjs "0.3.19"
-    sockjs-client "1.1.5"
-    spdy "^3.4.1"
+    sockjs-client "1.3.0"
+    spdy "^4.0.0"
     strip-ansi "^3.0.0"
     supports-color "^5.1.0"
+    url "^0.11.0"
     webpack-dev-middleware "3.4.0"
     webpack-log "^2.0.0"
     yargs "12.0.2"