aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/data-provider/provider
diff options
context:
space:
mode:
authorherbert <herbert.eiselt@highstreet-technologies.com>2019-12-11 15:06:19 +0100
committerTimoney, Dan (dt5972) <dtimoney@att.com>2019-12-13 14:56:50 -0500
commit58f412ad18c1daf622e54ed36db6014f4e04f3f7 (patch)
tree91cc5f6630b4bf6a0ef12c1dee5a03fa2ebbb6cc /sdnr/wt/data-provider/provider
parent05e4277510b9947e3cdcbab8c7bb3846a4211af6 (diff)
Add data-provider
data-provider and change to avoid heap overflow Issue-ID: SDNC-994 Signed-off-by: herbert <herbert.eiselt@highstreet-technologies.com> Change-Id: Ifcc6ce1198442e4b48fc08ba71108cfd5b5ca8aa
Diffstat (limited to 'sdnr/wt/data-provider/provider')
-rw-r--r--sdnr/wt/data-provider/provider/copyright17
-rw-r--r--sdnr/wt/data-provider/provider/pom.xml187
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessor.java58
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorPm.java161
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorStatus.java72
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java439
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/FaultEntityManager.java91
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtDatabaseEventsService.java388
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryByFilter.java342
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryResult.java52
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFileProvider.java206
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFilename.java63
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/AboutHttpServlet.java224
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/GetYangSchemaRequest.java57
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java42
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/YangSchemaHttpServlet.java103
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java95
-rw-r--r--sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java335
-rw-r--r--sdnr/wt/data-provider/provider/src/main/resources/about/README.md2
-rw-r--r--sdnr/wt/data-provider/provider/src/main/resources/about/test.bmpbin0 -> 14454 bytes
-rw-r--r--sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml68
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java98
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java22
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java137
-rw-r--r--sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangProvider.java195
-rw-r--r--sdnr/wt/data-provider/provider/src/test/resources/log4j.properties12
-rw-r--r--sdnr/wt/data-provider/provider/src/test/resources/log4j2.xml17
-rw-r--r--sdnr/wt/data-provider/provider/src/test/resources/simplelogger.properties6
28 files changed, 3489 insertions, 0 deletions
diff --git a/sdnr/wt/data-provider/provider/copyright b/sdnr/wt/data-provider/provider/copyright
new file mode 100644
index 000000000..754b6218f
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/copyright
@@ -0,0 +1,17 @@
+/**
+ * ============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==========================================================================
+ */
diff --git a/sdnr/wt/data-provider/provider/pom.xml b/sdnr/wt/data-provider/provider/pom.xml
new file mode 100644
index 000000000..2c1978ba4
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/pom.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : CCSDK / SDNR / WT / data-provider
+ ================================================================================
+ 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=========================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+ <artifactId>sdnr-wt-data-provider-provider</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name>
+ <packaging>bundle</packaging>
+
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>binding-parent</artifactId>
+ <version>1.5.1-SNAPSHOT</version>
+ <relativePath />
+ </parent>
+
+ <properties>
+ <checkstyle.skip>true</checkstyle.skip> <!-- POM configuration -->
+ <maven.javadoc.skip>true</maven.javadoc.skip>
+ <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
+ <buildtime>${maven.build.timestamp}</buildtime>
+ <elasticsearch.version>6.4.3</elasticsearch.version>
+ <elasticsearch.lucene.version>7.4.0</elasticsearch.lucene.version>
+ <databaseport>49402</databaseport>
+ <onap.distname>Frankfurt</onap.distname>
+ <odl.distname>Neon-SR1</odl.distname>
+ <odlux.buildno>29.7af5ca8(19/11/19)</odlux.buildno>
+ </properties>
+
+ <licenses>
+ <license>
+ <name>Apache License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+ </license>
+ </licenses>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>sdnr-wt-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>sdnr-wt-data-provider-database</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.netconf</groupId>
+ <artifactId>sal-netconf-connector</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+ <artifactId>rfc6991-ietf-yang-types</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>yang-binding</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>mdsal-singleton-common-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/gen/**</exclude>
+ <exclude>**/generated-sources/**</exclude>
+ <exclude>**/yang-gen-sal/**</exclude>
+ <exclude>**/pax/**</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generateDTOs</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <configuration>
+ <skip>${skipTests}</skip>
+ <executable>${basedir}/../database/src/main/resources/es-init.sh</executable>
+ <arguments>
+ <argument>initfile</argument>
+ <argument>-f</argument>
+ <argument>${project.build.directory}/EsInit.script</argument>
+ </arguments>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>com.github.alexcojocaru</groupId>
+ <artifactId>elasticsearch-maven-plugin</artifactId>
+ <version>6.16</version>
+ <configuration>
+ <skip>true</skip>
+ <clusterName>testCluster</clusterName>
+ <transportPort>9500</transportPort>
+ <httpPort>${databaseport}</httpPort>
+ <version>6.4.3</version>
+ <pathInitScript>${project.build.directory}/EsInit.script</pathInitScript>
+ </configuration>
+ <executions>
+ <execution>
+ <id>start-elasticsearch</id>
+ <phase>process-test-classes</phase>
+ <goals>
+ <goal>runforked</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>stop-elasticsearch</id>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>stop</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>databaseport</name>
+ <value>${databaseport}</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessor.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessor.java
new file mode 100644
index 000000000..dc90ee9fa
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessor.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.database.EsDataObjectReaderWriter;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataProviderServiceImpl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutputBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataObjectAcessor<T extends DataObject> extends EsDataObjectReaderWriter<T> {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessor.class);
+
+ public DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class<T> clazz) throws ClassNotFoundException {
+ this(dbClient, entity, clazz, true);
+ LOG.info("Create {}", this.getClass().getName());
+ }
+
+ public DataObjectAcessor(HtDatabaseClient dbClient, Entity entity, Class<T> clazz, boolean idSupported) throws ClassNotFoundException {
+ super(dbClient, entity, clazz);
+ if (idSupported)
+ setEsIdAttributeName("_id");
+ }
+
+ QueryResult<T> getData(EntityInput input) {
+ long page = QueryByFilter.getPage(input);
+ long pageSize = QueryByFilter.getPageSize(input);
+ LOG.info("Request: {}", this.getDataTypeName());
+ QueryBuilder query = QueryByFilter.fromFilter(input.getFilter()).from((page - 1) * pageSize).size(pageSize);
+ QueryByFilter.setSortOrder(query, input.getSortorder());
+ SearchResult<T> result = doReadAll(query,query.contains("range"));
+ return new QueryResult<T>(page, pageSize, result);
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorPm.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorPm.java
new file mode 100644
index 000000000..a145a9f1b
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorPm.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.io.IOException;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataObjectAcessorPm<T extends DataObject> extends DataObjectAcessor<T> {
+
+ private final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
+
+ private static final String UUID_KEY = "uuid-interface";
+ private static final String NODE_KEY = "node-name";
+ private static final String KEY = "node-name";
+
+
+ enum Intervall {
+ PMDATA15M("historicalperformance15min", "historicalperformance15min"),
+ PMDATA24H("historicalperformance24h", "historicalperformance24h");
+
+ String index;
+ String type;
+
+ Intervall(String index, String type) {
+ this.index = index;
+ this.type = type;
+ }
+
+ public String getIndex() {
+ return index;
+ }
+
+ public String getType() {
+ return type;
+ }
+ }
+
+ private ExtRestClient dbClient;
+ private Intervall mode;
+
+ public DataObjectAcessorPm(HtDatabaseClient dbClient, Intervall mode, Entity entity, Class<T> clazz) throws ClassNotFoundException {
+ super(dbClient, entity, clazz, false);
+ this.dbClient = dbClient;
+ this.mode = mode;
+ }
+
+ /**
+ * get aggregated list of ltps for filter NODE_KEY
+ * @param input
+ * @return
+ * @throws IOException
+ */
+ QueryResult<String> getDataLtpList(EntityInput input) throws IOException {
+ long page = QueryByFilter.getPage(input);
+ long pageSize = QueryByFilter.getPageSize(input);
+ Filter nodeFilter = QueryByFilter.getFilter(input.getFilter(), NODE_KEY);
+ if (nodeFilter != null) {
+ SearchRequest request = new SearchRequest(mode.getIndex(), mode.getType());
+ request.setQuery(QueryBuilders.matchQuery(NODE_KEY, nodeFilter.getFiltervalue()).aggregations(UUID_KEY).size(0));
+ try {
+ SearchResponse response = this.dbClient.search(request);
+ AggregationEntries aggs = response.getAggregations(UUID_KEY);
+ String[] uuids = aggs.getKeysAsPagedStringList(pageSize, pageSize * (page - 1));
+ long totalSize = aggs.size();
+ return new QueryResult<String>(page, pageSize, new SearchResult<String>(uuids, totalSize));
+ } catch (IOException e) {
+ throw new IOException("problem reading ltps for req="+request, e);
+ }
+ } else {
+ String msg = "no nodename in filter found ";
+ LOG.debug(msg);
+ throw new IllegalArgumentException(msg);
+ }
+ }
+
+// QueryResult<String> getDataDeviceList(EntityInput input) throws IOException {
+//
+// long page = QueryByFilter.getPage(input);
+// long pageSize = QueryByFilter.getPageSize(input);
+//
+// SearchRequest request = new SearchRequest(mode.getIndex(), mode.getType());
+// request.setQuery(QueryBuilders.matchAllQuery().aggregations(KEY).size(0));
+//// try {
+// SearchResponse response = this.dbClient.search(request);
+// AggregationEntries aggs = response.getAggregations(KEY);
+// String[] uuids = aggs.getKeysAsPagedStringList(pageSize, pageSize * (page - 1));
+// long totalSize = aggs.size();
+// return new QueryResult<String>(page, pageSize, new SearchResult<String>(uuids, totalSize));
+//// } catch (IOException e) {
+//// throw new IOException("problem reading nodes for req="+request, e);
+//// }
+// }
+ /**
+ * get aggregated devices list
+ * @param input filter should be empty/no filter handled, only sortorder for KEY ('node-name')
+ * @return
+ * @throws IOException
+ */
+ QueryResult<String> getDataDeviceList(EntityInput input) throws IOException {
+
+ long page = QueryByFilter.getPage(input);
+ long pageSize = QueryByFilter.getPageSize(input);
+
+ Sortorder soNode = QueryByFilter.getSortOrder(input.getSortorder(), KEY);
+ SearchRequest request = new SearchRequest(mode.getIndex(), mode.getType());
+ QueryBuilder query = null;
+ if (soNode != null) {
+ query = QueryBuilders.matchAllQuery()
+ .aggregations(KEY,
+ soNode.getSortorder() == SortOrder.Ascending
+ ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
+ : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING)
+ .size(0);
+ } else {
+ query = QueryBuilders.matchAllQuery().aggregations(KEY).size(0);
+ }
+ request.setQuery(query);
+ try {
+ SearchResponse response = this.dbClient.search(request);
+ AggregationEntries aggs = response.getAggregations(KEY);
+ String[] uuids = aggs.getKeysAsPagedStringList(pageSize, pageSize * (page - 1));
+ long totalSize = aggs.size();
+ return new QueryResult<String>(page, pageSize, new SearchResult<String>(uuids, totalSize));
+ } catch (IOException e) {
+ throw new IOException("problem reading nodes for req=" + request, e);
+ }
+
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorStatus.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorStatus.java
new file mode 100644
index 000000000..5970d5416
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/DataObjectAcessorStatus.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.io.IOException;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.ExtRestClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
+import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.status.output.Data;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.status.output.DataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.status.entity.FaultsBuilder;
+
+public class DataObjectAcessorStatus extends DataObjectAcessor<Data> {
+
+ final String ESDATATYPE_FAULTCURRENT_SEVERITY_KEY = "severity";
+
+ private final ExtRestClient dbClient;
+ private final Entity entity;
+
+ public DataObjectAcessorStatus(HtDatabaseClient dbClient, Entity entity)
+ throws ClassNotFoundException {
+ super(dbClient, entity, Data.class, false);
+ this.dbClient = dbClient;
+ this.entity = entity;
+ }
+
+ QueryResult<Data> getDataStatus() throws IOException {
+ SearchRequest request = getNewInstanceOfSearchRequest(entity);
+ request.setQuery(
+ QueryBuilders.matchAllQuery().aggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY).size(0));
+ SearchResponse response = this.dbClient.search(request);
+ AggregationEntries aggs = response.getAggregations(ESDATATYPE_FAULTCURRENT_SEVERITY_KEY);
+
+ Data[] data = { new DataBuilder().setFaults(new FaultsBuilder().
+ setCriticals(aggs.getOrDefault("Critical",0L)).
+ setMajors(aggs.getOrDefault("Major", 0L)).
+ setMinors(aggs.getOrDefault("Minor", 0L)).
+ setWarnings(aggs.getOrDefault("Warning", 0L)).
+ build()).build() };
+ long toalsize = data.length;
+ return new QueryResult<Data>(1L, 1L, new SearchResult<Data>(data, toalsize));
+
+ }
+
+
+ private static SearchRequest getNewInstanceOfSearchRequest(Entity entity) {
+ return new SearchRequest(entity.getName(), entity.getName());
+ }
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java
new file mode 100644
index 000000000..306fe95f4
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/ElasticSearchDataProvider.java
@@ -0,0 +1,439 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.DataObjectAcessorPm.Intervall;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.MaintenanceEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.MediatorServerEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionOutputBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ElasticSearchDataProvider implements IEntityDataProvider {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ElasticSearchDataProvider.class);
+
+ private final HtDatabaseClient dbClient;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.Data> eventRWFaultCurrent;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.Data> eventRWFaultLog;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.Data> mediatorserverRW;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.Data> maintenanceRW;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.Data> equipmentRW;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.connectionlog.list.output.Data> connnectionlogRW;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.Data> eventlogRW;
+ private final DataObjectAcessor<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.Data> networkelementConnectionRW;
+ private final DataObjectAcessorPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.Data> pm15mRW;
+ private final DataObjectAcessorPm<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.Data> pm24hRW;
+
+ private final DataObjectAcessorStatus readStatus;
+ private final HtDatabaseEventsService databaseService;
+
+ public ElasticSearchDataProvider(HostInfo[] hosts) throws Exception {
+ LOG.info("Start {}", this.getClass().getName());
+
+ this.dbClient = new HtDatabaseClient(hosts);
+ this.mediatorserverRW = new DataObjectAcessor<>(dbClient, Entity.MediatorServer,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.Data.class);
+ this.mediatorserverRW.setWriteInterface(MediatorServerEntity.class);
+
+ this.maintenanceRW = new DataObjectAcessor<>(dbClient, Entity.Maintenancemode,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.Data.class);
+ this.maintenanceRW.setWriteInterface(MaintenanceEntity.class);
+
+ this.equipmentRW = new DataObjectAcessor<>(dbClient, Entity.Inventoryequipment,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.Data.class);
+
+ this.eventRWFaultCurrent = new DataObjectAcessor<>(dbClient, Entity.Faultcurrent,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.Data.class);
+
+ this.eventRWFaultLog = new DataObjectAcessor<>(dbClient, Entity.Faultlog,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.Data.class);
+
+ this.connnectionlogRW = new DataObjectAcessor<>(dbClient, Entity.Connectionlog,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.connectionlog.list.output.Data.class);
+
+ this.eventlogRW = new DataObjectAcessor<>(dbClient, Entity.Eventlog,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.Data.class);
+
+ this.networkelementConnectionRW = new DataObjectAcessor<>(dbClient, Entity.NetworkelementConnection,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.Data.class);
+ this.networkelementConnectionRW.setWriteInterface(NetworkElementConnectionEntity.class);
+
+ this.pm15mRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA15M, Entity.Historicalperformance15min,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.Data.class);
+
+ this.pm24hRW = new DataObjectAcessorPm<>(dbClient, Intervall.PMDATA24H, Entity.Historicalperformance24h,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.Data.class);
+
+ this.readStatus = new DataObjectAcessorStatus(dbClient, Entity.Faultcurrent );
+
+ this.databaseService = new HtDatabaseEventsService(dbClient);
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.PaginationBuilder
+ //eventRWFaultCurrent
+ public ReadFaultcurrentListOutputBuilder readFaultCurrentList(EntityInput input) {
+
+ ReadFaultcurrentListOutputBuilder outputBuilder = new ReadFaultcurrentListOutputBuilder();
+
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.Data> result = this.eventRWFaultCurrent
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultcurrent.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.PaginationBuilder
+ //eventRWFaultLog
+ public ReadFaultlogListOutputBuilder readFaultLogList(EntityInput input) {
+ ReadFaultlogListOutputBuilder outputBuilder = new ReadFaultlogListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.Data> result = this.eventRWFaultLog
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.faultlog.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.PaginationBuilder
+ //maintenanceRW
+ public ReadMaintenanceListOutputBuilder readMaintenanceList(EntityInput input) {
+ ReadMaintenanceListOutputBuilder outputBuilder = new ReadMaintenanceListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.Data> result = this.maintenanceRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.maintenance.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.Pagination
+ //mediatorserverRW
+ public ReadMediatorServerListOutputBuilder readMediatorServerList(EntityInput input) {
+
+ ReadMediatorServerListOutputBuilder outputBuilder = new ReadMediatorServerListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.Data> result = this.mediatorserverRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.mediator.server.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.PaginationBuilder
+ //networkelementConnectionRW
+ public ReadNetworkElementConnectionListOutputBuilder readNetworkElementConnectionList(
+ EntityInput input) {
+ ReadNetworkElementConnectionListOutputBuilder outputBuilder = new ReadNetworkElementConnectionListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.Data> result = this.networkelementConnectionRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.network.element.connection.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.PaginationBuilder
+ //equipmentRW
+ public ReadInventoryListOutputBuilder readInventoryList(EntityInput input) {
+ ReadInventoryListOutputBuilder outputBuilder = new ReadInventoryListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.Data> result = this.equipmentRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.inventory.list.output.PaginationBuilder
+ //connnectionlogRW
+ public ReadConnectionlogListOutputBuilder readConnectionlogList(EntityInput input) {
+ ReadConnectionlogListOutputBuilder outputBuilder = new ReadConnectionlogListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.connectionlog.list.output.Data> result = this.connnectionlogRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.connectionlog.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.PaginationBuilder
+ //eventlogRW
+ public ReadEventlogListOutputBuilder readEventlogList(ReadEventlogListInput input) throws IOException {
+ ReadEventlogListOutputBuilder outputBuilder = new ReadEventlogListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.Data> result = this.eventlogRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.eventlog.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.PaginationBuilder
+ public ReadPmdata15mListOutputBuilder readPmdata15mList(EntityInput input) {
+ ReadPmdata15mListOutputBuilder outputBuilder = new ReadPmdata15mListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.Data> result = this.pm15mRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.Data
+ //org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.Pagination
+ public ReadPmdata24hListOutputBuilder readPmdata24hList(EntityInput input) {
+ ReadPmdata24hListOutputBuilder outputBuilder = new ReadPmdata24hListOutputBuilder();
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.Data> result = this.pm24hRW
+ .getData(input);
+ outputBuilder.setData(result.getResult().getHits());
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ return outputBuilder;
+ }
+
+ public ReadPmdata15mLtpListOutputBuilder readPmdata15mLtpList(EntityInput input) throws IOException {
+ ReadPmdata15mLtpListOutputBuilder outputBuilder = new ReadPmdata15mLtpListOutputBuilder();
+ QueryResult<String> result = pm15mRW.getDataLtpList(input);
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.ltp.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ outputBuilder.setData(result.getResult().getHits());
+ return outputBuilder;
+ }
+
+ public ReadPmdata15mDeviceListOutputBuilder readPmdata15mDeviceList(EntityInput input) throws IOException {
+ ReadPmdata15mDeviceListOutputBuilder outputBuilder = new ReadPmdata15mDeviceListOutputBuilder();
+ QueryResult<String> result = pm15mRW.getDataDeviceList(input);
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._15m.device.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ outputBuilder.setData(result.getResult().getHits());
+ return outputBuilder;
+ }
+
+ public ReadPmdata24hLtpListOutputBuilder readPmdata24hLtpList(EntityInput input) throws IOException {
+
+ QueryResult<String> result = pm24hRW.getDataLtpList(input);
+
+ ReadPmdata24hLtpListOutputBuilder outputBuilder = new ReadPmdata24hLtpListOutputBuilder();
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.ltp.list.output.PaginationBuilder();
+ outputBuilder.setPagination(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.ltp.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ outputBuilder.setData(result.getResult().getHits());
+ return outputBuilder;
+ }
+
+ public ReadPmdata24hDeviceListOutputBuilder readPmdata24hDeviceList(EntityInput input)
+ throws IOException {
+
+ QueryResult<String> result = pm24hRW.getDataDeviceList(input);
+
+ ReadPmdata24hDeviceListOutputBuilder outputBuilder = new ReadPmdata24hDeviceListOutputBuilder();
+ outputBuilder.setPagination(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.pmdata._24h.device.list.output.PaginationBuilder(
+ result.getPagination()).build());
+ outputBuilder.setData(result.getResult().getHits());
+ return outputBuilder;
+ }
+
+ public ReadStatusOutputBuilder readStatus() throws IOException {
+ QueryResult<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.status.output.Data> result = readStatus.getDataStatus();
+
+ ReadStatusOutputBuilder outputBuilder = new ReadStatusOutputBuilder();
+ outputBuilder.setData(result.getResult().getHits());
+ return outputBuilder;
+ }
+
+ public boolean waitForYellowDatabaseStatus(long timeout, TimeUnit unit) {
+ return this.dbClient.waitForYellowStatus(unit.toMillis(timeout));
+ }
+
+ public CreateNetworkElementConnectionOutputBuilder createNetworkElementConnection(
+ NetworkElementConnectionEntity input) throws IOException {
+ String id = this.networkelementConnectionRW.update(input, input.getNodeId());
+ if (id == null) {
+ throw new IOException("unable to write data to database");
+ }
+ CreateNetworkElementConnectionOutputBuilder builder = new CreateNetworkElementConnectionOutputBuilder();
+ builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort())
+ .setUsername(input.getUsername()).setPassword(input.getPassword()).setIsRequired(input.isIsRequired())
+ .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType());
+ return builder;
+ }
+
+ public UpdateNetworkElementConnectionOutputBuilder updateNetworkElementConnection(
+ UpdateNetworkElementConnectionInput input) throws IOException {
+ String id = this.networkelementConnectionRW.update(input, input.getId());
+ if (id == null) {
+ throw new IOException("unable to update data in database");
+ }
+ UpdateNetworkElementConnectionOutputBuilder builder = new UpdateNetworkElementConnectionOutputBuilder();
+ builder.setId(id).setNodeId(input.getNodeId()).setHost(input.getHost()).setPort(input.getPort())
+ .setUsername(input.getUsername()).setPassword(input.getPassword())
+ .setCoreModelCapability(input.getCoreModelCapability()).setDeviceType(input.getDeviceType());
+ return builder;
+ }
+
+ public DeleteNetworkElementConnectionOutputBuilder deleteNetworkElementConnection(DeleteNetworkElementConnectionInput input) throws IOException {
+ boolean removed = this.networkelementConnectionRW.remove(input.getId());
+ if (!removed) {
+ throw new IOException("unable to remove data from database");
+ }
+ return new DeleteNetworkElementConnectionOutputBuilder();
+ }
+
+ public DeleteMediatorServerOutputBuilder deleteMediatorServer(DeleteMediatorServerInput input) throws IOException {
+ boolean removed = this.mediatorserverRW.remove(input.getId());
+ if (!removed) {
+ throw new IOException("unable to remove data from database");
+ }
+ return new DeleteMediatorServerOutputBuilder();
+ }
+
+ public DeleteMaintenanceOutputBuilder deleteMaintenance(DeleteMaintenanceInput input) throws IOException {
+ boolean removed = this.maintenanceRW.remove(input.getId());
+ if (!removed) {
+ throw new IOException("unable to remove data from database");
+ }
+ return new DeleteMaintenanceOutputBuilder();
+ }
+
+ public UpdateMaintenanceOutputBuilder updateMaintenance(UpdateMaintenanceInput input) throws IOException {
+ if (input.getId() == null) {
+ throw new IOException("please give the id for updating entry");
+ }
+ String id = this.maintenanceRW.update(input, input.getId());
+ if (id == null) {
+ throw new IOException("unable to update data in database");
+ }
+ UpdateMaintenanceOutputBuilder builder = new UpdateMaintenanceOutputBuilder(input).setId(id);
+ return builder;
+ }
+
+ public UpdateMediatorServerOutputBuilder updateMediatorServer(UpdateMediatorServerInput input) throws IOException {
+ if (input.getId() == null) {
+ throw new IOException("please give the id for updating entry");
+ }
+ String id = this.mediatorserverRW.update(input, input.getId());
+ if (id == null) {
+ throw new IOException("unable to update data in database");
+ }
+ UpdateMediatorServerOutputBuilder builder = new UpdateMediatorServerOutputBuilder();
+ builder.setId(id).setName(input.getName()).setUrl(input.getUrl());
+ return builder;
+ }
+
+ public CreateMaintenanceOutputBuilder createMaintenance(CreateMaintenanceInput input) throws IOException {
+ String id = this.maintenanceRW.write(input, input.getNodeId());
+ if (id == null) {
+ throw new IOException("unable to write data to database");
+ }
+ CreateMaintenanceOutputBuilder builder = new CreateMaintenanceOutputBuilder(input).setId(id);
+ return builder;
+ }
+
+ public CreateMediatorServerOutputBuilder createMediatorServer(CreateMediatorServerInput input) throws IOException {
+ String id = this.mediatorserverRW.write(input, null);
+
+ if (id == null) {
+ throw new IOException("unable to write data to database");
+ }
+ CreateMediatorServerOutputBuilder builder = new CreateMediatorServerOutputBuilder();
+ builder.setId(id).setName(input.getName()).setUrl(input.getUrl());
+ return builder;
+ }
+
+ @Override
+ public DataProvider getDataProvider() {
+ return this.databaseService;
+ }
+
+ /**
+ * no need for implementation
+ */
+ @Override
+ public void setReadyStatus(boolean status) {
+
+ }
+
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/FaultEntityManager.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/FaultEntityManager.java
new file mode 100644
index 000000000..f26a30de8
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/FaultEntityManager.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Fault;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SeverityType;
+
+public class FaultEntityManager {
+
+ private static final Pattern pattern = Pattern.compile(".*\\[layerProtocol=(.*)\\]");
+
+ /**
+ * The leading indication for notification or events that are not in the
+ * currentProblem data of the ONF Coremodel
+ */
+ private static final String NOCURRENTPROBLEMINDICATION = "#";
+
+ /**
+ * Specific problems are not moving into current problem list
+ * @param problemName to be verified
+ * @return true if problem is current
+ */
+ public static boolean isManagedAsCurrentProblem(String problemName) {
+ return ! problemName.startsWith(NOCURRENTPROBLEMINDICATION);
+ }
+
+ public static boolean isManagedAsCurrentProblem(Fault problem) {
+ return isManagedAsCurrentProblem(problem.getProblem());
+ }
+
+ /**
+ * Specific problems are not moving into current problem list
+ * @param fault to be verified
+ * @return true if cleared indication
+ */
+ public static boolean isNoAlarmIndication(@Nonnull Fault fault) {
+ return SeverityType.NonAlarmed.equals(fault.getSeverity());
+ }
+
+ /**
+ * Create a specific ES id for the current log.
+ * @return a string with the generated ES Id
+ */
+ public static String genSpecificEsId(String nodeName, String objectId, String problemName) {
+
+ String uuId;
+
+ Matcher matcher = pattern.matcher(objectId);
+ if (matcher.matches() && matcher.groupCount() == 1) {
+ uuId = matcher.group(1);
+ } else {
+ uuId = objectId;
+ }
+
+ StringBuffer strBuf = new StringBuffer();
+ strBuf.append(nodeName);
+ strBuf.append("/");
+ strBuf.append(uuId);
+ strBuf.append("/");
+ strBuf.append(problemName);
+ return strBuf.toString();
+ }
+
+ /**
+ * Create Es id
+ * @param fault used to create uuid for faultcurrent
+ * @return String with Id
+ */
+ public static String genSpecificEsId(FaultcurrentEntity fault) {
+ return genSpecificEsId(fault.getNodeId(), fault.getObjectId(), fault.getProblem());
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtDatabaseEventsService.java
new file mode 100644
index 000000000..b08466c8b
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtDatabaseEventsService.java
@@ -0,0 +1,388 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import org.onap.ccsdk.features.sdnr.wt.base.netconf.util.NetconfTimeStamp;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.database.EsDataObjectReaderWriter2;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionLogStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ConnectionlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Entity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EventlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultcurrentEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.FaultlogEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.Inventory;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.InventoryEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.NetworkElementConnectionEntity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInputBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Event service, writing all events into the database into the appropriate
+ * index.
+ *
+ * @author herbert
+ */
+public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvider {
+ private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class);
+
+ private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter();
+
+ private HtDatabaseClient client;
+ private EsDataObjectReaderWriter2<EventlogEntity> eventRWEventLogDevicemanager;
+ private EsDataObjectReaderWriter2<InventoryEntity> eventRWEquipment;
+ private EsDataObjectReaderWriter2<FaultcurrentEntity> eventRWFaultCurrentDB;
+ private EsDataObjectReaderWriter2<FaultlogEntity> eventRWFaultLogDB;
+ private EsDataObjectReaderWriter2<ConnectionlogEntity> eventRWConnectionLogDB;
+ private EsDataObjectReaderWriter2<NetworkElementConnectionEntity> networkelementConnectionDB;
+ // --- Construct and initialize
+
+ public HtDatabaseEventsService(HtDatabaseClient client) throws Exception {
+
+ LOG.info("Create {} start", HtDatabaseEventsService.class);
+
+ try {
+ // Create control structure
+ this.client = client;
+
+ eventRWEventLogDevicemanager = new EsDataObjectReaderWriter2<>(client, Entity.Eventlog,
+ EventlogEntity.class, EventlogBuilder.class);
+
+ eventRWEquipment = new EsDataObjectReaderWriter2<>(client, Entity.Inventoryequipment,
+ InventoryEntity.class, InventoryBuilder.class);
+
+ eventRWFaultCurrentDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultcurrent,
+ FaultcurrentEntity.class, FaultcurrentBuilder.class);
+
+ eventRWFaultLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Faultlog,
+ FaultlogEntity.class, FaultlogBuilder.class);
+
+ eventRWConnectionLogDB = new EsDataObjectReaderWriter2<>(client, Entity.Connectionlog,
+ ConnectionlogEntity.class, ConnectionlogBuilder.class);
+
+ networkelementConnectionDB = new EsDataObjectReaderWriter2<>(client, Entity.NetworkelementConnection,
+ NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class)
+ .setEsIdAttributeName("_id");
+
+ } catch (Exception e) {
+ LOG.error("Can not start database client. Exception: {}", e);
+ throw new Exception("Can not start database client. Exception: {}", e);
+ }
+ LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class,
+ client != null ? "sucessfully" : "not");
+ }
+
+ // --- Function
+
+ // -- Connection log
+ @Override
+ public void writeConnectionLog(ConnectionlogEntity event) {
+ if (assertIfClientNull(event)) {
+ return;
+ }
+ LOG.debug("Write event: {}", event);
+ eventRWConnectionLogDB.write(event, null);
+
+ }
+ // -- Event log
+ @Override
+ public void writeEventLog(EventlogEntity event) {
+ if (assertIfClientNull("No client to write {}", event)) {
+ return;
+ }
+
+ LOG.debug("Write event: {}", event.toString());
+ eventRWEventLogDevicemanager.write(event, null);
+ }
+
+
+ // -- Fault log
+
+ @Override
+ public void writeFaultLog(FaultlogEntity fault) {
+ if (assertIfClientNull(fault)) {
+ return;
+ }
+
+ LOG.debug("Write fault to faultlog: {}", fault.toString());
+ eventRWFaultLogDB.write(fault,null);
+ }
+
+ // -- Fault current
+
+ @Override
+ public void updateFaultCurrent(FaultcurrentEntity fault) {
+ if (assertIfClientNull(fault)) {
+ return;
+ }
+
+ if (FaultEntityManager.isManagedAsCurrentProblem(fault)) {
+ if (FaultEntityManager.isNoAlarmIndication(fault)) {
+ LOG.debug("Remove from currentFaults: {}", fault.toString());
+ eventRWFaultCurrentDB.remove(FaultEntityManager.genSpecificEsId(fault));
+ } else {
+ LOG.debug("Write to currentFaults: {}", fault.toString());
+ eventRWFaultCurrentDB.write(fault, FaultEntityManager.genSpecificEsId(fault));
+ }
+ } else {
+ LOG.debug("Ingnore for currentFaults: {}", fault.toString());
+ }
+ }
+
+ /**
+ * Remove all entries for one node
+ *
+ * @param nodeName contains the mountpointname
+ * @return number of deleted entries
+ */
+ @Override
+ public int clearFaultsCurrentOfNode(String nodeName) {
+ if (assertIfClientNullForNodeName(nodeName)) {
+ return -1;
+ }
+
+ LOG.debug("Remove from currentFaults all faults for node: {}", nodeName);
+ return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNode(nodeName));
+ }
+
+ /**
+ * Remove all entries for one node
+ *
+ * @param nodeName contains the mountpointname
+ * @param objectId of element to be deleted
+ * @return number of deleted entries
+ */
+ @Override
+ public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) {
+ if (assertIfClientNullForNodeName(nodeName)) {
+ return -1;
+ }
+
+ LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId);
+ return eventRWFaultCurrentDB.remove(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId));
+ }
+
+ /**
+ * Deliver list with all mountpoint/node-names in the database.
+ *
+ * @return List of all mountpoint/node-names the had active alarms.
+ */
+ @Override
+ public @Nonnull List<String> getAllNodesWithCurrentAlarms() {
+ if (assertIfClientNull("No DB, can not delete for all nodes", null)) {
+ return new ArrayList<>();
+ }
+
+ LOG.debug("Remove from currentFaults faults for all node");
+ List<String> nodeNames = new ArrayList<>();
+
+ for (FaultcurrentEntity fault : eventRWFaultCurrentDB.doReadAll().getHits()) {
+ String nodeName = fault.getNodeId();
+ if (!nodeNames.contains(nodeName)) {
+ // this.clearFaultsCurrentOfNode(nodeName); -> Function shifted
+ nodeNames.add(nodeName);
+ }
+ }
+ return nodeNames;
+ }
+
+ // -- Inventory and equipment current
+
+ /**
+ * write internal equipment to database
+ * @param internalEquipment with mandatory fields.
+ */
+ @Override
+ public void writeInventory(Inventory internalEquipment) {
+
+ if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
+ return;
+ }
+ eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId()+"/"+internalEquipment.getUuid());
+ }
+
+
+ // -- Networkelement
+
+ /**
+ *
+ * @param networkElementConnectionEntitiy to wirte to DB
+ * @param nodeId Id for this DB element
+ */
+ @Override
+ public void updateNetworkConnectionDeviceType(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
+ this.networkelementConnectionDB.update(networkElementConnectionEntitiy, nodeId);
+ }
+
+ /**
+ * Update after new mountpoint registration
+ * @param networkElementConnectionEntitiy data
+ * @param nodeId of device (mountpoint name)
+ */
+ @Override
+ public void updateNetworkConnection22(NetworkElementConnectionEntity networkElementConnectionEntitiy, String nodeId) {
+ this.networkelementConnectionDB.updateOrCreate(networkElementConnectionEntitiy, nodeId, Arrays.asList("is-required", "username", "password"));
+ }
+
+ /* please do not remove */
+ // public void cleanNetworkElementConnections() {
+ // this.networkelementConnectionDB.remove(QueryBuilders.matchQuery("is-required", false));
+ // CreateNetworkElementConnectionInput x = new CreateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build();
+ // this.networkelementConnectionDB.update(x,QueryBuilders.matchAllQuery());
+ // }
+
+ @Override
+ public void removeNetworkConnection(String nodeId) {
+ Boolean isRequired;
+ NetworkElementConnectionEntity e = this.networkelementConnectionDB.read(nodeId);
+ if (e != null && (isRequired = e.isIsRequired()) != null) {
+ if (isRequired) {
+ LOG.debug("updating connection status for {} of required ne to disconnected",nodeId);
+ this.networkelementConnectionDB.update(new UpdateNetworkElementConnectionInputBuilder().setStatus(ConnectionLogStatus.Disconnected).build(), nodeId);
+ } else {
+ LOG.debug("remove networkelement-connection for {} entry because of non-required",nodeId);
+ this.networkelementConnectionDB.remove(nodeId);
+ }
+ }
+ else {
+ LOG.warn("Unable to update connection-status. dbentry for {} not found in networkelement-connection",nodeId);
+ }
+ }
+
+ // -- Multiple areas
+
+ @Override
+ public int doIndexClean(Date olderAreOutdated) {
+
+ String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
+ int removed = 0;
+
+ QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
+ removed += eventRWEventLogDevicemanager.remove(queryEventBase);
+
+ QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
+ removed += eventRWFaultLogDB.remove(queryFaultLog);
+ return removed;
+ }
+
+ @Override
+ public int getNumberOfOldObjects(Date olderAreOutdated) {
+
+ String netconfTimeStamp = NETCONFTIME_CONVERTER.getTimeStampAsNetconfString(olderAreOutdated);
+ int numberOfElements = 0;
+
+ QueryBuilder queryEventBase = EsEventBase.getQueryForTimeStamp(netconfTimeStamp);
+ numberOfElements += eventRWEventLogDevicemanager.doReadAll(queryEventBase).getTotal();
+
+ QueryBuilder queryFaultLog = EsFaultLogDevicemanager.getQueryForTimeStamp(netconfTimeStamp);
+ numberOfElements += eventRWFaultLogDB.doReadAll(queryFaultLog).getTotal();
+
+ return numberOfElements;
+ }
+
+ // -- Helper
+
+ /**
+ * Verify status of client
+ * @param event that is printed with message
+ * @return true if client is null
+ */
+ private boolean assertIfClientNull(Object event) {
+ return assertIfClientNull("No DB, can not write: {}", event);
+ }
+
+ private boolean assertIfClientNullForNodeName(Object object) {
+ return assertIfClientNull("No DB, can not handle node: {}", object);
+ }
+ /**
+ * Verify status of client
+ * @param message to print including {} for object printout.
+ * @return true if client is null
+ */
+ private boolean assertIfClientNull(String message, Object object) {
+ if (client == null) {
+ LOG.debug(message, object);
+ return true;
+ }
+ return false;
+ }
+
+ // ### sub classes
+
+
+ private static class EsEventBase {
+ /**
+ * Query to get older Elements
+ * @param netconfTimeStamp to identify older Elements
+ * @return QueryBuilder for older elements related to timestamp
+ */
+ private static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
+ return new RangeQueryBuilder("event.timeStamp").lte(netconfTimeStamp);
+ }
+ }
+ private static class EsFaultLogDevicemanager {
+ /**
+ * Get older Elements
+ * @param netconfTimeStamp to identify query elements older than this timestamp.
+ * @return QueryBuilder for related elements
+ */
+ public static QueryBuilder getQueryForTimeStamp(String netconfTimeStamp) {
+ return new RangeQueryBuilder("timestamp").lte(netconfTimeStamp);
+ }
+ }
+ public static class EsFaultCurrent {
+ /**
+ * @param nodeName name of the node
+ * @return query builder
+ */
+ public static QueryBuilder getQueryForOneNode( String nodeName) {
+ return QueryBuilders.matchQuery("node-id", nodeName);
+ }
+
+ public static QueryBuilder getQueryForOneNodeAndObjectId( String nodeName, String objectId) {
+ BoolQueryBuilder bq = QueryBuilders.boolQuery();
+ bq.must(QueryBuilders.matchQuery("node-id", nodeName));
+ bq.must(QueryBuilders.matchQuery("object-id", objectId));
+ return bq;
+ }
+ }
+ @Override
+ public List<NetworkElementConnectionEntity> getNetworkElementConnections() {
+ return this.networkelementConnectionDB.doReadAll().getHits();
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryByFilter.java
new file mode 100644
index 000000000..f00ffb546
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryByFilter.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.onap.ccsdk.features.sdnr.wt.base.netconf.util.NetconfTimeStamp;
+import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.EntityInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.SortOrder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Sortorder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QueryByFilter {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DataObjectAcessorPm.class);
+
+ private QueryByFilter() {
+ //Hide
+ }
+
+ static long getPage(EntityInput input) {
+ return getPage(input, 1);
+ }
+
+ @SuppressWarnings("null")
+ private static long getPage(EntityInput input, long defaultValue) {
+ return input.getPagination() != null ? input.getPagination().getPage().longValue() : defaultValue;
+ }
+
+ static long getPageSize(EntityInput input) {
+ return getPageSize(input, 1);
+ }
+
+ @SuppressWarnings("null")
+ private static long getPageSize(EntityInput input, long defaultValue) {
+ return input.getPagination() != null ? input.getPagination().getSize().longValue() : defaultValue;
+ }
+
+
+ public static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder) {
+ return setSortOrder(query, sortorder, "");
+ }
+
+ private static QueryBuilder setSortOrder(QueryBuilder query, @Nullable List<Sortorder> sortorder, String prefix) {
+ if (sortorder != null && sortorder.size() > 0) {
+ for (Sortorder so : sortorder) {
+ query.sort((prefix != null ? prefix : "") + so.getProperty(),
+ so.getSortorder() == SortOrder.Ascending
+ ? org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.ASCENDING
+ : org.onap.ccsdk.features.sdnr.wt.common.database.queries.SortOrder.DESCENDING);
+ }
+ }
+ return query;
+
+ }
+
+
+ public static Sortorder getSortOrder(@Nullable List<Sortorder> list, String prop) {
+ if (list == null) {
+ return null;
+ }
+ for (Sortorder o : list) {
+ if (prop.equals(o.getProperty())) {
+ return o;
+ }
+ }
+ return null;
+ }
+
+ public static Filter getFilter(@Nullable List<Filter> list, String prop) {
+ if (list == null) {
+ return null;
+ }
+ for (Filter f : list) {
+ if (prop.equals(f.getProperty())) {
+ return f;
+ }
+ }
+ return null;
+ }
+
+ public static QueryBuilder fromFilter(@Nullable List<Filter> filters) {
+ return fromFilter(filters, "");
+ }
+
+ private static String fillTimeStamp(String value) {
+ int idx=value.lastIndexOf("*");
+ final String REPLACE="0000-00-00T00:00:00.0Z";
+ String s = value.substring(0,idx)+REPLACE.substring(idx);
+ if(Integer.parseInt(s.substring(5,7))==0) {
+ s=s.substring(0,5)+"01-"+s.substring(8);
+ }
+ if(Integer.parseInt(s.substring(8,10))==0) {
+ s=s.substring(0,8)+"01"+s.substring(10);
+ }
+
+ return s;
+ }
+ /**
+ * convert timestamp with ending placeholder in filter to elasticsearch filter
+ * e.g. 2017* => gte: 2017-01-01T00:00:00Z, lt:2018-01-01T00:00:00Z
+ *
+ * 201* => 2010-01... 2020 ..
+ * 2018-* => 2018-01... <=> 2019-01
+ *
+ */
+ private static @Nullable QueryBuilder fromTimestampSearchFilter(String property,String value) {
+ if(!value.endsWith("*")) {
+ return null;
+ }
+ int idx=value.lastIndexOf("*");
+ String lowerEnd = fillTimeStamp(value);
+ String upperEnd =null;
+ NetconfTimeStamp converter = NetconfTimeStamp.getConverter();
+ Date dt = null;
+ try{
+ dt=converter.getDateFromNetconf(lowerEnd);
+ }
+ catch(Exception e) {
+
+ }
+ if(dt==null) {
+ return null;
+ }
+// property.substring(0,idx)+REPLACE.substring(idx+1);
+ Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ c.setTime(dt);
+ int tmpvalue;
+ switch(idx) {
+ case 1: // (2*)
+ c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1000);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 2: // (20*)
+ c.set(Calendar.YEAR,c.get(Calendar.YEAR)+100);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 3: // (200*)
+ c.set(Calendar.YEAR,c.get(Calendar.YEAR)+10);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 4: // (2000*)
+ case 5: // (2000-*)
+ c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 6: //switch 10 months (2000-0* or 2000-1*)
+ tmpvalue = c.get(Calendar.MONTH);
+ if(tmpvalue<9) {
+ c.set(Calendar.MONTH,9);
+ }
+ else {
+ c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
+ c.set(Calendar.MONTH,0);
+ }
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+
+ break;
+ case 7: //switch one month (2018-01* or 2018-01-*)
+ case 8:
+ c.add(Calendar.MONTH, 1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 9: // (2018-01-0*)
+ tmpvalue = c.get(Calendar.DAY_OF_MONTH);
+ if(tmpvalue==1) {
+ c.set(Calendar.DAY_OF_MONTH, 10);
+ }else if(tmpvalue==10) {
+ c.set(Calendar.DAY_OF_MONTH, 20);
+ }else if(tmpvalue==20) {
+ if(c.getActualMaximum(Calendar.DAY_OF_MONTH)<30) {
+ c.set(Calendar.DAY_OF_MONTH,1);
+ c.add(Calendar.MONTH,1);
+ }
+ else {
+ c.set(Calendar.DAY_OF_MONTH,30);
+ }
+ }else if(tmpvalue==30) {
+ c.set(Calendar.DAY_OF_MONTH,1);
+ c.add(Calendar.MONTH,1);
+ }
+ else {
+ break;
+ }
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 10: // (2018-01-01*)
+ case 11: // (2018-01-01T*)
+ c.add(Calendar.DAY_OF_MONTH,1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 12: // (2018-01-01T1*)
+ tmpvalue = c.get(Calendar.HOUR_OF_DAY);
+ if(tmpvalue==20) {
+ c.set(Calendar.HOUR_OF_DAY,0);
+ c.add(Calendar.DAY_OF_MONTH,1);
+ }
+ else {
+ c.add(Calendar.HOUR_OF_DAY,10);
+ }
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 13: // (2018-01-01T11*)
+ case 14: // (2018-01-01T11-*)
+ c.add(Calendar.HOUR_OF_DAY,1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 15: // (2018-01-01T11-3*)
+ c.add(Calendar.MINUTE,10);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 16: // (2018-01-01T11-32*)
+ case 17: // (2018-01-01T11-32-*)
+ c.add(Calendar.MINUTE,1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 18: // (2018-01-01T11-32-1*)
+ c.add(Calendar.SECOND,10);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+ case 19: // (2018-01-01T11-32-11*)
+ case 20: // (2018-01-01T11-32-11.*)
+ c.add(Calendar.SECOND,1);
+ upperEnd = converter.getTimeStampAsNetconfString(c.getTime());
+ break;
+
+ default:
+ break;
+ }
+
+ if(upperEnd==null) {
+ return null;
+ }
+ return QueryBuilders.rangeQuery(property).gte(lowerEnd).lt(upperEnd);
+
+ }
+ private static QueryBuilder fromFilter(@Nullable List<Filter> filters, String prefix) {
+ if (filters == null || filters.size() == 0) {
+ return QueryBuilders.matchAllQuery();
+
+ } else if (filters.size() == 1) {
+ QueryBuilder query;
+ String p = filters.get(0).getProperty();
+ String v= filters.get(0).getFiltervalue();
+ if ("id".equals(p)) {
+ p = "_id";
+ }
+ else {
+ // v=v.toLowerCase();
+ }
+ if (DbFilter.hasSearchParams(v)) {
+ if(p!=null && "timestamp".equals(p.toLowerCase())) {
+ query = fromTimestampSearchFilter(p,v);
+ if(query!=null) {
+ return query;
+ }
+ }
+ return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
+
+
+ } else if (DbFilter.isComparisonValid(v)) {
+ RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p, v);
+ if (q != null) {
+ return q;
+ }
+ else {
+ return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
+ }
+ }
+ else {
+ return QueryBuilders.matchQuery((prefix != null ? prefix : "") + p, v);
+ }
+ }
+ else {
+ BoolQueryBuilder query = new BoolQueryBuilder();
+ QueryBuilder tmpQuery;
+ for (Filter fi : filters) {
+ String p = fi.getProperty();
+ String v=fi.getFiltervalue();
+ if ("id".equals(p)) {
+ p = "_id";
+ }
+ else {
+ // v=v.toLowerCase();
+ }
+ if(DbFilter.hasSearchParams(v)) {
+ if(p!=null && "timestamp".equals(p.toLowerCase())) {
+ tmpQuery=fromTimestampSearchFilter(p,v);
+ if(tmpQuery!=null) {
+ query.must(tmpQuery);
+ }else {
+ query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
+ }
+ }else {
+ query.must(QueryBuilders.regex((prefix != null ? prefix : "") + p,DbFilter.createDatabaseRegex(v)));
+ }
+ }
+ else if (DbFilter.isComparisonValid(v)) {
+ RangeQueryBuilder q = DbFilter.getRangeQuery((prefix != null ? prefix : "") + p,v);
+ if(q!=null) {
+ query.must(q);
+ }
+ else {
+ query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
+ }
+ }
+ else {
+ query.must(QueryBuilders.matchQuery((prefix != null ? prefix : "") + p,v));
+ }
+ }
+ LOG.trace("Query result. {}", query.toJSON());
+ return query;
+ }
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryResult.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryResult.java
new file mode 100644
index 000000000..9cbe9430c
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/QueryResult.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.math.BigInteger;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.PaginationOutputG;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.read.connectionlog.list.output.PaginationBuilder;
+
+public class QueryResult<T> {
+
+ private SearchResult<T> result;
+ private PaginationOutputG pagination;
+
+ public QueryResult(long page, long pageSize, SearchResult<T> result) {
+ this.result = result;
+
+ PaginationBuilder x = new PaginationBuilder();
+ x.setPage(BigInteger.valueOf(page));
+ x.setSize(pageSize);
+ x.setTotal(BigInteger.valueOf(result.getTotal()));
+ pagination = x.build();
+ }
+
+ public SearchResult<T> getResult() {
+ return result;
+ }
+
+ PaginationOutputG getPagination() {
+ return pagination;
+ }
+
+
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFileProvider.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFileProvider.java
new file mode 100644
index 000000000..44240b07f
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFileProvider.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class YangFileProvider {
+
+ private static final Logger LOG = LoggerFactory.getLogger(YangFileProvider.class);
+
+ private static final FilenameFilter yangFilenameFilter = new FilenameFilter() {
+
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().endsWith(".yang");
+ }
+ };
+
+ private static final int BUFFER_SIZE = 1024;
+
+ private final Path mainSourcePath;
+ private final List<Path> additionalSources;
+
+ public YangFileProvider(String path) {
+ this.mainSourcePath = new File(path).toPath();
+ this.additionalSources = new ArrayList<>();
+ }
+
+ public boolean hasFileForModule(String module, String version) {
+ return this.mainSourcePath.resolve(YangFilename.createFilename(module, version)).toFile().exists();
+ }
+
+ public boolean hasFileForModule(String module) {
+ return this.findYangFiles(module).size() > 0;
+ }
+
+ private List<YangFilename> findYangFiles(String module) {
+ List<YangFilename> list = new ArrayList<>();
+ String[] files = this.mainSourcePath.toFile().list(yangFilenameFilter);
+ YangFilename yangfile;
+ for (String file : files) {
+ files = this.mainSourcePath.toFile().list(yangFilenameFilter);
+ for (String fn : files) {
+ try {
+ yangfile = new YangFilename(this.mainSourcePath.resolve(fn).toString());
+ if (yangfile.getModule().equals(module)) {
+ list.add(yangfile);
+ }
+ } catch (ParseException e) {
+ LOG.warn("unable to handle yangfile {}: {}", file, e);
+ }
+ }
+ }
+ for (Path addPath : this.additionalSources) {
+ files = addPath.toFile().list(yangFilenameFilter);
+ for (String file : files) {
+ try {
+ yangfile = new YangFilename(addPath.resolve(file).toString());
+ if (yangfile.getModule().equals(module)) {
+ list.add(yangfile);
+ }
+ } catch (ParseException e) {
+ LOG.warn("unable to handle yangfile {}: {}", file, e);
+ }
+ }
+ }
+ return list;
+ }
+
+ /**
+ * get yang file from source with specified version or least newer one if
+ * version is null then the latest one
+ *
+ * @param module
+ * @param version
+ * @return
+ * @throws ParseException
+ */
+ private @Nullable YangFilename getYangFile(@Nonnull String module, @Nullable String version) throws ParseException {
+ YangFilename f = null;
+ List<YangFilename> list = this.findYangFiles(module);
+
+ list.sort(SortByDateAscComparator.getInstance());
+
+ // find specific version or nearest oldest
+ if (version != null) {
+ Date rev = YangFilename.parseRevision(version);
+ for (YangFilename item : list) {
+ if (rev.equals(item.getRevision())) {
+ f = item;
+ break;
+ }
+ if (item.getRevision().after(rev)) {
+ f = item;
+ break;
+ }
+ }
+ }
+ // get latest
+ else {
+ f = list.get(list.size() - 1);
+ }
+ return f;
+ }
+
+ /**
+ * write filestream directly to output stream easier for http handling
+ *
+ * @param module
+ * @param version
+ * @param outputStream
+ * @return
+ * @throws IOException
+ * @throws ParseException
+ */
+ public int writeOutput(@Nonnull String module, @Nullable String version, @Nonnull OutputStream outputStream)
+ throws IOException, ParseException {
+ YangFilename fn = this.getYangFile(module, version);
+ if(fn==null) {
+ return 0;
+ }
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int bytesRead = -1;
+ int sumlen = 0;
+ InputStream inputStream = null ;
+ try {
+ inputStream= new FileInputStream(fn.getFilename());
+
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ sumlen += bytesRead;
+ }}
+ catch(IOException e) {
+ LOG.warn("problem sending {}: {}",fn.getFilename(),e);
+ }
+ finally {
+ if(inputStream!=null) {
+ inputStream.close();
+ }
+ }
+ return sumlen;
+ }
+
+ private static class SortByDateAscComparator implements Comparator<YangFilename> {
+
+ private static SortByDateAscComparator instance;
+
+ @Override
+ public int compare(YangFilename o1, YangFilename o2) {
+ return o1.getRevision().compareTo(o2.getRevision());
+ }
+
+ public static Comparator<? super YangFilename> getInstance() {
+ if (instance == null) {
+ instance = new SortByDateAscComparator();
+ }
+ return instance;
+ }
+
+ }
+
+ public YangFilename getFileForModule(String module, String rev) throws ParseException {
+ return this.getYangFile(module, rev);
+ }
+
+ public YangFilename getFileForModule(String module) throws ParseException {
+ return this.getFileForModule(module, null);
+ }
+
+ public boolean hasFileOrNewerForModule(String module, String version) throws ParseException {
+ return this.getYangFile(module, version) != null;
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFilename.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFilename.java
new file mode 100644
index 000000000..b00eb203f
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/YangFilename.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * ============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.dataprovider.data;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class YangFilename {
+
+ private static final String regex = "([^\\/]*)@([0-9]{4}-[0-9]{2}-[0-9]{2}).yang";
+ private static final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
+ private final String filename;
+ private final Matcher matcher;
+ private Date revision;
+ private String module;
+ public static Date parseRevision(String sRevision) throws ParseException {
+ final SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
+ return fmt.parse(sRevision);
+ }
+ public YangFilename(String fn) throws ParseException {
+ this.filename = fn;
+ matcher = pattern.matcher(this.filename);
+ if(!matcher.find()) {
+ throw new ParseException("unknown filename format", 0);
+ }
+ this.module= matcher.group(1);
+ this.revision=parseRevision(matcher.group(2));
+
+ }
+ public static String createFilename(String module, String rev) {
+ return String.format("%s@%s.yang", module,rev);
+ }
+ public YangFilename(String module, String rev) throws ParseException {
+ this(createFilename(module, rev));
+ }
+ public String getFilename() {
+ return this.filename;
+ }
+ public Date getRevision() {
+ return this.revision;
+ }
+ public String getModule() {
+ return this.module;
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/AboutHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/AboutHttpServlet.java
new file mode 100644
index 000000000..66d21041c
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/AboutHttpServlet.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * ============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.dataprovider.http;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+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.common.Resources;
+import org.onap.ccsdk.features.sdnr.wt.common.file.PomFile;
+import org.onap.ccsdk.features.sdnr.wt.common.file.PomPropertiesFile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AboutHttpServlet extends HttpServlet {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOG = LoggerFactory.getLogger(AboutHttpServlet.class);
+
+ private static final String URI_PRE = "/about";
+ private static final String RES_BASEPATH = "about/";
+
+ private static final String PLACEHOLDER_ONAP_RELEASENAME = "{release-name}";
+ private static final String PLACEHOLDER_ODL_RELEASENAME = "{odl-version}";
+ private static final String PLACEHOLDER_BUILD_TIMESTAMP = "{build-time}";
+ private static final String PLACEHOLDER_ODLUX_REVISION = "{odlux-revision}";
+ private static final String PLACEHOLDER_PACAKGE_VERSION = "{package-version}";
+ private static final String README_FILE = "README.md";
+
+ private final String groupId="org.onap.ccsdk.features.sdnr.wt";
+ private final String artifactId="sdnr-wt-data-provider-provider";
+
+// private final ConfigurationFileRepresentation configuration;
+ //private final ExtRestClient dbClient;
+ private final Map<String, String> data;
+ private final String readmeContent;
+
+
+
+ public AboutHttpServlet() {
+// this.configuration = new ConfigurationFileRepresentation(DataProviderServiceImpl.CONFIGURATIONFILE);
+// EsConfig esConfig = new EsConfig(configuration);
+ //this.dbClient = ExtRestClient.createInstance(esConfig.getHosts());
+ this.data = new HashMap<>();
+ this.collectStaticData();
+ this.readmeContent = this.render(this.getFileContent(README_FILE));
+ }
+
+ private void collectStaticData() {
+ PomPropertiesFile props = this.getPomProperties();
+ this.data.put(PLACEHOLDER_ONAP_RELEASENAME, this.getPomProperty("onap.distname"));
+ this.data.put(PLACEHOLDER_ODL_RELEASENAME, this.getPomProperty("odl.distname") );
+ this.data.put(PLACEHOLDER_BUILD_TIMESTAMP, props!=null?props.getBuildDate().toString():"");
+ this.data.put(PLACEHOLDER_ODLUX_REVISION, this.getPomProperty("odlux.buildno"));
+ this.data.put(PLACEHOLDER_PACAKGE_VERSION, this.getManifestValue("Bundle-Version"));
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+
+ String uri = req.getRequestURI().substring(URI_PRE.length());
+ LOG.debug("request for {}",uri);
+ if (uri.length() <= 0 || uri.equals("/")) {
+ // collect data
+ this.collectData();
+ // render readme
+ String content = this.render();
+ byte[] output = content!=null?content.getBytes():new byte[0];
+ // output
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentLength(output.length);
+ resp.setContentType("text/plain");
+ resp.getOutputStream().write(output);
+
+ } else {
+ this.doGetFile(uri, resp);
+ }
+ }
+
+ private String getFileContent(String filename) {
+ LOG.debug("try ti get content of {}",filename);
+ return Resources.getFileContent(AboutHttpServlet.class,RES_BASEPATH + filename);
+ }
+
+ private void collectData() {
+ // TODO Auto-generated method stub
+
+ }
+
+ private String getManifestValue(String key) {
+ URL url = Resources.getUrlForRessource(AboutHttpServlet.class, "/META-INF/MANIFEST.MF");
+ if(url==null) {
+ return null;
+ }
+ Manifest manifest;
+ try {
+ manifest = new Manifest(url.openStream());
+ Attributes attr = manifest.getMainAttributes();
+ return attr.getValue(key);
+ } catch (IOException e) {
+ LOG.warn("problem reading manifest: {}",e);
+ }
+ return null;
+
+ }
+ private PomPropertiesFile getPomProperties() {
+ URL url = Resources.getUrlForRessource(AboutHttpServlet.class, "/META-INF/maven/"+groupId+"/"+artifactId+"/pom.properties");
+ PomPropertiesFile propfile;
+ if(url==null) {
+ return null;
+ }
+ try {
+ propfile = new PomPropertiesFile(url.openStream());
+ return propfile;
+ } catch (Exception e) {
+ LOG.warn("unable to read inner pom file: {}",e);
+ }
+ return null;
+ }
+ private String getPomProperty(String key) {
+ LOG.info("try to get pom property for {}",key);
+ URL url = Resources.getUrlForRessource(AboutHttpServlet.class,"/META-INF/maven/"+groupId+"/"+artifactId+"/pom.xml");
+ if(url==null) {
+ return null;
+ }
+ PomFile pomfile;
+ try {
+ pomfile = new PomFile(url.openStream());
+ return pomfile.getProperty(key);
+ } catch (Exception e) {
+ LOG.warn("unable to read inner pom file: {}",e);
+ }
+ return null;
+ }
+ private void doGetFile(String uri, HttpServletResponse resp) {
+ String content = this.getFileContent(uri);
+ if (content == null) {
+ try {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ } catch (IOException e) {
+ LOG.debug("unable to send error response : {}",e);
+ }
+ } else {
+ byte[] data = content.getBytes();
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(this.getContentType(uri));
+ try {
+ resp.getOutputStream().write(data);
+ } catch (IOException e) {
+ LOG.debug("unable to send data : {}",e);
+ }
+ }
+
+ }
+
+ private String getContentType(String filename) {
+ String ext = filename.substring(filename.lastIndexOf(".")+1).toLowerCase();
+ switch (ext) {
+ case "jpg":
+ case "jpeg":
+ case "svg":
+ case "png":
+ case "gif":
+ case "bmp":
+ return "image/" + ext;
+ case "json":
+ return "application/json";
+ case "html":
+ case "htm":
+ return "text/html";
+ case "txt":
+ case "md":
+ default:
+ return "text/plain";
+ }
+ }
+
+ private String render() {
+ return this.render(null);
+ }
+
+ private String render(String content) {
+ if (content == null) {
+ content = this.readmeContent;
+ }
+ if(content==null) {
+ return null;
+ }
+ for (Entry<String, String> entry : this.data.entrySet()) {
+ if (entry.getValue() != null && content.contains(entry.getKey())) {
+ content = content.replace(entry.getKey(), entry.getValue());
+ }
+ }
+
+ return content;
+ }
+} \ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/GetYangSchemaRequest.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/GetYangSchemaRequest.java
new file mode 100644
index 000000000..db4faedfc
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/GetYangSchemaRequest.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.http;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class GetYangSchemaRequest {
+
+ private static final String URI_PREFIX = "/yang-schema/";
+ private final String module;
+ private final String version;
+
+ public String getModule() {
+ return this.module;
+ }
+
+ public String getVersion() {
+ return this.version;
+ }
+
+ public boolean hasVersion() {
+ return this.version != null;
+ }
+
+ public GetYangSchemaRequest(HttpServletRequest req) throws Exception {
+ String uri = req.getRequestURI().substring(URI_PREFIX.length());
+
+ String[] hlp = uri.split("/");
+ if (hlp.length < 1) {
+ throw new Exception("no module request found");
+
+ } else if (hlp.length == 1) {
+ this.module = hlp[0];
+ this.version = null;
+ } else {
+ this.module = hlp[0];
+ this.version = hlp[1];
+ }
+
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java
new file mode 100644
index 000000000..607f552f6
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/ReadyHttpServlet.java
@@ -0,0 +1,42 @@
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.http;
+
+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 ReadyHttpServlet extends HttpServlet {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOG = LoggerFactory.getLogger(ReadyHttpServlet.class);
+ private boolean status;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+
+ if(this.isReady()) {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ }
+ else {
+
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ }
+ }
+
+ private boolean isReady() {
+ return this.status;
+ }
+
+ public void setStatus(boolean status) {
+ this.status = status;
+ LOG.info("status is set to ready: {}",status);
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/YangSchemaHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/YangSchemaHttpServlet.java
new file mode 100644
index 000000000..94d2793ec
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/YangSchemaHttpServlet.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * ============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.dataprovider.http;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+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.dataprovider.data.YangFileProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class YangSchemaHttpServlet extends HttpServlet {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOG = LoggerFactory.getLogger(YangSchemaHttpServlet.class);
+
+ private static final String schemaCachePath = "cache/schema/";
+
+ private final YangFileProvider fileProvider;
+
+ public YangSchemaHttpServlet() {
+ this.fileProvider = new YangFileProvider(schemaCachePath);
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+
+ GetYangSchemaRequest request = null;
+ try {
+ request = new GetYangSchemaRequest(req);
+ } catch (Exception e) {
+ LOG.warn("bad request for yang-schema: {}", e);
+ }
+ if (request != null) {
+ int len;
+ LOG.debug("request for yang-schema for module {} with version {}", request.getModule(),
+ request.getVersion());
+ if (request.hasVersion()) {
+ boolean has=false;
+ try {
+ has = this.fileProvider.hasFileOrNewerForModule(request.getModule(), request.getVersion());
+ } catch (ParseException e1) {
+ LOG.warn("unable to parse revision: {}" ,e1);
+ }
+ if(has) {
+
+ try {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ len = this.fileProvider.writeOutput(request.getModule(), request.getVersion(),
+ resp.getOutputStream());
+ resp.setContentLength(len);
+
+ } catch (ParseException e) {
+ LOG.warn("unable to parse revision: {}", e);
+ }
+ } else {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ }
+
+ } else if (this.fileProvider.hasFileForModule(request.getModule())) {
+
+ try {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ len = this.fileProvider.writeOutput(request.getModule(), null, resp.getOutputStream());
+ resp.setContentLength(len);
+ } catch (ParseException e) {
+ LOG.warn(e.getMessage());
+ }
+
+ } else {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ }
+ } else {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
+ }
+
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
new file mode 100644
index 000000000..ba6e99975
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * ============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.dataprovider.impl;
+
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DataProviderImpl.class);
+
+ private static final String APPLICATION_NAME = null;
+ private RpcProviderService rpcProviderService = null;
+ private DataProviderServiceImpl rpcApiService;
+ private ReadyHttpServlet readyServlet;
+ private HtDatabaseClient dbClient;
+
+
+ // Blueprint 1
+ public DataProviderImpl() {
+ LOG.info("Creating provider for {}", APPLICATION_NAME);
+ }
+
+ public void setRpcProviderService(RpcProviderService rpcProviderService) {
+ this.rpcProviderService = rpcProviderService;
+ }
+ public void setReadyServlet(ReadyHttpServlet readyServlet) {
+ this.readyServlet = readyServlet;
+ }
+ public void init() throws Exception {
+
+ LOG.info("Session Initiated start {}", APPLICATION_NAME);
+
+ // Start RPC Service
+ this.rpcApiService = new DataProviderServiceImpl(rpcProviderService);
+ // Get configuration
+
+ LOG.info("Session Initiated end. Initialization done");
+ }
+
+ @Override
+ public void close() throws Exception {
+ LOG.info("DeviceManagerImpl closing ...");
+
+ close(dbClient);
+ close(rpcApiService);
+ LOG.info("DeviceManagerImpl closing done");
+ }
+
+ /**
+ * Used to close all Services, that should support AutoCloseable Pattern
+ *
+ * @param toClose
+ * @throws Exception
+ */
+ private void close(AutoCloseable... toCloseList) throws Exception {
+ for (AutoCloseable element : toCloseList) {
+ if (element != null) {
+ element.close();
+ }
+ }
+ }
+
+ @Override
+ public DataProvider getDataProvider() {
+ return rpcApiService.getDataProvider();
+ }
+
+ @Override
+ public void setReadyStatus(boolean status) {
+ if(this.readyServlet!=null) {
+ this.readyServlet.setStatus(status);
+ }
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
new file mode 100644
index 000000000..70b735357
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
@@ -0,0 +1,335 @@
+/*******************************************************************************
+ * ============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.dataprovider.impl;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
+import org.onap.ccsdk.features.sdnr.wt.database.config.EsConfig;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DataProviderService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionOutput;
+import org.opendaylight.yangtools.concepts.Builder;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
+ public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
+ private static final long DATABASE_TIMEOUT_MS = 120*1000L;
+
+ private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
+ private final ElasticSearchDataProvider dataProvider;
+ private final ConfigurationFileRepresentation configuration;
+
+ DataProviderServiceImpl(final RpcProviderService rpcProviderService) throws Exception {
+ this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
+ EsConfig esConfig = new EsConfig(configuration);
+ this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts());
+ this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS,TimeUnit.MILLISECONDS);
+ // Register ourselves as the REST API RPC implementation
+ LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
+ this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
+ }
+
+ /**
+ * @return the dataProvider
+ */
+ public DataProvider getDataProvider() {
+ return dataProvider.getDataProvider();
+ }
+
+
+
+ @Override
+ public void close() throws Exception {
+ LOG.info("Close RPC Service");
+ if (rpcReg != null) {
+ rpcReg.close();
+ }
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(ReadFaultcurrentListInput input) {
+ LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
+ RpcResultBuilder<ReadFaultcurrentListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
+ return result.buildFuture();
+ }
+ @Override
+ public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
+ LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
+ RpcResultBuilder<ReadFaultlogListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
+ LOG.debug("RPC Request: getMaintenanceEntityList with input {}", input);
+ RpcResultBuilder<ReadMaintenanceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
+ ReadMediatorServerListInput input) {
+ LOG.debug("RPC Request: getMediatorServerEntityList with input {}", input);
+ RpcResultBuilder<ReadMediatorServerListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
+ ReadNetworkElementConnectionListInput input) {
+ LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
+ RpcResultBuilder<ReadNetworkElementConnectionListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
+ return result.buildFuture();
+
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
+ LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
+ RpcResultBuilder<ReadPmdata15mListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
+ return result.buildFuture();
+
+ }
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
+ LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
+ RpcResultBuilder<ReadPmdata24hListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
+ return result.buildFuture();
+
+ }
+ @Override
+ public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
+ LOG.debug("RPC Request: getStatusEntityList with input {}", input);
+ RpcResultBuilder<ReadStatusOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readStatus());
+ return result.buildFuture();
+
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
+ LOG.debug("RPC Request: getInventoryEntityList with input {}", input);
+ RpcResultBuilder<ReadInventoryListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(ReadPmdata15mLtpListInput input) {
+ LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
+ RpcResultBuilder<ReadPmdata15mLtpListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(ReadPmdata15mDeviceListInput input) {
+ LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
+ RpcResultBuilder<ReadPmdata15mDeviceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(ReadPmdata24hLtpListInput input) {
+ LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
+ RpcResultBuilder<ReadPmdata24hLtpListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(ReadPmdata24hDeviceListInput input) {
+ LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
+ RpcResultBuilder<ReadPmdata24hDeviceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
+ ReadConnectionlogListInput input) {
+ LOG.debug("RPC Request: readConnectionlogList with input {}", input);
+ RpcResultBuilder<ReadConnectionlogListOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
+ CreateNetworkElementConnectionInput input) {
+ LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
+ RpcResultBuilder<CreateNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
+ UpdateNetworkElementConnectionInput input) {
+ LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
+ RpcResultBuilder<UpdateNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
+ DeleteNetworkElementConnectionInput input) {
+ RpcResultBuilder<DeleteNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
+ DeleteMediatorServerInput input) {
+ LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
+ RpcResultBuilder<DeleteMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
+ CreateMediatorServerInput input) {
+ LOG.debug("RPC Request: createMediatorServer with input {}", input);
+ RpcResultBuilder<CreateMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
+ LOG.debug("RPC Request: createMaintenance with input {}", input);
+ RpcResultBuilder<CreateMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
+ LOG.debug("RPC Request: deleteMaintenance with input {}", input);
+ RpcResultBuilder<DeleteMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
+ UpdateMediatorServerInput input) {
+ LOG.debug("RPC Request: updateMediatorServer with input {}", input);
+ RpcResultBuilder<UpdateMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
+ LOG.debug("RPC Request: updateMaintenance with input {}", input);
+ RpcResultBuilder<UpdateMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
+ return result.buildFuture();
+ }
+
+ @Override
+ public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
+ LOG.debug("RPC Request: readEventlogList with input {}", input);
+ RpcResultBuilder<ReadEventlogListOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
+ return result.buildFuture();
+ }
+
+ // -- private classes and functions
+
+ private static String assembleExceptionMessage(Exception e) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+
+ StringBuffer buf = new StringBuffer();
+ buf.append("Exception: ");
+ buf.append(sw.toString());
+ return buf.toString();
+ }
+
+ private interface GetEntityInput<O extends DataObject> {
+ Builder<O> get() throws IOException;
+ }
+
+ private static <O extends DataObject,I extends DataObject> RpcResultBuilder<O> read(GetEntityInput<O> inputgetter ) {
+ RpcResultBuilder<O> result;
+ try {
+ Builder<O> outputBuilder = inputgetter.get();
+ result = RpcResultBuilder.success(outputBuilder);
+ } catch (Exception e) {
+ LOG.info("Exception", e);
+ result = RpcResultBuilder.failed();
+ result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));
+ }
+ return result;
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/resources/about/README.md b/sdnr/wt/data-provider/provider/src/main/resources/about/README.md
new file mode 100644
index 000000000..9c45d8354
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/resources/about/README.md
@@ -0,0 +1,2 @@
+# About
+ONAP SDN-R | ONF Wireless for ONAP {release-name} ({odl-version}) - Build: {build-time} {odlux-revision} {package-version} \ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/main/resources/about/test.bmp b/sdnr/wt/data-provider/provider/src/main/resources/about/test.bmp
new file mode 100644
index 000000000..d049ea5bc
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/resources/about/test.bmp
Binary files differ
diff --git a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
new file mode 100644
index 000000000..bc2e3f9cf
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============LICENSE_START=======================================================
+ONAP : ccsdk feature sdnr wt data-provider
+ ================================================================================
+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=========================================================
+ -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true">
+
+ <reference id="rpcProviderService" interface="org.opendaylight.mdsal.binding.api.RpcProviderService"
+ odl:type="default" />
+
+ <bean id="readyServlet"
+ class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet">
+ </bean>
+ <service interface="javax.servlet.http.HttpServlet"
+ ref="readyServlet">
+ <service-properties>
+ <entry key="alias" value="/ready" />
+ </service-properties>
+ </service>
+
+ <bean id="provider"
+ class="org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataProviderImpl"
+ init-method="init" destroy-method="close">
+ <property name="rpcProviderService" ref="rpcProviderService" />
+ <property name="readyServlet" ref="readyServlet" />
+</bean>
+ <bean id="yangServlet"
+ class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.YangSchemaHttpServlet">
+ </bean>
+ <service interface="javax.servlet.http.HttpServlet"
+ ref="yangServlet">
+ <service-properties>
+ <entry key="alias" value="/yang-schema" />
+ </service-properties>
+ </service>
+
+ <bean id="aboutServlet"
+ class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.AboutHttpServlet">
+ </bean>
+ <service interface="javax.servlet.http.HttpServlet"
+ ref="aboutServlet">
+ <service-properties>
+ <entry key="alias" value="/about" />
+ </service-properties>
+ </service>
+
+ <service ref="provider"
+ interface="org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider" />
+
+</blueprint>
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
new file mode 100644
index 000000000..e87ef9d9b
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestAbout.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * ============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.dataprovider.test;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.AboutHttpServlet;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class TestAbout {
+
+ @Test
+ public void testReadmeRequest() throws IOException, ServletException {
+ AboutHelperServlet servlet =new AboutHelperServlet();
+ HttpServletRequest request = mock(HttpServletRequest.class);
+ HttpServletResponse response = mock(HttpServletResponse.class);
+ when(request.getRequestURI()).thenReturn("/about");
+ StringWriter out = new StringWriter();
+ ServletOutputStream printOut = new ServletOutputStream() {
+
+ @Override
+ public void write(int arg0) throws IOException {
+ out.write(arg0);
+ }
+ };
+ when(response.getOutputStream()).thenReturn(printOut);
+ servlet.doGet(request,response);
+ verify(response).setStatus(200);
+ verify(response).setContentType("text/plain");
+ System.out.println(out.getBuffer().toString());
+ assertTrue(out.getBuffer().length()>0);
+ }
+
+ @Test
+ public void testReadmeResourceRequest() throws IOException, ServletException {
+ AboutHelperServlet servlet =new AboutHelperServlet();
+ HttpServletRequest request = mock(HttpServletRequest.class);
+ HttpServletResponse response = mock(HttpServletResponse.class);
+ when(request.getRequestURI()).thenReturn("/about/test.bmp");
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ServletOutputStream printOut = new ServletOutputStream() {
+
+ @Override
+ public void write(int arg0) throws IOException {
+ out.write(arg0);
+ }
+ };
+ when(response.getOutputStream()).thenReturn(printOut);
+ servlet.doGet(request,response);
+ verify(response).setStatus(200);
+ verify(response).setContentType("image/bmp");
+ assertTrue(out.size()>0);
+ }
+
+
+ private class AboutHelperServlet extends AboutHttpServlet{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doGet(req, resp);
+ }
+
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
new file mode 100644
index 000000000..51fe76d92
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestFilterConversion.java
@@ -0,0 +1,22 @@
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.QueryByFilter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.FilterBuilder;
+
+public class TestFilterConversion {
+
+ private static final String PROPERTY = "node-id";
+
+ @Test
+ public void testQuestionMark() {
+ List<Filter> filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY).setFiltervalue("si?ba").build());
+ QueryBuilder query = QueryByFilter.fromFilter(filters );
+ System.out.println(query.toJSON());
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
new file mode 100644
index 000000000..c32149ba5
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTimestampFilter.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * ============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.dataprovider.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.json.JSONObject;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.QueryByFilter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.Filter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.entity.input.FilterBuilder;
+
+public class TestTimestampFilter {
+
+
+
+ @Test
+ public void testTimestampRange() {
+ final String PROPERTY_TIMESTAMP = "timestamp";
+ List<Filter> filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2017*").build());
+ QueryBuilder query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2017-01-01T00:00:00.0Z", "2018-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2000-01-01T00:00:00.0Z", "3000-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("20*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2000-01-01T00:00:00.0Z", "2100-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("205*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-01-01T00:00:00.0Z", "2060-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-01-01T00:00:00.0Z", "2051-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-01-01T00:00:00.0Z", "2051-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-1*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-01T00:00:00.0Z", "2051-01-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-01T00:00:00.0Z", "2050-11-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-01T00:00:00.0Z", "2050-11-01T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-0*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-01T00:00:00.0Z", "2050-10-10T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-02*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-02T00:00:00.0Z", "2050-10-03T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T00:00:00.0Z", "2050-10-15T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T00:00:00.0Z", "2050-10-15T00:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T1*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T10:00:00.0Z", "2050-10-14T20:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:00:00.0Z", "2050-10-14T13:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:00:00.0Z", "2050-10-14T13:00:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:4*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:40:00.0Z", "2050-10-14T12:50:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:42*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:42:00.0Z", "2050-10-14T12:43:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:42:*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:42:00.0Z", "2050-10-14T12:43:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:42:5*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:42:50.0Z", "2050-10-14T12:43:00.0Z");
+
+ filters = Arrays.asList(new FilterBuilder().setProperty(PROPERTY_TIMESTAMP).setFiltervalue("2050-10-14T12:42:56*").build());
+ query= QueryByFilter.fromFilter(filters );
+ assertRange(query.getInner(), PROPERTY_TIMESTAMP, "2050-10-14T12:42:56.0Z", "2050-10-14T12:42:57.0Z");
+ }
+ private void assertRange(JSONObject rangeQuery,String property,String lower,String upper) {
+ System.out.println("==test for "+rangeQuery.toString());
+ assertTrue(rangeQuery.has("range"));
+ assertTrue(rangeQuery.getJSONObject("range").has(property));
+ JSONObject o=rangeQuery.getJSONObject("range").getJSONObject(property);
+ assertNotNull(o);
+ assertTrue(o.has("lt"));
+ assertEquals(upper, o.getString("lt"));
+ assertTrue(o.has("gte"));
+ assertEquals(lower, o.getString("gte"));
+ System.out.println("succeeded");
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangProvider.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangProvider.java
new file mode 100644
index 000000000..c911100ef
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangProvider.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * ============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.dataprovider.test;
+
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileAttribute;
+import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.PosixFilePermissions;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.Set;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.YangFileProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.YangFilename;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.YangSchemaHttpServlet;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class TestYangProvider {
+
+ private static final String TESTPATH = "cache/schema/";
+
+
+ @BeforeClass
+ public static void init() {
+ Set<PosixFilePermission> perms;
+ FileAttribute<?> attr;
+ perms = EnumSet.noneOf(PosixFilePermission.class);
+
+ perms.add(PosixFilePermission.OWNER_READ);
+ perms.add(PosixFilePermission.OWNER_WRITE);
+ perms.add(PosixFilePermission.OWNER_EXECUTE);
+
+ attr = PosixFilePermissions.asFileAttribute(perms);
+ try {
+ Files.createDirectories(new File(TESTPATH).toPath(),attr);
+ new File(TESTPATH+new YangFilename("module1","2010-01-01").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module2","2010-01-01").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module2","2010-04-01").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module3","2010-01-01").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module4","2010-05-01").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module5","2010-01-11").getFilename()).createNewFile();
+ new File(TESTPATH+new YangFilename("module6","2010-01-01").getFilename()).createNewFile();
+ } catch (IOException | ParseException e) {
+
+ }
+ }
+ @AfterClass
+ public static void deinit() {
+ try {
+ Files.walk(new File("cache").toPath())
+ .sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .forEach(File::delete);
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+ @Test
+ public void testExisting() {
+ YangFileProvider provider= new YangFileProvider(TESTPATH);
+ assertTrue(provider.hasFileForModule("module1","2010-01-01"));
+ assertTrue(provider.hasFileForModule("module2"));
+ assertTrue(provider.hasFileForModule("module3"));
+ assertFalse(provider.hasFileForModule("module5","2010-01-01"));
+ }
+ @Test
+ public void testRevision() throws ParseException {
+ SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
+ YangFileProvider provider= new YangFileProvider(TESTPATH);
+ YangFilename f1 = provider.getFileForModule("module1","2010-01-01");
+ assertEquals("module1",f1.getModule());
+ assertEquals(sdf.parse("2010-01-01"),f1.getRevision());
+ YangFilename f2 = provider.getFileForModule("module2");
+ assertEquals("module2",f2.getModule());
+ assertEquals(sdf.parse("2010-04-01"),f2.getRevision());
+ f2 = provider.getFileForModule("module2","2010-02-01");
+ assertEquals("module2",f2.getModule());
+ assertEquals(sdf.parse("2010-04-01"),f2.getRevision());
+ YangFilename f3 = provider.getFileForModule("module3");
+ assertEquals("module3",f3.getModule());
+ assertEquals(sdf.parse("2010-01-01"),f3.getRevision());
+ f3 = provider.getFileForModule("module3","2010-04-01");
+ assertNull(f3);
+ }
+ @Test
+ public void testServlet() throws IOException, ServletException {
+ HelpYangSchemaHttpServlet servlet = new HelpYangSchemaHttpServlet();
+ HttpServletRequest req = mock(HttpServletRequest.class);
+ HttpServletResponse resp = mock(HttpServletResponse.class);
+
+ when(req.getRequestURI()).thenReturn("/yang-schema/module1");
+ StringWriter out = new StringWriter();
+ ServletOutputStream printOut = new ServletOutputStream() {
+
+ @Override
+ public void write(int arg0) throws IOException {
+ out.write(arg0);
+ }
+ };
+ when(resp.getOutputStream()).thenReturn(printOut);
+ servlet.doGet(req,resp);
+ verify(resp).setStatus(200);
+ verify(resp).setContentType("text/plain");
+
+ }
+ @Test
+ public void testServletBad() throws IOException, ServletException {
+ HelpYangSchemaHttpServlet servlet = new HelpYangSchemaHttpServlet();
+ HttpServletRequest req = mock(HttpServletRequest.class);
+ HttpServletResponse resp = mock(HttpServletResponse.class);
+
+ when(req.getRequestURI()).thenReturn("/yang-schema/module1/2020-01-01");
+ StringWriter out = new StringWriter();
+ ServletOutputStream printOut = new ServletOutputStream() {
+
+ @Override
+ public void write(int arg0) throws IOException {
+ out.write(arg0);
+ }
+ };
+ when(resp.getOutputStream()).thenReturn(printOut);
+ servlet.doGet(req,resp);
+ verify(resp).sendError(HttpServletResponse.SC_NOT_FOUND);
+
+ }
+ @Test
+ public void testServletNear() throws IOException, ServletException {
+ HelpYangSchemaHttpServlet servlet = new HelpYangSchemaHttpServlet();
+ HttpServletRequest req = mock(HttpServletRequest.class);
+ HttpServletResponse resp = mock(HttpServletResponse.class);
+
+ when(req.getRequestURI()).thenReturn("/yang-schema/module2/2010-03-01");
+ StringWriter out = new StringWriter();
+ ServletOutputStream printOut = new ServletOutputStream() {
+
+ @Override
+ public void write(int arg0) throws IOException {
+ out.write(arg0);
+ }
+ };
+ when(resp.getOutputStream()).thenReturn(printOut);
+ servlet.doGet(req,resp);
+ verify(resp).setStatus(200);
+ verify(resp).setContentType("text/plain");
+
+ }
+ private static class HelpYangSchemaHttpServlet extends YangSchemaHttpServlet{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ super.doGet(req, resp);
+ }
+ }
+
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/log4j.properties b/sdnr/wt/data-provider/provider/src/test/resources/log4j.properties
new file mode 100644
index 000000000..142663bd2
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/log4j.properties
@@ -0,0 +1,12 @@
+log4j.rootLogger=INFO, out
+
+log4j.logger.org.apache.camel.impl.converter=WARN
+log4j.logger.org.apache.camel.management=WARN
+log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
+log4j.logger.org.springframework=ERROR
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/log4j2.xml b/sdnr/wt/data-provider/provider/src/test/resources/log4j2.xml
new file mode 100644
index 000000000..164e93f54
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/log4j2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration package="log4j.test"
+ status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Logger name="log4j.test.Log4jTest" level="debug">
+ <AppenderRef ref="Console"/>
+ </Logger>
+ <Root level="trace">
+ <AppenderRef ref="Console"/>
+ </Root>
+ </Loggers>
+</Configuration> \ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/simplelogger.properties b/sdnr/wt/data-provider/provider/src/test/resources/simplelogger.properties
new file mode 100644
index 000000000..a2f1e7e76
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/simplelogger.properties
@@ -0,0 +1,6 @@
+org.slf4j.simpleLogger.defaultLogLevel=debug
+org.slf4j.simpleLogger.showDateTime=true
+#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
+#org.slf4j.simpleLogger.showThreadName=true
+org.slf4j.simpleLogger.showLogName=true
+org.slf4j.simpleLogger.showShortLogName=false \ No newline at end of file