From 24cac2175588a81a2ebecb5c08b91455cfc24d0b Mon Sep 17 00:00:00 2001 From: Michael DÜrre Date: Tue, 6 Apr 2021 10:33:41 +0200 Subject: source out odl mapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit put odl mapper code into seperate bundle Issue-ID: CCSDK-3254 Signed-off-by: Michael DÜrre Change-Id: I3debef0be8e44e7c68c95a6d06b7e50813bbea43 --- .../alarms/rev190911/OperatorStateBuilder.java | 23 ++ .../ietf/alarms/rev190911/ResourceBuilder.java | 23 ++ .../alarms/rev190911/ResourceMatchBuilder.java | 23 ++ .../alarms/rev190911/SeverityWithClearBuilder.java | 23 ++ .../ControlMaxAlarmStatusChangesBuilder.java | 23 ++ sdnr/wt/common-yang/pom.xml | 1 + .../acm/rev180214/nacm/RuleListGroupBuilder.java | 23 ++ .../rule/list/RuleAccessOperationsBuilder.java | 23 ++ .../nacm/rule/list/RuleModuleNameBuilder.java | 23 ++ .../type/NotificationNotificationNameBuilder.java | 23 ++ .../rule/type/ProtocolOperationRpcNameBuilder.java | 23 ++ sdnr/wt/common-yang/utils/pom.xml | 74 ++++++ .../sdnr/wt/yang/mapper/YangToolsMapper.java | 73 ++++++ .../sdnr/wt/yang/mapper/YangToolsMapper2.java | 97 ++++++++ .../sdnr/wt/yang/mapper/YangToolsMapperHelper.java | 270 +++++++++++++++++++++ .../wt/yang/mapper/builder/DateAndTimeBuilder.java | 36 +++ .../YangToolsBuilderAnnotationIntrospector.java | 136 +++++++++++ .../YangToolsDeserializerModifier.java | 111 +++++++++ .../mapper/mapperextensions/YangToolsModule.java | 50 ++++ .../mapper/serialize/BaseIdentityDeserializer.java | 64 +++++ .../yang/mapper/serialize/ClassDeserializer.java | 45 ++++ .../mapper/serialize/DateAndTimeSerializer.java | 51 ++++ .../wt/yang/mapper/serialize/EnumSerializer.java | 36 +++ .../mapper/serialize/IdentifierDeserializer.java | 71 ++++++ .../wt/yang/mapper/serialize/MapSerializer.java | 37 +++ .../mapper/serialize/TypeObjectDeserializer.java | 87 +++++++ .../mapper/serialize/TypeObjectSerializer.java | 52 ++++ .../sdnr/wt/common/database/ExtRestClient.java | 55 +---- .../sdnr/wt/common/database/data/DbFilter.java | 19 ++ .../wt/common/database/queries/QueryBuilders.java | 14 ++ .../sdnr/wt/common/http/BaseHTTPClient.java | 9 + sdnr/wt/common/src/test/resources/testpom.xml | 6 +- sdnr/wt/data-provider/installer/pom.xml | 19 -- .../model/DataInconsistencyException.java | 40 +++ .../sdnr/wt/dataprovider/model/DataProvider.java | 7 +- .../wt/dataprovider/model/HtUserdataManager.java | 38 +++ .../wt/dataprovider/model/IEntityDataProvider.java | 2 + .../model/types/NetconfTimeStampImpl.java | 4 +- .../src/main/yang/data-provider@2020-11-10.yang | 24 +- sdnr/wt/data-provider/provider/pom.xml | 10 +- .../dataprovider/data/HtUserdataManagerImpl.java | 150 ++++++++++++ .../data/entity/HtDatabaseEventsService.java | 104 +++++++- .../data/rpctypehelper/QueryByFilter.java | 109 +++++---- .../database/EsDataObjectReaderWriter2.java | 4 +- .../wt/dataprovider/http/DataTreeChildObject.java | 14 +- .../wt/dataprovider/http/DataTreeHttpServlet.java | 26 +- .../sdnr/wt/dataprovider/http/DataTreeObject.java | 14 +- .../wt/dataprovider/http/UserdataHttpServlet.java | 175 +++++++++++++ .../wt/dataprovider/impl/DataProviderImpl.java | 13 +- .../dataprovider/impl/DataProviderServiceImpl.java | 8 + .../wt/dataprovider/impl/DataTreeProviderImpl.java | 33 ++- .../yangtools/DataProviderYangToolsMapper.java | 50 ++++ .../wt/dataprovider/yangtools/YangToolsMapper.java | 60 ----- .../dataprovider/yangtools/YangToolsMapper2.java | 97 -------- .../yangtools/YangToolsMapperHelper.java | 244 ------------------- .../yangtools/builder/DateAndTimeBuilder.java | 36 --- .../YangToolsBuilderAnnotationIntrospector.java | 134 ---------- .../YangToolsDeserializerModifier.java | 117 --------- .../mapperextensions/YangToolsModule.java | 50 ---- .../serialize/BaseIdentityDeserializer.java | 64 ----- .../yangtools/serialize/ClassDeserializer.java | 45 ---- .../yangtools/serialize/DateAndTimeSerializer.java | 51 ---- .../yangtools/serialize/EnumSerializer.java | 36 --- .../serialize/IdentifierDeserializer.java | 71 ------ .../yangtools/serialize/MapSerializer.java | 37 --- .../serialize/TypeObjectDeserializer.java | 87 ------- .../yangtools/serialize/TypeObjectSerializer.java | 51 ---- .../org/opendaylight/blueprint/impl-blueprint.xml | 10 + .../wt/dataprovider/test/TestCRUDforDatabase.java | 81 +++++-- .../wt/dataprovider/test/TestDataMappings.java | 2 +- .../wt/dataprovider/test/TestEventService.java | 22 +- .../wt/dataprovider/test/TestImplementation.java | 4 +- .../sdnr/wt/dataprovider/test/TestNuMappings.java | 6 +- .../sdnr/wt/dataprovider/test/TestTree.java | 5 +- .../sdnr/wt/dataprovider/test/TestUserdata.java | 94 +++++++ .../dataprovider/test/TestYangGenSalMapping.java | 6 +- .../test/TestYangGenSalMappingOpenRoadm.java | 10 +- .../provider/src/test/resources/userdata/full.json | 13 + .../src/test/resources/userdata/merged.json | 13 + .../src/test/resources/userdata/networkmap.json | 11 + sdnr/wt/oauth-provider/provider-jar/pom.xml | 2 +- .../wt/oauthprovider/http/AuthHttpServlet.java | 26 +- .../oauthprovider/test/helper/OdlJsonMapper.java | 4 +- .../wt/oauthprovider/test/helper/OdlXmlMapper.java | 2 +- 84 files changed, 2541 insertions(+), 1418 deletions(-) create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 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 create mode 100644 sdnr/wt/common-yang/utils/pom.xml create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java create mode 100644 sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java create mode 100644 sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java create mode 100644 sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java create mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java delete mode 100644 sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java create mode 100644 sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java create mode 100644 sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json create mode 100644 sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json create mode 100644 sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java new file mode 100644 index 000000000..7e8327a09 --- /dev/null +++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/OperatorStateBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class OperatorStateBuilder { + private OperatorStateBuilder() { + //Exists only to defeat instantiation. + } + + public static OperatorState getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java new file mode 100644 index 000000000..7c4a63d2b --- /dev/null +++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class ResourceBuilder { + private ResourceBuilder() { + //Exists only to defeat instantiation. + } + + public static Resource getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java new file mode 100644 index 000000000..282a6a26d --- /dev/null +++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/ResourceMatchBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class ResourceMatchBuilder { + private ResourceMatchBuilder() { + //Exists only to defeat instantiation. + } + + public static ResourceMatch getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java new file mode 100644 index 000000000..81391922d --- /dev/null +++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/SeverityWithClearBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class SeverityWithClearBuilder { + private SeverityWithClearBuilder() { + //Exists only to defeat instantiation. + } + + public static SeverityWithClear getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java new file mode 100644 index 000000000..9f10ae87f --- /dev/null +++ b/sdnr/wt/common-yang/ietf-alarms/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/alarms/rev190911/alarms/ControlMaxAlarmStatusChangesBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.alarms.rev190911.alarms; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class ControlMaxAlarmStatusChangesBuilder { + private ControlMaxAlarmStatusChangesBuilder() { + //Exists only to defeat instantiation. + } + + public static Control.MaxAlarmStatusChanges getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/pom.xml b/sdnr/wt/common-yang/pom.xml index 19a2a0f2e..01bde5e0c 100755 --- a/sdnr/wt/common-yang/pom.xml +++ b/sdnr/wt/common-yang/pom.xml @@ -44,6 +44,7 @@ rfc8341 rfc7317-ietf-system ietf-alarms + utils diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java new file mode 100644 index 000000000..31142806f --- /dev/null +++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/RuleListGroupBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class RuleListGroupBuilder { + private RuleListGroupBuilder() { + //Exists only to defeat instantiation. + } + + public static RuleList.Group getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java new file mode 100644 index 000000000..91ae639c6 --- /dev/null +++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleAccessOperationsBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class RuleAccessOperationsBuilder { + private RuleAccessOperationsBuilder() { + //Exists only to defeat instantiation. + } + + public static Rule.AccessOperations getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java new file mode 100644 index 000000000..acf011231 --- /dev/null +++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/RuleModuleNameBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class RuleModuleNameBuilder { + private RuleModuleNameBuilder() { + //Exists only to defeat instantiation. + } + + public static Rule.ModuleName getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java new file mode 100644 index 000000000..7aca26b8c --- /dev/null +++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/NotificationNotificationNameBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list.rule.rule.type; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class NotificationNotificationNameBuilder { + private NotificationNotificationNameBuilder() { + //Exists only to defeat instantiation. + } + + public static Notification.NotificationName getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java new file mode 100644 index 000000000..3610df21f --- /dev/null +++ b/sdnr/wt/common-yang/rfc8341/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/netconf/acm/rev180214/nacm/rule/list/rule/rule/type/ProtocolOperationRpcNameBuilder.java @@ -0,0 +1,23 @@ +package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.acm.rev180214.nacm.rule.list.rule.rule.type; +import java.lang.String; +import java.lang.UnsupportedOperationException; + +/** + * The purpose of generated class in src/main/java for Union types is to create new instances of unions from a string representation. + * In some cases it is very difficult to automate it since there can be unions such as (uint32 - uint16), or (string - uint32). + * + * The reason behind putting it under src/main/java is: + * This class is generated in form of a stub and needs to be finished by the user. This class is generated only once to prevent + * loss of user code. + * + */ +public class ProtocolOperationRpcNameBuilder { + private ProtocolOperationRpcNameBuilder() { + //Exists only to defeat instantiation. + } + + public static ProtocolOperation.RpcName getDefaultInstance(String defaultValue) { + throw new UnsupportedOperationException("Not yet implemented"); + } + +} diff --git a/sdnr/wt/common-yang/utils/pom.xml b/sdnr/wt/common-yang/utils/pom.xml new file mode 100644 index 000000000..ef3c22b4c --- /dev/null +++ b/sdnr/wt/common-yang/utils/pom.xml @@ -0,0 +1,74 @@ + + + + + 4.0.0 + + + org.onap.ccsdk.parent + binding-parent + 2.2.0-SNAPSHOT + + + + org.onap.ccsdk.features.sdnr.wt + sdnr-wt-yang-utils + 1.2.0-SNAPSHOT + bundle + + ccsdk-features :: ${project.artifactId} + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + + org.osgi + org.osgi.core + provided + + + com.google.code.findbugs + annotations + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + org.opendaylight.mdsal.binding.model.ietf + rfc6991-ietf-yang-types + provided + + + + diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java new file mode 100644 index 000000000..f406ea97d --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java @@ -0,0 +1,73 @@ +/* + * ============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.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.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector; +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsModule; +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 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() { + this(new YangToolsBuilderAnnotationIntrospector()); + } + + 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(this.module); + + } + public void addDeserializer(Class clsToDeserialize, String builderClassName) { + this.annotationIntrospector.addDeserializer(clsToDeserialize, builderClassName); + } + + public void addKeyDeserializer(Class type, KeyDeserializer deserializer) { + this.module.addKeyDeserializer(type, deserializer); + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java new file mode 100644 index 000000000..5c5aeb6de --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java @@ -0,0 +1,97 @@ +/* + * ============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.yang.mapper; + +import java.lang.reflect.InvocationTargetException; +import javax.annotation.Nullable; +import org.eclipse.jdt.annotation.NonNull; +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; +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 YangToolsMapper2 extends YangToolsMapper { + + private static final Logger LOG = LoggerFactory.getLogger(YangToolsMapper2.class); + private static final long serialVersionUID = 1L; + + private @Nullable final Class> builderClazz; + + /** + * Generic Object creation of yangtools java class builder pattern. + * + * @param Class of DataObject + * @param Builder for the class. + * @param clazz specifies class to be mapped + * @param builderClazz is the builder for class with name pattern "clazzBuilder".
+ * If null the clazz is expected to support normal jackson build pattern. + * @throws ClassNotFoundException if builderClazz not available in bundle + */ + public > YangToolsMapper2(@NonNull Class clazz, + @Nullable Class builderClazz) throws ClassNotFoundException { + super(new YangToolsBuilderAnnotationIntrospector(clazz, builderClazz)); + + this.builderClazz = + builderClazz != null ? builderClazz : getBuilderClass(YangToolsMapperHelper.getBuilderClassName(clazz)); + } + + /** + * Get Builder object for yang tools interface. + * + * @param yang-tools base datatype + * @param clazz class with interface. + * @return builder for interface or null if not existing + */ + public @Nullable Builder getBuilder(Class clazz) { + try { + if (builderClazz != null) + return builderClazz.getDeclaredConstructor().newInstance(); + else + return null; + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e) { + LOG.warn("Problem intantiating Builder", e); + return null; + } + } + + // --- Private functions + + /** + * Search builder in context + * + * @param name + * @return + * @throws ClassNotFoundException + */ + @SuppressWarnings("unchecked") + private > Class getBuilderClass(String name) throws ClassNotFoundException { + return (Class) YangToolsMapperHelper.getBuilderClass(name); + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java new file mode 100644 index 000000000..ac6b1b5c5 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java @@ -0,0 +1,270 @@ +/* + * ============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.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; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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> cache = new ConcurrentHashMap<>(); + + private YangToolsMapperHelper() { + //Make unaccessible + } + + public static Class findClass(String name) throws ClassNotFoundException { + + //Try first in cache + Class res = cache.get(name); + if (res != null) { + return res; + } + //Try first in actual bundle + try { + return loadClass(null, name); + } catch (ClassNotFoundException e) { + // No problem, this bundle doesn't have the class + } + // Try to find in other bundles + if (context != null) { + //OSGi environment + for (Bundle b : context.getBundles()) { + try { + return loadClass(b, name); + } catch (ClassNotFoundException e) { + // No problem, this bundle doesn't have the class + } + } + } + // really not found in any bundle + throw new ClassNotFoundException("Can not find class '"+name+"'"); + } + + private static Class loadClass(Bundle b, String name) throws ClassNotFoundException { + Class res = b == null ? Class.forName(name) : b.loadClass(name); + cache.put(name, res); + return res; + } + + /** + * Verify if builder is available + * + * @throws ClassNotFoundException + **/ + public static Class assertBuilderClass(Class clazz) throws ClassNotFoundException { + return getBuilderClass(getBuilderClassName(clazz)); + } + + public static Class getBuilderClass(String name) throws ClassNotFoundException { + return findClass(name); + } + + public static Class getBuilderClass(Class clazz) throws ClassNotFoundException { + return findClass(getBuilderClassName(clazz)); + } + + /** + * Create name of builder class + * + * @param + * @param clazz + * @return builders class name + * @throws ClassNotFoundException + */ + public static String getBuilderClassName(Class clazz) { + return clazz.getName() + BUILDER; + } + + @SuppressWarnings("unchecked") + public static > Class findBuilderClass(DeserializationContext ctxt, Class clazz) throws ClassNotFoundException { + return (Class) findClass(getBuilderClassName(clazz)); + } + + public static > Optional> findBuilderClassOptional(DeserializationContext ctxt, Class clazz) { + try { + return Optional.of(findBuilderClass(ctxt, clazz)); + } catch (ClassNotFoundException e) { + return Optional.empty(); + } + } + + public static boolean hasClassDeclaredMethod(Class clazz, String name) { + Method[] methods = clazz.getDeclaredMethods(); + for (Method m : methods) { + if (m.getName().equals(name)) { + return true; + } + } + return false; + } + + @SuppressWarnings("unchecked") + public static Optional getInstanceByConstructor(Class clazz, String arg) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { + List> ctypes = getConstructorParameterTypes(clazz, String.class); + Optional oObj; + for (Class ctype : ctypes) { + if (ctype.equals(String.class)) { + return Optional.of((T) clazz.getConstructor(ctype).newInstance(arg)); + } else if ((oObj = getDefaultInstance(ctype, arg)).isPresent()) { + return Optional.of((T) clazz.getConstructor(ctype).newInstance(oObj.get())); + } else { + // TODO: recursive instantiation down to string constructor or + // getDefaultInstance method + LOG.debug("Not implemented arg:'{}' class:'{}'", arg, clazz); + } + } + return Optional.empty(); + } + + @SuppressWarnings("unchecked") + public static Optional getDefaultInstance(@Nullable Class clazz, String arg) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + LOG.trace("arg:'{}' clazz '{}'", arg, clazz.getName()); + if (clazz != null) { + Method[] methods = clazz.getDeclaredMethods(); + for (Method m : methods) { + //TODO Verify argument type to avoid exception + if (m.getName().equals(TYPEOBJECT_INSTANCE_METHOD)) { + Method method = clazz.getDeclaredMethod(TYPEOBJECT_INSTANCE_METHOD, String.class); + LOG.trace("Invoke {} available {}",TYPEOBJECT_INSTANCE_METHOD, method != null); + return Optional.of((T) method.invoke(null, arg)); + } + } + } + return Optional.empty(); + } + + public static Optional getDefaultInstance(Optional> optionalClazz, String arg) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + if (optionalClazz.isPresent()) { + return getDefaultInstance(optionalClazz.get(), arg); + } + return Optional.empty(); + } + + public static List> getConstructorParameterTypes(Class clazz, Class prefer) { + + Constructor[] constructors = clazz.getConstructors(); + List> res = new ArrayList<>(); + for (Constructor c : constructors) { + Class[] ptypes = c.getParameterTypes(); + if (ptypes.length == 1) { + res.add(ptypes[0]); + } + + if (prefer != null && ptypes.length == 1 && ptypes[0].equals(prefer)) { + return Arrays.asList(prefer); + } + } + return res; + } + + 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)) { + return true; + } + } + return false; + } + + /** + * Provide mapping of string to attribute names, generated by yang-tools. "netconf-id" converted to "_netconfId" + * + * @param name with attribute name, not null or empty + * @return converted string or null if name was empty or null + */ + public @Nullable static String toCamelCaseAttributeName(final String name) { + if (name == null || name.isEmpty()) + return null; + + final StringBuilder ret = new StringBuilder(name.length()); + if (!name.startsWith("_")) + ret.append('_'); + int start = 0; + for (final String word : name.split("-")) { + if (!word.isEmpty()) { + if (start++ == 0) { + ret.append(Character.toLowerCase(word.charAt(0))); + } else { + ret.append(Character.toUpperCase(word.charAt(0))); + } + ret.append(word.substring(1)); + } + } + return ret.toString(); + } + + private static BundleContext getBundleContext() { + Bundle bundle = FrameworkUtil.getBundle(YangToolsMapperHelper.class); + return bundle != null ? bundle.getBundleContext() : null; + } + public static boolean hasTime(Notification notification) { + return notification instanceof EventInstantAware; + } + public static DateAndTime getTime(Notification notification, Instant defaultValue) { + Instant time; + if (hasTime(notification)) { // If notification class extends/implements the EventInstantAware + time = ((EventInstantAware) notification).eventInstant(); + LOG.debug("Event time {}", time); + } else { + time = defaultValue; + LOG.debug("Defaulting to actual time of processing the notification - {}", time); + } + return DateAndTime.getDefaultInstance(ZonedDateTime.ofInstant(time, ZoneOffset.UTC).format(formatterOutput)); + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java new file mode 100644 index 000000000..f6afc578f --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/builder/DateAndTimeBuilder.java @@ -0,0 +1,36 @@ +/* + * ============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.yang.mapper.builder; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; + +public class DateAndTimeBuilder { + private final String _value; + + public DateAndTimeBuilder(String v) { + this._value = v; + } + + public DateAndTime build() { + return new DateAndTime(_value); + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java new file mode 100644 index 000000000..46c966076 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsBuilderAnnotationIntrospector.java @@ -0,0 +1,136 @@ +/* + * ============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.yang.mapper.mapperextensions; + +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder.Value; +import com.fasterxml.jackson.databind.cfg.MapperConfig; +import com.fasterxml.jackson.databind.introspect.AnnotatedClass; +import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +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.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; +import org.opendaylight.yangtools.yang.common.Uint8; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationIntrospector { + + private static final Logger LOG = LoggerFactory.getLogger(YangToolsBuilderAnnotationIntrospector.class); + private static final long serialVersionUID = 1L; + + private final Map, String> customDeserializer; + + public YangToolsBuilderAnnotationIntrospector() { + this(null, null); + } + + public YangToolsBuilderAnnotationIntrospector(Class cls, Class builderClass) { + this.customDeserializer = new HashMap<>(); + if (cls != null && builderClass != null) { + this.customDeserializer.put(cls, builderClass.getName()); + } + this.customDeserializer.put(DateAndTime.class, DateAndTimeBuilder.class.getName()); + //this.customDeserializer.put(Credentials.class, LoginPasswordBuilder.class.getName()); + } + + @Override + public Class findPOJOBuilder(AnnotatedClass ac) { + try { + String builder = null; + if (this.customDeserializer.containsKey(ac.getRawType())) { + builder = this.customDeserializer.get(ac.getRawType()); + } else { + if (ac.getRawType().isInterface()) { + builder = ac.getName() + "Builder"; + } + } + if (builder != null) { + LOG.trace("map {} with builder {}", ac.getName(), builder); + Class innerBuilder = YangToolsMapperHelper.findClass(builder); + return innerBuilder; + } + } catch (ClassNotFoundException e) { + LOG.trace("builder class not found for {}", ac.getName()); + } + return super.findPOJOBuilder(ac); + } + + @Override + public Value findPOJOBuilderConfig(AnnotatedClass ac) { + if (ac.hasAnnotation(JsonPOJOBuilder.class)) { + return super.findPOJOBuilderConfig(ac); + } + return new JsonPOJOBuilder.Value("build", "set"); + } + + @Override + public AnnotatedMethod resolveSetterConflict(MapperConfig config, AnnotatedMethod setter1, + AnnotatedMethod setter2) { + Class p1 = setter1.getRawParameterType(0); + Class p2 = setter2.getRawParameterType(0); + AnnotatedMethod res = null; + + if (this.isAssignable(p1, p2, Map.class, List.class)) { + res = p1.isAssignableFrom(List.class) ? setter1 : setter2; //prefer List setter + } else if (this.isAssignable(p1, p2, Uint64.class, BigInteger.class)) { + res = setter1; + } else if (this.isAssignable(p1, p2, Uint32.class, Long.class)) { + res = setter1; + } else if (this.isAssignable(p1, p2, Uint16.class, Integer.class)) { + res = setter1; + } else if (this.isAssignable(p1, p2, Uint8.class, Short.class)) { + res = setter1; + } + if (res == null) { + res = super.resolveSetterConflict(config, setter1, setter2); + } + 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; + } + + private boolean isAssignable(Class p1, Class p2, Class c1, Class c2) { + return ((p1.isAssignableFrom(c1) && p2.isAssignableFrom(c2)) + || (p2.isAssignableFrom(c1) && p1.isAssignableFrom(c2))); + + } + + public void addDeserializer(Class clazz, String builder) { + this.customDeserializer.put(clazz, builder); + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java new file mode 100644 index 000000000..c12d17e74 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java @@ -0,0 +1,111 @@ +/* + * ============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.yang.mapper.mapperextensions; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.DeserializationConfig; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.KeyDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; +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.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; + +public class YangToolsDeserializerModifier extends BeanDeserializerModifier { + + private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier.class); + private static final String getEnumMethodName="valueOf"; + + @Override + public JsonDeserializer> modifyEnumDeserializer(DeserializationConfig config, final JavaType type, + BeanDescription beanDesc, final JsonDeserializer deserializer) { + return new JsonDeserializer>() { + + @Override + public Enum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + Class clazz = type.getRawClass(); + + try { + Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class); + Enum result = (Enum) method.invoke(null, jp.getValueAsString()); + LOG.debug("Deserialize '{}' with class '{}' to '{}'", jp.getValueAsString(), clazz.getName(), result); + return result; + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | NoSuchElementException | SecurityException e) { + LOG.warn("problem deserializing enum for {} with value {}: {}", clazz.getName(), + jp.getValueAsString(), e); + } + throw new IOException( + "unable to parse enum (" + type.getRawClass() + ")for value " + jp.getValueAsString()); + } + }; + } + + @Override + public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, + JsonDeserializer deserializer) { + final JavaType type = beanDesc.getType(); + final Class rawClass = type.getRawClass(); + + JsonDeserializer deser = super.modifyDeserializer(config, beanDesc, deserializer); + + if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) { + deser = new TypeObjectDeserializer(type, deser); + } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) { + deser = new TypeObjectDeserializer>(type, deser); + } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) { + deser = new BaseIdentityDeserializer(deser); + } else if (rawClass.equals(Class.class)) { + deser = new ClassDeserializer(rawClass); + } + + LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName()); + return deser; + } + + @Override + public KeyDeserializer modifyKeyDeserializer(DeserializationConfig config, JavaType type, KeyDeserializer deser) { + KeyDeserializer res; + if (YangToolsMapperHelper.implementsInterface(type.getRawClass(), Identifier.class)) { + res = new IdentifierDeserializer(); + } else { + res = super.modifyKeyDeserializer(config, type, deser); + } + LOG.debug("Keydeserialize '{}' with deserializer '{}'", type.getRawClass().getName(), res.getClass().getName()); + return res; + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java new file mode 100644 index 000000000..02628dc16 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsModule.java @@ -0,0 +1,50 @@ +/* + * ============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.yang.mapper.mapperextensions; + +import com.fasterxml.jackson.databind.module.SimpleModule; +import java.util.Map; +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.yangtools.yang.binding.ScalarTypeObject; +import org.opendaylight.yangtools.yang.binding.TypeObject; + +public class YangToolsModule extends SimpleModule { + + private static final long serialVersionUID = 1L; + + public YangToolsModule() { + super(); + setDeserializerModifier(new YangToolsDeserializerModifier()); + + addSerializer(DateAndTime.class, new DateAndTimeSerializer()); + addSerializer(TypeObject.class, new TypeObjectSerializer()); + addSerializer(ScalarTypeObject.class, new TypeObjectSerializer()); + addSerializer(Enum.class, new EnumSerializer()); + addSerializer(Map.class, new MapSerializer()); + + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java new file mode 100644 index 000000000..f85f80e2c --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/BaseIdentityDeserializer.java @@ -0,0 +1,64 @@ +/* + * ============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.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.yang.mapper.YangToolsMapperHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseIdentityDeserializer extends JsonDeserializer { + + private static final Logger LOG = LoggerFactory.getLogger(BaseIdentityDeserializer.class); + private final JsonDeserializer deser; + + public BaseIdentityDeserializer(final JsonDeserializer deser) { + this.deser = deser; + } + + @SuppressWarnings("unchecked") + @Override + public T deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { + LOG.debug("BaseIdentityDeserializer class for '{}'",parser.getValueAsString()); + String clazzToSearch = parser.getValueAsString(); + // clazz from Elasticsearch is full qualified + int lastDot = clazzToSearch.lastIndexOf("."); + if (lastDot > -1) { + clazzToSearch = clazzToSearch.substring(lastDot+1); + } else { + clazzToSearch = clazzToSearch.substring(0, 1).toUpperCase() + clazzToSearch.substring(1); + } + Class clazz; + try { + clazz = YangToolsMapperHelper.findClass(clazzToSearch); + if (clazz != null) + return (T)clazz; + } catch (ClassNotFoundException e) { + LOG.warn("BaseIdentityDeserializer class not found for '"+parser.getValueAsString()+"'",e); + } + return (T) deser.deserialize(parser, ctxt); + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java new file mode 100644 index 000000000..9d221f504 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/ClassDeserializer.java @@ -0,0 +1,45 @@ +/* + * ============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.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.yang.mapper.YangToolsMapperHelper; + +public class ClassDeserializer extends FromStringDeserializer> { + + private static final long serialVersionUID = 1L; + + public ClassDeserializer(Class vc) { + super(vc); + } + + @Override + protected Class _deserialize(String value, DeserializationContext ctxt) throws IOException { + try { + return YangToolsMapperHelper.findClass(value); + } catch (ClassNotFoundException e) { + throw new IOException("Can not find class "+value,e); + } + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java new file mode 100644 index 000000000..f4fd87580 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/DateAndTimeSerializer.java @@ -0,0 +1,51 @@ +/* + * ============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.yang.mapper.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import java.io.IOException; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; + +/** + * DateAndTime shouldn't be encapsulated into a json object to be able to use elasticsearch date time query functions. + */ +public class DateAndTimeSerializer extends StdSerializer<@NonNull DateAndTime> { + + private static final long serialVersionUID = 1L; + + public DateAndTimeSerializer() { + this(null); + } + + protected DateAndTimeSerializer(Class t) { + super(t); + } + + @Override + public void serialize(DateAndTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(value.getValue()); + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java new file mode 100644 index 000000000..55a20d6c0 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/EnumSerializer.java @@ -0,0 +1,36 @@ +/* + * ============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.yang.mapper.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; + +@SuppressWarnings("rawtypes") +public class EnumSerializer extends JsonSerializer { + + @Override + public void serialize(Enum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(value.name()); + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java new file mode 100644 index 000000000..6c4c25eb1 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/IdentifierDeserializer.java @@ -0,0 +1,71 @@ +/* + * ============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.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.yang.mapper.YangToolsMapperHelper; +import org.opendaylight.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IdentifierDeserializer extends KeyDeserializer { + + private static final Logger LOG = LoggerFactory.getLogger(IdentifierDeserializer.class); + + public IdentifierDeserializer() {} + + @Override + public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException { + Class clazz = ctxt.getClass(); + final String arg = key; + LOG.debug("Deserialization for key:{}",key); + // find constructor argument types + List> ctypes = YangToolsMapperHelper.getConstructorParameterTypes(clazz, String.class); + for (Class ctype : ctypes) { + try { + if (ctype.equals(String.class)) { + return clazz.getConstructor(ctype).newInstance(arg); + } else if (ctype.equals(Uint16.class)) { + return clazz.getConstructor(ctype).newInstance(Uint16.valueOf(arg)); + + } else if (ctype.equals(Uint32.class)) { + return clazz.getConstructor(ctype).newInstance(Uint32.valueOf(arg)); + } else if (ctype.equals(Uint64.class)) { + return clazz.getConstructor(ctype).newInstance(Uint64.valueOf(arg)); + } + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException | NoSuchMethodException | SecurityException e) { + LOG.warn("unable to instantiate class {} with arg {}: ", clazz, arg, e); + throw new IllegalArgumentException( + "unable to instantiate class " + clazz.getName() + " with arg '" + arg + "' ", e); + } + } + return null; + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java new file mode 100644 index 000000000..63689c098 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/MapSerializer.java @@ -0,0 +1,37 @@ +/* + * ============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.yang.mapper.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import java.util.Map; + +@SuppressWarnings("rawtypes") +public class MapSerializer extends JsonSerializer { + + @Override + public void serialize(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeObject(value.values()); + } +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java new file mode 100644 index 000000000..b857a2ffb --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectDeserializer.java @@ -0,0 +1,87 @@ +/* + * ============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.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.JavaType; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.NoSuchElementException; +import java.util.Optional; +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper; +import org.opendaylight.yangtools.concepts.Builder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TypeObjectDeserializer extends JsonDeserializer { + + private static final Logger LOG = LoggerFactory.getLogger(TypeObjectDeserializer.class); + private final JavaType type; + private final JsonDeserializer deser; + + + public TypeObjectDeserializer(final JavaType type, final JsonDeserializer deser) { + this.type = type; + this.deser = deser; + } + + @SuppressWarnings("unchecked") + @Override + public T deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { + + Class clazz = (Class) type.getRawClass(); + final String arg = parser.getValueAsString(); + LOG.debug("Try to build arg:'{}' with class {}",arg, clazz); + Optional oRes = Optional.empty(); + try { + //try get method for default instance + if ((oRes = YangToolsMapperHelper.getDefaultInstance(clazz, arg)).isEmpty()) { + //try to find builder with getDefaultInstance method + Optional>> oBuilderClazz = YangToolsMapperHelper.findBuilderClassOptional(ctxt, clazz); + LOG.debug("Try builder class present:{}",oBuilderClazz.isPresent()); + if (oBuilderClazz.isEmpty() + || ((oRes = YangToolsMapperHelper.getDefaultInstance(oBuilderClazz.get(), arg)).isEmpty())) { + //try to find constructor with string + LOG.debug("Try constructor"); + if ((oRes = YangToolsMapperHelper.getInstanceByConstructor(clazz, arg)).isEmpty()) { + //forward to standard deserializer or throw if not available + LOG.debug("Try default deserializer"); + oRes = Optional.of((T) deser.deserialize(parser, ctxt)); + } + } + } + LOG.debug("Deserialize string value:{} for class:{} success:{}", arg, clazz, oRes.isPresent()); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | NoSuchElementException | SecurityException | InstantiationException e) { + LOG.warn("problem deserializing {} with value {}: {}", clazz.getName(), arg, e); + } + if (oRes.isPresent()) { + return oRes.get(); + } else { + throw new IllegalArgumentException("Could not find constructor for arg:'" + arg + "' and class: " + clazz); + } + } + +} diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java new file mode 100644 index 000000000..b43e6c100 --- /dev/null +++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/TypeObjectSerializer.java @@ -0,0 +1,52 @@ +/* + * ============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.yang.mapper.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.opendaylight.yangtools.yang.binding.TypeObject; + +public class TypeObjectSerializer extends JsonSerializer { + + @Override + public void serialize(TypeObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + //stringValue + Method[] methods = value.getClass().getDeclaredMethods(); + String name; + for (Method method : methods) { + name = method.getName(); + if (method.getParameterCount()==0 && (name.equals("stringValue") || name.equals("getValue"))) { + try { + gen.writeString((String)method.invoke(value)); + break; + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | IOException e) { + throw new IOException("No String getter method supported TypeObject for "+value.getClass(),e); + } + } + } + } +} diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java index f8734d5a6..1f67e5ef8 100644 --- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/ExtRestClient.java @@ -29,10 +29,8 @@ import java.security.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 diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java index 82c036406..70e41c280 100644 --- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/DbFilter.java @@ -37,9 +37,28 @@ public class DbFilter { return restFilterValue == null ? false : restFilterValue.contains("*") || restFilterValue.contains("?"); } + public static boolean hasSearchParams(List 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 restFilterValues) { + for (String restFilterValue : restFilterValues) { + if (!isComparisonValid(restFilterValue)) { + return false; + } + } + return true; + } + public static boolean isDatetimeKeyValue(String key, String value) { return timestampValueNames.contains(key.toLowerCase()); } diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java index 7b22fd5e7..582d749d5 100644 --- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/queries/QueryBuilders.java @@ -21,6 +21,7 @@ */ package org.onap.ccsdk.features.sdnr.wt.common.database.queries; +import java.util.List; import org.json.JSONObject; public class QueryBuilders { @@ -34,6 +35,11 @@ public class QueryBuilders { o.put(key, value); return new QueryBuilder().setQuery("term", o); } + public static QueryBuilder multiTermQuery(String key, List 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(); } diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java index 937e2d898..ffb31c676 100644 --- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java +++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/http/BaseHTTPClient.java @@ -370,6 +370,15 @@ 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; + } + } diff --git a/sdnr/wt/common/src/test/resources/testpom.xml b/sdnr/wt/common/src/test/resources/testpom.xml index e57fed436..6fba87af9 100644 --- a/sdnr/wt/common/src/test/resources/testpom.xml +++ b/sdnr/wt/common/src/test/resources/testpom.xml @@ -29,13 +29,13 @@ org.onap.ccsdk.parent binding-parent - 2.1.0-SNAPSHOT + 2.0.0-SNAPSHOT org.onap.ccsdk.features.sdnr.wt sdnr-wt-common - 1.1.1-SNAPSHOT + 1.0.0-SNAPSHOT jar ccsdk-features :: ${project.artifactId} @@ -63,7 +63,7 @@ javax.servlet - javax.servlet-api + servlet-api org.osgi diff --git a/sdnr/wt/data-provider/installer/pom.xml b/sdnr/wt/data-provider/installer/pom.xml index cdd1724d2..ee6b2f370 100755 --- a/sdnr/wt/data-provider/installer/pom.xml +++ b/sdnr/wt/data-provider/installer/pom.xml @@ -118,26 +118,7 @@ maven-resources-plugin - 2.6 - - copy-sdnr-data-migration-tool - - copy-resources - - validate - - ${project.build.directory}/assembly/system/org/onap/ccsdk/features/sdnr/wt/sdnr-wt-data-provider-setup/${project.version} - - - ${basedir}/../setup/target - - sdnr-dmt.jar - - - - - copy-schemas 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 index 000000000..e734a47a3 --- /dev/null +++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataInconsistencyException.java @@ -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 repaired; + + public DataInconsistencyException(List repaired, String message) { + super(message); + this.repaired = repaired; + } + + public List getRepairedList() { + return this.repaired; + } +} diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java index 47255fd73..e6eb7a4e8 100644 --- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java +++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/DataProvider.java @@ -67,10 +67,15 @@ 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 list); /** * write GUI Cut through data to database diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java new file mode 100644 index 000000000..2f580c98b --- /dev/null +++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/HtUserdataManager.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. + * ================================================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + * ============LICENSE_END========================================================================== + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.model; + +/** + * @author Jack + * + */ +public interface HtUserdataManager { + + String getUserdata(String username); + + String getUserdata(String username, String key); + + boolean setUserdata(String username, String data); + + boolean setUserdata(String username, String key, String data); + + boolean removeUserdata(String username); + + boolean removeUserdata(String username, String key); + +} diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java index 9ba10cd0b..2a91d7816 100644 --- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java +++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/IEntityDataProvider.java @@ -27,6 +27,8 @@ 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); diff --git a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java index bd71d5ba1..2ccebca99 100644 --- a/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java +++ b/sdnr/wt/data-provider/model/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/model/types/NetconfTimeStampImpl.java @@ -75,14 +75,14 @@ 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); /** diff --git a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang index 8509007e1..84c43d52b 100644 --- a/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang +++ b/sdnr/wt/data-provider/model/src/main/yang/data-provider@2020-11-10.yang @@ -104,6 +104,10 @@ 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; diff --git a/sdnr/wt/data-provider/provider/pom.xml b/sdnr/wt/data-provider/provider/pom.xml index 9045dfa12..3507d4108 100644 --- a/sdnr/wt/data-provider/provider/pom.xml +++ b/sdnr/wt/data-provider/provider/pom.xml @@ -48,7 +48,8 @@ true - 49402 + 49402 + ${basedir}/../setup/target/sdnr-dmt.jar @@ -72,6 +73,11 @@ sdnr-wt-common ${project.version} + + ${project.groupId} + sdnr-wt-yang-utils + ${project.version} + ${project.groupId} sdnr-wt-data-provider-model @@ -159,7 +165,7 @@ ${basedir}/java.sh -jar - ${basedir}/../../data-provider/setup/target/sdnr-dmt.jar + ${initdb} -c pluginfile -of diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java new file mode 100644 index 000000000..73cc1a212 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/HtUserdataManagerImpl.java @@ -0,0 +1,150 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.data; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import org.json.JSONException; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchHit; +import org.onap.ccsdk.features.sdnr.wt.common.database.SearchResult; +import org.onap.ccsdk.features.sdnr.wt.common.database.queries.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtUserdataManagerImpl implements HtUserdataManager { + + private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerImpl.class); + + private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json"; + private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults(); + + private static JSONObject loadDefaults() { + File f = new File(USERDATA_DEFAULTS_FILENAME); + String content; + JSONObject o = null; + if (f.exists()) { + try { + content = Files.readString(f.toPath()); + o = new JSONObject(content); + } catch (IOException e) { + LOG.warn("problem loading defaults: ", e); + } catch (JSONException e) { + LOG.warn("problem parsing defaults: ", e); + } + } + return o; + } + + + private final HtDatabaseClient dbClient; + + public HtUserdataManagerImpl(HtDatabaseClient rawClient) { + this.dbClient = rawClient; + } + + @Override + public String getUserdata(String username) { + SearchResult result = this.dbClient.doReadByQueryJsonData(Entity.Userdata.getName(), + QueryBuilders.matchQuery("_id", username)); + String json = result.getHits().size() > 0 ? result.getHits().get(0).getSourceAsString() : "{}"; + if (USERDATA_DEFAULTS_CONTENT != null) { + JSONObject merge = mergeData(new JSONObject(json), USERDATA_DEFAULTS_CONTENT); + json = merge.toString(); + } + return json; + } + + @Override + public String getUserdata(String username, String key) { + JSONObject o = new JSONObject(this.getUserdata(username)); + return o.has(key) ? o.get(key).toString() : "{}"; + } + + @Override + public boolean setUserdata(String username, String data) { + JSONObject o = new JSONObject(this.getUserdata(username)); + JSONObject merge = mergeData(o, new JSONObject(data)); + return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, merge.toString()) != null; + } + + @Override + public boolean setUserdata(String username, String key, String data) { + JSONObject o = new JSONObject(this.getUserdata(username)); + o = mergeData(o, key, new JSONObject(data)); + return this.dbClient.doWriteRaw(Entity.Userdata.getName(), username, o.toString()) != null; + } + + @Override + public boolean removeUserdata(String username) { + return this.dbClient.doRemove(Entity.Userdata.getName(), username); + } + + @Override + public boolean removeUserdata(String username, String key) { + JSONObject o = new JSONObject(this.getUserdata(username)); + if (o.has(key)) { + o.remove(key); + return this.setUserdata(username, o.toString()); + } + return true; + } + + private static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) { + if (!o.has(key)) { + o.put(key, subObject); + } else { + JSONObject tmp = new JSONObject(); + tmp.put(key, subObject); + o = mergeData(tmp, o); + } + return o; + } + + private static JSONObject mergeData(JSONObject source, JSONObject target) throws JSONException { + String[] keys = JSONObject.getNames(source); + if (keys == null) { + return target; + } + for (String key : keys) { + Object value = source.get(key); + if (!target.has(key)) { + // new value for "key": + target.put(key, value); + } else { + // existing value for "key" - recursively deep merge: + if (value instanceof JSONObject) { + JSONObject valueJson = (JSONObject) value; + mergeData(valueJson, target.getJSONObject(key)); + } else { + target.put(key, value); + } + } + } + return target; + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java index f6cd7491a..f680edddf 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/entity/HtDatabaseEventsService.java @@ -24,7 +24,10 @@ 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 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 list) throws DataInconsistencyException { + final String UNBOUND_INVENTORY_UUID = "unbound"; + List failures = new ArrayList<>(); + long treeLevel; + int failCounter = 0; + Map 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 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 duplicate = list + .stream().filter(e -> !item.equals(e) && item.getUuid() != null + && item.getUuid().equals(e.getUuid()) && repairList.containsKey(e.getUuid())) + .findFirst(); + if (duplicate.isPresent()) { + failures.add(String.format("found duplicate uuid=%s", item.getUuid())); + failCounter++; + continue; + + } + if (failCounter > 0) { + repairList.put(repairedItem.getUuid(), repairedItem.build()); + } else { + repairList.put(item.getUuid(), item); + } + } + } + + if (failures.size() > 0) { + throw new DataInconsistencyException(new ArrayList<>(repairList.values()), + "inventory list is not consistent;\n" + String.join("\n", failures)); + } + } // -- Networkelement diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java index 09e48197a..627d125ae 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/data/rpctypehelper/QueryByFilter.java @@ -33,7 +33,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.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 collectValues(Filter filter) { + List values = new ArrayList(); + if (filter.getFiltervalue() != null) { + values.add(filter.getFiltervalue()); + } + if (filter.getFiltervalues() != null) { + values.addAll(filter.getFiltervalues()); + } + return values; + } + private static QueryBuilder fromFilter(@Nullable List 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 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 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; } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java index 603c25bae..153022b4c 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/database/EsDataObjectReaderWriter2.java @@ -32,8 +32,8 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.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; diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java index e34988b4b..91d469700 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeChildObject.java @@ -26,14 +26,13 @@ import java.util.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 children; private final Map 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(); + } } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java index bb4023abc..115ff4f40 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeHttpServlet.java @@ -48,14 +48,6 @@ 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) { diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java index d6c8bd7bb..f12ff3deb 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/DataTreeObject.java @@ -21,8 +21,9 @@ */ package org.onap.ccsdk.features.sdnr.wt.dataprovider.http; +import java.util.ArrayList; import java.util.HashMap; - +import java.util.List; import org.json.JSONObject; public class DataTreeObject extends HashMap { @@ -95,8 +96,15 @@ public class DataTreeObject extends HashMap { * */ public void removeUnmatchedPaths() { - for (DataTreeChildObject entry : this.values()) { - entry.removeUnmatchedPaths(); + List toRemove = new ArrayList<>(); + for (Entry entry : this.entrySet()) { + entry.getValue().removeUnmatchedPaths(); + if(!entry.getValue().isMatch() && !entry.getValue().hasChildren()) { + toRemove.add(entry.getKey()); + } + } + for(String toRemoveKey:toRemove) { + this.remove(toRemoveKey); } } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java new file mode 100644 index 000000000..09a81c381 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/http/UserdataHttpServlet.java @@ -0,0 +1,175 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.http; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UserdataHttpServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + private static final Logger LOG = LoggerFactory.getLogger(UserdataHttpServlet.class); + private static final String REGEX = "^\\/userdata[\\/]?([a-zA-Z0-9]+)?$"; + private static final Pattern PATTERN = Pattern.compile(REGEX); + private static final String JWT_PAYLOAD_USERNAME_PROPERTYKEY = "sub"; + private HtUserdataManager dbUserManager; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final String uri = req.getRequestURI(); + final Matcher matcher = PATTERN.matcher(uri); + if (matcher.find()) { + LOG.info("GET found match"); + this.handleGetRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null); + } else { + LOG.info("no valid request"); + super.doGet(req, resp); + } + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final String uri = req.getRequestURI(); + final Matcher matcher = PATTERN.matcher(uri); + if (matcher.find()) { + LOG.info("PUT found match"); + final String payload = getPayload(req); + this.handlePutRequest(req, resp, payload, matcher.groupCount() > 0 ? matcher.group(1) : null); + } else { + LOG.info("no valid request"); + super.doPut(req, resp); + } + } + + private String getPayload(HttpServletRequest req) throws IOException { + return DataTreeHttpServlet.readPayload(req); + } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final String uri = req.getRequestURI(); + final Matcher matcher = PATTERN.matcher(uri); + if (matcher.find()) { + LOG.info("DELETE found match"); + this.handleDeleteRequest(req, resp, matcher.groupCount() > 0 ? matcher.group(1) : null); + } else { + LOG.info("no valid request"); + super.doPut(req, resp); + } + } + + private void handleGetRequest(HttpServletRequest req, HttpServletResponse resp, String key) { + final String username = this.getUsername(req); + if(username==null) { + resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + sendJsonResponse(resp, + key == null ? this.dbUserManager.getUserdata(username) : this.dbUserManager.getUserdata(username, key)); + } + + + private void handlePutRequest(HttpServletRequest req, HttpServletResponse resp, String data, String key) { + final String username = this.getUsername(req); + if(username==null) { + resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + boolean success = key == null ? this.dbUserManager.setUserdata(username, data) + : this.dbUserManager.setUserdata(username, key, data); + resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + private void handleDeleteRequest(HttpServletRequest req, HttpServletResponse resp, String key) { + final String username = this.getUsername(req); + if(username==null) { + resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + boolean success = key == null ? this.dbUserManager.removeUserdata(username) + : this.dbUserManager.removeUserdata(username, key); + resp.setStatus(success ? HttpServletResponse.SC_OK : HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + + private String getUsername(HttpServletRequest req) { + final String authHeader = req.getHeader("Authorization"); + if(authHeader==null) { + return null; + } + String username = null; + if(authHeader.startsWith("Basic")) { + username = BaseHTTPClient.decodeBasicAuthHeaderUsername(authHeader); + } + else if(authHeader.startsWith("Bearer")) { + username = decodeJWTPayloadUsername(authHeader, JWT_PAYLOAD_USERNAME_PROPERTYKEY); + } + return username; + } + + public static String decodeJWTPayloadUsername(String authHeader, String key) { + String username = null; + if(authHeader.startsWith("Bearer")) { + authHeader = authHeader.substring(7); + } + String[] tmp = authHeader.split("\\."); + if(tmp.length==3) { + final String decoded = new String(Base64.getDecoder().decode(tmp[1])); + JSONObject o = new JSONObject(decoded); + if(o.has(key)) { + username = o.getString(key); + if(username!=null && username.contains("@")) { + username = username.split("@")[0]; + } + } + } + return username; + } + + private static void sendJsonResponse(HttpServletResponse resp, String userdata) { + resp.setContentType("application/json"); + resp.setStatus(HttpServletResponse.SC_OK); + try { + + resp.getOutputStream().write(userdata.getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + LOG.warn("problem sending response: ", e); + } + + } + + public void setDatabaseClient(HtUserdataManager dbUserManager) { + this.dbUserManager = dbUserManager; + } + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java index 5c1ea98b2..190c78904 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderImpl.java @@ -26,9 +26,11 @@ import org.onap.ccsdk.features.sdnr.wt.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(); + } + } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java index 5ef7a0ad9..9e7fc18bc 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataProviderServiceImpl.java @@ -30,10 +30,12 @@ import org.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; + } + } diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java index 4340d8168..e69ddb737 100644 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/impl/DataTreeProviderImpl.java @@ -36,7 +36,6 @@ import org.onap.ccsdk.features.sdnr.wt.common.database.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 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 tree, String filter, FilterMode mode) throws IOException { + public DataTreeObject readInventoryTree(List 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 list, String filter, FilterMode mode) + private DataTreeObject readInventoryTreeForNode(String nodeId, List 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 others = this.search(Entity.Inventoryequipment, (String) null, INVENTORY_PROPERTY_TREELEVEL); + List 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 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 index 000000000..78b032e77 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/DataProviderYangToolsMapper.java @@ -0,0 +1,50 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.yangtools; + +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper; +import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.IdentifierDeserializer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.pmdata.grp.MeasurementKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * YangToolsMapper is a specific Jackson mapper configuration for opendaylight yangtools serialization or + * deserialization of DataObject to/from JSON TODO ChoiceIn and Credentials deserialization only for + * LoginPasswordBuilder + */ +public class DataProviderYangToolsMapper extends YangToolsMapper { + + @SuppressWarnings("unused") + private final Logger LOG = LoggerFactory.getLogger(DataProviderYangToolsMapper.class); + private static final long serialVersionUID = 1L; + + public DataProviderYangToolsMapper() { + super(); + this.addDeserializer(Credentials.class, LoginPasswordBuilder.class.getName()); + this.addKeyDeserializer(MeasurementKey.class, new IdentifierDeserializer()); + } + + +} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java deleted file mode 100644 index e7580c69a..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * ============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 com.fasterxml.jackson.annotation.JsonInclude.Include; -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.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 YangToolsMapper extends ObjectMapper { - - @SuppressWarnings("unused") - private final Logger LOG = LoggerFactory.getLogger(YangToolsMapper.class); - private static final long serialVersionUID = 1L; - - public YangToolsMapper() { - this(new YangToolsBuilderAnnotationIntrospector()); - } - - protected YangToolsMapper(YangToolsBuilderAnnotationIntrospector yangToolsBuilderAnnotationIntrospector) { - super(); - - 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()); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java deleted file mode 100644 index a19f114e3..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapper2.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * ============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 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.opendaylight.yangtools.concepts.Builder; -import org.opendaylight.yangtools.yang.binding.DataObject; -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 YangToolsMapper2 extends YangToolsMapper { - - private static final Logger LOG = LoggerFactory.getLogger(YangToolsMapper2.class); - private static final long serialVersionUID = 1L; - - private @Nullable final Class> builderClazz; - - /** - * Generic Object creation of yangtools java class builder pattern. - * - * @param Class of DataObject - * @param Builder for the class. - * @param clazz specifies class to be mapped - * @param builderClazz is the builder for class with name pattern "clazzBuilder".
- * If null the clazz is expected to support normal jackson build pattern. - * @throws ClassNotFoundException if builderClazz not available in bundle - */ - public > YangToolsMapper2(@NonNull Class clazz, - @Nullable Class builderClazz) throws ClassNotFoundException { - super(new YangToolsBuilderAnnotationIntrospector(clazz, builderClazz)); - - this.builderClazz = - builderClazz != null ? builderClazz : getBuilderClass(YangToolsMapperHelper.getBuilderClassName(clazz)); - } - - /** - * Get Builder object for yang tools interface. - * - * @param yang-tools base datatype - * @param clazz class with interface. - * @return builder for interface or null if not existing - */ - public @Nullable Builder getBuilder(Class clazz) { - try { - if (builderClazz != null) - return builderClazz.getDeclaredConstructor().newInstance(); - else - return null; - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | SecurityException e) { - LOG.warn("Problem intantiating Builder", e); - return null; - } - } - - // --- Private functions - - /** - * Search builder in context - * - * @param name - * @return - * @throws ClassNotFoundException - */ - @SuppressWarnings("unchecked") - private > Class getBuilderClass(String name) throws ClassNotFoundException { - return (Class) YangToolsMapperHelper.getBuilderClass(name); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java deleted file mode 100644 index a2afab0a8..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/YangToolsMapperHelper.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * ============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.yangtools; - -import com.fasterxml.jackson.databind.DeserializationContext; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -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.yangtools.concepts.Builder; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -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 BundleContext context = getBundleContext(); - private static ConcurrentHashMap> cache = new ConcurrentHashMap<>(); - - private YangToolsMapperHelper() { - //Make unaccessible - } - - public static Class findClass(String name) throws ClassNotFoundException { - - //Try first in cache - Class res = cache.get(name); - if (res != null) { - return res; - } - //Try first in actual bundle - try { - return loadClass(null, name); - } catch (ClassNotFoundException e) { - // No problem, this bundle doesn't have the class - } - // Try to find in other bundles - if (context != null) { - //OSGi environment - for (Bundle b : context.getBundles()) { - try { - return loadClass(b, name); - } catch (ClassNotFoundException e) { - // No problem, this bundle doesn't have the class - } - } - } - // really not found in any bundle - throw new ClassNotFoundException("Can not find class '"+name+"'"); - } - - private static Class loadClass(Bundle b, String name) throws ClassNotFoundException { - Class res = b == null ? Class.forName(name) : b.loadClass(name); - cache.put(name, res); - return res; - } - - /** - * Verify if builder is available - * - * @throws ClassNotFoundException - **/ - public static Class assertBuilderClass(Class clazz) throws ClassNotFoundException { - return getBuilderClass(getBuilderClassName(clazz)); - } - - public static Class getBuilderClass(String name) throws ClassNotFoundException { - return findClass(name); - } - - public static Class getBuilderClass(Class clazz) throws ClassNotFoundException { - return findClass(getBuilderClassName(clazz)); - } - - /** - * Create name of builder class - * - * @param - * @param clazz - * @return builders class name - * @throws ClassNotFoundException - */ - public static String getBuilderClassName(Class clazz) { - return clazz.getName() + BUILDER; - } - - @SuppressWarnings("unchecked") - public static > Class findBuilderClass(DeserializationContext ctxt, Class clazz) throws ClassNotFoundException { - return (Class) findClass(getBuilderClassName(clazz)); - } - - public static > Optional> findBuilderClassOptional(DeserializationContext ctxt, Class clazz) { - try { - return Optional.of(findBuilderClass(ctxt, clazz)); - } catch (ClassNotFoundException e) { - return Optional.empty(); - } - } - - public static boolean hasClassDeclaredMethod(Class clazz, String name) { - Method[] methods = clazz.getDeclaredMethods(); - for (Method m : methods) { - if (m.getName().equals(name)) { - return true; - } - } - return false; - } - - @SuppressWarnings("unchecked") - public static Optional getInstanceByConstructor(Class clazz, String arg) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { - List> ctypes = getConstructorParameterTypes(clazz, String.class); - Optional oObj; - for (Class ctype : ctypes) { - if (ctype.equals(String.class)) { - return Optional.of((T) clazz.getConstructor(ctype).newInstance(arg)); - } else if ((oObj = getDefaultInstance(ctype, arg)).isPresent()) { - return Optional.of((T) clazz.getConstructor(ctype).newInstance(oObj.get())); - } else { - // TODO: recursive instantiation down to string constructor or - // getDefaultInstance method - LOG.debug("Not implemented arg:'{}' class:'{}'", arg, clazz); - } - } - return Optional.empty(); - } - - @SuppressWarnings("unchecked") - public static Optional getDefaultInstance(@Nullable Class clazz, String arg) - throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException { - LOG.trace("arg:'{}' clazz '{}'", arg, clazz.getName()); - if (clazz != null) { - Method[] methods = clazz.getDeclaredMethods(); - for (Method m : methods) { - //TODO Verify argument type to avoid exception - if (m.getName().equals(TYPEOBJECT_INSTANCE_METHOD)) { - Method method = clazz.getDeclaredMethod(TYPEOBJECT_INSTANCE_METHOD, String.class); - LOG.trace("Invoke {} available {}",TYPEOBJECT_INSTANCE_METHOD, method != null); - return Optional.of((T) method.invoke(null, arg)); - } - } - } - return Optional.empty(); - } - - public static Optional getDefaultInstance(Optional> optionalClazz, String arg) - throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException { - if (optionalClazz.isPresent()) { - return getDefaultInstance(optionalClazz.get(), arg); - } - return Optional.empty(); - } - - public static List> getConstructorParameterTypes(Class clazz, Class prefer) { - - Constructor[] constructors = clazz.getConstructors(); - List> res = new ArrayList<>(); - for (Constructor c : constructors) { - Class[] ptypes = c.getParameterTypes(); - if (ptypes.length == 1) { - res.add(ptypes[0]); - } - - if (prefer != null && ptypes.length == 1 && ptypes[0].equals(prefer)) { - return Arrays.asList(prefer); - } - } - return res; - } - - public static boolean implementsInterface(Class clz, Class ifToImplement) { - Class[] ifs = clz.getInterfaces(); - for (Class iff : ifs) { - if (iff.equals(ifToImplement)) { - return true; - } - } - return false; - } - - /** - * Provide mapping of string to attribute names, generated by yang-tools. "netconf-id" converted to "_netconfId" - * - * @param name with attribute name, not null or empty - * @return converted string or null if name was empty or null - */ - public @Nullable static String toCamelCaseAttributeName(final String name) { - if (name == null || name.isEmpty()) - return null; - - final StringBuilder ret = new StringBuilder(name.length()); - if (!name.startsWith("_")) - ret.append('_'); - int start = 0; - for (final String word : name.split("-")) { - if (!word.isEmpty()) { - if (start++ == 0) { - ret.append(Character.toLowerCase(word.charAt(0))); - } else { - ret.append(Character.toUpperCase(word.charAt(0))); - } - ret.append(word.substring(1)); - } - } - return ret.toString(); - } - - private static BundleContext getBundleContext() { - Bundle bundle = FrameworkUtil.getBundle(YangToolsMapperHelper.class); - return bundle != null ? bundle.getBundleContext() : null; - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java deleted file mode 100644 index 8dbaf4ab9..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/builder/DateAndTimeBuilder.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ============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.yangtools.builder; - -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; - -public class DateAndTimeBuilder { - private final String _value; - - public DateAndTimeBuilder(String v) { - this._value = v; - } - - public DateAndTime build() { - return new DateAndTime(_value); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java deleted file mode 100644 index eb611c602..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsBuilderAnnotationIntrospector.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * ============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.yangtools.mapperextensions; - -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder.Value; -import com.fasterxml.jackson.databind.cfg.MapperConfig; -import com.fasterxml.jackson.databind.introspect.AnnotatedClass; -import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; -import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -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.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; -import org.opendaylight.yangtools.yang.common.Uint8; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class YangToolsBuilderAnnotationIntrospector extends JacksonAnnotationIntrospector { - - private static final Logger LOG = LoggerFactory.getLogger(YangToolsBuilderAnnotationIntrospector.class); - private static final long serialVersionUID = 1L; - - private final Map, String> customDeserializer; - - public YangToolsBuilderAnnotationIntrospector() { - this(null, null); - } - - public YangToolsBuilderAnnotationIntrospector(Class cls, Class builderClass) { - this.customDeserializer = new HashMap<>(); - if (cls != null && builderClass != null) { - this.customDeserializer.put(cls, builderClass.getName()); - } - this.customDeserializer.put(DateAndTime.class, DateAndTimeBuilder.class.getName()); - this.customDeserializer.put(Credentials.class, LoginPasswordBuilder.class.getName()); - } - - @Override - public Class findPOJOBuilder(AnnotatedClass ac) { - try { - String builder = null; - if (this.customDeserializer.containsKey(ac.getRawType())) { - builder = this.customDeserializer.get(ac.getRawType()); - } else { - if (ac.getRawType().isInterface()) { - builder = ac.getName() + "Builder"; - } - } - if (builder != null) { - LOG.trace("map {} with builder {}", ac.getName(), builder); - Class innerBuilder = YangToolsMapperHelper.findClass(builder); - return innerBuilder; - } - } catch (ClassNotFoundException e) { - LOG.trace("builder class not found for {}", ac.getName()); - } - return super.findPOJOBuilder(ac); - } - - @Override - public Value findPOJOBuilderConfig(AnnotatedClass ac) { - if (ac.hasAnnotation(JsonPOJOBuilder.class)) { - return super.findPOJOBuilderConfig(ac); - } - return new JsonPOJOBuilder.Value("build", "set"); - } - - @Override - public AnnotatedMethod resolveSetterConflict(MapperConfig config, AnnotatedMethod setter1, - AnnotatedMethod setter2) { - Class p1 = setter1.getRawParameterType(0); - Class p2 = setter2.getRawParameterType(0); - AnnotatedMethod res = null; - - if (this.isAssignable(p1, p2, Map.class, List.class)) { - res = p1.isAssignableFrom(List.class) ? setter1 : setter2; //prefer List setter - } else if (this.isAssignable(p1, p2, Uint64.class, BigInteger.class)) { - res = setter1; - } else if (this.isAssignable(p1, p2, Uint32.class, Long.class)) { - res = setter1; - } else if (this.isAssignable(p1, p2, Uint16.class, Integer.class)) { - res = setter1; - } else if (this.isAssignable(p1, p2, Uint8.class, Short.class)) { - res = setter1; - } - if (res == null) { - res = super.resolveSetterConflict(config, setter1, setter2); - } - LOG.debug("{} (m1={} <=> m2={} => result:{})", setter1.getName(), p1.getSimpleName(), p2.getSimpleName(), - res.getRawParameterType(0).getSimpleName()); - - return res; - } - - private boolean isAssignable(Class p1, Class p2, Class c1, Class c2) { - return ((p1.isAssignableFrom(c1) && p2.isAssignableFrom(c2)) - || (p2.isAssignableFrom(c1) && p1.isAssignableFrom(c2))); - - } - - public void addDeserializer(Class clazz, String builder) { - this.customDeserializer.put(clazz, builder); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java deleted file mode 100644 index 634a3bc5b..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsDeserializerModifier.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * ============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.yangtools.mapperextensions; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.KeyDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; -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.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.Identifier; -import org.opendaylight.yangtools.yang.binding.TypeObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class YangToolsDeserializerModifier extends BeanDeserializerModifier { - - private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier.class); - private static final String getEnumMethodName="valueOf"; - - @Override - public JsonDeserializer> modifyEnumDeserializer(DeserializationConfig config, final JavaType type, - BeanDescription beanDesc, final JsonDeserializer deserializer) { - return new JsonDeserializer>() { - - @Override - public Enum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { - Class clazz = type.getRawClass(); - - try { - Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class); - Enum result = (Enum) method.invoke(null, jp.getValueAsString()); - LOG.debug("Deserialize '{}' with class '{}' to '{}'", jp.getValueAsString(), clazz.getName(), result); - return result; - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | NoSuchMethodException | NoSuchElementException | SecurityException e) { - LOG.warn("problem deserializing enum for {} with value {}: {}", clazz.getName(), - jp.getValueAsString(), e); - } - throw new IOException( - "unable to parse enum (" + type.getRawClass() + ")for value " + jp.getValueAsString()); - } - }; - } - - @Override - public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, - JsonDeserializer deserializer) { - final JavaType type = beanDesc.getType(); - final Class rawClass = type.getRawClass(); - - JsonDeserializer deser = super.modifyDeserializer(config, beanDesc, deserializer); - - if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) { - deser = new TypeObjectDeserializer(type, deser); - } else if (YangToolsMapperHelper.implementsInterface(rawClass, YangHelper2.getScalarTypeObjectClass())) { - deser = new TypeObjectDeserializer(type, deser); - } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) { - deser = new BaseIdentityDeserializer(deser); - } else if (rawClass.equals(Class.class)) { - deser = new ClassDeserializer(rawClass); - } - - LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName()); - return deser; - } - - @Override - public KeyDeserializer modifyKeyDeserializer(DeserializationConfig config, JavaType type, KeyDeserializer deser) { - KeyDeserializer res; - if (YangToolsMapperHelper.implementsInterface(type.getRawClass(), Identifier.class)) { - res = new IdentifierDeserializer(); - } else { - res = super.modifyKeyDeserializer(config, type, deser); - } - LOG.debug("Keydeserialize '{}' with deserializer '{}'", type.getRawClass().getName(), res.getClass().getName()); - return res; - } - - void test() { - com.fasterxml.jackson.databind.util.ClassUtil xy; - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java deleted file mode 100644 index 46f69d4f9..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/mapperextensions/YangToolsModule.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * ============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.yangtools.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.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.TypeObject; - -public class YangToolsModule extends SimpleModule { - - private static final long serialVersionUID = 1L; - - public YangToolsModule() { - super(); - setDeserializerModifier(new YangToolsDeserializerModifier()); - - addKeyDeserializer(MeasurementKey.class, new IdentifierDeserializer()); - addSerializer(DateAndTime.class, new DateAndTimeSerializer()); - addSerializer(TypeObject.class, new TypeObjectSerializer()); - addSerializer(Enum.class, new EnumSerializer()); - addSerializer(Map.class, new MapSerializer()); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java deleted file mode 100644 index 10f18e796..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/BaseIdentityDeserializer.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ============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.yangtools.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.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class BaseIdentityDeserializer extends JsonDeserializer { - - private static final Logger LOG = LoggerFactory.getLogger(BaseIdentityDeserializer.class); - private final JsonDeserializer deser; - - public BaseIdentityDeserializer(final JsonDeserializer deser) { - this.deser = deser; - } - - @SuppressWarnings("unchecked") - @Override - public T deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { - LOG.debug("BaseIdentityDeserializer class for '{}'",parser.getValueAsString()); - String clazzToSearch = parser.getValueAsString(); - // clazz from Elasticsearch is full qualified - int lastDot = clazzToSearch.lastIndexOf("."); - if (lastDot > -1) { - clazzToSearch = clazzToSearch.substring(lastDot+1); - } else { - clazzToSearch = clazzToSearch.substring(0, 1).toUpperCase() + clazzToSearch.substring(1); - } - Class clazz; - try { - clazz = YangToolsMapperHelper.findClass(clazzToSearch); - if (clazz != null) - return (T)clazz; - } catch (ClassNotFoundException e) { - LOG.warn("BaseIdentityDeserializer class not found for '"+parser.getValueAsString()+"'",e); - } - return (T) deser.deserialize(parser, ctxt); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java deleted file mode 100644 index 2627c2ae0..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/ClassDeserializer.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ============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.yangtools.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; - -public class ClassDeserializer extends FromStringDeserializer> { - - private static final long serialVersionUID = 1L; - - public ClassDeserializer(Class vc) { - super(vc); - } - - @Override - protected Class _deserialize(String value, DeserializationContext ctxt) throws IOException { - try { - return YangToolsMapperHelper.findClass(value); - } catch (ClassNotFoundException e) { - throw new IOException("Can not find class "+value,e); - } - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java deleted file mode 100644 index a35aad75a..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/DateAndTimeSerializer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ============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.yangtools.serialize; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import java.io.IOException; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; - -/** - * DateAndTime shouldn't be encapsulated into a json object to be able to use elasticsearch date time query functions. - */ -public class DateAndTimeSerializer extends StdSerializer<@NonNull DateAndTime> { - - private static final long serialVersionUID = 1L; - - public DateAndTimeSerializer() { - this(null); - } - - protected DateAndTimeSerializer(Class t) { - super(t); - } - - @Override - public void serialize(DateAndTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeString(value.getValue()); - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java deleted file mode 100644 index f8220c2d4..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/EnumSerializer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ============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.yangtools.serialize; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; - -@SuppressWarnings("rawtypes") -public class EnumSerializer extends JsonSerializer { - - @Override - public void serialize(Enum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeString(value.name()); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java deleted file mode 100644 index 0837b8a19..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/IdentifierDeserializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ============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.yangtools.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.opendaylight.yangtools.yang.common.Uint16; -import org.opendaylight.yangtools.yang.common.Uint32; -import org.opendaylight.yangtools.yang.common.Uint64; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IdentifierDeserializer extends KeyDeserializer { - - private static final Logger LOG = LoggerFactory.getLogger(IdentifierDeserializer.class); - - public IdentifierDeserializer() {} - - @Override - public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException { - Class clazz = ctxt.getClass(); - final String arg = key; - LOG.debug("Deserialization for key:{}",key); - // find constructor argument types - List> ctypes = YangToolsMapperHelper.getConstructorParameterTypes(clazz, String.class); - for (Class ctype : ctypes) { - try { - if (ctype.equals(String.class)) { - return clazz.getConstructor(ctype).newInstance(arg); - } else if (ctype.equals(Uint16.class)) { - return clazz.getConstructor(ctype).newInstance(Uint16.valueOf(arg)); - - } else if (ctype.equals(Uint32.class)) { - return clazz.getConstructor(ctype).newInstance(Uint32.valueOf(arg)); - } else if (ctype.equals(Uint64.class)) { - return clazz.getConstructor(ctype).newInstance(Uint64.valueOf(arg)); - } - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException | NoSuchMethodException | SecurityException e) { - LOG.warn("unable to instantiate class {} with arg {}: ", clazz, arg, e); - throw new IllegalArgumentException( - "unable to instantiate class " + clazz.getName() + " with arg '" + arg + "' ", e); - } - } - return null; - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java deleted file mode 100644 index e5c966a74..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/MapSerializer.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ============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.yangtools.serialize; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; -import java.util.Map; - -@SuppressWarnings("rawtypes") -public class MapSerializer extends JsonSerializer { - - @Override - public void serialize(Map value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeObject(value.values()); - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java deleted file mode 100644 index 5beca0d47..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectDeserializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * ============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.yangtools.serialize; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonDeserializer; -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.opendaylight.yangtools.concepts.Builder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TypeObjectDeserializer extends JsonDeserializer { - - private static final Logger LOG = LoggerFactory.getLogger(TypeObjectDeserializer.class); - private final JavaType type; - private final JsonDeserializer deser; - - - public TypeObjectDeserializer(final JavaType type, final JsonDeserializer deser) { - this.type = type; - this.deser = deser; - } - - @SuppressWarnings("unchecked") - @Override - public T deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JsonProcessingException { - - Class clazz = (Class) type.getRawClass(); - final String arg = parser.getValueAsString(); - LOG.debug("Try to build arg:'{}' with class {}",arg, clazz); - Optional oRes = Optional.empty(); - try { - //try get method for default instance - if ((oRes = YangToolsMapperHelper.getDefaultInstance(clazz, arg)).isEmpty()) { - //try to find builder with getDefaultInstance method - Optional>> oBuilderClazz = YangToolsMapperHelper.findBuilderClassOptional(ctxt, clazz); - LOG.debug("Try builder class present:{}",oBuilderClazz.isPresent()); - if (oBuilderClazz.isEmpty() - || ((oRes = YangToolsMapperHelper.getDefaultInstance(oBuilderClazz.get(), arg)).isEmpty())) { - //try to find constructor with string - LOG.debug("Try constructor"); - if ((oRes = YangToolsMapperHelper.getInstanceByConstructor(clazz, arg)).isEmpty()) { - //forward to standard deserializer or throw if not available - LOG.debug("Try default deserializer"); - oRes = Optional.of((T) deser.deserialize(parser, ctxt)); - } - } - } - LOG.debug("Deserialize string value:{} for class:{} success:{}", arg, clazz, oRes.isPresent()); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException - | NoSuchElementException | SecurityException | InstantiationException e) { - LOG.warn("problem deserializing {} with value {}: {}", clazz.getName(), arg, e); - } - if (oRes.isPresent()) { - return oRes.get(); - } else { - throw new IllegalArgumentException("Could not find constructor for arg:'" + arg + "' and class: " + clazz); - } - } - -} diff --git a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java b/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java deleted file mode 100644 index 1269d0746..000000000 --- a/sdnr/wt/data-provider/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/yangtools/serialize/TypeObjectSerializer.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * ============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.yangtools.serialize; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import org.opendaylight.yangtools.yang.binding.TypeObject; - -public class TypeObjectSerializer extends JsonSerializer { - - @Override - public void serialize(TypeObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - //stringValue - Method[] methods = value.getClass().getDeclaredMethods(); - String name; - for (Method method : methods) { - name = method.getName(); - if (name.equals("stringValue") || name.equals("getValue")) { - try { - gen.writeString((String)method.invoke(value)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException - | IOException e) { - throw new IOException("No String getter method supported TypeObject for "+value.getClass(),e); - } - } - } - } -} diff --git a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml index ebb20fc7b..686af61d6 100644 --- a/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml +++ b/sdnr/wt/data-provider/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -70,6 +70,15 @@ + + + + + + + + @@ -77,6 +86,7 @@ + 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 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(); diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java index eaaa31107..56bc32ce3 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestDataMappings.java @@ -24,7 +24,7 @@ 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 { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java index 7e63c183c..56138b0b1 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestEventService.java @@ -63,6 +63,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.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 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(); } /** diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java index aa010939d..16dfa0ec6 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestImplementation.java @@ -22,14 +22,13 @@ package org.onap.ccsdk.features.sdnr.wt.dataprovider.test; import static org.junit.Assert.fail; - import java.util.Set; - import org.junit.Test; import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section; import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.DataTreeHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.UserdataHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.about.AboutHttpServlet; import org.onap.ccsdk.features.sdnr.wt.dataprovider.impl.DataProviderImpl; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.StatusChangedHandler.StatusKey; @@ -73,6 +72,7 @@ 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) { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java index 76286c820..b52e34c49 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestNuMappings.java @@ -24,7 +24,7 @@ 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)); diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java index 53c72115d..e32179122 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestTree.java @@ -36,7 +36,6 @@ import org.onap.ccsdk.features.sdnr.wt.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 index 000000000..fd397840e --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestUserdata.java @@ -0,0 +1,94 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : ccsdk features + * ================================================================================ + * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property. + * All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + */ +package org.onap.ccsdk.features.sdnr.wt.dataprovider.test; + +import static org.junit.Assert.fail; +import java.io.IOException; +import org.apache.sshd.common.util.io.IoUtils; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient; +import org.onap.ccsdk.features.sdnr.wt.common.database.config.HostInfo; +import org.onap.ccsdk.features.sdnr.wt.common.test.JSONAssert; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.HtUserdataManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.dataprovider.test.util.HostInfoForTest; + +public class TestUserdata { + + private static final String USERNAME = "admin"; + private static HtDatabaseClient dbRawProvider; + private static HtUserdataManagerImpl userDbProvider; + + @BeforeClass + public static void init() throws Exception { + + HostInfo[] hosts = HostInfoForTest.get(); + dbRawProvider = HtDatabaseClient.getClient(hosts); + userDbProvider = new HtUserdataManagerImpl(dbRawProvider); + } + + public static void trySleep(long ms) { + try { + Thread.sleep(ms); + } catch (Exception e) { + Thread.currentThread().interrupt(); + } + } + + @Ignore + @Test + public void test1() { + String fullContent = ""; + try { + fullContent = getFileContent("/userdata/full.json"); + userDbProvider.setUserdata(USERNAME, fullContent); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + + trySleep(2000); + + String userdata = userDbProvider.getUserdata(USERNAME); + JSONAssert.assertEquals(fullContent, userdata, false); + String networkMapContent = ""; + String mergedContent = ""; + try { + networkMapContent = getFileContent("/userdata/networkmap.json"); + mergedContent = getFileContent("/userdata/merged.json"); + userDbProvider.setUserdata(USERNAME, "networkMap", networkMapContent); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + + trySleep(2000); + + userdata = userDbProvider.getUserdata(USERNAME); + JSONAssert.assertEquals(mergedContent, userdata, false); + } + + private static String getFileContent(String filename) throws IOException { + return String.join("\n", IoUtils.readAllLines(TestTree.class.getResourceAsStream(filename))); + } +} diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java index 3c9d4946b..524659e99 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMapping.java @@ -40,8 +40,8 @@ import org.onap.ccsdk.features.sdnr.wt.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 { diff --git a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java index 56df62819..1345d4edf 100644 --- a/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java +++ b/sdnr/wt/data-provider/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/dataprovider/test/TestYangGenSalMappingOpenRoadm.java @@ -32,8 +32,8 @@ import org.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 index 000000000..c5b41ec21 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/full.json @@ -0,0 +1,13 @@ +{ + "networkMap": { + "styling": { + "theme": "dark" + }, + "startupPosition": { + "latitude": "52.5", + "zoom": "10", + "longitude": "13.35" + }, + "tileOpacity": "26" + } +} \ No newline at end of file diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json new file mode 100644 index 000000000..4e283cd6f --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/merged.json @@ -0,0 +1,13 @@ +{ + "networkMap": { + "tileOpacity": "26", + "styling": { + "theme": "light" + }, + "startupPosition": { + "latitude": "52.5", + "longitude": "13.35", + "zoom": "10" + } + } +} \ No newline at end of file diff --git a/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json b/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json new file mode 100644 index 000000000..20d44f752 --- /dev/null +++ b/sdnr/wt/data-provider/provider/src/test/resources/userdata/networkmap.json @@ -0,0 +1,11 @@ +{ + "tileOpacity": "26", + "styling": { + "theme": "light" + }, + "startupPosition": { + "latitude": "52.5", + "longitude": "13.35", + "zoom": "10" + } +} \ No newline at end of file diff --git a/sdnr/wt/oauth-provider/provider-jar/pom.xml b/sdnr/wt/oauth-provider/provider-jar/pom.xml index 1b6cd8af1..5d9cbee67 100644 --- a/sdnr/wt/oauth-provider/provider-jar/pom.xml +++ b/sdnr/wt/oauth-provider/provider-jar/pom.xml @@ -186,7 +186,7 @@ ${project.groupId} - sdnr-wt-data-provider-provider + sdnr-wt-yang-utils ${project.version} test diff --git a/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java b/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java index cd4239081..9a9f4fc04 100644 --- a/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java +++ b/sdnr/wt/oauth-provider/provider-jar/src/main/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/http/AuthHttpServlet.java @@ -37,7 +37,11 @@ import javax.servlet.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); + } + } } diff --git a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java index 0399655ed..7213f80f5 100644 --- a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java +++ b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlJsonMapper.java @@ -26,8 +26,8 @@ import com.fasterxml.jackson.databind.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; diff --git a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java index cc029bd05..b965878e8 100644 --- a/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java +++ b/sdnr/wt/oauth-provider/provider-jar/src/test/java/org/onap/ccsdk/features/sdnr/wt/oauthprovider/test/helper/OdlXmlMapper.java @@ -26,7 +26,7 @@ import com.fasterxml.jackson.databind.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{ -- cgit 1.2.3-korg