diff options
Diffstat (limited to 'sdnr/wt/common-yang/utils')
20 files changed, 1115 insertions, 209 deletions
diff --git a/sdnr/wt/common-yang/utils/pom.xml b/sdnr/wt/common-yang/utils/pom.xml index 927639ffe..4fb97cce2 100644 --- a/sdnr/wt/common-yang/utils/pom.xml +++ b/sdnr/wt/common-yang/utils/pom.xml @@ -22,13 +22,14 @@ ~ ============LICENSE_END======================================================= ~ --> + <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>binding-parent</artifactId> - <version>2.4.0</version> + <version>2.4.1-SNAPSHOT</version> <relativePath/> </parent> @@ -73,10 +74,61 @@ <artifactId>mdsal-dom-api</artifactId> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId> + <artifactId>rfc6991-ietf-inet-types</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + </dependency> <dependency> <groupId>org.opendaylight.netconf</groupId> <artifactId>sal-netconf-connector</artifactId> <scope>test</scope> </dependency> </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <configuration> + <excludes> + <exclude>**/gen/**</exclude> + <exclude>**/generated-sources/**</exclude> + <exclude>**/yang-gen-sal/**</exclude> + <exclude>**/pax/**</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.opendaylight.yangtools</groupId> + <artifactId>yang-maven-plugin</artifactId> + <version>7.0.9</version> + <executions> + <execution> + <id>binding</id> + <goals> + <goal>generate-sources</goal> + </goals> + <configuration> + <yangFilesRootDir>src/test/yang</yangFilesRootDir> + <inspectDependencies>true</inspectDependencies> + </configuration> + </execution> + </executions> + <dependencies> + <dependency> + <groupId>org.opendaylight.mdsal</groupId> + <artifactId>mdsal-binding-java-api-generator</artifactId> + <version>8.0.7</version> + <scope>compile</scope> + </dependency> + </dependencies> + </plugin> + </plugins> + </build> </project> 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 |