source out odl mapper
put odl mapper code into seperate bundle
Issue-ID: CCSDK-3254
Signed-off-by: Michael DÜrre <michael.duerre@highstreet-technologies.com>
Change-Id: I3debef0be8e44e7c68c95a6d06b7e50813bbea43
diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java
new file mode 100644
index 0000000..7e8327a
--- /dev/null
+++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class OperatorStateBuilder {
+ private OperatorStateBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static OperatorState getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java
new file mode 100644
index 0000000..7c4a63d
--- /dev/null
+++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class ResourceBuilder {
+ private ResourceBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Resource getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java
new file mode 100644
index 0000000..282a6a2
--- /dev/null
+++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class ResourceMatchBuilder {
+ private ResourceMatchBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static ResourceMatch getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java
new file mode 100644
index 0000000..8139192
--- /dev/null
+++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class SeverityWithClearBuilder {
+ private SeverityWithClearBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static SeverityWithClear getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java
new file mode 100644
index 0000000..9f10ae8
--- /dev/null
+++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911.alarms;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class ControlMaxAlarmStatusChangesBuilder {
+ private ControlMaxAlarmStatusChangesBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Control.MaxAlarmStatusChanges getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/pom.xml b/sdnr/wt/common-yang/pom.xml
index 19a2a0f..01bde5e 100755
--- a/sdnr/wt/common-yang/pom.xml
+++ b/sdnr/wt/common-yang/pom.xml
@@ -44,6 +44,7 @@
<module>rfc8341</module>
<module>rfc7317-ietf-system</module>
<module>ietf-alarms</module>
+ <module>utils</module>
</modules>
</project>
diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java
new file mode 100644
index 0000000..3114280
--- /dev/null
+++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class RuleListGroupBuilder {
+ private RuleListGroupBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static RuleList.Group getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java
new file mode 100644
index 0000000..91ae639
--- /dev/null
+++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class RuleAccessOperationsBuilder {
+ private RuleAccessOperationsBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Rule.AccessOperations getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java
new file mode 100644
index 0000000..acf0112
--- /dev/null
+++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class RuleModuleNameBuilder {
+ private RuleModuleNameBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Rule.ModuleName getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java
new file mode 100644
index 0000000..7aca26b
--- /dev/null
+++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list.rule.rule.type;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class NotificationNotificationNameBuilder {
+ private NotificationNotificationNameBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Notification.NotificationName getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java
new file mode 100644
index 0000000..3610df2
--- /dev/null
+++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java
@@ -0,0 +1,23 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list.rule.rule.type;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+
+/**
+ * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation.
+ * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32).
+ *
+ * The reason behind putting it under src/main/java is:
+ * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent
+ * loss of user code.
+ *
+ */
+public class ProtocolOperationRpcNameBuilder {
+ private ProtocolOperationRpcNameBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static ProtocolOperation.RpcName getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/pom.xml b/sdnr/wt/common-yang/utils/pom.xml
new file mode 100644
index 0000000..ef3c22b
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ ============LICENSE_START=======================================================
+ ~ ONAP : ccsdk features
+ ~ ================================================================================
+ ~ Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
+ ~ All rights reserved.
+ ~ ================================================================================
+ ~ Update Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ ~ ================================================================================
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ ~ ============LICENSE_END=======================================================
+ ~
+ -->
+
+<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>
+
+ <parent>
+ <groupId>org.onap.ccsdk.parent</groupId>
+ <artifactId>binding-parent</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+ <artifactId>sdnr-wt-yang-utils</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+
+ <name>ccsdk-features :: ${project.artifactId}</name>
+ <licenses>
+ <license>
+ <name>Apache License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+ </license>
+ </licenses>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.findbugs</groupId>
+ <artifactId>annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+ <artifactId>rfc6991-ietf-yang-types</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java
similarity index 72%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java
index e7580c6..f406ea9 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java
@@ -19,15 +19,16 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.KeyDeserializer;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsBuilderAnnotationIntrospector;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsModule;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +41,8 @@
@SuppressWarnings("unused")
private final Logger LOG = LoggerFactory.getLogger(YangToolsMapper.class);
+ private final YangToolsBuilderAnnotationIntrospector annotationIntrospector;
+ private final YangToolsModule module;
private static final long serialVersionUID = 1L;
public YangToolsMapper() {
@@ -49,12 +52,22 @@
protected YangToolsMapper(YangToolsBuilderAnnotationIntrospector yangToolsBuilderAnnotationIntrospector) {
super();
+ this.annotationIntrospector = yangToolsBuilderAnnotationIntrospector;
+ this.module = new YangToolsModule();
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
setSerializationInclusion(Include.NON_NULL);
enable(MapperFeature.USE_GETTERS_AS_SETTERS);
setAnnotationIntrospector(yangToolsBuilderAnnotationIntrospector);
- registerModule(new YangToolsModule());
+ registerModule(this.module);
+
+ }
+ public void addDeserializer(Class<?> clsToDeserialize, String builderClassName) {
+ this.annotationIntrospector.addDeserializer(clsToDeserialize, builderClassName);
+ }
+
+ public void addKeyDeserializer(Class<?> type, KeyDeserializer deserializer) {
+ this.module.addKeyDeserializer(type, deserializer);
}
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java
similarity index 95%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java
index a19f114..5c5aeb6 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java
@@ -19,12 +19,12 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper;
import java.lang.reflect.InvocationTargetException;
import javax.annotation.Nullable;
import org.eclipse.jdt.annotation.NonNull;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsBuilderAnnotationIntrospector;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.slf4j.Logger;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
similarity index 86%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
index a2afab0..ac6b1b5 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java
@@ -19,19 +19,26 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper;
import com.fasterxml.jackson.databind.DeserializationContext;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Nullable;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yangtools.concepts.Builder;
+import org.opendaylight.yangtools.yang.binding.EventInstantAware;
+import org.opendaylight.yangtools.yang.binding.Notification;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
@@ -43,6 +50,8 @@
private static final Logger LOG = LoggerFactory.getLogger(YangToolsMapperHelper.class);
private static final String TYPEOBJECT_INSTANCE_METHOD = "getDefaultInstance";
private static final String BUILDER = "Builder";
+ private static final DateTimeFormatter formatterOutput =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S'Z'").withZone(ZoneOffset.UTC);
private static BundleContext context = getBundleContext();
private static ConcurrentHashMap<String, Class<?>> cache = new ConcurrentHashMap<>();
@@ -201,6 +210,9 @@
}
public static boolean implementsInterface(Class<?> clz, Class<?> ifToImplement) {
+ if(clz.equals(ifToImplement)) {
+ return true;
+ }
Class<?>[] ifs = clz.getInterfaces();
for (Class<?> iff : ifs) {
if (iff.equals(ifToImplement)) {
@@ -241,4 +253,18 @@
Bundle bundle = FrameworkUtil.getBundle(YangToolsMapperHelper.class);
return bundle != null ? bundle.getBundleContext() : null;
}
+ public static boolean hasTime(Notification notification) {
+ return notification instanceof EventInstantAware;
+ }
+ public static DateAndTime getTime(Notification notification, Instant defaultValue) {
+ Instant time;
+ if (hasTime(notification)) { // If notification class extends/implements the EventInstantAware
+ time = ((EventInstantAware) notification).eventInstant();
+ LOG.debug("Event time {}", time);
+ } else {
+ time = defaultValue;
+ LOG.debug("Defaulting to actual time of processing the notification - {}", time);
+ }
+ return DateAndTime.getDefaultInstance(ZonedDateTime.ofInstant(time, ZoneOffset.UTC).format(formatterOutput));
+ }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java
similarity index 94%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java
index 8dbaf4a..f6afc57 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.builder;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.builder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
similarity index 86%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
index eb611c6..46c9660 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder.Value;
@@ -31,12 +31,10 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.builder.DateAndTimeBuilder;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.builder.DateAndTimeBuilder;
//import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.builders.rev201110.read.network.element.connection.list.output.DataBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
@@ -61,7 +59,7 @@
this.customDeserializer.put(cls, builderClass.getName());
}
this.customDeserializer.put(DateAndTime.class, DateAndTimeBuilder.class.getName());
- this.customDeserializer.put(Credentials.class, LoginPasswordBuilder.class.getName());
+ //this.customDeserializer.put(Credentials.class, LoginPasswordBuilder.class.getName());
}
@Override
@@ -115,9 +113,13 @@
if (res == null) {
res = super.resolveSetterConflict(config, setter1, setter2);
}
- LOG.debug("{} (m1={} <=> m2={} => result:{})", setter1.getName(), p1.getSimpleName(), p2.getSimpleName(),
- res.getRawParameterType(0).getSimpleName());
-
+ if(res ==null) {
+ LOG.warn("unable to resolve setter conflict for {}", setter1.getName());
+ }
+ else {
+ LOG.debug("{} (m1={} <=> m2={} => result:{})", setter1.getName(), p1.getSimpleName(), p2.getSimpleName(),
+ res.getRawParameterType(0)==null?"null":res.getRawParameterType(0).getSimpleName());
+ }
return res;
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
similarity index 83%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
index 634a3bc..c12d17e 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
@@ -33,16 +33,14 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.NoSuchElementException;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.ScalarTypeObject;
-//import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.ScalarTypeObject;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.BaseIdentityDeserializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.ClassDeserializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.IdentifierDeserializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.TypeObjectDeserializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.BaseIdentityDeserializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.ClassDeserializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.IdentifierDeserializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.TypeObjectDeserializer;
import org.opendaylight.yangtools.yang.binding.BaseIdentity;
import org.opendaylight.yangtools.yang.binding.Identifier;
+import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
import org.opendaylight.yangtools.yang.binding.TypeObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -87,8 +85,8 @@
if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) {
deser = new TypeObjectDeserializer<TypeObject>(type, deser);
- } else if (YangToolsMapperHelper.implementsInterface(rawClass, YangHelper2.getScalarTypeObjectClass())) {
- deser = new TypeObjectDeserializer<ScalarTypeObject>(type, deser);
+ } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) {
+ deser = new TypeObjectDeserializer<ScalarTypeObject<?>>(type, deser);
} else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) {
deser = new BaseIdentityDeserializer<BaseIdentity>(deser);
} else if (rawClass.equals(Class.class)) {
@@ -110,8 +108,4 @@
LOG.debug("Keydeserialize '{}' with deserializer '{}'", type.getRawClass().getName(), res.getClass().getName());
return res;
}
-
- void test() {
- com.fasterxml.jackson.databind.util.ClassUtil xy;
- }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java
similarity index 70%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java
index 46f69d4..02628dc 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java
@@ -19,17 +19,16 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.Map;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.DateAndTimeSerializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.EnumSerializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.IdentifierDeserializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.MapSerializer;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize.TypeObjectSerializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.DateAndTimeSerializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.EnumSerializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.MapSerializer;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.TypeObjectSerializer;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.MeasurementKey;
+import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
import org.opendaylight.yangtools.yang.binding.TypeObject;
public class YangToolsModule extends SimpleModule {
@@ -40,11 +39,12 @@
super();
setDeserializerModifier(new YangToolsDeserializerModifier());
- addKeyDeserializer(MeasurementKey.class, new IdentifierDeserializer());
addSerializer(DateAndTime.class, new DateAndTimeSerializer());
addSerializer(TypeObject.class, new TypeObjectSerializer());
+ addSerializer(ScalarTypeObject.class, new TypeObjectSerializer());
addSerializer(Enum.class, new EnumSerializer());
addSerializer(Map.class, new MapSerializer());
+
}
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java
similarity index 93%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java
index 10f18e7..f85f80e 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java
@@ -19,14 +19,14 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java
similarity index 91%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java
index 2627c2a..9d221f5 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java
@@ -19,12 +19,12 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer;
import java.io.IOException;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
public class ClassDeserializer extends FromStringDeserializer<Class<?>> {
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java
similarity index 95%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java
index a35aad7..f4fd875 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java
similarity index 94%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java
index f8220c2..55a20d6 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java
similarity index 94%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java
index 0837b8a..6c4c25e 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java
@@ -19,14 +19,14 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.KeyDeserializer;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java
similarity index 94%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java
index e5c966a..63689c0 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java
similarity index 95%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java
index 5beca0d..b857a2f 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -30,7 +30,7 @@
import java.lang.reflect.InvocationTargetException;
import java.util.NoSuchElementException;
import java.util.Optional;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.opendaylight.yangtools.concepts.Builder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java
similarity index 91%
rename from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java
rename to sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java
index 1269d07..b43e6c1 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java
@@ -19,7 +19,7 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
@@ -38,9 +38,10 @@
String name;
for (Method method : methods) {
name = method.getName();
- if (name.equals("stringValue") || name.equals("getValue")) {
+ if (method.getParameterCount()==0 && (name.equals("stringValue") || name.equals("getValue"))) {
try {
gen.writeString((String)method.invoke(value));
+ break;
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
| IOException e) {
throw new IOException("No String getter method supported TypeObject for "+value.getClass(),e);
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
index f8734d5..1f67e5e 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
@@ -29,10 +29,8 @@
import java.security.cert.CertificateException;
import java.security.spec.InvalidKeySpecException;
import java.text.ParseException;
-
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
-
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
@@ -140,57 +138,6 @@
}
}
- // private class SSLCercAuthHttpClientConfigCallback implements HttpClientConfigCallback {
- //
- // private final String certFilename;
- //
- // SSLCercAuthHttpClientConfigCallback(String certfile) {
- // this.certFilename = certfile;
- // }
- //
- // @Override
- // public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
- // if (this.certFilename == null) {
- // return httpClientBuilder;
- // }
- //
- // char[] keystorePass = "MY PASSWORD".toCharArray();
- //
- // FileInputStream fis = null;
- //
- // // Loading KEYSTORE in JKS format
- // KeyStore keyStorePci = null;
- // try {
- // keyStorePci = KeyStore.getInstance(KeyStore.getDefaultType());
- // } catch (KeyStoreException e1) {
- // LOG.warn("unable to load keystore: {}",e1);
- // }
- // if (keyStorePci != null) {
- // try {
- // fis = new FileInputStream(this.certFilename);
- // keyStorePci.load(fis, keystorePass);
- // } catch (Exception e) {
- // LOG.error("Error loading keystore: " + this.certFilename);
- // } finally {
- // if (fis != null) {
- // try {
- // fis.close();
- // } catch (IOException e) {
- //
- // }
- // }
- // }
- // }
- // SSLContext sslcontext=null;
- // try {
- // sslcontext = SSLContexts.custom().loadKeyMaterial(keyStorePci, keystorePass).build();
- // } catch (KeyManagementException | UnrecoverableKeyException | NoSuchAlgorithmException
- // | KeyStoreException e) {
- // LOG.warn("unable to load sslcontext: {}",e);
- // }
- // return httpClientBuilder.setSSLContext(sslcontext);
- // }
- // }
private final RestClient client;
private final boolean isES7;
@@ -298,7 +245,7 @@
/**
* Search for database entries
- *
+ *
* @param request inputRequest
* @param ignoreParseException especially for usercreated filters which may cause ES server response exceptions
* @return Response with related entries
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
index 82c0364..70e41c2 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
@@ -37,9 +37,28 @@
return restFilterValue == null ? false : restFilterValue.contains("*") || restFilterValue.contains("?");
}
+ public static boolean hasSearchParams(List<String> restFilterValues) {
+ for (String restFilterValue : restFilterValues) {
+ if (!hasSearchParams(restFilterValue)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static boolean isComparisonValid(String restFilterValue) {
return restFilterValue == null ? false : restFilterValue.contains(">") || restFilterValue.contains("<");
}
+
+ public static boolean isComparisonValid(List<String> restFilterValues) {
+ for (String restFilterValue : restFilterValues) {
+ if (!isComparisonValid(restFilterValue)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public static boolean isDatetimeKeyValue(String key, String value) {
return timestampValueNames.contains(key.toLowerCase());
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
index 7b22fd5..582d749 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
@@ -21,6 +21,7 @@
*/
package org.onap.ccsdk.features.sdnr.wt.common.database.queries;
+import java.util.List;
import org.json.JSONObject;
public class QueryBuilders {
@@ -34,6 +35,11 @@
o.put(key, value);
return new QueryBuilder().setQuery("term", o);
}
+ public static QueryBuilder multiTermQuery(String key, List<String> value) {
+ JSONObject o = new JSONObject();
+ o.put(key, value);
+ return new QueryBuilder().setQuery("terms", o);
+ }
public static QueryBuilder matchQuery(String key, Object value) {
JSONObject o = new JSONObject();
@@ -41,6 +47,14 @@
return new QueryBuilder().setQuery("match", o);
}
+ public static QueryBuilder matchQuery(String key, List<?> values) {
+ BoolQueryBuilder query = boolQuery();
+ for (Object value : values) {
+ query.should(matchQuery(key, value));
+ }
+ return query;
+ }
+
public static BoolQueryBuilder boolQuery() {
return new BoolQueryBuilder();
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
index 937e2d8..ffb31c6 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
@@ -370,6 +370,15 @@
return SSLCERT_PEM;
}
+ public static String decodeBasicAuthHeaderUsername(String authHeader) {
+ if(authHeader.startsWith("Basic")) {
+ authHeader = authHeader.substring(6);
+ }
+ final String decoded = new String(Base64.getDecoder().decode(authHeader));
+ String[] tmp = decoded.split(":");
+ return tmp.length > 0 ? tmp[0] : null;
+ }
+
}
diff --git a/sdnr/wt/common/src/test/resources/testpom.xml b/sdnr/wt/common/src/test/resources/testpom.xml
index e57fed4..6fba87a 100644
--- a/sdnr/wt/common/src/test/resources/testpom.xml
+++ b/sdnr/wt/common/src/test/resources/testpom.xml
@@ -29,13 +29,13 @@
<parent>
<groupId>org.onap.ccsdk.parent</groupId>
<artifactId>binding-parent</artifactId>
- <version>2.1.0-SNAPSHOT</version>
+ <version>2.0.0-SNAPSHOT</version>
<relativePath/>
</parent>
<groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
<artifactId>sdnr-wt-common</artifactId>
- <version>1.1.1-SNAPSHOT</version>
+ <version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ccsdk-features :: ${project.artifactId}</name>
@@ -63,7 +63,7 @@
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
+ <artifactId>servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
diff --git a/sdnr/wt/data-provider/installer/pom.xml b/sdnr/wt/data-provider/installer/pom.xml
index cdd1724..ee6b2f3 100755
--- a/sdnr/wt/data-provider/installer/pom.xml
+++ b/sdnr/wt/data-provider/installer/pom.xml
@@ -118,27 +118,8 @@
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
- <version>2.6</version>
<executions>
<execution>
- <id>copy-sdnr-data-migration-tool</id>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <phase>validate</phase>
- <configuration>
- <outputDirectory>${project.build.directory}/assembly/system/org/onap/ccsdk/features/sdnr/wt/sdnr-wt-data-provider-setup/${project.version}</outputDirectory>
- <resources>
- <resource>
- <directory>${basedir}/../setup/target</directory>
- <includes>
- <include>sdnr-dmt.jar</include>
- </includes>
- </resource>
- </resources>
- </configuration>
- </execution>
- <execution>
<id>copy-schemas</id>
<goals>
<goal>copy-resources</goal>
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java
similarity index 63%
copy from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java
copy to sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java
index e5c966a..e734a47 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java
@@ -19,19 +19,22 @@
* ============LICENSE_END=========================================================
*
*/
-package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.serialize;
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.model;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import java.io.IOException;
-import java.util.Map;
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
-@SuppressWarnings("rawtypes")
-public class MapSerializer extends JsonSerializer<Map> {
+public class DataInconsistencyException extends Exception {
- @Override
- public void serialize(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
- gen.writeObject(value.values());
- }
+ private static final long serialVersionUID = 1L;
+ private final List<Inventory> repaired;
+
+ public DataInconsistencyException(List<Inventory> repaired, String message) {
+ super(message);
+ this.repaired = repaired;
+ }
+
+ public List<Inventory> getRepairedList() {
+ return this.repaired;
+ }
}
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
index 47255fd..e6eb7a4 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
@@ -67,10 +67,15 @@
/**
* write internal equipment to database
- *
* @param internalEquipment with mandatory fields.
*/
void writeInventory(Inventory internalEquipment);
+ /**
+ * write internal equipment to database
+ * @param nodeId
+ * @param list with mandatory fields.
+ */
+ void writeInventory(String nodeId, List<Inventory> list);
/**
* write GUI Cut through data to database
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java
new file mode 100644
index 0000000..2f580c9
--- /dev/null
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ */
+package org.onap.ccsdk.features.sdnr.wt.dataprovider.model;
+
+/**
+ * @author Jack
+ *
+ */
+public interface HtUserdataManager {
+
+ String getUserdata(String username);
+
+ String getUserdata(String username, String key);
+
+ boolean setUserdata(String username, String data);
+
+ boolean setUserdata(String username, String key, String data);
+
+ boolean removeUserdata(String username);
+
+ boolean removeUserdata(String username, String key);
+
+}
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
index 9ba10cd..2a91d78 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
@@ -27,6 +27,8 @@
/** Get provider to access read/write operations for maintenance **/
public HtDatabaseMaintenance getHtDatabaseMaintenance();
+ public HtUserdataManager getHtDatabaseUserManager();
+
/** Set overall ready status from outside of this data-provider **/
public void setReadyStatus(boolean status);
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java
index bd71d5b..2ccebca 100644
--- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java
+++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java
@@ -75,14 +75,14 @@
/**
* Specify the input format expected from netconf, and from specific devices.
*/
- private static DateTimeFormatter formatterInput =
+ private static final DateTimeFormatter formatterInput =
DateTimeFormatter.ofPattern("" + "[yyyy-MM-dd'T'HH:mm[:ss][.SSS][.SS][.S][xxx][xx][X][Z]]"
+ "[yyyyMMddHHmmss[.SSS][.SS][.S][xxx][xx][X][Z]]").withZone(ZoneOffset.UTC);
/**
* Specify output format that is used internally
*/
- private static DateTimeFormatter formatterOutput =
+ private static final DateTimeFormatter formatterOutput =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S'Z'").withZone(ZoneOffset.UTC);
/**
diff --git a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
index 8509007..84c43d5 100644
--- a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
+++ b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
@@ -104,6 +104,10 @@
description
"list of GUI Cut through entries";
}
+ enum userdata {
+ description
+ "user specific data. id=username";
+ }
}
description
"Data type and alias for elasticsearch or table name for SQL database.";
@@ -556,7 +560,11 @@
description
"An object class describing a mediator server entity.";
}
-
+ container mediator-server {
+ description
+ "builder";
+ uses mediator-server-entity;
+ }
grouping pmdata-base {
description
"Performance data base information";
@@ -1260,6 +1268,11 @@
description
"current connection status. default Disconnected";
}
+ leaf tls-key {
+ type string;
+ description
+ "TLS key-id in MD-SAL";
+ }
description
"An object class defining the NetConf connection towards a
NetConf server. ";
@@ -1324,6 +1337,11 @@
description
"The filter information for the corresponding property.";
}
+ leaf-list filtervalues {
+ type string;
+ description
+ "The filter information for the corresponding property.";
+ }
description
"List with filter criteria. Not listed means all.";
}
@@ -1406,12 +1424,12 @@
type string;
mandatory true;
description
- "Unique database id, node-id/uuid";
+ "Unique database id, node-id";
}
leaf name {
type string;
description
- "Mountpoint Name";
+ "Name of the system to which a GUI Cutthrough session will be established";
}
leaf weburi {
type string;
diff --git a/sdnr/wt/data-provider/provider/pom.xml b/sdnr/wt/data-provider/provider/pom.xml
index 9045dfa..3507d41 100644
--- a/sdnr/wt/data-provider/provider/pom.xml
+++ b/sdnr/wt/data-provider/provider/pom.xml
@@ -48,7 +48,8 @@
<properties>
<maven.javadoc.skip>true</maven.javadoc.skip>
- <databaseport>49402</databaseport>
+ <databaseport>49402</databaseport>
+ <initdb>${basedir}/../setup/target/sdnr-dmt.jar</initdb>
</properties>
<dependencies>
@@ -74,6 +75,11 @@
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
+ <artifactId>sdnr-wt-yang-utils</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
<artifactId>sdnr-wt-data-provider-model</artifactId>
<version>${project.version}</version>
</dependency>
@@ -159,7 +165,7 @@
<executable>${basedir}/java.sh</executable>
<arguments>
<argument>-jar</argument>
- <argument>${basedir}/../../data-provider/setup/target/sdnr-dmt.jar</argument>
+ <argument>${initdb}</argument>
<argument>-c</argument>
<argument>pluginfile</argument>
<argument>-of</argument>
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java
new file mode 100644
index 0000000..73cc1a2
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java
@@ -0,0 +1,150 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2020 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.IOException;
+import java.nio.file.Files;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
+import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
+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.dataprovider.model.HtUserdataManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HtUserdataManagerImpl implements HtUserdataManager {
+
+ private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerImpl.class);
+
+ private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json";
+ private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults();
+
+ private static JSONObject loadDefaults() {
+ File f = new File(USERDATA_DEFAULTS_FILENAME);
+ String content;
+ JSONObject o = null;
+ if (f.exists()) {
+ try {
+ content = Files.readString(f.toPath());
+ o = new JSONObject(content);
+ } catch (IOException e) {
+ LOG.warn("problem loading defaults: ", e);
+ } catch (JSONException e) {
+ LOG.warn("problem parsing defaults: ", e);
+ }
+ }
+ return o;
+ }
+
+
+ private final HtDatabaseClient dbClient;
+
+ public HtUserdataManagerImpl(HtDatabaseClient rawClient) {
+ this.dbClient = rawClient;
+ }
+
+ @Override
+ public String getUserdata(String username) {
+ SearchResult<SearchHit> result = this.dbClient.doReadByQueryJsonData(Entity.Userdata.getName(),
+ QueryBuilders.matchQuery("_id", username));
+ String json = result.getHits().size() > 0 ? result.getHits().get(0).getSourceAsString() : "{}";
+ if (USERDATA_DEFAULTS_CONTENT != null) {
+ JSONObject merge = mergeData(new JSONObject(json), USERDATA_DEFAULTS_CONTENT);
+ json = merge.toString();
+ }
+ return json;
+ }
+
+ @Override
+ public String getUserdata(String username, String key) {
+ JSONObject o = new JSONObject(this.getUserdata(username));
+ return o.has(key) ? o.get(key).toString() : "{}";
+ }
+
+ @Override
+ public boolean setUserdata(String username, String data) {
+ JSONObject o = new JSONObject(this.getUserdata(username));
+ JSONObject merge = mergeData(o, new JSONObject(data));
+ return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, merge.toString()) != null;
+ }
+
+ @Override
+ public boolean setUserdata(String username, String key, String data) {
+ JSONObject o = new JSONObject(this.getUserdata(username));
+ o = mergeData(o, key, new JSONObject(data));
+ return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, o.toString()) != null;
+ }
+
+ @Override
+ public boolean removeUserdata(String username) {
+ return this.dbClient.doRemove(Entity.Userdata.getName(), username);
+ }
+
+ @Override
+ public boolean removeUserdata(String username, String key) {
+ JSONObject o = new JSONObject(this.getUserdata(username));
+ if (o.has(key)) {
+ o.remove(key);
+ return this.setUserdata(username, o.toString());
+ }
+ return true;
+ }
+
+ private static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) {
+ if (!o.has(key)) {
+ o.put(key, subObject);
+ } else {
+ JSONObject tmp = new JSONObject();
+ tmp.put(key, subObject);
+ o = mergeData(tmp, o);
+ }
+ return o;
+ }
+
+ private static JSONObject mergeData(JSONObject source, JSONObject target) throws JSONException {
+ String[] keys = JSONObject.getNames(source);
+ if (keys == null) {
+ return target;
+ }
+ for (String key : keys) {
+ Object value = source.get(key);
+ if (!target.has(key)) {
+ // new value for "key":
+ target.put(key, value);
+ } else {
+ // existing value for "key" - recursively deep merge:
+ if (value instanceof JSONObject) {
+ JSONObject valueJson = (JSONObject) value;
+ mergeData(valueJson, target.getJSONObject(key));
+ } else {
+ target.put(key, value);
+ }
+ }
+ }
+ return target;
+ }
+
+}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java
index f6cd749..f680edd 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java
@@ -24,7 +24,10 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import javax.annotation.Nonnull;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
@@ -36,6 +39,7 @@
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.ArchiveCleanProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataInconsistencyException;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.NetconfTimeStampImpl;
@@ -62,6 +66,7 @@
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntity;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInputBuilder;
+import org.opendaylight.yangtools.yang.common.Uint32;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -120,8 +125,8 @@
NetworkElementConnectionEntity.class, NetworkElementConnectionBuilder.class, true)
.setEsIdAttributeName("_id");
- guiCutThroughDB = new EsDataObjectReaderWriter2<>(client, Entity.Guicutthrough,
- GuicutthroughEntity.class, GuicutthroughBuilder.class);
+ guiCutThroughDB = new EsDataObjectReaderWriter2<>(client, Entity.Guicutthrough, GuicutthroughEntity.class,
+ GuicutthroughBuilder.class);
pmData15mDB = new EsDataObjectReaderWriter2<>(client, Entity.Historicalperformance15min, PmdataEntity.class,
PmdataEntityBuilder.class);
@@ -259,22 +264,109 @@
*
* @param internalEquipment with mandatory fields.
*/
+
@Override
public void writeInventory(Inventory internalEquipment) {
- if (assertIfClientNullForNodeName(internalEquipment.getNodeId())) {
- return;
- }
if (internalEquipment.getManufacturerIdentifier() == null) {
internalEquipment = new InventoryBuilder(internalEquipment).setManufacturerIdentifier("").build();
}
if (internalEquipment.getDate() == null) {
internalEquipment = new InventoryBuilder(internalEquipment).setDate("").build();
}
-
eventRWEquipment.write(internalEquipment, internalEquipment.getNodeId() + "/" + internalEquipment.getUuid());
}
+ /**
+ * write internal equipment to database
+ *
+ * @param nodeId
+ * @param list
+ */
+ @Override
+ public void writeInventory(String nodeId, List<Inventory> list) {
+
+ try {
+ checkConsistency(nodeId, list);
+ } catch (DataInconsistencyException e) {
+ LOG.warn("inventory list for node {} is not consistent", nodeId, e);
+ list = e.getRepairedList();
+ }
+
+ for (Inventory internalEquipment : list) {
+ this.writeInventory(internalEquipment);
+ }
+ }
+
+ private static void checkConsistency(String nodeId, List<Inventory> list) throws DataInconsistencyException {
+ final String UNBOUND_INVENTORY_UUID = "unbound";
+ List<String> failures = new ArrayList<>();
+ long treeLevel;
+ int failCounter = 0;
+ Map<String, Inventory> repairList = new HashMap<>();
+ InventoryBuilder repairedItem;
+ InventoryBuilder unboundItem = new InventoryBuilder().setNodeId(nodeId).setUuid(UNBOUND_INVENTORY_UUID)
+ .setTreeLevel(Uint32.valueOf(0));;
+ for (Inventory item : list) {
+ repairedItem = new InventoryBuilder(item);
+ //check missing tree-level
+ if (!nodeId.equals(item.getNodeId())) {
+ failures.add(String.format("missing node-id for equipment(uuid=%s)", item.getUuid()));
+ repairedItem.setNodeId(nodeId);
+ failCounter++;
+ }
+ if (item.getTreeLevel() == null) {
+ failures.add(String.format("missing tree-level for equipment(uuid=%s)", item.getUuid()));
+ repairedItem.setTreeLevel(Uint32.valueOf(1));
+ failCounter++;
+
+ } else {
+ treeLevel = item.getTreeLevel().longValue();
+ if (treeLevel > 0) {
+ //check non root elem and missing parent
+ if (item.getParentUuid() == null) {
+ failures.add(String.format("Non root level element (uuid=%s) has to have a parent element",
+ item.getUuid()));
+ failCounter++;
+ repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID);
+ repairList.put(unboundItem.getUuid(), unboundItem.build());
+ }
+ //check that parent exists in list and is tree-level -1
+ else {
+ Optional<Inventory> parent =
+ list.stream().filter(e -> item.getParentUuid().equals(e.getUuid())).findFirst();
+ if (parent.isEmpty()) {
+ failures.add(String.format("no parent found for uuid=%s with parent-uuid=%s",
+ item.getUuid(), item.getParentUuid()));
+ repairedItem.setParentUuid(UNBOUND_INVENTORY_UUID);
+ failCounter++;
+ }
+ }
+ }
+ //check for duplicated uui
+ Optional<Inventory> duplicate = list
+ .stream().filter(e -> !item.equals(e) && item.getUuid() != null
+ && item.getUuid().equals(e.getUuid()) && repairList.containsKey(e.getUuid()))
+ .findFirst();
+ if (duplicate.isPresent()) {
+ failures.add(String.format("found duplicate uuid=%s", item.getUuid()));
+ failCounter++;
+ continue;
+
+ }
+ if (failCounter > 0) {
+ repairList.put(repairedItem.getUuid(), repairedItem.build());
+ } else {
+ repairList.put(item.getUuid(), item);
+ }
+ }
+ }
+
+ if (failures.size() > 0) {
+ throw new DataInconsistencyException(new ArrayList<>(repairList.values()),
+ "inventory list is not consistent;\n" + String.join("\n", failures));
+ }
+ }
// -- Networkelement
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java
index 09e4819..627d125 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java
@@ -33,7 +33,6 @@
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.common.database.requests.SearchRequest;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.acessor.DataObjectAcessorPm;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
@@ -76,11 +75,13 @@
@Nullable
Pagination pagination = input.getPagination();
if (pagination != null) {
- @Nullable Uint64 pageOrNull = YangHelper2.getUint64(pagination.getPage());
+ @Nullable
+ Uint64 pageOrNull = YangHelper2.getUint64(pagination.getPage());
if (pageOrNull != null) {
page = pageOrNull.longValue();
}
- @Nullable Uint32 pageSizeOrNull = YangHelper2.getUint32(pagination.getSize());
+ @Nullable
+ Uint32 pageSizeOrNull = YangHelper2.getUint32(pagination.getSize());
if (pageSizeOrNull != null) {
pageSize = pageSizeOrNull.longValue();
}
@@ -239,7 +240,7 @@
if (dt == null) {
return null;
}
- // property.substring(0,idx)+REPLACE.substring(idx+1);
+ // property.substring(0,idx)+REPLACE.substring(idx+1);
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
c.setTime(dt);
int tmpvalue;
@@ -348,70 +349,54 @@
}
+ private static List<String> collectValues(Filter filter) {
+ List<String> values = new ArrayList<String>();
+ if (filter.getFiltervalue() != null) {
+ values.add(filter.getFiltervalue());
+ }
+ if (filter.getFiltervalues() != null) {
+ values.addAll(filter.getFiltervalues());
+ }
+ return values;
+ }
+
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();
+ String property = filters.get(0).getProperty();
+ List<String> values = collectValues(filters.get(0));
+ if ("id".equals(property)) {
+ property = "_id";
}
- if (DbFilter.hasSearchParams(v)) {
- if (p != null && timestampValueNames.contains(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(handlePrefix(prefix, p), v);
- if (q != null) {
- return q;
- } else {
- return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
- }
+ if (values.size() == 1) {
+ return getSinglePropertyQuery(property, values.get(0), prefix);
} else {
- return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
+ BoolQueryBuilder bquery = new BoolQueryBuilder();
+ for (String v : values) {
+ bquery.should(getSinglePropertyQuery(property, v, prefix));
+ }
+ return bquery;
+
}
} else {
BoolQueryBuilder query = new BoolQueryBuilder();
- QueryBuilder tmpQuery;
for (Filter fi : filters) {
String p = fi.getProperty();
- String v = fi.getFiltervalue();
+ List<String> values = collectValues(fi);
if ("id".equals(p)) {
p = "_id";
- } else {
- // v=v.toLowerCase();
}
- if (DbFilter.hasSearchParams(v)) {
- if (p != null && timestampValueNames.contains(p.toLowerCase())) {
- tmpQuery = fromTimestampSearchFilter(p, v);
- if (tmpQuery != null) {
- query.must(tmpQuery);
- } else {
- query.must(QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
- }
- } else {
- query.must(QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v)));
- }
- } else if (DbFilter.isComparisonValid(v)) {
- RangeQueryBuilder q = DbFilter.getRangeQuery(handlePrefix(prefix, p), v);
- if (q != null) {
- query.must(q);
- } else {
- query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
- }
+ if (values.size() == 1) {
+ query.must(getSinglePropertyQuery(p, values.get(0), prefix));
} else {
- query.must(QueryBuilders.matchQuery(handlePrefix(prefix, p), v));
+ BoolQueryBuilder tmpQuery = QueryBuilders.boolQuery();
+ for (String v : values) {
+ tmpQuery.should(getSinglePropertyQuery(p, v, prefix));
+ }
+ query.must(tmpQuery);
+ tmpQuery = QueryBuilders.boolQuery();
}
}
LOG.trace("Query result. {}", query.toJSON());
@@ -419,6 +404,28 @@
}
}
+ private static QueryBuilder getSinglePropertyQuery(String p, String v, String prefix) {
+ QueryBuilder query = null;
+ if (DbFilter.hasSearchParams(v)) {
+ if (p != null && timestampValueNames.contains(p.toLowerCase())) {
+ query = fromTimestampSearchFilter(p, v);
+ if (query == null) {
+ query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v));
+ }
+ } else {
+ query = QueryBuilders.regex(handlePrefix(prefix, p), DbFilter.createDatabaseRegex(v));
+ }
+ } else if (DbFilter.isComparisonValid(v)) {
+ query = DbFilter.getRangeQuery(handlePrefix(prefix, p), v);
+ if (query == null) {
+ query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
+ }
+ } else {
+ query = QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
+ }
+ return query;
+ }
+
private static String handlePrefix(String prefix, String p) {
return (prefix != null ? prefix : "") + p;
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java
index 603c25b..153022b 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java
@@ -32,8 +32,8 @@
import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit;
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.dataprovider.yangtools.YangToolsMapper2;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper2;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.yang.binding.DataObject;
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
index e34988b..91d4697 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
@@ -26,14 +26,13 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-
import org.json.JSONObject;
public class DataTreeChildObject {
private final String label;
- private final String ownSeverity;
- private final String childrenSeveritySummary;
+// private final String ownSeverity;
+// private final String childrenSeveritySummary;
private final boolean isMatch;
private final Map<String, DataTreeChildObject> children;
private final Map<String, Object> properties;
@@ -47,8 +46,8 @@
this.label = label;
this.isMatch = isMatch;
this.children = children;
- this.ownSeverity = ownSeverity;
- this.childrenSeveritySummary = childrenSeveritySummary;
+// this.ownSeverity = ownSeverity;
+// this.childrenSeveritySummary = childrenSeveritySummary;
this.properties = new HashMap<>();
}
@@ -104,6 +103,7 @@
itemValue = this.getProperty(childKey, null);
if (itemValue != null && itemValue.equals(itemValueToMatch)) {
this.children.put(id, data);
+ return true;
}
}
return false;
@@ -189,4 +189,8 @@
this.children.remove(key);
}
}
+
+ public boolean hasChildren() {
+ return this.children!=null && !this.children.isEmpty();
+ }
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java
index bb4023a..115ff4f 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java
@@ -48,14 +48,6 @@
*/
public class DataTreeHttpServlet extends HttpServlet {
- public enum FilterMode {
- Strict, //show only filtered items and their parents
- Lazy //show root items (and all their children) which have matches inside
- }
-
- /**
- *
- */
private static final long serialVersionUID = 1L;
private final DataTreeProviderImpl dataTreeProvider;
private static final Logger LOG = LoggerFactory.getLogger(DataTreeHttpServlet.class);
@@ -116,7 +108,7 @@
LOG.info("GET request for {} to e={} with tree={}", uri, e.entity, e.tree);
switch (e.entity) {
case Inventoryequipment:
- DataTreeObject o = this.dataTreeProvider.readInventoryTree(e.tree, null, FilterMode.Lazy);
+ DataTreeObject o = this.dataTreeProvider.readInventoryTree(e.tree, null);
this.doJsonResponse(resp, o);
break;
default:
@@ -132,17 +124,12 @@
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final String uri = req.getRequestURI();
String filter = null;
- FilterMode mode = FilterMode.Lazy;
try {
final String body = readPayload(req);
JSONObject data = new JSONObject(body);
if (data.has("query")) {
filter = data.getString("query");
}
- if (data.has("mode")) {
- mode = data.getString("mode").equals("lazy") ? FilterMode.Lazy : FilterMode.Strict;
- }
-
} catch (Exception e) {
LOG.warn("problem reading payload: {}", e);
@@ -152,7 +139,7 @@
if (e != null) {
switch (e.entity) {
case Inventoryequipment:
- DataTreeObject o = this.dataTreeProvider.readInventoryTree(e.tree, filter, mode);
+ DataTreeObject o = this.dataTreeProvider.readInventoryTree(e.tree, filter);
this.doJsonResponse(resp, o);
break;
default:
@@ -208,6 +195,15 @@
return "EntityWithTree [entity=" + entity + ", tree=" + tree + "]";
}
+ /**
+ *
+ * @param e database enttity to access
+ * @param tree tree description
+ * e.g. nodeA => tree entry for node-id=nodeA
+ * nodeA/key0 => tree entry for node-id=nodeA and uuid=key0 and tree-level=0
+ * nodeA/key0/key1 => tree entry for node-id=nodeA and uuid=key1 and tree-level=1
+ *
+ */
public EntityWithTree(Entity e, String tree) {
this.entity = e;
if (tree != null) {
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java
index d6c8bd7..f12ff3d 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java
@@ -21,8 +21,9 @@
*/
package org.onap.ccsdk.features.sdnr.wt.dataprovider.http;
+import java.util.ArrayList;
import java.util.HashMap;
-
+import java.util.List;
import org.json.JSONObject;
public class DataTreeObject extends HashMap<String, DataTreeChildObject> {
@@ -95,8 +96,15 @@
*
*/
public void removeUnmatchedPaths() {
- for (DataTreeChildObject entry : this.values()) {
- entry.removeUnmatchedPaths();
+ List<String> toRemove = new ArrayList<>();
+ for (Entry<String,DataTreeChildObject> entry : this.entrySet()) {
+ entry.getValue().removeUnmatchedPaths();
+ if(!entry.getValue().isMatch() && !entry.getValue().hasChildren()) {
+ toRemove.add(entry.getKey());
+ }
+ }
+ for(String toRemoveKey:toRemove) {
+ this.remove(toRemoveKey);
}
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java
new file mode 100644
index 0000000..09a81c3
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java
@@ -0,0 +1,175 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2020 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.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.json.JSONObject;
+import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UserdataHttpServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOG = LoggerFactory.getLogger(UserdataHttpServlet.class);
+ private static final String REGEX = "^\\/userdata[\\/]?([a-zA-Z0-9]+)?$";
+ private static final Pattern PATTERN = Pattern.compile(REGEX);
+ private static final String JWT_PAYLOAD_USERNAME_PROPERTYKEY = "sub";
+ private HtUserdataManager dbUserManager;
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ final String uri = req.getRequestURI();
+ final Matcher matcher = PATTERN.matcher(uri);
+ if (matcher.find()) {
+ LOG.info("GET found match");
+ this.handleGetRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null);
+ } else {
+ LOG.info("no valid request");
+ super.doGet(req, resp);
+ }
+ }
+
+ @Override
+ protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ final String uri = req.getRequestURI();
+ final Matcher matcher = PATTERN.matcher(uri);
+ if (matcher.find()) {
+ LOG.info("PUT found match");
+ final String payload = getPayload(req);
+ this.handlePutRequest(req, resp, payload, matcher.groupCount() > 0 ? matcher.group(1) : null);
+ } else {
+ LOG.info("no valid request");
+ super.doPut(req, resp);
+ }
+ }
+
+ private String getPayload(HttpServletRequest req) throws IOException {
+ return DataTreeHttpServlet.readPayload(req);
+ }
+
+ @Override
+ protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ final String uri = req.getRequestURI();
+ final Matcher matcher = PATTERN.matcher(uri);
+ if (matcher.find()) {
+ LOG.info("DELETE found match");
+ this.handleDeleteRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null);
+ } else {
+ LOG.info("no valid request");
+ super.doPut(req, resp);
+ }
+ }
+
+ private void handleGetRequest(HttpServletRequest req, HttpServletResponse resp, String key) {
+ final String username = this.getUsername(req);
+ if(username==null) {
+ resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ sendJsonResponse(resp,
+ key == null ? this.dbUserManager.getUserdata(username) : this.dbUserManager.getUserdata(username, key));
+ }
+
+
+ private void handlePutRequest(HttpServletRequest req, HttpServletResponse resp, String data, String key) {
+ final String username = this.getUsername(req);
+ if(username==null) {
+ resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ boolean success = key == null ? this.dbUserManager.setUserdata(username, data)
+ : this.dbUserManager.setUserdata(username, key, data);
+ resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+
+ private void handleDeleteRequest(HttpServletRequest req, HttpServletResponse resp, String key) {
+ final String username = this.getUsername(req);
+ if(username==null) {
+ resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return;
+ }
+ boolean success = key == null ? this.dbUserManager.removeUserdata(username)
+ : this.dbUserManager.removeUserdata(username, key);
+ resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+
+ private String getUsername(HttpServletRequest req) {
+ final String authHeader = req.getHeader("Authorization");
+ if(authHeader==null) {
+ return null;
+ }
+ String username = null;
+ if(authHeader.startsWith("Basic")) {
+ username = BaseHTTPClient.decodeBasicAuthHeaderUsername(authHeader);
+ }
+ else if(authHeader.startsWith("Bearer")) {
+ username = decodeJWTPayloadUsername(authHeader, JWT_PAYLOAD_USERNAME_PROPERTYKEY);
+ }
+ return username;
+ }
+
+ public static String decodeJWTPayloadUsername(String authHeader, String key) {
+ String username = null;
+ if(authHeader.startsWith("Bearer")) {
+ authHeader = authHeader.substring(7);
+ }
+ String[] tmp = authHeader.split("\\.");
+ if(tmp.length==3) {
+ final String decoded = new String(Base64.getDecoder().decode(tmp[1]));
+ JSONObject o = new JSONObject(decoded);
+ if(o.has(key)) {
+ username = o.getString(key);
+ if(username!=null && username.contains("@")) {
+ username = username.split("@")[0];
+ }
+ }
+ }
+ return username;
+ }
+
+ private static void sendJsonResponse(HttpServletResponse resp, String userdata) {
+ resp.setContentType("application/json");
+ resp.setStatus(HttpServletResponse.SC_OK);
+ try {
+
+ resp.getOutputStream().write(userdata.getBytes(StandardCharsets.UTF_8));
+ } catch (IOException e) {
+ LOG.warn("problem sending response: ", e);
+ }
+
+ }
+
+ public void setDatabaseClient(HtUserdataManager dbUserManager) {
+ this.dbUserManager = dbUserManager;
+ }
+
+}
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
index 5c1ea98..190c789 100644
--- 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
@@ -26,9 +26,11 @@
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.ReadyHttpServlet;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEntityDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
@@ -48,6 +50,7 @@
private DataProviderServiceImpl rpcApiService;
private AboutHttpServlet aboutServlet;
private DataTreeHttpServlet treeServlet;
+ private UserdataHttpServlet userdataServlet;
private HtDatabaseClient dbClient;
// Blueprint 1
@@ -71,7 +74,9 @@
public void setTreeServlet(DataTreeHttpServlet treeServlet) {
this.treeServlet = treeServlet;
}
-
+ public void setUserdataServlet(UserdataHttpServlet userdataServlet) {
+ this.userdataServlet = userdataServlet;
+ }
public void init() throws Exception {
LOG.info("Session Initiated start {}", APPLICATION_NAME);
@@ -79,6 +84,7 @@
// Start RPC Service
this.rpcApiService = new DataProviderServiceImpl(rpcProviderService, this.mediatorServerServlet);
this.treeServlet.setDatabaseClient(this.rpcApiService.getRawClient());
+ this.userdataServlet.setDatabaseClient(this.rpcApiService.getHtDatabaseUserManager());
LOG.info("Session Initiated end. Initialization done");
} catch (Exception e) {
if (e instanceof HtDatabaseClientException)
@@ -144,4 +150,9 @@
}
}
+ @Override
+ public HtUserdataManager getHtDatabaseUserManager() {
+ return this.rpcApiService.getHtDatabaseUserManager();
+ }
+
}
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
index 5ef7a0a..9e7fc18 100644
--- 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
@@ -30,10 +30,12 @@
import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
import org.opendaylight.mdsal.binding.api.RpcProviderService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
@@ -107,6 +109,7 @@
private final ConfigurationFileRepresentation configuration;
private final EsConfig esConfig;
private final MediatorServerDataProvider mediatorServerDataProvider;
+ private final HtUserdataManager dbUserManager;
DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet)
throws Exception {
@@ -118,6 +121,7 @@
this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),
esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts());
mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
+ this.dbUserManager = new HtUserdataManagerImpl(this.dataProvider.getRawClient());
// Register ourselves as the REST API RPC implementation
LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
@@ -412,4 +416,8 @@
return result;
}
+ public HtUserdataManager getHtDatabaseUserManager() {
+ return this.dbUserManager;
+ }
+
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
index 4340d81..e69ddb7 100644
--- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
@@ -36,7 +36,6 @@
import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeChildObject;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet.FilterMode;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeObject;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
@@ -48,12 +47,12 @@
private static final long MAXSIZE_PERSEARCH = 10;
private HtDatabaseClient dbClient;
- final String INVENTORY_PROPERTY_TREELEVEL = "tree-level";
- final String INVENTORY_PROPERTY_NODEID = "node-id";
- final String INVENTORY_PROPERTY_UUID = "uuid";
- final String INVENTORY_PROPERTY_PARENTUUID = "parent-uuid";
- final String INVENTORY_PROPERTY_FOR_LABEL_CHILD = "uuid";
- final String INVENTORY_PROPERTY_FOR_LABEL = "uuid";
+ private static final String INVENTORY_PROPERTY_TREELEVEL = "tree-level";
+ private static final String INVENTORY_PROPERTY_NODEID = "node-id";
+ private static final String INVENTORY_PROPERTY_UUID = "uuid";
+ private static final String INVENTORY_PROPERTY_PARENTUUID = "parent-uuid";
+ private static final String INVENTORY_PROPERTY_FOR_LABEL_CHILD = "uuid";
+ private static final String INVENTORY_PROPERTY_FOR_LABEL = "uuid";
private List<SearchHit> search(Entity e, String filter, String propTreeLevel) throws IOException {
return this.search(e, filter, null, null, null, null, null, null, propTreeLevel);
@@ -132,15 +131,15 @@
* @return
* @throws IOException
*/
- public DataTreeObject readInventoryTree(List<String> tree, String filter, FilterMode mode) throws IOException {
+ public DataTreeObject readInventoryTree(List<String> tree, String filter) throws IOException {
//root nodes will be node-information -> below inventory
if (tree == null || tree.size() <= 0) {
- return this.readInventoryTreeWithNode(filter, mode);
+ return this.readInventoryTreeWithNode(filter);
}
//root node will be inventory on tree-level if sliced treePath
else {
- return this.readInventoryTreeForNode(tree.get(0), tree.subList(0, tree.size() - 1), filter, mode);
+ return this.readInventoryTreeForNode(tree.get(0), tree.subList(0, tree.size() - 1), filter);
}
}
@@ -152,7 +151,7 @@
* @param mode
* @return
*/
- private DataTreeObject readInventoryTreeForNode(String nodeId, List<String> list, String filter, FilterMode mode)
+ private DataTreeObject readInventoryTreeForNode(String nodeId, List<String> list, String filter)
throws IOException {
DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
final String parentUuid = list.size() > 1 ? list.get(list.size() - 2) : null;
@@ -161,7 +160,8 @@
INVENTORY_PROPERTY_PARENTUUID, parentUuid, INVENTORY_PROPERTY_UUID, uuid, INVENTORY_PROPERTY_TREELEVEL);
//tree.a(subtreePath);
- List<SearchHit> others = this.search(Entity.Inventoryequipment, (String) null, INVENTORY_PROPERTY_TREELEVEL);
+ List<SearchHit> others = this.search(Entity.Inventoryequipment, (String) null, INVENTORY_PROPERTY_NODEID, nodeId,
+ null, null, null, null, INVENTORY_PROPERTY_TREELEVEL);
if (matches.size() > 0) {
int treeLevelToStart = (list == null || list.size() <= 0) ? 0 : list.size() - 1;
//build tree
@@ -208,6 +208,7 @@
hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
}
}
+ tree.removeUnmatchedPaths();
}
return tree;
}
@@ -216,11 +217,10 @@
* node will be root elements inventory information below from level-1
*
* @param filter
- * @param mode
* @return
* @throws IOException
*/
- private DataTreeObject readInventoryTreeWithNode(String filter, FilterMode mode) throws IOException {
+ private DataTreeObject readInventoryTreeWithNode(String filter) throws IOException {
DataTreeObject tree = new DataTreeObject(INVENTORY_PROPERTY_PARENTUUID, INVENTORY_PROPERTY_UUID);
List<SearchHit> matches = this.search(Entity.Inventoryequipment, filter, INVENTORY_PROPERTY_TREELEVEL);
@@ -302,9 +302,8 @@
}
}
}
- if (mode == FilterMode.Strict) {
- tree.removeUnmatchedPaths();
- }
+ tree.removeUnmatchedPaths();
+
}
return tree;
}
diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java
new file mode 100644
index 0000000..78b032e
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java
@@ -0,0 +1,50 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * 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.yangtools;
+
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.IdentifierDeserializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.MeasurementKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * YangToolsMapper is a specific Jackson mapper configuration for opendaylight yangtools serialization or
+ * deserialization of DataObject to/from JSON TODO ChoiceIn and Credentials deserialization only for
+ * LoginPasswordBuilder
+ */
+public class DataProviderYangToolsMapper extends YangToolsMapper {
+
+ @SuppressWarnings("unused")
+ private final Logger LOG = LoggerFactory.getLogger(DataProviderYangToolsMapper.class);
+ private static final long serialVersionUID = 1L;
+
+ public DataProviderYangToolsMapper() {
+ super();
+ this.addDeserializer(Credentials.class, LoginPasswordBuilder.class.getName());
+ this.addKeyDeserializer(MeasurementKey.class, new IdentifierDeserializer());
+ }
+
+
+}
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
index ebb20fc..686af61 100644
--- 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
@@ -70,6 +70,15 @@
</service-properties>
</service>
+ <bean id="userdataServlet"
+ class="org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet">
+ </bean>
+ <service interface="javax.servlet.http.HttpServlet" ref="userdataServlet">
+ <service-properties>
+ <entry key="alias" value="/userdata"/>
+ </service-properties>
+ </service>
+
<bean id="provider"
class="org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataProviderImpl"
init-method="init" destroy-method="close">
@@ -77,6 +86,7 @@
<property name="aboutServlet" ref="aboutServlet"/>
<property name="treeServlet" ref="treeServlet"/>
<property name="mediatorServerServlet" ref="msServlet"/>
+ <property name="userdataServlet" ref="userdataServlet"/>
</bean>
<bean id="yangServlet"
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
index b7a4db5..5a8c549 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
@@ -40,9 +40,11 @@
import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
import org.onap.ccsdk.features.sdnr.wt.common.database.requests.BaseRequest;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInputBuilder;
@@ -227,7 +229,8 @@
// ==READ===========================
System.out.println("try to read entry");
ReadMediatorServerListInput readinput = new ReadMediatorServerListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class,new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadMediatorServerListOutputBuilder readoutput = dbProvider.readMediatorServerList(readinput);
List<Data> data = readoutput.getData();
@@ -254,7 +257,8 @@
// ==READ============================
System.out.println("try to read entry");
readinput = new ReadMediatorServerListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("name").setFiltervalue(NAME2).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("name").setFiltervalue(NAME2).build()))
.setPagination(getPagination(20, 1)).build();
readoutput = dbProvider.readMediatorServerList(readinput);
data = readoutput.getData();
@@ -277,7 +281,8 @@
// ==READ/VERIFY DELETE============================
System.out.println("try to read entry");
readinput = new ReadMediatorServerListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("name").setFiltervalue(NAME2).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("name").setFiltervalue(NAME2).build()))
.setPagination(getPagination(20, 1)).build();
readoutput = dbProvider.readMediatorServerList(readinput);
data = readoutput.getData();
@@ -322,7 +327,8 @@
// ==READ===========================
ReadNetworkElementConnectionListInput readInput = new ReadNetworkElementConnectionListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadNetworkElementConnectionListOutputBuilder readOperation =
@@ -393,7 +399,8 @@
}
readInput = new ReadNetworkElementConnectionListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
readOperation = dbProvider.readNetworkElementConnectionList(readInput);
data = readOperation.getData();
@@ -437,7 +444,8 @@
System.out.println("Try read...");
ReadMaintenanceListInput readinput = new ReadMaintenanceListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadMaintenanceListOutputBuilder readResult = dbProvider.readMaintenanceList(readinput);
List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.maintenance.list.output.Data> data =
@@ -502,7 +510,8 @@
System.out.println("try to read entry");
ReadFaultlogListInput readinput = new ReadFaultlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadFaultlogListOutputBuilder readResult = null;
@@ -530,7 +539,8 @@
System.out.println("try to search entry 1");
readinput = new ReadFaultlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-id").setFiltervalue("test").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-id").setFiltervalue("test").build()))
.setPagination(getPagination(20, 1)).build();
//== VERIFY UPDATE ================================
@@ -545,7 +555,8 @@
System.out.println("try to search entry 2");
readinput = new ReadFaultlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-id").setFiltervalue("test*").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-id").setFiltervalue("test*").build()))
.setPagination(getPagination(20, 1)).build();
readResult = dbProvider.readFaultLogList(readinput);
@@ -589,7 +600,8 @@
ReadFaultcurrentListInput readinput = new ReadFaultcurrentListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadFaultcurrentListOutputBuilder readResult = null;
@@ -693,7 +705,8 @@
System.out.println("Try read entry");
ReadConnectionlogListInput readinput = new ReadConnectionlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadConnectionlogListOutputBuilder readResult = null;
@@ -722,7 +735,8 @@
System.out.println("Try read updated entry");
readinput = new ReadConnectionlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("status").setFiltervalue("Connected").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("status").setFiltervalue("Connected").build()))
.setPagination(getPagination(20, 1)).build();
try {
@@ -782,7 +796,8 @@
// ==READ===========================
ReadEventlogListInput readinput = new ReadEventlogListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadEventlogListOutputBuilder readResult = null;
try {
@@ -850,7 +865,8 @@
// ==READ===========================
ReadInventoryListInput readinput = new ReadInventoryListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("id").setFiltervalue(dbId).build()))
.setPagination(getPagination(20, 1)).build();
ReadInventoryListOutputBuilder readResult = null;
try {
@@ -1015,7 +1031,8 @@
System.out.println("read list entries...");
ReadPmdata15mListInput read = new ReadPmdata15mListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
.setPagination(getPagination(20, 1)).build();
ReadPmdata15mListOutputBuilder readResult = null;
@@ -1035,7 +1052,8 @@
System.out.println("read ltp entries with node name set...");
ReadPmdata15mLtpListInput readLtp = new ReadPmdata15mLtpListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
.setPagination(getPagination(20, 1)).build();
ReadPmdata15mLtpListOutputBuilder readltpResult = null;
@@ -1133,7 +1151,8 @@
System.out.println("filter list entries...");
read = new ReadPmdata24hListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
.setPagination(getPagination(20, 1)).build();
readResult = null;
@@ -1152,7 +1171,8 @@
System.out.println("read ltp entries with node name set...");
ReadPmdata24hLtpListInput readLtp = new ReadPmdata24hLtpListInputBuilder()
- .setFilter(YangHelper2.getListOrMap(FilterKey.class, new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
+ .setFilter(YangHelper2.getListOrMap(FilterKey.class,
+ new FilterBuilder().setProperty("node-name").setFiltervalue("a2").build()))
.setPagination(getPagination(20, 1)).build();
ReadPmdata24hLtpListOutputBuilder readltpResult = null;
@@ -1363,7 +1383,7 @@
+ "\"implemented-interface\": \"org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Faultlog\",\n"
+ "\"source-type\": \"Netconf\",\n" + "\"node-id\": \"sim4\",\n" + "\"problem\": \"signalIsLost\"\n"
+ "}";
- YangToolsMapper yangtoolsMapper = new YangToolsMapper();
+ DataProviderYangToolsMapper yangtoolsMapper = new DataProviderYangToolsMapper();
Faultlog log = yangtoolsMapper.readValue(jsonString, Faultlog.class);
System.out.println(yangtoolsMapper.writeValueAsString((new FaultlogBuilder(log).build())));
System.out.println("Check3");
@@ -1374,6 +1394,27 @@
}
+ @Test
+ public void testUserdata() {
+ final String USERNAME = "admin";
+ final String DATA1 = "{\n" + " \"networkMap\":{\n"
+ + " \"startupPosition\": {\"lat\": 52.5095, \"lon\":13.329, \"zoom\": 10},\n"
+ + " \"tileOpacity\": 90,\n" + " \"styling\":{\n" + " \"theme\": \"light\"\n"
+ + " }\n" + " },\n" + " \"dashboard\":{\n" + " \"color\":\"#F00\"\n" + " }\n"
+ + "}";
+ HtUserdataManagerImpl client = new HtUserdataManagerImpl(dbRawProvider);
+ boolean success = client.setUserdata(USERNAME, DATA1);
+ assertTrue(success);
+ String data = client.getUserdata(USERNAME);
+ //JSONAssert.assertEquals(DATA1,data,false);
+
+ assertEquals("admin", UserdataHttpServlet.decodeJWTPayloadUsername(String.format("Bearer %s",
+ "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbkBzZG4iLCJyb2xlcyI6WyJ1c2VyIiwiYWRtaW4iXSwiaXN"
+ + "zIjoiT3BlbmRheWxpZ2h0IiwibmFtZSI6ImFkbWluQHNkbiIsImV4cCI6MTYxNTc5NTg1NywiZmFtaWx5X25hbWUiOiIifQ.wB"
+ + "PdB45_bryU6_kSCu3be3dq3yth24niSXi6b2_1ufc"),
+ "sub"));
+ }
+
private Pagination getPagination(long pageSize, int page) {
return new PaginationBuilder().setPage(YangHelper2.getBigIntegerOrUint64(BigInteger.valueOf(page)))
.setSize(YangHelper2.getLongOrUint32(pageSize)).build();
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java
index eaaa311..56bc32c 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java
@@ -24,7 +24,7 @@
import static org.junit.Assert.fail;
import java.io.IOException;
import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper2;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper2;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.pmdata._15m.list.output.Data;
public class TestDataMappings {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
index 7e63c18..56138b0 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
@@ -63,6 +63,7 @@
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.PmdataEntityBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SourceType;
+import org.opendaylight.yangtools.yang.common.Uint32;
/**
* @author Michael Dürre
@@ -205,6 +206,7 @@
List<NetworkElementConnectionEntity> nes = service.getNetworkElementConnections();
assertEquals(0, nes.size());
service.updateNetworkConnection22(createNeConnection(NODEID, NetworkElementDeviceType.Unknown), NODEID);
+ service.updateNetworkConnection22(createNeConnection(NODEID, NetworkElementDeviceType.Unknown), NODEID);
service.updateNetworkConnection22(createNeConnection(NODEID2, NetworkElementDeviceType.ORAN), NODEID2);
nes = service.getNetworkElementConnections();
assertEquals(2, nes.size());
@@ -243,11 +245,9 @@
@Test
public void testInventory() {
clearDbEntity(Entity.Inventoryequipment);
- service.writeInventory(createEquipment(NODEID, "uuid1"));
- service.writeInventory(createEquipment(NODEID, "uuid2"));
- service.writeInventory(createEquipment(NODEID2, "uuid3"));
- service.writeInventory(createEquipment(NODEID2, "uuid4"));
- service.writeInventory(createEquipment(NODEID2, "uuid5"));
+ service.writeInventory(NODEID,Arrays.asList(createEquipment(NODEID, "uuid1"), createEquipment(NODEID, "uuid2"),
+ createEquipment(NODEID, "uuid3"), createEquipment(NODEID, "uuid4"),
+ createEquipment(NODEID, "uuid5")));
assertEquals(5, getDbEntityEntries(Entity.Inventoryequipment).getTotal());
}
@@ -272,19 +272,21 @@
* @return
*/
private Inventory createEquipment(String nodeId, String uuid) {
- return new InventoryBuilder().setNodeId(nodeId).setParentUuid("").setDescription("desc")
- .setManufacturerName("manu").setDate(NetconfTimeStampImpl.getConverter().getTimeStampAsNetconfString()).setUuid(uuid).build();
+ return new InventoryBuilder().setNodeId(nodeId).setParentUuid(null).setDescription("desc")
+ .setTreeLevel(Uint32.valueOf(0)).setManufacturerName("manu")
+ .setDate(NetconfTimeStampImpl.getConverter().getTimeStampAsNetconfString()).setUuid(uuid).build();
}
/**
* @param devType
+ * @param mountMethod
* @param nodename3
* @return
*/
private static NetworkElementConnectionEntity createNeConnection(String nodeId, NetworkElementDeviceType devType) {
- return new NetworkElementConnectionBuilder().setNodeId(nodeId).setHost("host").setPort(YangHelper2.getLongOrUint32(1234L))
- .setCoreModelCapability("123").setStatus(ConnectionLogStatus.Connected).setDeviceType(devType)
- .setIsRequired(true).build();
+ return new NetworkElementConnectionBuilder().setNodeId(nodeId).setHost("host")
+ .setPort(YangHelper2.getLongOrUint32(1234L)).setCoreModelCapability("123")
+ .setStatus(ConnectionLogStatus.Connected).setDeviceType(devType).setIsRequired(true).build();
}
/**
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
index aa01093..16dfa0e 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
@@ -22,14 +22,13 @@
package org.onap.ccsdk.features.sdnr.wt.dataprovider.test;
import static org.junit.Assert.fail;
-
import java.util.Set;
-
import org.junit.Test;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataProviderImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.StatusChangedHandler.StatusKey;
@@ -73,6 +72,7 @@
impl.setMediatorServerServlet(new MsServlet());
impl.setAboutServlet(new AboutHttpServlet());
impl.setTreeServlet(new DataTreeHttpServlet());
+ impl.setUserdataServlet(new UserdataHttpServlet());
try {
impl.init();
} catch (Exception e) {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java
index 76286c8..b52e34c 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java
@@ -24,7 +24,7 @@
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import org.junit.Test;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Faultcurrent;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.SeverityType;
@@ -33,7 +33,7 @@
@Test
public void testMapObjectToJson() throws IOException {
- YangToolsMapper mapper = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper = new DataProviderYangToolsMapper();
Faultcurrent c = new FaultcurrentBuilder().setSeverity(SeverityType.Critical).build();
String json = mapper.writeValueAsString(c);
@@ -42,7 +42,7 @@
@Test
public void testMapJsonToObject() throws IOException {
- YangToolsMapper mapper = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper = new DataProviderYangToolsMapper();
Faultcurrent f = mapper.readValue("{\"severity\":\"Critical\"}", Faultcurrent.class);
assertTrue("Critical expected", f.getSeverity().equals(SeverityType.Critical));
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
index 53c7211..e321791 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
@@ -36,7 +36,6 @@
import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet.EntityWithTree;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet.FilterMode;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeObject;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataTreeProviderImpl;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
@@ -91,14 +90,14 @@
provider.setDatabaseClient(dbRawProvider);
- DataTreeObject tree = provider.readInventoryTree(null, null, FilterMode.Lazy);
+ DataTreeObject tree = provider.readInventoryTree(null, null);
System.out.println(tree.toJSON());
JSONObject o = new JSONObject(tree.toJSON());
JSONAssert.assertContainsOnlyKey(o, "sim1");
JSONObject children = o.getJSONObject("sim1").getJSONObject("children");
this.assertSim1(children);
- tree = provider.readInventoryTree(Arrays.asList("sim1"), "*", FilterMode.Lazy);
+ tree = provider.readInventoryTree(Arrays.asList("sim1"), "*");
this.assertSim1(new JSONObject(tree.toJSON()));
System.out.println(tree.toJSON());
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
new file mode 100644
index 0000000..fd39784
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java
@@ -0,0 +1,94 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2021 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.fail;
+import java.io.IOException;
+import org.apache.sshd.common.util.io.IoUtils;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+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.common.test.JSONAssert;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
+
+public class TestUserdata {
+
+ private static final String USERNAME = "admin";
+ private static HtDatabaseClient dbRawProvider;
+ private static HtUserdataManagerImpl userDbProvider;
+
+ @BeforeClass
+ public static void init() throws Exception {
+
+ HostInfo[] hosts = HostInfoForTest.get();
+ dbRawProvider = HtDatabaseClient.getClient(hosts);
+ userDbProvider = new HtUserdataManagerImpl(dbRawProvider);
+ }
+
+ public static void trySleep(long ms) {
+ try {
+ Thread.sleep(ms);
+ } catch (Exception e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ @Ignore
+ @Test
+ public void test1() {
+ String fullContent = "";
+ try {
+ fullContent = getFileContent("/userdata/full.json");
+ userDbProvider.setUserdata(USERNAME, fullContent);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ trySleep(2000);
+
+ String userdata = userDbProvider.getUserdata(USERNAME);
+ JSONAssert.assertEquals(fullContent, userdata, false);
+ String networkMapContent = "";
+ String mergedContent = "";
+ try {
+ networkMapContent = getFileContent("/userdata/networkmap.json");
+ mergedContent = getFileContent("/userdata/merged.json");
+ userDbProvider.setUserdata(USERNAME, "networkMap", networkMapContent);
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ trySleep(2000);
+
+ userdata = userDbProvider.getUserdata(USERNAME);
+ JSONAssert.assertEquals(mergedContent, userdata, false);
+ }
+
+ private static String getFileContent(String filename) throws IOException {
+ return String.join("\n", IoUtils.readAllLines(TestTree.class.getResourceAsStream(filename)));
+ }
+}
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
index 3c9d494..524659e 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
@@ -40,8 +40,8 @@
import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.EsDataObjectReaderWriter2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapperHelper;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
@@ -65,7 +65,7 @@
public class TestYangGenSalMapping {
// Create mapper for serialization and deserialization
- YangToolsMapper mapper = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper = new DataProviderYangToolsMapper();
@Test
public void test1() throws IOException {
diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java
index 56df628..1345d4e 100644
--- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java
+++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java
@@ -32,8 +32,8 @@
import org.junit.Test;
import org.mockito.Mockito;
import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types.YangHelper2;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.YangToolsMapper2;
+import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.DataProviderYangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper2;
import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev191129.PmDataType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.openroadm.pm.types.rev200413.BIPErrorCounter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.openroadm.pm.types.rev200413.OpticalPowerInputOSCMin;
@@ -74,7 +74,7 @@
PmdataEntity pmDataType = pmDataEntitybuilder.build();
- YangToolsMapper mapper2 = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper2 = new DataProviderYangToolsMapper();
String jsonString = mapper2.writeValueAsString(pmDataType);
out("Result json after mapping: " + jsonString);
@@ -88,7 +88,7 @@
public void testOpenroadmPMString1() throws IOException, ClassNotFoundException {
out("Test: " + method());
String jsonString2 = getFileContent("pmdata1.json");
- YangToolsMapper mapper2 = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper2 = new DataProviderYangToolsMapper();
PmdataEntity generatepmdNode = mapper2.readValue(jsonString2.getBytes(), PmdataEntity.class);
out("String1:"+generatepmdNode.toString()); // Print it with specified indentation
assertTrue("GranularityPeriod", generatepmdNode.getGranularityPeriod().equals(GranularityPeriodType.Period15Min));
@@ -105,7 +105,7 @@
public void testOpenroadmPMString2() throws IOException, ClassNotFoundException {
out("Test: " + method());
String jsonString2 = getFileContent("pmdata2.json");
- YangToolsMapper mapper2 = new YangToolsMapper();
+ DataProviderYangToolsMapper mapper2 = new DataProviderYangToolsMapper();
PmdataEntity generatepmdNode = mapper2.readValue(jsonString2.getBytes(), PmdataEntity.class);
out(generatepmdNode.toString()); // Print it with specified indentation
}
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json
new file mode 100644
index 0000000..c5b41ec
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json
@@ -0,0 +1,13 @@
+{
+ "networkMap": {
+ "styling": {
+ "theme": "dark"
+ },
+ "startupPosition": {
+ "latitude": "52.5",
+ "zoom": "10",
+ "longitude": "13.35"
+ },
+ "tileOpacity": "26"
+ }
+}
\ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json
new file mode 100644
index 0000000..4e283cd
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json
@@ -0,0 +1,13 @@
+{
+ "networkMap": {
+ "tileOpacity": "26",
+ "styling": {
+ "theme": "light"
+ },
+ "startupPosition": {
+ "latitude": "52.5",
+ "longitude": "13.35",
+ "zoom": "10"
+ }
+ }
+}
\ No newline at end of file
diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json
new file mode 100644
index 0000000..20d44f7
--- /dev/null
+++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json
@@ -0,0 +1,11 @@
+{
+ "tileOpacity": "26",
+ "styling": {
+ "theme": "light"
+ },
+ "startupPosition": {
+ "latitude": "52.5",
+ "longitude": "13.35",
+ "zoom": "10"
+ }
+}
\ No newline at end of file
diff --git a/sdnr/wt/oauth-provider/provider-jar/pom.xml b/sdnr/wt/oauth-provider/provider-jar/pom.xml
index 1b6cd8a..5d9cbee 100644
--- a/sdnr/wt/oauth-provider/provider-jar/pom.xml
+++ b/sdnr/wt/oauth-provider/provider-jar/pom.xml
@@ -186,7 +186,7 @@
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>sdnr-wt-data-provider-provider</artifactId>
+ <artifactId>sdnr-wt-yang-utils</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
diff --git a/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java b/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java
index cd42390..9a9f4fc 100644
--- a/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java
+++ b/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java
@@ -37,7 +37,11 @@
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.ShiroException;
import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
import org.jolokia.osgi.security.Authenticator;
import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
import org.onap.ccsdk.features.sdnr.wt.oauthprovider.data.Config;
@@ -66,7 +70,7 @@
private static final long serialVersionUID = 1L;
private static final String BASEURI = "/oauth";
private static final String LOGINURI = BASEURI + "/login";
- //private static final String LOGOUTURI = BASEURI + "/logout";
+ private static final String LOGOUTURI = BASEURI + "/logout";
private static final String PROVIDERSURI = BASEURI + "/providers";
public static final String REDIRECTURI = BASEURI + "/redirect";
private static final String REDIRECTURI_FORMAT = REDIRECTURI + "/%s";
@@ -137,6 +141,8 @@
this.sendResponse(resp, HttpServletResponse.SC_OK, getConfigs(this.providerStore.values()));
} else if (req.getRequestURI().startsWith(LOGINURI)) {
this.handleLoginRedirect(req, resp);
+ } else if (req.getRequestURI().equals(LOGOUTURI)) {
+ this.handleLogout(req, resp);
} else if (POLICIESURI.equals(req.getRequestURI())) {
this.sendResponse(resp, HttpServletResponse.SC_OK, this.getPoliciesForUser(req));
} else if (req.getRequestURI().startsWith(REDIRECTURI)) {
@@ -146,7 +152,10 @@
}
}
-
+ private void handleLogout(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ this.logout();
+ this.sendResponse(resp, HttpServletResponse.SC_OK,"");
+ }
private void handleLoginRedirect(HttpServletRequest req, HttpServletResponse resp) throws IOException {
final String uri = req.getRequestURI();
final Matcher matcher = LOGIN_REDIRECT_PATTERN.matcher(uri);
@@ -458,5 +467,16 @@
os.write(output);
}
-
+ private void logout() {
+ final Subject subject = SecurityUtils.getSubject();
+ try {
+ subject.logout();
+ Session session = subject.getSession(false);
+ if (session != null) {
+ session.stop();
+ }
+ } catch (ShiroException e) {
+ LOG.debug("Couldn't log out {}", subject, e);
+ }
+ }
}
diff --git a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java
index 0399655..7213f80 100644
--- a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java
+++ b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java
@@ -26,8 +26,8 @@
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsBuilderAnnotationIntrospector;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsModule;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsModule;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.aaa.rev161214.http.permission.Permissions;
import org.opendaylight.yangtools.concepts.Builder;
diff --git a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java
index cc029bd..b965878 100644
--- a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java
+++ b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java
@@ -26,7 +26,7 @@
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
-import org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools.mapperextensions.YangToolsBuilderAnnotationIntrospector;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
public class OdlXmlMapper extends XmlMapper{