source out odl mapper 19/120219/2
authorMichael DÜrre <michael.duerre@highstreet-technologies.com>
Tue, 6 Apr 2021 08:33:41 +0000 (10:33 +0200)
committerMichael D�rre <michael.duerre@highstreet-technologies.com>
Tue, 6 Apr 2021 09:01:07 +0000 (09:01 +0000)
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

69 files changed:
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
sdnr/wt/common-yang/pom.xml
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
sdnr/wt/common-yang/utils/pom.xml [new file with mode: 0644]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java with 72% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java with 95% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java with 87% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java with 94% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java with 86% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java with 83% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java with 70% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java with 94% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java with 91% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java with 96% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java with 95% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java with 95% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java with 95% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java with 96% similarity]
sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java [moved from sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java with 91% similarity]
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java
sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java
sdnr/wt/common/src/test/resources/testpom.xml
sdnr/wt/data-provider/installer/pom.xml
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java [new file with mode: 0644]
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java [new file with mode: 0644]
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java
sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java
sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang
sdnr/wt/data-provider/provider/pom.xml
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java
sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestCRUDforDatabase.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java
sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java
sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json [new file with mode: 0644]
sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json [new file with mode: 0644]
sdnr/wt/oauth-provider/provider-jar/pom.xml
sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java
sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java
sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java

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 (file)
index 0000000..7e8327a
--- /dev/null
@@ -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 (file)
index 0000000..7c4a63d
--- /dev/null
@@ -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 (file)
index 0000000..282a6a2
--- /dev/null
@@ -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 (file)
index 0000000..8139192
--- /dev/null
@@ -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 (file)
index 0000000..9f10ae8
--- /dev/null
@@ -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");
+    }
+
+}
index 19a2a0f..01bde5e 100755 (executable)
@@ -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 (file)
index 0000000..3114280
--- /dev/null
@@ -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 (file)
index 0000000..91ae639
--- /dev/null
@@ -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 (file)
index 0000000..acf0112
--- /dev/null
@@ -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 (file)
index 0000000..7aca26b
--- /dev/null
@@ -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 (file)
index 0000000..3610df2
--- /dev/null
@@ -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 (file)
index 0000000..ef3c22b
--- /dev/null
@@ -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>
  * ============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 @@ public class YangToolsMapper extends ObjectMapper {
 
     @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 @@ public class YangToolsMapper extends ObjectMapper {
     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);
     }
 
 }
  * ============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;
  * ============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 @@ public class YangToolsMapperHelper {
     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 class YangToolsMapperHelper {
     }
 
     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 @@ public class YangToolsMapperHelper {
         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));
+    }
 }
@@ -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.math.BigInteger;
 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 @@ public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationInt
             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 @@ public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationInt
         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;
     }
 
@@ -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.io.IOException;
 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 @@ public class YangToolsDeserializerModifier extends BeanDeserializerModifier {
 
         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 @@ public class YangToolsDeserializerModifier extends BeanDeserializerModifier {
         LOG.debug("Keydeserialize '{}' with deserializer '{}'", type.getRawClass().getName(), res.getClass().getName());
         return res;
     }
-
-    void test() {
-        com.fasterxml.jackson.databind.util.ClassUtil xy;
-    }
 }
  * ============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 @@ public class YangToolsModule extends SimpleModule {
         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());
+
     }
 
 }
  * ============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;
 
  * ============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<?>> {
 
  * ============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;
@@ -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.io.IOException;
 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;
@@ -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 @@ public class TypeObjectSerializer extends JsonSerializer<TypeObject> {
         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);
index f8734d5..1f67e5e 100644 (file)
@@ -29,10 +29,8 @@ import java.security.UnrecoverableKeyException;
 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 @@ public class ExtRestClient {
         }
 
     }
-    //    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 @@ public class ExtRestClient {
 
     /**
      * 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
index 82c0364..70e41c2 100644 (file)
@@ -37,9 +37,28 @@ public class DbFilter {
         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());
     }
index 7b22fd5..582d749 100644 (file)
@@ -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 @@ public class QueryBuilders {
         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 @@ public class QueryBuilders {
         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();
     }
index 937e2d8..ffb31c6 100644 (file)
@@ -370,6 +370,15 @@ public class BaseHTTPClient {
         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;
+    }
+
 
 
 }
index e57fed4..6fba87a 100644 (file)
     <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>
index cdd1724..ee6b2f3 100755 (executable)
             </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>
diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java
new file mode 100644 (file)
index 0000000..e734a47
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * ============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.model;
+
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Inventory;
+
+public class DataInconsistencyException extends Exception {
+
+    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;
+    }
+}
index 47255fd..e6eb7a4 100644 (file)
@@ -67,10 +67,15 @@ public interface DataProvider extends ArchiveCleanProvider {
 
     /**
      * 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 (file)
index 0000000..2f580c9
--- /dev/null
@@ -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);
+
+}
index 9ba10cd..2a91d78 100644 (file)
@@ -27,6 +27,8 @@ public interface IEntityDataProvider {
     /** 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);
 
index bd71d5b..2ccebca 100644 (file)
@@ -75,14 +75,14 @@ public class NetconfTimeStampImpl implements NetconfTimeStamp {
     /**
      * 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);
 
     /**
index 8509007..84c43d5 100644 (file)
@@ -104,6 +104,10 @@ module data-provider {
         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 @@ module data-provider {
     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 @@ module data-provider {
       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 @@ module data-provider {
         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 @@ module data-provider {
           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;
index 9045dfa..3507d41 100644 (file)
@@ -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>
             <artifactId>sdnr-wt-common</artifactId>
             <version>${project.version}</version>
         </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>
                             <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 (file)
index 0000000..73cc1a2
--- /dev/null
@@ -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;
+    }
+
+}
index f6cd749..f680edd 100644 (file)
@@ -24,7 +24,10 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.data.entity;
 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.common.database.queries.RangeQueryBuilder
 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.pro
 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 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
                     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 @@ public class HtDatabaseEventsService implements ArchiveCleanProvider, DataProvid
      *
      * @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
 
index 09e4819..627d125 100644 (file)
@@ -33,7 +33,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.data.DbFilter;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.BoolQueryBuilder;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilder;
 import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders;
-import org.onap.ccsdk.features.sdnr.wt.common.database.queries.RangeQueryBuilder;
 import org.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 @@ public class QueryByFilter {
             @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 @@ public class QueryByFilter {
         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 @@ public class QueryByFilter {
 
     }
 
+    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;
-                    }
+            if (values.size() == 1) {
+                return getSinglePropertyQuery(property, values.get(0), prefix);
+            } else {
+                BoolQueryBuilder bquery = new BoolQueryBuilder();
+                for (String v : values) {
+                    bquery.should(getSinglePropertyQuery(property, v, prefix));
                 }
-                return QueryBuilders.regex(p, DbFilter.createDatabaseRegex(v));
+                return bquery;
 
-
-            } 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);
-                }
-            } else {
-                return QueryBuilders.matchQuery(handlePrefix(prefix, p), v);
             }
         } 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 @@ public class QueryByFilter {
         }
     }
 
+    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;
     }
index 603c25b..153022b 100644 (file)
@@ -32,8 +32,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.DatabaseClient;
 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;
index e34988b..91d4697 100644 (file)
@@ -26,14 +26,13 @@ import java.util.HashMap;
 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 @@ public class DataTreeChildObject {
         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 @@ public class DataTreeChildObject {
             itemValue = this.getProperty(childKey, null);
             if (itemValue != null && itemValue.equals(itemValueToMatch)) {
                 this.children.put(id, data);
+                return true;
             }
         }
         return false;
@@ -189,4 +189,8 @@ public class DataTreeChildObject {
             this.children.remove(key);
         }
     }
+
+    public boolean hasChildren() {
+        return this.children!=null && !this.children.isEmpty();
+    }
 }
index bb4023a..115ff4f 100644 (file)
@@ -48,14 +48,6 @@ import org.slf4j.LoggerFactory;
  */
 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 @@ public class DataTreeHttpServlet extends HttpServlet {
             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 @@ public class DataTreeHttpServlet extends HttpServlet {
     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 @@ public class DataTreeHttpServlet extends HttpServlet {
         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 @@ public class DataTreeHttpServlet extends HttpServlet {
             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) {
index d6c8bd7..f12ff3d 100644 (file)
@@ -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 class DataTreeObject extends HashMap<String, DataTreeChildObject> {
      *
      */
     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 (file)
index 0000000..09a81c3
--- /dev/null
@@ -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;
+    }
+
+}
index 5c1ea98..190c789 100644 (file)
@@ -26,9 +26,11 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClientException
 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 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
     private DataProviderServiceImpl rpcApiService;
     private AboutHttpServlet aboutServlet;
     private DataTreeHttpServlet treeServlet;
+    private UserdataHttpServlet userdataServlet;
     private HtDatabaseClient dbClient;
 
     // Blueprint 1
@@ -71,7 +74,9 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
     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 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
             // 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 @@ public class DataProviderImpl implements IEntityDataProvider, AutoCloseable {
         }
     }
 
+    @Override
+    public HtUserdataManager getHtDatabaseUserManager() {
+        return this.rpcApiService.getHtDatabaseUserManager();
+    }
+
 }
index 5ef7a0a..9e7fc18 100644 (file)
@@ -30,10 +30,12 @@ import org.eclipse.jdt.annotation.NonNull;
 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 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
     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 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
         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 @@ public class DataProviderServiceImpl implements DataProviderService, AutoCloseab
         return result;
     }
 
+    public HtUserdataManager getHtDatabaseUserManager() {
+        return this.dbUserManager;
+    }
+
 }
index 4340d81..e69ddb7 100644 (file)
@@ -36,7 +36,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.requests.SearchRequest;
 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.AggregationEntries;
 import org.onap.ccsdk.features.sdnr.wt.common.database.responses.SearchResponse;
 import org.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 @@ public class DataTreeProviderImpl {
 
     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 @@ public class DataTreeProviderImpl {
      * @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 @@ public class DataTreeProviderImpl {
      * @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 @@ public class DataTreeProviderImpl {
                 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 @@ public class DataTreeProviderImpl {
                                             hitData.getString(INVENTORY_PROPERTY_PARENTUUID)));
                 }
             }
+            tree.removeUnmatchedPaths();
         }
         return tree;
     }
@@ -216,11 +217,10 @@ public class DataTreeProviderImpl {
      * 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 @@ public class DataTreeProviderImpl {
                     }
                 }
             }
-            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 (file)
index 0000000..78b032e
--- /dev/null
@@ -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());
+    }
+
+
+}
index ebb20fc..686af61 100644 (file)
         </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"
index b7a4db5..5a8c549 100644 (file)
@@ -40,9 +40,11 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo;
 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 @@ public class TestCRUDforDatabase {
         // ==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 @@ public class TestCRUDforDatabase {
         // ==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 @@ public class TestCRUDforDatabase {
         // ==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 @@ public class TestCRUDforDatabase {
         // ==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 @@ public class TestCRUDforDatabase {
         }
 
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
 
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
 
 
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         // ==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 @@ public class TestCRUDforDatabase {
 
         // ==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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
         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 @@ public class TestCRUDforDatabase {
                     + "\"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 @@ public class TestCRUDforDatabase {
 
     }
 
+    @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();
index eaaa311..56bc32c 100644 (file)
@@ -24,7 +24,7 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.test;
 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 {
index 7e63c18..56138b0 100644 (file)
@@ -63,6 +63,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
 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 @@ public class TestEventService {
         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 @@ public class TestEventService {
     @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 @@ public class TestEventService {
      * @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();
     }
 
     /**
index aa01093..16dfa0e 100644 (file)
 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 @@ public class TestImplementation {
         impl.setMediatorServerServlet(new MsServlet());
         impl.setAboutServlet(new AboutHttpServlet());
         impl.setTreeServlet(new DataTreeHttpServlet());
+        impl.setUserdataServlet(new UserdataHttpServlet());
         try {
             impl.init();
         } catch (Exception e) {
index 76286c8..b52e34c 100644 (file)
@@ -24,7 +24,7 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.test;
 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 @@ public class TestNuMappings {
 
     @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 @@ public class TestNuMappings {
 
     @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));
index 53c7211..e321791 100644 (file)
@@ -36,7 +36,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert;
 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 @@ public class TestTree {
         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 (file)
index 0000000..fd39784
--- /dev/null
@@ -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)));
+    }
+}
index 3c9d494..524659e 100644 (file)
@@ -40,8 +40,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.requests.DeleteIndexReque
 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 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.pro
 public class TestYangGenSalMapping {
 
     // Create mapper for serialization and deserialization
-    YangToolsMapper mapper = new YangToolsMapper();
+    DataProviderYangToolsMapper mapper = new DataProviderYangToolsMapper();
 
     @Test
     public void test1() throws IOException {
index 56df628..1345d4e 100644 (file)
@@ -32,8 +32,8 @@ import org.jline.utils.Log;
 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 @@ public class TestYangGenSalMappingOpenRoadm extends Mockito {
 
         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 class TestYangGenSalMappingOpenRoadm extends Mockito {
     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 class TestYangGenSalMappingOpenRoadm extends Mockito {
     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 (file)
index 0000000..c5b41ec
--- /dev/null
@@ -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 (file)
index 0000000..4e283cd
--- /dev/null
@@ -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 (file)
index 0000000..20d44f7
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "tileOpacity": "26",
+    "styling": {
+        "theme": "light"
+    },
+    "startupPosition": {
+        "latitude": "52.5",
+        "longitude": "13.35",
+        "zoom": "10"
+    }
+}
\ No newline at end of file
index 1b6cd8a..5d9cbee 100644 (file)
         </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>
index cd42390..9a9f4fc 100644 (file)
@@ -37,7 +37,11 @@ import javax.servlet.ServletOutputStream;
 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 @@ public class AuthHttpServlet extends HttpServlet {
     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 @@ public class AuthHttpServlet extends HttpServlet {
             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 @@ public class AuthHttpServlet extends HttpServlet {
         }
 
     }
-
+    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 @@ public class AuthHttpServlet extends HttpServlet {
         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);
+        }
+    }
 }
index 0399655..7213f80 100644 (file)
@@ -26,8 +26,8 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
 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;
 
index cc029bd..b965878 100644 (file)
@@ -26,7 +26,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
 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{