Bug 2480: Union objects are generated incorrectly when using bits type 35/13535/6
authorMartin Ciglan <mciglan@cisco.com>
Wed, 10 Dec 2014 13:29:05 +0000 (14:29 +0100)
committerMartin Ciglan <mciglan@cisco.com>
Fri, 16 Jan 2015 15:16:23 +0000 (15:16 +0000)
In case of bits typedef within union, method getValue() returning array
of booleans was missing.

Change-Id: If4b0f98d3889facff819d02f44566e816674528d
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/GeneratedTransferObject.java
code-generator/binding-model-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/type/builder/GeneratedTOBuilder.java
code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TypesResolutionTest.java
yang/yang-parser-impl/src/test/resources/types/union-with-bits/union-bits-model.yang [new file with mode: 0644]

index 270b04ac81161374d337fe03f012d96691939920..86d3bf5e3e3bdd5e3e35ad77d83730e6e27c2b99 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTO
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder;
 import org.opendaylight.yangtools.util.LazyCollections;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder> implements GeneratedTOBuilder {
 
@@ -30,6 +31,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
     private boolean isTypedef = false;
     private boolean isUnionType = false;
     private boolean isUnionTypeBuilder = false;
+    private TypeDefinition baseType = null;
     private Restrictions restrictions;
     private GeneratedPropertyBuilder SUID;
     private String reference;
@@ -140,6 +142,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         this.isTypedef = isTypedef;
     }
 
+    @Override
+    public void setBaseType(final TypeDefinition typeDef) {
+        this.baseType = typeDef;
+    }
+
     @Override
     public void setIsUnion(final boolean isUnion) {
         this.isUnionType = isUnion;
@@ -178,6 +185,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
         private final List<GeneratedProperty> stringProperties;
         private final GeneratedTransferObject extendsType;
         private final boolean isTypedef;
+        private final TypeDefinition baseType;
         private final boolean isUnionType;
         private final boolean isUnionTypeBuilder;
         private final Restrictions restrictions;
@@ -198,6 +206,7 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);
 
             this.isTypedef = builder.isTypedef;
+            this.baseType = builder.baseType;
             this.isUnionType = builder.isUnionType;
             this.isUnionTypeBuilder = builder.isUnionTypeBuilder;
             this.restrictions = builder.restrictions;
@@ -218,6 +227,11 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<G
             return isTypedef;
         }
 
+        @Override
+        public TypeDefinition getBaseType() {
+            return baseType;
+        }
+
         @Override
         public boolean isUnionType() {
             return isUnionType;
index 8d20831242fc1be9149a80811227def001523ecc..dba7356f9bd68cd61ce72d99407a8bcebc26c28b 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
 import com.google.common.base.Preconditions
 
 /**
@@ -126,6 +127,10 @@ class ClassTemplate extends BaseTemplate {
                 «ENDIF»
             «ENDFOR»
 
+            «IF (genTO.isTypedef() && genTO.getBaseType instanceof BitsTypeDefinition)»
+                «generateGetValueForBitsTypeDef»
+            «ENDIF»
+
             «generateHashCode»
 
             «generateEquals»
@@ -137,6 +142,24 @@ class ClassTemplate extends BaseTemplate {
             «generateRangeMethod("range", "_range")»
 
         }
+
+    '''
+
+    /**
+     * Template method which generates the method <code>getValue()</code> for typedef,
+     * which base type is BitsDefinition.
+     *
+     * @return string with the <code>getValue()</code> method definition in JAVA format
+     */
+    def protected generateGetValueForBitsTypeDef() '''
+
+        public boolean[] getValue() {
+            return new boolean[]{
+            «FOR property: genTO.properties SEPARATOR ','»
+                 «property.fieldName»
+            «ENDFOR»
+            };
+        }
     '''
 
     def private generateLengthMethod(String methodName, String varName) '''
index e6775e9e101b142e85aca1b4eecd6b47438034c5..32130d1cb77ebe06f0abdfee4d2db6cf91459794 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.sal.binding.model.api;
 
 import java.util.List;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 /**
  * Generated Transfer Object extends {@link GeneratedType} and is designed to
@@ -64,6 +65,13 @@ public interface GeneratedTransferObject extends GeneratedType {
 
     boolean isTypedef();
 
+    /**
+     * Returns Base type of Java representation of YANG typedef if set, otherwise it returns null
+     *
+     * @return Base type of Java representation of YANG typedef if set, otherwise it returns null
+     */
+    TypeDefinition getBaseType();
+
     /**
      * Return boolean value which describe whether Generated Transfer Object
      * was/wasn't created from union YANG type.
index b80d8eb94eadcb915625ea6cc83957cf6a66f9bd..fb680415a38d107dd9b7a22fe8ece39236419613 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.sal.binding.model.api.type.builder;
 
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 /**
  * Generated Transfer Object Builder is interface that contains methods to build
@@ -78,6 +79,14 @@ public interface GeneratedTOBuilder extends GeneratedTypeBuilderBase<GeneratedTO
 
     void setTypedef(boolean isTypedef);
 
+    /**
+     * Sets the base type for Java representation of YANG typedef
+     *
+     * @param typeDef
+     *           Type Definition
+     */
+    void setBaseType(TypeDefinition typeDef);
+
     /**
      *
      * @param isUnion
index 57038761ee822f92e2b9fe2e689ee817d605c614..b393c13367806ea9fb7211e698906e569ebe421f 100644 (file)
@@ -1099,6 +1099,7 @@ public final class TypeProviderImpl implements TypeProvider {
             genTOBuilder.setReference(typeDef.getReference());
             genTOBuilder.setSchemaPath(typeDef.getPath().getPathFromRoot());
             genTOBuilder.setModuleName(moduleName);
+            genTOBuilder.setBaseType(typeDef);
 
             final List<Bit> bitList = bitsTypeDefinition.getBits();
             GeneratedPropertyBuilder genPropertyBuilder;
index a2fa589a564e9a130135edf0c6e9d1e2caf2abfb..6156093cf89684131339d108868a6c08c924dd7d 100644 (file)
@@ -339,4 +339,11 @@ public class TypesResolutionTest {
         parser.parseFiles(Arrays.asList(extdef, unionbug, inet));
     }
 
+    @Test
+    public void testUnionWithBits() throws Exception {
+        File unionbits = new File(getClass().getResource("/types/union-with-bits/union-bits-model.yang").toURI());
+        YangContextParser parser = new YangParserImpl();
+        parser.parseFiles(Arrays.asList(unionbits));
+    }
+
 }
diff --git a/yang/yang-parser-impl/src/test/resources/types/union-with-bits/union-bits-model.yang b/yang/yang-parser-impl/src/test/resources/types/union-with-bits/union-bits-model.yang
new file mode 100644 (file)
index 0000000..2c99807
--- /dev/null
@@ -0,0 +1,59 @@
+module unionbitsmodel {
+    namespace "urn:ubt";
+    prefix "ubt";
+
+    revision 2014-12-10 {
+    }
+
+    typedef port-state-v13 {
+        description
+            "Current state of the physical port. These are not configurable from the controller.";
+
+        type bits {
+            bit link_down {
+                //description "No physical link present.";
+                position 0;
+            }
+
+            bit blocked {
+                //description "Port is blocked";
+                position 1;
+            }
+
+            bit live {
+                //description "Live for Fast Failover Group.";
+                position 2;
+            }
+        }
+    }
+
+    typedef port-state-v10 {
+        description "Current state of the physical port. These are not configurable from the controller.";
+
+        type bits {
+            bit link_down {
+                description "No physical link present.";
+                position 0;
+            }
+
+            bit blocked {
+                    description "Port is blocked";
+                    position 1;
+                }
+                bit live {
+                    description "Live for Fast Failover Group.";
+                    position 2;
+                }
+                bit stp_listen {
+                    description "Not learning or relaying frames.";
+                }
+            }
+        }
+
+    typedef my-union-type {
+        type union {
+            type port-state-v13;
+            type port-state-v10;
+        }
+    }
+}
\ No newline at end of file