Binding v2 - Map 'type empty' to yangtools.yang.common.Empty 01/62401/17
authorJie Han <han.jie@zte.com.cn>
Tue, 29 Aug 2017 10:55:15 +0000 (18:55 +0800)
committerRobert Varga <nite@hq.sk>
Sun, 11 Mar 2018 15:37:25 +0000 (15:37 +0000)
- make generator map Empty to empty leaf and use prefix 'get'
  for getter methos.
- fix codec for type Empty and its derived type correspondingly.

Change-Id: Icbc5c729ce4f035323fffc775f4943bc7ce50989
Signed-off-by: Jie Han <han.jie@zte.com.cn>
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/impl/context/base/BindingCodecContext.java
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/impl/value/EncapsulatedValueCodec.java
binding2/mdsal-binding2-dom-codec/src/main/java/org/opendaylight/mdsal/binding/javav2/dom/codec/impl/value/ValueTypeCodec.java
binding2/mdsal-binding2-dom-codec/src/test/java/org/opendaylight/mdsal/binding/javav2/dom/codec/impl/TypedefTest.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java
binding2/mdsal-binding2-java-api-generator/src/main/twirl/org/opendaylight/mdsal/binding/javav2/java/api/generator/classTemplate.scala.txt
binding2/mdsal-binding2-test-model/src/main/yang/test-typedef.yang

index 2733be647285a48aac3a4b0476eeb98213f96352..edcd894b8fc3742544f179e62bac914469624976 100644 (file)
@@ -59,6 +59,7 @@ import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.concepts.Identifier;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.util.ClassLoaderUtils;
+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.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -74,7 +75,6 @@ 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.BooleanTypeDefinition;
-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;
@@ -354,8 +354,8 @@ public final class BindingCodecContext implements CodecContextFactory, BindingTr
         final String suffix = JavaIdentifierNormalizer.normalizeSpecificIdentifier(node.getQName().getLocalName(),
             JavaIdentifier.CLASS);
 
-        if ((typeDef.getPath().equals(node.getPath()) || typeDef.getBaseType() == null)
-                && (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition)) {
+        if (typeDef instanceof BooleanTypeDefinition
+                && (typeDef.getPath().equals(node.getPath()) || typeDef.getBaseType() == null)) {
             return "is" + suffix;
         }
 
@@ -445,10 +445,8 @@ public final class BindingCodecContext implements CodecContextFactory, BindingTr
             @SuppressWarnings({ "unchecked", "rawtypes" })
             final Codec<Object, Object> casted = (Codec) instanceIdentifierCodec;
             return casted;
-        } else if (Boolean.class.equals(valueType)) {
-            if (instantiatedType instanceof EmptyTypeDefinition) {
-                return ValueTypeCodec.EMPTY_CODEC;
-            }
+        } else if (Empty.class.equals(valueType)) {
+            return ValueTypeCodec.EMPTY_CODEC;
         } else if (BindingReflections.isBindingClass(valueType)) {
             return getCodecForBindingClass(valueType, instantiatedType);
         }
index 2069baea2712fb7131c7c7fdab5945fa4d988d05..431edbf126d8c7c5018e17a216f5ecc2dfcab50a 100644 (file)
@@ -43,7 +43,7 @@ public final class EncapsulatedValueCodec extends ReflectionBasedCodec implement
         this.valueType = Preconditions.checkNotNull(valueType);
     }
 
-    static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, TypeDefinition<?> typeDef) {
+    static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, final TypeDefinition<?> typeDef) {
         return () -> {
             final Method m;
             if (typeDef instanceof BooleanTypeDefinition) {
index 7184f14cbdba62efde43d77c29be020885f006e3..0644cb0b20d4af550fd9d9068eec0ea4c8e259c4 100644 (file)
@@ -15,6 +15,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.javav2.runtime.reflection.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;
@@ -61,17 +62,18 @@ public abstract class ValueTypeCodec implements Codec<Object, Object> {
         public Object serialize(final Object arg0) {
             // Empty type has null value in NormalizedNode and Composite Node
             // representation
-            return null;
+            return Empty.getInstance();
         }
 
         @Override
         public Object deserialize(final Object arg0) {
-            /* 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.
+            /* Empty type has Empty representation in Binding-aware world
+            *  otherwise it is null.
+            *  So when codec is triggered, empty leaf is present and its
+            *  value is Empty.getInstance(), that means we are safe to
+            *  return it directly.
             */
-            return Boolean.TRUE;
+            return arg0;
         }
     };
 
@@ -109,14 +111,13 @@ public abstract class ValueTypeCodec implements Codec<Object, Object> {
             return EnumerationCodec.loader(typeClz, (EnumTypeDefinition) rootType);
         } else if (rootType instanceof BitsTypeDefinition) {
             return BitsCodec.loader(typeClz, (BitsTypeDefinition) rootType);
-        } else if (rootType instanceof EmptyTypeDefinition) {
-            return EMPTY_LOADER;
         }
+
         return EncapsulatedValueCodec.loader(typeClz, def);
     }
 
     @SuppressWarnings("rawtypes")
-    public static ValueTypeCodec encapsulatedValueCodecFor(final Class<?> typeClz,  final TypeDefinition<?> typeDef,
+    public static ValueTypeCodec encapsulatedValueCodecFor(final Class<?> typeClz, final TypeDefinition<?> typeDef,
             final Codec delegate) {
         final SchemaUnawareCodec extractor = getCachedSchemaUnawareCodec(typeClz,
             EncapsulatedValueCodec.loader(typeClz, typeDef));
index 53d7ea64bb28f06848b53195fc84f2d1bc2a7d10..11ea47fd7e382d52a969283717482240d3266dff 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.javav2.dom.codec.impl;
 
 import static org.junit.Assert.assertEquals;
+import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
 
 import java.util.Map.Entry;
 import javassist.ClassPool;
@@ -17,16 +18,32 @@ import org.opendaylight.mdsal.binding.javav2.runtime.javassist.JavassistUtils;
 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
 import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.data.DefaultPolicy;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.data.TestCont;
 import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.dto.DefaultPolicyBuilder;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.dto.TestContBuilder;
 import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.type.PolicyLoggingFlag;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.type.TypedefEmpty;
+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.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 
 
 public class TypedefTest extends AbstractBindingRuntimeTest {
 
     private static final InstanceIdentifier<DefaultPolicy> BA_DEFAULT_POLICY =
             InstanceIdentifier.builder(DefaultPolicy.class).build();
+    private static final InstanceIdentifier<TestCont> BA_TEST_CONT =
+            InstanceIdentifier.builder(TestCont.class).build();
+
+    private static final QName EMPTY_LEAF = QName.create(TestCont.QNAME, "empty-leaf");
+    private static final QName EMPTY_LEAF2 = QName.create(TestCont.QNAME, "empty-leaf2");
+    private static final QName EMPTY_LEAF3 = QName.create(TestCont.QNAME, "empty-leaf3");
+    private static final YangInstanceIdentifier BI_TESTCONT_PATH = YangInstanceIdentifier.of(TestCont.QNAME);
+
     private BindingNormalizedNodeCodecRegistry registry;
 
     @Override
@@ -52,4 +69,37 @@ public class TypedefTest extends AbstractBindingRuntimeTest {
         assertEquals(binding,readed.getValue());
 
     }
+
+    private static TestCont getTypedefEmptyTypeBindingData() {
+        return new TestContBuilder()
+            .setEmptyLeaf(Empty.getInstance())
+            .setEmptyLeaf2(TypedefEmpty.getDefaultInstance())
+            .setEmptyLeaf3(Empty.getInstance())
+            .build();
+    }
+
+    private static ContainerNode getTypedefEmptyTypeNormalizedData() {
+        return ImmutableContainerNodeBuilder.create()
+            .withNodeIdentifier(new NodeIdentifier(TestCont.QNAME))
+            .withChild(leafNode(EMPTY_LEAF, Empty.getInstance()))
+            .withChild(leafNode(EMPTY_LEAF2, Empty.getInstance()))
+            .withChild(leafNode(EMPTY_LEAF3, Empty.getInstance()))
+            .build();
+    }
+
+    @Test
+    public void testTypedefEmptyTypeToNormalizedData() {
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
+            registry.toNormalizedNode(BA_TEST_CONT, getTypedefEmptyTypeBindingData());
+
+        assertEquals(getTypedefEmptyTypeNormalizedData(), dom.getValue());
+    }
+
+    @Test
+    public void testTypedefEmptyTypeFromNormalizedData() {
+        final Entry<InstanceIdentifier<?>, TreeNode> readed =
+            registry.fromNormalizedNode(BI_TESTCONT_PATH, getTypedefEmptyTypeNormalizedData());
+
+        assertEquals(getTypedefEmptyTypeBindingData(), readed.getValue());
+    }
 }
index ee50c8417e91622cad1e5acb39c127cf5865ecf2..acb2dd28b7dd0c0c17e240ac4433b9e0093675fc 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
+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;
@@ -52,7 +53,7 @@ public final class BaseYangTypes {
     /**
      * <code>Type</code> representation of <code>empty</code> YANG type
      */
-    public static final Type EMPTY_TYPE = Types.typeForClass(Boolean.class);
+    public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class);
 
     /**
      * <code>Type</code> representation of <code>enumeration</code> YANG type
index 12564e4ef7c1bd3eb6e8cbb3a8567312562dded2..08b01e6f457b3e911d7fce5b318513689beb83f7 100644 (file)
@@ -148,6 +148,11 @@ class @{genType.getName}
 
 @defaultInstance() = {
 @if(genTo.isTypedef && !allProperties.isEmpty && !genTo.isUnionType) {
+    @if("org.opendaylight.yangtools.yang.common.Empty".equals(allProperties.get(0).getReturnType.getFullyQualifiedName)) {
+        public static @{genTo.getName} getDefaultInstance() {
+            return new @{genTo.getName}(Empty.getInstance());
+        }
+    } else {
     @if(!"org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier".equals(allProperties.get(0).getReturnType.getFullyQualifiedName)) {
         public static @{genTo.getName} getDefaultInstance(String defaultValue) {
             @if(allProperties.size > 1) {
@@ -189,5 +194,6 @@ class @{genType.getName}
             }
         }
     }
+    }
 }
 }
\ No newline at end of file
index 738b352ab79853d7ce1edc61f2ddd7ddb94086e9..c87d851d5b992206f2ff589fb2d25bcd17040c1e 100755 (executable)
@@ -11,6 +11,10 @@ module test-typedef {
         type boolean;
     }
 
+    typedef typedef-empty {
+        type empty;
+    }
+
     container default-policy{
       leaf action {
         type boolean;
@@ -25,4 +29,19 @@ module test-typedef {
         default "true";
       }
     }
+
+    container test-cont{
+      leaf empty-leaf {
+        type empty;
+      }
+
+      leaf empty-leaf2 {
+        type typedef-empty;
+      }
+
+      leaf empty-leaf3{
+         type empty;
+         default "";
+      }
+    }
 }