From e4c2cc63642bc697402ef850b87506bf536c6d28 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 18 Mar 2019 14:40:29 +0100 Subject: [PATCH] Change 'type empty' mapping This patch changes 'type empty' leaves to map to yang.common.Empty, aligning DOM and Binding representations and removing potential confusion around what Boolean.FALSE means in the value. It also eliminates the need for a dedicated codec, as this type is handled through NOOP_CODEC. JIRA: MDSAL-48 Change-Id: If43d710d4620cffaecc8ca7d42d1eb00c58370c0 Signed-off-by: Robert Varga --- .../dom/codec/impl/BindingCodecContext.java | 5 ---- .../codec/impl/EncapsulatedValueCodec.java | 3 +-- .../dom/codec/impl/ValueTypeCodec.java | 26 ++----------------- .../dom/codec/util/BindingSchemaMapping.java | 5 ++-- .../impl/UnionValueOptionContextTest.java | 8 +++--- .../binding/dom/codec/test/EmptyLeafTest.java | 6 +++-- .../binding/dom/codec/test/TypedefTest.java | 7 ++--- .../binding/yang/types/BaseYangTypes.java | 3 ++- .../binding/yang/types/BaseYangTypesTest.java | 5 ++-- .../java/api/generator/ClassTemplate.xtend | 5 ++++ .../binding/java/api/generator/Constants.java | 7 +++++ .../java/api/generator/UnionTemplate.xtend | 6 ++++- .../api/generator/test/CompilationTest.java | 3 ++- .../test/TypedefCompilationTest.java | 7 ++--- 14 files changed, 45 insertions(+), 51 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index 4a5083f636..84ab3e539a 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -56,7 +56,6 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; @@ -283,10 +282,6 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree @SuppressWarnings({ "unchecked", "rawtypes" }) final Codec casted = (Codec) instanceIdentifierCodec; return casted; - } else if (Boolean.class.equals(valueType)) { - if (instantiatedType instanceof EmptyTypeDefinition) { - return ValueTypeCodec.EMPTY_CODEC; - } } else if (BindingReflections.isBindingClass(valueType)) { return getCodecForBindingClass(valueType, instantiatedType); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java index 5e9f21e89e..3452e2ac65 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java @@ -19,7 +19,6 @@ import java.util.concurrent.Callable; import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; /** * Derived YANG types are just immutable value holders for simple value @@ -43,7 +42,7 @@ final class EncapsulatedValueCodec extends ReflectionBasedCodec implements Schem static Callable loader(final Class typeClz, final TypeDefinition typeDef) { return () -> { final Method m; - if (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition) { + if (typeDef instanceof BooleanTypeDefinition) { m = typeClz.getMethod("isValue"); } else { m = typeClz.getMethod("getValue"); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java index 2b8b69d08e..7cf9733607 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java @@ -13,10 +13,8 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Codec; -import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; /** @@ -37,7 +35,7 @@ abstract class ValueTypeCodec implements Codec { /** * No-op Codec, Java YANG Binding uses same types as NormalizedNode model for base YANG types, representing numbers, - * binary and strings. + * binary, strings and empty. */ public static final SchemaUnawareCodec NOOP_CODEC = new SchemaUnawareCodec() { @@ -52,31 +50,11 @@ abstract class ValueTypeCodec implements Codec { } }; - public static final SchemaUnawareCodec EMPTY_CODEC = new SchemaUnawareCodec() { - - @Override - public Object serialize(final Object input) { - // Empty type has Empty value in NormalizedNode and Composite Node representation - return Empty.getInstance(); - } - - @Override - public Object deserialize(final Object input) { - /* Empty type has boolean.TRUE representation in Binding-aware world otherwise it is null / false. - * So when codec is triggered, empty leaf is present, that means we are safe to return true. - */ - return Boolean.TRUE; - } - }; - - private static final Callable EMPTY_LOADER = () -> EMPTY_CODEC; - - public static SchemaUnawareCodec getCodecFor(final Class typeClz, final TypeDefinition def) { if (BindingReflections.isBindingClass(typeClz)) { return getCachedSchemaUnawareCodec(typeClz, getCodecLoader(typeClz, def)); } - return def instanceof EmptyTypeDefinition ? EMPTY_CODEC : NOOP_CODEC; + return NOOP_CODEC; } private static SchemaUnawareCodec getCachedSchemaUnawareCodec(final Class typeClz, diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java index c82825e094..7349ccdd2d 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java @@ -12,7 +12,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; public final class BindingSchemaMapping { private BindingSchemaMapping() { @@ -25,11 +24,11 @@ public final class BindingSchemaMapping { } public static String getGetterMethodName(final TypedDataSchemaNode node) { - // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type + // Bug 8903: If it is a derived type of boolean, not an inner type, then the return type // of method would be the generated type of typedef not build-in types, so here it should be 'get'. final TypeDefinition type = node.getType(); return BindingMapping.getGetterMethodName(node.getQName(), - (type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition) + type instanceof BooleanTypeDefinition && (type.getPath().equals(node.getPath()) || type.getBaseType() == null)); } } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java index 4332a3a5a9..794659b176 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java @@ -25,16 +25,16 @@ public class UnionValueOptionContextTest { final Method methodFoo1 = TestDataObject1.class.getMethod("foo"); final Method methodFoo2 = TestDataObject2.class.getMethod("foo"); TEST_UVOC_1 = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, methodFoo1, - ValueTypeCodec.EMPTY_CODEC); + ValueTypeCodec.NOOP_CODEC); TEST_UVOC_2 = new UnionValueOptionContext(TestUnion.class, TestDataObject2.class, methodFoo2, - ValueTypeCodec.EMPTY_CODEC); + ValueTypeCodec.NOOP_CODEC); } @Test public void hashCodeTest() throws Exception { final Method methodFoo1 = TestDataObject1.class.getMethod("foo"); final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, - methodFoo1, ValueTypeCodec.EMPTY_CODEC); + methodFoo1, ValueTypeCodec.NOOP_CODEC); assertEquals("HashCode", test_uvoc.hashCode(), TEST_UVOC_1.hashCode()); assertNotEquals("HashCode", TEST_UVOC_1.hashCode(), TEST_UVOC_2.hashCode()); @@ -44,7 +44,7 @@ public class UnionValueOptionContextTest { public void equalsTest() throws Exception { final Method methodFoo1 = TestDataObject1.class.getMethod("foo"); final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, - methodFoo1, ValueTypeCodec.EMPTY_CODEC); + methodFoo1, ValueTypeCodec.NOOP_CODEC); assertTrue("Equals", TEST_UVOC_1.equals(test_uvoc)); assertFalse("Not equals", TEST_UVOC_1.equals(TEST_UVOC_2)); diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/EmptyLeafTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/EmptyLeafTest.java index 1604858975..6450a29c9f 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/EmptyLeafTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/EmptyLeafTest.java @@ -7,6 +7,7 @@ */ package org.opendaylight.mdsal.binding.dom.codec.test; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Collections; @@ -26,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.ChoiceInList; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -45,7 +47,7 @@ public class EmptyLeafTest extends AbstractBindingCodecTest { public void testCaseWithEmptyLeafType() { final TopLevelList withEmptyCase = new TopLevelListBuilder() .withKey(TOP_FOO_KEY) - .setChoiceInList(new EmptyLeafBuilder().setEmptyType(true).build()) + .setChoiceInList(new EmptyLeafBuilder().setEmptyType(Empty.getInstance()).build()) .build(); final Entry> dom = registry.toNormalizedNode(BA_TOP_LEVEL_LIST, withEmptyCase); @@ -53,7 +55,7 @@ public class EmptyLeafTest extends AbstractBindingCodecTest { dom.getValue()); final ChoiceInList list = ((TopLevelList) readed.getValue()).getChoiceInList(); assertTrue(list instanceof EmptyLeaf); - assertTrue(((EmptyLeaf) list).isEmptyType()); + assertNotNull(((EmptyLeaf) list).getEmptyType()); } private static RpcComplexUsesAugment createComplexData() { diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/TypedefTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/TypedefTest.java index 1fa38c283b..eb0910c52a 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/TypedefTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/TypedefTest.java @@ -19,6 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.typedef.empty.rev170829.TypedefEmpty; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -49,9 +50,9 @@ public class TypedefTest extends AbstractBindingCodecTest { @Test public void testTypedefEmptyType() { TestCont binding = new TestContBuilder() - .setEmptyLeaf(true) - .setEmptyLeaf2(new TypedefEmpty(true)) - .setEmptyLeaf3(true) + .setEmptyLeaf(Empty.getInstance()) + .setEmptyLeaf2(new TypedefEmpty(Empty.getInstance())) + .setEmptyLeaf3(Empty.getInstance()) .build(); final Entry> dom = registry.toNormalizedNode(BA_TEST_CONT, binding); diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypes.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypes.java index 2863b462f1..2f3d7a23e5 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypes.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypes.java @@ -19,6 +19,7 @@ import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.model.util.Types; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; @@ -32,7 +33,7 @@ public final class BaseYangTypes { /** * Type representation of empty YANG type. */ - public static final Type EMPTY_TYPE = BOOLEAN_TYPE; + public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class); public static final Type ENUM_TYPE = Types.typeForClass(Enum.class); diff --git a/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypesTest.java b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypesTest.java index 2631d500ff..066d07392f 100644 --- a/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypesTest.java +++ b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/yang/types/BaseYangTypesTest.java @@ -19,6 +19,7 @@ import org.junit.Test; import org.opendaylight.mdsal.binding.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; @@ -185,7 +186,7 @@ public class BaseYangTypesTest { javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty); assertNotNull(javaType); - assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName()); + assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName()); javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool); assertNotNull(javaType); @@ -263,7 +264,7 @@ public class BaseYangTypesTest { javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty, BindingGeneratorUtil.getRestrictions(empty)); assertNotNull(javaType); - assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName()); + assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName()); javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool, BindingGeneratorUtil.getRestrictions(bool)); diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend index 337c7a7c88..24f2972c62 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend @@ -13,6 +13,7 @@ import static org.opendaylight.mdsal.binding.model.util.Types.BYTE_ARRAY; import static org.opendaylight.mdsal.binding.model.util.Types.STRING; import static extension org.apache.commons.text.StringEscapeUtils.escapeJava +import com.google.common.base.Preconditions import com.google.common.collect.ImmutableList import com.google.common.collect.Lists import java.beans.ConstructorProperties @@ -32,6 +33,7 @@ import org.opendaylight.mdsal.binding.model.api.Restrictions import org.opendaylight.mdsal.binding.model.api.Type import org.opendaylight.mdsal.binding.model.util.TypeConstants import org.opendaylight.yangtools.yang.binding.CodeHelpers +import org.opendaylight.yangtools.yang.common.Empty import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition /** @@ -336,6 +338,9 @@ class ClassTemplate extends BaseTemplate { return new «genTO.name»(«Base64.importedName».getDecoder().decode(defaultValue)); «ELSEIF STRING.equals(prop.returnType)» return new «genTO.name»(defaultValue); + «ELSEIF Constants.EMPTY.equals(prop.returnType)» + «Preconditions.importedName».checkArgument(defaultValue.isEmpty(), "Invalid value %s", defaultValue); + return new «genTO.name»(«Empty.importedName».getInstance()); «ELSEIF allProperties.size > 1» «bitsArgs» «ELSEIF BOOLEAN.equals(prop.returnType)» diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Constants.java b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Constants.java index 094b164d8d..194e73bd4f 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Constants.java +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/Constants.java @@ -7,6 +7,10 @@ */ package org.opendaylight.mdsal.binding.java.api.generator; +import org.opendaylight.mdsal.binding.model.api.Type; +import org.opendaylight.mdsal.binding.model.util.Types; +import org.opendaylight.yangtools.yang.common.Empty; + /** * Various constants when generating JAVA source code. */ @@ -29,6 +33,9 @@ final class Constants { */ public static final String MEMBER_REGEX_LIST = "regexes"; + // This should live in a common artifact + static final Type EMPTY = Types.typeForClass(Empty.class); + private Constants() { } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend index 477ee19ace..05b8a23e9d 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend @@ -17,13 +17,14 @@ import java.util.Base64; import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject import org.opendaylight.mdsal.binding.model.api.Enumeration import org.opendaylight.mdsal.binding.model.api.Type +import org.opendaylight.mdsal.binding.model.util.Types +import org.opendaylight.yangtools.yang.common.Empty import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition /** * Template for generating JAVA class. */ class UnionTemplate extends ClassTemplate { - /** * Creates instance of this class with concrete genType. * @@ -128,6 +129,9 @@ class UnionTemplate extends ClassTemplate { «ELSEIF BYTE_ARRAY.equals(propRet.typedefReturnType)» ««« generated byte[] typedef return «Base64.importedName».getEncoder().encodeToString(«field».getValue()); + «ELSEIF Constants.EMPTY.equals(propRet) || Constants.EMPTY.equals(propRet.typedefReturnType)» + ««« generated empty typedef + return ""; «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject && (propRet as GeneratedTransferObject).typedef // Is it a typedef && (propRet as GeneratedTransferObject).baseType instanceof BitsTypeDefinition» diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java index c2a3d2fa3a..a50ac877b3 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java @@ -36,6 +36,7 @@ import java.util.stream.Collectors; import org.junit.Test; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; +import org.opendaylight.yangtools.yang.common.Empty; /** * Test correct code generation. @@ -391,7 +392,7 @@ public class CompilationTest extends BaseCompilationTest { CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader); CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean"); CompilationTestUtils.assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64"); - CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty"); + CompilationTestUtils.assertContainsMethod(nodesClass, Empty.class, "getIdEmpty"); CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader); testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg"); testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier"); diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java index ed49527410..7c99a60cb0 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.junit.Test; +import org.opendaylight.yangtools.yang.common.Empty; /** * Test correct code generation. @@ -316,18 +317,18 @@ public class TypedefCompilationTest extends BaseCompilationTest { assertFalse(unionExt4Class.isInterface()); CompilationTestUtils.assertContainsField(unionExt4Class, "_unionExt3", unionExt3Class); CompilationTestUtils.assertContainsField(unionExt4Class, "_int32Ext2", int32Ext2Class); - CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Boolean.class); + CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Empty.class); CompilationTestUtils.assertContainsField(unionExt4Class, "_myDecimalType", myDecimalTypeClass); CompilationTestUtils.assertContainsFieldWithValue(unionExt4Class, "serialVersionUID", Long.TYPE, 8089656970520476667L, new Class[] { Boolean.class }, false); assertEquals(5, unionExt4Class.getDeclaredFields().length); CompilationTestUtils.assertContainsMethod(unionExt4Class, unionExt3Class, "getUnionExt3"); CompilationTestUtils.assertContainsMethod(unionExt4Class, int32Ext2Class, "getInt32Ext2"); - CompilationTestUtils.assertContainsMethod(unionExt4Class, Boolean.class, "isEmpty"); + CompilationTestUtils.assertContainsMethod(unionExt4Class, Empty.class, "getEmpty"); CompilationTestUtils.assertContainsMethod(unionExt4Class, myDecimalTypeClass, "getMyDecimalType"); CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt3Class); CompilationTestUtils.assertContainsConstructor(unionExt4Class, int32Ext2Class); - CompilationTestUtils.assertContainsConstructor(unionExt4Class, Boolean.class); + CompilationTestUtils.assertContainsConstructor(unionExt4Class, Empty.class); CompilationTestUtils.assertContainsConstructor(unionExt4Class, myDecimalTypeClass); CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt4Class); assertEquals(5, unionExt4Class.getDeclaredConstructors().length); -- 2.36.6