aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/common-yang/utils/src
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/common-yang/utils/src')
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper.java26
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapper2.java13
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/YangToolsMapperHelper.java6
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier.java151
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier2.java146
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer.java50
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer2.java30
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/SetDeserializer.java39
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/test/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/TestYangToolsMapper.java101
-rw-r--r--sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java25
-rw-r--r--sdnr/wt/common-yang/utils/src/test/yang/ietf-inet-types.yang429
-rw-r--r--sdnr/wt/common-yang/utils/src/test/yang/test-yang-utils.yang79
19 files changed, 1062 insertions, 208 deletions
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
index 7d73afae0..0d9045658 100644
--- 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
@@ -46,7 +46,8 @@ public class YangToolsMapper extends ObjectMapper {
private final YangToolsBuilderAnnotationIntrospector annotationIntrospector;
private final YangToolsModule module;
private static final long serialVersionUID = 1L;
- private boolean isModuleRegistered=false;
+ private boolean isModuleRegistered = false;
+
public YangToolsMapper() {
this(new YangToolsBuilderAnnotationIntrospector());
}
@@ -63,6 +64,7 @@ public class YangToolsMapper extends ObjectMapper {
enable(MapperFeature.USE_GETTERS_AS_SETTERS);
setAnnotationIntrospector(yangToolsBuilderAnnotationIntrospector);
}
+
public void addDeserializer(Class<?> clsToDeserialize, String builderClassName) {
this.annotationIntrospector.addDeserializer(clsToDeserialize, builderClassName);
}
@@ -70,21 +72,23 @@ public class YangToolsMapper extends ObjectMapper {
public void addKeyDeserializer(Class<?> type, KeyDeserializer deserializer) {
this.module.addKeyDeserializer(type, deserializer);
}
+
@Override
public <T> T readValue(String content, Class<T> valueType) throws JsonProcessingException, JsonMappingException {
- if(!this.isModuleRegistered) {
- this.registerModule(this.module);
- this.isModuleRegistered=true;
- }
- return super.readValue(content, valueType);
+ if (!this.isModuleRegistered) {
+ this.registerModule(this.module);
+ this.isModuleRegistered = true;
+ }
+ return super.readValue(content, valueType);
}
+
@Override
public String writeValueAsString(Object value) throws JsonProcessingException {
- if(!this.isModuleRegistered) {
- this.registerModule(this.module);
- this.isModuleRegistered=true;
- }
- return super.writeValueAsString(value);
+ if (!this.isModuleRegistered) {
+ this.registerModule(this.module);
+ this.isModuleRegistered = true;
+ }
+ return super.writeValueAsString(value);
}
}
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
index 5c5aeb6de..6b5704078 100644
--- 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
@@ -22,6 +22,8 @@
package org.onap.ccsdk.features.sdnr.wt.yang.mapper;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
import javax.annotation.Nullable;
import org.eclipse.jdt.annotation.NonNull;
import org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions.YangToolsBuilderAnnotationIntrospector;
@@ -40,7 +42,7 @@ public class YangToolsMapper2<T extends DataObject> extends YangToolsMapper {
private static final Logger LOG = LoggerFactory.getLogger(YangToolsMapper2.class);
private static final long serialVersionUID = 1L;
- private @Nullable final Class<? extends Builder<? extends T>> builderClazz;
+ private @Nullable final Class<?> builderClazz;
/**
* Generic Object creation of yangtools java class builder pattern.
@@ -52,7 +54,7 @@ public class YangToolsMapper2<T extends DataObject> extends YangToolsMapper {
* If null the clazz is expected to support normal jackson build pattern.
* @throws ClassNotFoundException if builderClazz not available in bundle
*/
- public <X extends T, B extends Builder<X>> YangToolsMapper2(@NonNull Class<T> clazz,
+ public <X extends T, B> YangToolsMapper2(@NonNull Class<T> clazz,
@Nullable Class<B> builderClazz) throws ClassNotFoundException {
super(new YangToolsBuilderAnnotationIntrospector(clazz, builderClazz));
@@ -67,10 +69,10 @@ public class YangToolsMapper2<T extends DataObject> extends YangToolsMapper {
* @param clazz class with interface.
* @return builder for interface or null if not existing
*/
- public @Nullable Builder<? extends T> getBuilder(Class<T> clazz) {
+ public @Nullable<B> B getBuilder(Class<T> clazz) {
try {
if (builderClazz != null)
- return builderClazz.getDeclaredConstructor().newInstance();
+ return (B) builderClazz.getDeclaredConstructor().newInstance();
else
return null;
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
@@ -90,8 +92,9 @@ public class YangToolsMapper2<T extends DataObject> extends YangToolsMapper {
* @throws ClassNotFoundException
*/
@SuppressWarnings("unchecked")
- private <X extends T, B extends Builder<X>> Class<B> getBuilderClass(String name) throws ClassNotFoundException {
+ private <X extends T, B> Class<B> getBuilderClass(String name) throws ClassNotFoundException {
return (Class<B>) 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
index fe7631a6d..e72e962bb 100644
--- 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
@@ -311,4 +311,10 @@ public class YangToolsMapperHelper {
public static <K extends Identifier<V>, V extends Identifiable<K>> Map<K,V> toMap(List<V> list) {
return list == null || list.isEmpty() ? null : Maps.uniqueIndex(list, Identifiable::key);
}
+
+ @SuppressWarnings("unchecked")
+ public static <S,T> T callBuild(S builder) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ Method method = builder.getClass().getMethod("build");
+ return (T) method.invoke(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
index 0fe8ab9d7..b7f1782b6 100644
--- 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
@@ -29,18 +29,19 @@ 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 com.fasterxml.jackson.databind.type.ArrayType;
import com.fasterxml.jackson.databind.type.MapType;
-
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.NoSuchElementException;
import java.util.Optional;
+import java.util.Set;
+
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.SetDeserializer;
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;
@@ -51,87 +52,87 @@ import org.slf4j.LoggerFactory;
public class YangToolsDeserializerModifier extends BeanDeserializerModifier {
- private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier.class);
- private static final String getEnumMethodName = "valueOf";
- private static final String getEnumMethodName2 = "forName";
+ private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier.class);
+ private static final String getEnumMethodName = "valueOf";
+ private static final String getEnumMethodName2 = "forName";
- @SuppressWarnings("unchecked")
- public static Enum<?> parseEnum(String value, Class<?> clazz) throws IllegalAccessException,
- IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
- try {
- Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
- Enum<?> result = (Enum<?>) method.invoke(null, value);
- LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
- return result;
- } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
- | NoSuchElementException | SecurityException e) {
- Method method = clazz.getDeclaredMethod(getEnumMethodName2, String.class);
- Optional<Enum<?>> result = (Optional<Enum<?>>) method.invoke(null, value);
- LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
- return result.orElseThrow();
- }
- }
+ @SuppressWarnings("unchecked")
+ public static Enum<?> parseEnum(String value, Class<?> clazz) throws IllegalAccessException,
+ IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+ try {
+ Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
+ Enum<?> result = (Enum<?>) method.invoke(null, value);
+ LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+ return result;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
+ | NoSuchElementException | SecurityException e) {
+ Method method = clazz.getDeclaredMethod(getEnumMethodName2, String.class);
+ Optional<Enum<?>> result = (Optional<Enum<?>>) method.invoke(null, value);
+ LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+ return result.orElseThrow();
+ }
+ }
- @Override
- public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
- BeanDescription beanDesc, final JsonDeserializer<?> deserializer) {
- return new JsonDeserializer<Enum<?>>() {
+ @Override
+ public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
+ BeanDescription beanDesc, final JsonDeserializer<?> deserializer) {
+ return new JsonDeserializer<Enum<?>>() {
- @Override
- public Enum<?> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
- Class<?> clazz = type.getRawClass();
+ @Override
+ public Enum<?> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+ Class<?> clazz = type.getRawClass();
- try {
- return parseEnum(jp.getValueAsString(), clazz);
- } 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());
- }
- };
- }
+ try {
+ return parseEnum(jp.getValueAsString(), clazz);
+ } 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();
+ @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);
+ JsonDeserializer<?> deser = super.modifyDeserializer(config, beanDesc, deserializer);
- if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) {
- deser = new TypeObjectDeserializer<TypeObject>(type, deser);
- } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) {
- deser = new TypeObjectDeserializer<ScalarTypeObject<?>>(type, deser);
- } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) {
- deser = new BaseIdentityDeserializer<BaseIdentity>(deser);
- } else if (rawClass.equals(Class.class)) {
- deser = new ClassDeserializer(rawClass);
- }
+ if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) {
+ deser = new TypeObjectDeserializer<TypeObject>(type, deser);
+ } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) {
+ deser = new TypeObjectDeserializer<ScalarTypeObject<?>>(type, deser);
+ } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) {
+ deser = new BaseIdentityDeserializer<BaseIdentity>(deser);
+ } else if (rawClass.equals(Class.class)) {
+ deser = new ClassDeserializer(rawClass);
+ }
- LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName());
- return deser;
- }
+ LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName());
+ return deser;
+ }
- @Override
- public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type,
- BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
- final Class<?> rawClass = type.getBindings().getBoundType(1).getRawClass();
- return new YangtoolsMapDesirializer(rawClass);
- }
+ @Override
+ public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type,
+ BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
+ final Class<?> rawClass = type.getBindings().getBoundType(1).getRawClass();
+ return new YangtoolsMapDesirializer(rawClass);
+ }
- @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;
- }
+ @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/YangToolsDeserializerModifier2.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier2.java
index 0697f5f2e..800f41481 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier2.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangToolsDeserializerModifier2.java
@@ -49,87 +49,87 @@ import org.slf4j.LoggerFactory;
public class YangToolsDeserializerModifier2 extends BeanDeserializerModifier {
- private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier2.class);
- private static final String getEnumMethodName = "valueOf";
- private static final String getEnumMethodName2 = "forName";
+ private static final Logger LOG = LoggerFactory.getLogger(YangToolsDeserializerModifier2.class);
+ private static final String getEnumMethodName = "valueOf";
+ private static final String getEnumMethodName2 = "forName";
- @SuppressWarnings("unchecked")
- public static Enum<?> parseEnum(String value, Class<?> clazz) throws IllegalAccessException,
- IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
- try {
- Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
- Enum<?> result = (Enum<?>) method.invoke(null, value);
- LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
- return result;
- } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
- | NoSuchElementException | SecurityException e) {
- Method method = clazz.getDeclaredMethod(getEnumMethodName2, String.class);
- Optional<Enum<?>> result = (Optional<Enum<?>>) method.invoke(null, value);
- LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
- return result.orElseThrow();
- }
- }
+ @SuppressWarnings("unchecked")
+ public static Enum<?> parseEnum(String value, Class<?> clazz) throws IllegalAccessException,
+ IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+ try {
+ Method method = clazz.getDeclaredMethod(getEnumMethodName, String.class);
+ Enum<?> result = (Enum<?>) method.invoke(null, value);
+ LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+ return result;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
+ | NoSuchElementException | SecurityException e) {
+ Method method = clazz.getDeclaredMethod(getEnumMethodName2, String.class);
+ Optional<Enum<?>> result = (Optional<Enum<?>>) method.invoke(null, value);
+ LOG.debug("Deserialize '{}' with class '{}' to '{}'", value, clazz.getName(), result);
+ return result.orElseThrow();
+ }
+ }
- @Override
- public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
- BeanDescription beanDesc, final JsonDeserializer<?> deserializer) {
- return new JsonDeserializer<Enum<?>>() {
+ @Override
+ public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
+ BeanDescription beanDesc, final JsonDeserializer<?> deserializer) {
+ return new JsonDeserializer<Enum<?>>() {
- @Override
- public Enum<?> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
- Class<?> clazz = type.getRawClass();
+ @Override
+ public Enum<?> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+ Class<?> clazz = type.getRawClass();
- try {
- return parseEnum(jp.getValueAsString(), clazz);
- } 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());
- }
- };
- }
+ try {
+ return parseEnum(jp.getValueAsString(), clazz);
+ } 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();
+ @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);
+ JsonDeserializer<?> deser = super.modifyDeserializer(config, beanDesc, deserializer);
- if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) {
- deser = new TypeObjectDeserializer<TypeObject>(type, deser);
- } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) {
- deser = new TypeObjectDeserializer<ScalarTypeObject<?>>(type, deser);
- } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) {
- deser = new BaseIdentityDeserializer<BaseIdentity>(deser);
- } else if (rawClass.equals(Class.class)) {
- deser = new ClassDeserializer(rawClass);
- }
+ if (YangToolsMapperHelper.implementsInterface(rawClass, TypeObject.class)) {
+ deser = new TypeObjectDeserializer<TypeObject>(type, deser);
+ } else if (YangToolsMapperHelper.implementsInterface(rawClass, ScalarTypeObject.class)) {
+ deser = new TypeObjectDeserializer<ScalarTypeObject<?>>(type, deser);
+ } else if (YangToolsMapperHelper.implementsInterface(rawClass, BaseIdentity.class)) {
+ deser = new BaseIdentityDeserializer<BaseIdentity>(deser);
+ } else if (rawClass.equals(Class.class)) {
+ deser = new ClassDeserializer(rawClass);
+ }
- LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName());
- return deser;
- }
+ LOG.debug("Deserialize '{}' with deserializer '{}'", rawClass.getName(), deser.getClass().getName());
+ return deser;
+ }
- @Override
- public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type,
- BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
- final Class<?> rawClass = type.getBindings().getBoundType(1).getRawClass();
- return new YangtoolsMapDesirializer(rawClass);
- }
+ @Override
+ public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type,
+ BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
+ final Class<?> rawClass = type.getBindings().getBoundType(1).getRawClass();
+ return new YangtoolsMapDesirializer(rawClass);
+ }
- @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;
- }
+ @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/YangtoolsMapDesirializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer.java
index 2fe7fa11f..922257d13 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer.java
@@ -1,44 +1,36 @@
package org.onap.ccsdk.features.sdnr.wt.yang.mapper.mapperextensions;
+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 com.fasterxml.jackson.databind.type.CollectionLikeType;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.Identifier;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.core.TreeNode;
-import com.fasterxml.jackson.databind.BeanDescription;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.type.CollectionLikeType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import com.google.common.collect.Maps;
public class YangtoolsMapDesirializer<K extends Identifier<V>, V extends Identifiable<K>>
- extends JsonDeserializer<Map<K, V>> {
+ extends JsonDeserializer<Map<K, V>> {
+
+ private final Class<V> clazz;
+ private final YangToolsMapper mapper;
- private final Class<V> clazz;
- private final YangToolsMapper mapper;
-
- public YangtoolsMapDesirializer(Class<V> clazz) {
- super();
- this.clazz = clazz;
- this.mapper = new YangToolsMapper();
- }
+ public YangtoolsMapDesirializer(Class<V> clazz) {
+ super();
+ this.clazz = clazz;
+ this.mapper = new YangToolsMapper();
+ }
- @Override
- public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt)
- throws IOException, JsonProcessingException {
- CollectionLikeType type = ctxt.getTypeFactory().constructCollectionType(List.class, clazz);
- List<V> list = mapper.readValue(p,type);
- return YangToolsMapperHelper.toMap(list);
- }
+ @Override
+ public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt)
+ throws IOException, JsonProcessingException {
+ CollectionLikeType type = ctxt.getTypeFactory().constructCollectionType(List.class, clazz);
+ List<V> list = mapper.readValue(p, type);
+ return YangToolsMapperHelper.toMap(list);
+ }
}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer2.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer2.java
index 6a419eee1..4a52f57ee 100644
--- a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer2.java
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/mapperextensions/YangtoolsMapDesirializer2.java
@@ -14,23 +14,23 @@ import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.Identifier;
public class YangtoolsMapDesirializer2<K extends Identifier<V>, V extends Identifiable<K>>
- extends JsonDeserializer<Map<K, V>> {
+ extends JsonDeserializer<Map<K, V>> {
- private final Class<V> clazz;
- private final YangToolsMapper mapper;
+ private final Class<V> clazz;
+ private final YangToolsMapper mapper;
- public YangtoolsMapDesirializer2(Class<V> clazz) {
- super();
- this.clazz = clazz;
- this.mapper = new YangToolsMapper();
- }
+ public YangtoolsMapDesirializer2(Class<V> clazz) {
+ super();
+ this.clazz = clazz;
+ this.mapper = new YangToolsMapper();
+ }
- @Override
- public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt)
- throws IOException, JsonProcessingException {
- CollectionLikeType type = ctxt.getTypeFactory().constructCollectionType(List.class, clazz);
- List<V> list = mapper.readValue(p,type);
- return YangToolsMapperHelper.toMap(list);
- }
+ @Override
+ public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt)
+ throws IOException, JsonProcessingException {
+ CollectionLikeType type = ctxt.getTypeFactory().constructCollectionType(List.class, clazz);
+ List<V> list = mapper.readValue(p, type);
+ return YangToolsMapperHelper.toMap(list);
+ }
}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/SetDeserializer.java b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/SetDeserializer.java
new file mode 100644
index 000000000..2ab3fe7c3
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/serialize/SetDeserializer.java
@@ -0,0 +1,39 @@
+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 com.fasterxml.jackson.databind.type.CollectionLikeType;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapper;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.YangToolsMapperHelper;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
+import org.opendaylight.yangtools.yang.binding.Identifier;
+
+public class SetDeserializer<V>
+ extends JsonDeserializer<Set<V>> {
+
+ private final Class<V> clazz;
+ private final YangToolsMapper mapper;
+
+ public SetDeserializer(Class<V> clazz) {
+ super();
+ this.clazz = clazz;
+ this.mapper = new YangToolsMapper();
+ }
+
+ @Override
+ public Set<V> deserialize(JsonParser p, DeserializationContext ctxt)
+ throws IOException, JsonProcessingException {
+ CollectionLikeType type = ctxt.getTypeFactory().constructCollectionType(Set.class, clazz);
+ List<V> list = mapper.readValue(p, type);
+ return new HashSet<>(list);
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java
new file mode 100644
index 000000000..3d859e8b5
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class HostBuilder {
+ private HostBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Host getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java
new file mode 100644
index 000000000..62771f669
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpAddressBuilder {
+ private IpAddressBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpAddress getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java
new file mode 100644
index 000000000..d7b295263
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpAddressNoZoneBuilder {
+ private IpAddressNoZoneBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpAddressNoZone getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java
new file mode 100644
index 000000000..d5fff3db4
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpPrefixBuilder {
+ private IpPrefixBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpPrefix getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/TestYangToolsMapper.java b/sdnr/wt/common-yang/utils/src/test/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/TestYangToolsMapper.java
new file mode 100644
index 000000000..2e51e8404
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/java/org/onap/ccsdk/features/sdnr/wt/yang/mapper/TestYangToolsMapper.java
@@ -0,0 +1,101 @@
+/*
+ * ============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 static org.junit.Assert.assertEquals;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.util.HashMap;
+import java.util.Map;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.yang.mapper.serialize.IdentifierDeserializer;
+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.test.yang.utils.norev.AddressLocation;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.AddressLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.AddressType;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.ItemCode;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.address.location.entity.ItemList;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.address.location.entity.ItemListBuilder;
+import org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.address.location.entity.ItemListKey;
+
+public class TestYangToolsMapper {
+
+ private static final YangToolsMapper MAPPER = new YangToolsMapper();
+
+ @Before
+ public void init() {
+ MAPPER.addKeyDeserializer(ItemListKey.class, new IdentifierDeserializer());
+ }
+
+ @Test
+ public void testYangMapperDeser() {
+ AddressLocation al = null;
+
+ try {
+ al = MAPPER.readValue(
+ "{\n"
+ + " \"address-type\": \"OFFICE\",\n"
+ + " \"delivery-date-time\": \"2022-03-15T11:12:13.890Z\",\n"
+ + " \"delivery-url\": \"delivery.uri\",\n"
+ + " \"item-list\": [\n"
+ + " {\n"
+ + " \"item-key\": \"org.opendaylight.yang.gen.v1.urn.test.yang.utils.norev.ItemCode\"\n"
+ + " }\n"
+ + " ]\n"
+ + "}",
+ AddressLocation.class);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ assertEquals(AddressType.OFFICE, al.getAddressType());
+ assertEquals("2022-03-15T11:12:13.890Z", al.getDeliveryDateTime().getValue());
+ System.out.println("Delivery Date = " + al.getDeliveryDateTime().getValue());
+ System.out.println(al.getItemList());
+ System.out.println(al.getDeliveryUrl().getValue());
+ }
+
+ @Test
+ public void testYangMapperSer() {
+ Map<ItemListKey, ItemList> items = new HashMap<ItemListKey, ItemList>();
+ ItemList il = new ItemListBuilder().setItemKey(ItemCode.class).build();
+ items.put(new ItemListKey(ItemCode.class), il);
+
+ Uri uri = new Uri("delivery.uri");
+
+ AddressLocation al = new AddressLocationBuilder().setId("99").setAddressType(AddressType.HOME)
+ .setDeliveryDateTime(new DateAndTime("2022-03-15T11:12:13.890Z")).setItemList(items)
+ .setDeliveryUrl(uri).build();
+ String str = null;
+
+ try {
+ str = MAPPER.writeValueAsString(al);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ assertEquals("HOME", new JSONObject(str).getString("address-type"));
+ assertEquals("2022-03-15T11:12:13.890Z", new JSONObject(str).getString("delivery-date-time"));
+ System.out.println(new JSONObject(str).getJSONArray("item-list"));
+ System.out.println(str);
+ }
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java
new file mode 100644
index 000000000..3d859e8b5
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/HostBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class HostBuilder {
+ private HostBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static Host getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java
new file mode 100644
index 000000000..62771f669
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpAddressBuilder {
+ private IpAddressBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpAddress getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java
new file mode 100644
index 000000000..d7b295263
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressNoZoneBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpAddressNoZoneBuilder {
+ private IpAddressNoZoneBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpAddressNoZone getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java
new file mode 100644
index 000000000..d5fff3db4
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
+import java.lang.String;
+import java.lang.UnsupportedOperationException;
+import javax.annotation.processing.Generated;
+
+/**
+ * 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.
+ *
+ */
+@Generated("mdsal-binding-generator")
+public class IpPrefixBuilder {
+ private IpPrefixBuilder() {
+ //Exists only to defeat instantiation.
+ }
+
+ public static IpPrefix getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/yang/ietf-inet-types.yang b/sdnr/wt/common-yang/utils/src/test/yang/ietf-inet-types.yang
new file mode 100644
index 000000000..f91aa1fb8
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/yang/ietf-inet-types.yang
@@ -0,0 +1,429 @@
+module ietf-inet-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+ prefix "inet";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types for Internet addresses and related things.
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - ip-address-no-zone
+ - ipv4-address-no-zone
+ - ipv6-address-no-zone";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of types related to protocol fields ***/
+
+ typedef ip-version {
+ type enumeration {
+ enum unknown {
+ value "0";
+ description
+ "An unknown or unspecified version of the Internet
+ protocol.";
+ }
+ enum ipv4 {
+ value "1";
+ description
+ "The IPv4 protocol as defined in RFC 791.";
+ }
+ enum ipv6 {
+ value "2";
+ description
+ "The IPv6 protocol as defined in RFC 2460.";
+ }
+ }
+ description
+ "This value represents the version of the IP protocol.
+ In the value set and its semantics, this type is equivalent
+ to the InetVersion textual convention of the SMIv2.";
+ reference
+ "RFC 791: Internet Protocol
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ typedef dscp {
+ type uint8 {
+ range "0..63";
+ }
+ description
+ "The dscp type represents a Differentiated Services Code Point
+ that may be used for marking packets in a traffic stream.
+ In the value set and its semantics, this type is equivalent
+ to the Dscp textual convention of the SMIv2.";
+ reference
+ "RFC 3289: Management Information Base for the Differentiated
+ Services Architecture
+ RFC 2474: Definition of the Differentiated Services Field
+ (DS Field) in the IPv4 and IPv6 Headers
+ RFC 2780: IANA Allocation Guidelines For Values In
+ the Internet Protocol and Related Headers";
+ }
+
+ typedef ipv6-flow-label {
+ type uint32 {
+ range "0..1048575";
+ }
+ description
+ "The ipv6-flow-label type represents the flow identifier or Flow
+ Label in an IPv6 packet header that may be used to
+ discriminate traffic flows.
+ In the value set and its semantics, this type is equivalent
+ to the IPv6FlowLabel textual convention of the SMIv2.";
+ reference
+ "RFC 3595: Textual Conventions for IPv6 Flow Label
+ RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+ }
+
+ typedef port-number {
+ type uint16 {
+ range "0..65535";
+ }
+ description
+ "The port-number type represents a 16-bit port number of an
+ Internet transport-layer protocol such as UDP, TCP, DCCP, or
+ SCTP. Port numbers are assigned by IANA. A current list of
+ all assignments is available from <http://www.iana.org/>.
+ Note that the port number value zero is reserved by IANA. In
+ situations where the value zero does not make sense, it can
+ be excluded by subtyping the port-number type.
+ In the value set and its semantics, this type is equivalent
+ to the InetPortNumber textual convention of the SMIv2.";
+ reference
+ "RFC 768: User Datagram Protocol
+ RFC 793: Transmission Control Protocol
+ RFC 4960: Stream Control Transmission Protocol
+ RFC 4340: Datagram Congestion Control Protocol (DCCP)
+ RFC 4001: Textual Conventions for Internet Network Addresses";
+ }
+
+ /*** collection of types related to autonomous systems ***/
+
+ typedef as-number {
+ type uint32;
+ description
+ "The as-number type represents autonomous system numbers
+ which identify an Autonomous System (AS). An AS is a set
+ of routers under a single technical administration, using
+ an interior gateway protocol and common metrics to route
+ packets within the AS, and using an exterior gateway
+ protocol to route packets to other ASes. IANA maintains
+ the AS number space and has delegated large parts to the
+ regional registries.
+ Autonomous system numbers were originally limited to 16
+ bits. BGP extensions have enlarged the autonomous system
+ number space to 32 bits. This type therefore uses an uint32
+ base type without a range restriction in order to support
+ a larger autonomous system number space.
+ In the value set and its semantics, this type is equivalent
+ to the InetAutonomousSystemNumber textual convention of
+ the SMIv2.";
+ reference
+ "RFC 1930: Guidelines for creation, selection, and registration
+ of an Autonomous System (AS)
+ RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+ RFC 4001: Textual Conventions for Internet Network Addresses
+ RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+ Number Space";
+ }
+
+ /*** collection of types related to IP addresses and hostnames ***/
+
+ typedef ip-address {
+ type union {
+ type inet:ipv4-address;
+ type inet:ipv6-address;
+ }
+ description
+ "The ip-address type represents an IP address and is IP
+ version neutral. The format of the textual representation
+ implies the IP version. This type supports scoped addresses
+ by allowing zone identifiers in the address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '(%[\p{N}\p{L}]+)?';
+ }
+ description
+ "The ipv4-address type represents an IPv4 address in
+ dotted-quad notation. The IPv4 address may include a zone
+ index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format for the zone index is the numerical
+ format";
+ }
+
+ typedef ipv6-address {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(%[\p{N}\p{L}]+)?';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(%.+)?';
+ }
+ description
+ "The ipv6-address type represents an IPv6 address in full,
+ mixed, shortened, and shortened-mixed notation. The IPv6
+ address may include a zone index, separated by a % sign.
+ The zone index is used to disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index number or the name of an
+ interface. If the zone index is not present, the default
+ zone of the device will be used.
+ The canonical format of IPv6 addresses uses the textual
+ representation defined in Section 4 of RFC 5952. The
+ canonical format for the zone index is the numerical
+ format as described in Section 11.2 of RFC 4007.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-address-no-zone {
+ type union {
+ type inet:ipv4-address-no-zone;
+ type inet:ipv6-address-no-zone;
+ }
+ description
+ "The ip-address-no-zone type represents an IP address and is
+ IP version neutral. The format of the textual representation
+ implies the IP version. This type does not support scoped
+ addresses since it does not allow zone identifiers in the
+ address format.";
+ reference
+ "RFC 4007: IPv6 Scoped Address Architecture";
+ }
+
+ typedef ipv4-address-no-zone {
+ type inet:ipv4-address {
+ pattern '[0-9\.]*';
+ }
+ description
+ "An IPv4 address without a zone index. This type, derived from
+ ipv4-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ }
+
+ typedef ipv6-address-no-zone {
+ type inet:ipv6-address {
+ pattern '[0-9a-fA-F:\.]*';
+ }
+ description
+ "An IPv6 address without a zone index. This type, derived from
+ ipv6-address, may be used in situations where the zone is
+ known from the context and hence no zone index is needed.";
+ reference
+ "RFC 4291: IP Version 6 Addressing Architecture
+ RFC 4007: IPv6 Scoped Address Architecture
+ RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ typedef ip-prefix {
+ type union {
+ type inet:ipv4-prefix;
+ type inet:ipv6-prefix;
+ }
+ description
+ "The ip-prefix type represents an IP prefix and is IP
+ version neutral. The format of the textual representations
+ implies the IP version.";
+ }
+
+ typedef ipv4-prefix {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+ + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+ }
+ description
+ "The ipv4-prefix type represents an IPv4 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 32.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The canonical format of an IPv4 prefix has all bits of
+ the IPv4 address set to zero that are not part of the
+ IPv4 prefix.";
+ }
+
+ typedef ipv6-prefix {
+ type string {
+ pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+ + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+ + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+ + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+ + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+ pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+ + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+ + '(/.+)';
+ }
+
+ description
+ "The ipv6-prefix type represents an IPv6 address prefix.
+ The prefix length is given by the number following the
+ slash character and must be less than or equal to 128.
+ A prefix length value of n corresponds to an IP address
+ mask that has n contiguous 1-bits from the most
+ significant bit (MSB) and all other bits set to 0.
+ The IPv6 address should have all bits that do not belong
+ to the prefix set to zero.
+ The canonical format of an IPv6 prefix has all bits of
+ the IPv6 address set to zero that are not part of the
+ IPv6 prefix. Furthermore, the IPv6 address is represented
+ as defined in Section 4 of RFC 5952.";
+ reference
+ "RFC 5952: A Recommendation for IPv6 Address Text
+ Representation";
+ }
+
+ /*** collection of domain name and URI types ***/
+
+ typedef domain-name {
+ type string {
+ pattern
+ '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+ + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+ + '|\.';
+ length "1..253";
+ }
+ description
+ "The domain-name type represents a DNS domain name. The
+ name SHOULD be fully qualified whenever possible.
+ Internet domain names are only loosely specified. Section
+ 3.5 of RFC 1034 recommends a syntax (modified in Section
+ 2.1 of RFC 1123). The pattern above is intended to allow
+ for current practice in domain name use, and some possible
+ future expansion. It is designed to hold various types of
+ domain names, including names used for A or AAAA records
+ (host names) and other records, such as SRV records. Note
+ that Internet host names have a stricter syntax (described
+ in RFC 952) than the DNS recommendations in RFCs 1034 and
+ 1123, and that systems that want to store host names in
+ schema nodes using the domain-name type are recommended to
+ adhere to this stricter standard to ensure interoperability.
+ The encoding of DNS names in the DNS protocol is limited
+ to 255 characters. Since the encoding consists of labels
+ prefixed by a length bytes and there is a trailing NULL
+ byte, only 253 characters can appear in the textual dotted
+ notation.
+ The description clause of schema nodes using the domain-name
+ type MUST describe when and how these names are resolved to
+ IP addresses. Note that the resolution of a domain-name value
+ may require to query multiple DNS records (e.g., A for IPv4
+ and AAAA for IPv6). The order of the resolution process and
+ which DNS record takes precedence can either be defined
+ explicitly or may depend on the configuration of the
+ resolver.
+ Domain-name values use the US-ASCII encoding. Their canonical
+ format uses lowercase US-ASCII characters. Internationalized
+ domain names MUST be A-labels as per RFC 5890.";
+ reference
+ "RFC 952: DoD Internet Host Table Specification
+ RFC 1034: Domain Names - Concepts and Facilities
+ RFC 1123: Requirements for Internet Hosts -- Application
+ and Support
+ RFC 2782: A DNS RR for specifying the location of services
+ (DNS SRV)
+ RFC 5890: Internationalized Domain Names in Applications
+ (IDNA): Definitions and Document Framework";
+ }
+
+ typedef host {
+ type union {
+ type inet:ip-address;
+ type inet:domain-name;
+ }
+ description
+ "The host type represents either an IP address or a DNS
+ domain name.";
+ }
+
+ typedef uri {
+ type string;
+ description
+ "The uri type represents a Uniform Resource Identifier
+ (URI) as defined by STD 66.
+ Objects using the uri type MUST be in US-ASCII encoding,
+ and MUST be normalized as described by RFC 3986 Sections
+ 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary
+ percent-encoding is removed, and all case-insensitive
+ characters are set to lowercase except for hexadecimal
+ digits, which are normalized to uppercase as described in
+ Section 6.2.2.1.
+ The purpose of this normalization is to help provide
+ unique URIs. Note that this normalization is not
+ sufficient to provide uniqueness. Two URIs that are
+ textually distinct after this normalization may still be
+ equivalent.
+ Objects using the uri type may restrict the schemes that
+ they permit. For example, 'data:' and 'urn:' schemes
+ might not be appropriate.
+ A zero-length URI is not a valid URI. This can be used to
+ express 'URI absent' where required.
+ In the value set and its semantics, this type is equivalent
+ to the Uri SMIv2 textual convention defined in RFC 5017.";
+ reference
+ "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+ RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+ Group: Uniform Resource Identifiers (URIs), URLs,
+ and Uniform Resource Names (URNs): Clarifications
+ and Recommendations
+ RFC 5017: MIB Textual Conventions for Uniform Resource
+ Identifiers (URIs)";
+ }
+
+}
diff --git a/sdnr/wt/common-yang/utils/src/test/yang/test-yang-utils.yang b/sdnr/wt/common-yang/utils/src/test/yang/test-yang-utils.yang
new file mode 100644
index 000000000..eb62a859a
--- /dev/null
+++ b/sdnr/wt/common-yang/utils/src/test/yang/test-yang-utils.yang
@@ -0,0 +1,79 @@
+module test-yang-utils {
+
+ yang-version 1.1;
+ namespace "urn:test:yang:utils";
+ prefix tesyangutils;
+
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types.";
+ }
+
+ import ietf-inet-types {
+ prefix inet;
+ }
+
+ typedef AddressType {
+ type enumeration {
+ enum OFFICE {
+ description
+ "Office Address";
+ }
+ enum HOME {
+ description
+ "Home Address";
+ }
+ }
+ }
+
+ identity item-code {
+ description
+ "Base identity";
+ }
+
+ typedef item-code {
+ type identityref {
+ base item-code;
+ }
+ description
+ "Item code - Could be bar code, QR code or any other code to uniquely identify an item";
+ }
+
+ grouping address-location-entity {
+ leaf id {
+ type string;
+ description
+ "Unique ID of the address";
+ }
+ leaf address-type {
+ type AddressType;
+ description
+ "Type of Address";
+ }
+ leaf delivery-date-time {
+ type yang:date-and-time;
+ description
+ "Package delivery date and time";
+ }
+ leaf delivery-url {
+ type inet:uri;
+ description
+ "Delivery URL";
+ }
+ list item-list {
+ key "item-key";
+ leaf item-key {
+ type item-code;
+ }
+ description
+ "Unique code of the ordered item";
+ }
+ }
+
+ container address-location {
+ description
+ "builder";
+ uses address-location-entity;
+ }
+} \ No newline at end of file