Bug 6112 - UnionTypeCodec fails to non-identityref value 86/41886/1
authorIsaku Yamahata <isaku.yamahata@intel.com>
Wed, 13 Jul 2016 00:04:41 +0000 (17:04 -0700)
committerRobert Varga <nite@hq.sk>
Fri, 15 Jul 2016 10:06:33 +0000 (10:06 +0000)
When Non-identityref value is deserialized, ClassCastException exception occurs.
catch the exception and move to the next codec.

> java.lang.ClassCastException: java.lang.Short cannot be cast to org.opendaylight.yangtools.yang.common.QName
>         at org.opendaylight.yangtools.binding.data.codec.impl.IdentityCodec.deserialize(IdentityCodec.java:17)
>         at org.opendaylight.yangtools.binding.data.codec.impl.UnionTypeCodec.deserialize(UnionTypeCodec.java:103)
>         at org.opendaylight.yangtools.binding.data.codec.impl.LeafNodeCodecContext.deserializeObject(LeafNodeCodecContext.java:199)
>         at org.opendaylight.yangtools.binding.data.codec.impl.DataObjectCodecContext.getBindingChildValue(DataObjectCodecContext.java:328)
>         at org.opendaylight.yangtools.binding.data.codec.impl.LazyDataObject.getBindingData(LazyDataObject.java:148)
>         at org.opendaylight.yangtools.binding.data.codec.impl.LazyDataObject.invoke(LazyDataObject.java:71)
>         at com.sun.proxy.$Proxy3.getValue(Unknown Source)
>         at org.opendaylight.yangtools.binding.data.codec.test.UnionTypeWithIdentityrefTest.bug6112Test(UnionTypeWithIdentityrefTest.java:78)

Change-Id: If6d9bffbc8cecaca2894f889940c814919da6a4b
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
(cherry picked from commit 71a93cffcd04df6a5521b323c9afdadafc90bc47)

binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/UnionTypeCodec.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/UnionTypeWithIdentityrefTest.java
binding/mdsal-binding-test-model/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/mdsal/test/bug/_6006/rev160607/UnionTypeBuilder.java

index bdb6a99efe67abed70c44b0c476b0b0e47095129..d05503f5818031b080c05c72fc4aa57d203f90c6 100644 (file)
@@ -101,7 +101,7 @@ final class UnionTypeCodec extends ReflectionBasedCodec {
             final Object identityref;
             try {
                 identityref = idRefCodec.deserialize(input);
-            } catch (UncheckedExecutionException | ExecutionError e) {
+            } catch (UncheckedExecutionException | ExecutionError | ClassCastException e) {
                 LOG.debug("Deserialization of {} as identityref failed", e);
                 return deserializeString(input);
             }
index d69c183e8b44a3aa16e5bec1c266cadb34f536ca..2c3e0f220e8a9814b8f350902324bfa5127d73c0 100644 (file)
@@ -50,9 +50,8 @@ public class UnionTypeWithIdentityrefTest extends AbstractBindingRuntimeTest {
         registry.onBindingRuntimeContextUpdated(getRuntimeContext());
     }
 
-    @Test
-    public void bug6006Test() {
-        UnionType unionType = UnionTypeBuilder.getDefaultInstance(identOneString);
+    private DataObject createValueNode(final String valueString) {
+        UnionType unionType = UnionTypeBuilder.getDefaultInstance(valueString);
         UnionNode unionNode = new UnionNodeBuilder().setValue(unionType).build();
         NormalizedNode<?, ?> normalizedUnionNode = registry
             .toNormalizedNode(InstanceIdentifier.builder(UnionNode.class).build(), unionNode)
@@ -62,8 +61,22 @@ public class UnionTypeWithIdentityrefTest extends AbstractBindingRuntimeTest {
                 YangInstanceIdentifier.of(normalizedUnionNode.getNodeType()), normalizedUnionNode);
         DataObject unionNodeObj = unionNodeEntry.getValue();
         assertTrue(unionNodeObj instanceof UnionNode);
+        return unionNodeObj;
+    }
+
+    @Test
+    public void bug6006Test() {
+        DataObject unionNodeObj = createValueNode(identOneString);
         UnionType unionTypeObj = ((UnionNode) unionNodeObj).getValue();
         assertEquals(null, unionTypeObj.getUint8());
         assertEquals(IdentOne.class, unionTypeObj.getIdentityref());
     }
+
+    @Test
+    public void bug6112Test() {
+        DataObject unionNodeObj = createValueNode("1");
+        UnionType unionTypeObj = ((UnionNode) unionNodeObj).getValue();
+        assertEquals(Short.valueOf((short)1), unionTypeObj.getUint8());
+        assertEquals(null, unionTypeObj.getIdentityref());
+    }
 }
index 98105ac775249c7b7006f01592cb709eccde09c0..1cdf3dc21d2a04684059d0a17a52a6a3302b6818 100644 (file)
@@ -16,13 +16,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 public class UnionTypeBuilder {
 
     public static UnionType getDefaultInstance(java.lang.String defaultValue) {
-        Class<? extends IdentBase> identityref = null;
         if (defaultValue.equals("IdentOne")) {
             return new UnionType(IdentOne.class);
         }
         if (defaultValue.equals("IdentTwo")) {
             return new UnionType(IdentTwo.class);
         }
+
+        try {
+            return new UnionType(Short.valueOf(defaultValue));
+        } catch(NumberFormatException e) {
+            /* do nothing */;
+        }
+
         throw new IllegalArgumentException("Unknown UnionType string " + defaultValue);
     }