From 7d64be5b1995171d040d304a9aa4f6e96bff5541 Mon Sep 17 00:00:00 2001 From: Isaku Yamahata Date: Tue, 12 Jul 2016 17:04:41 -0700 Subject: [PATCH] Bug 6112 - UnionTypeCodec fails to non-identityref value 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 (cherry picked from commit 71a93cffcd04df6a5521b323c9afdadafc90bc47) --- .../data/codec/impl/UnionTypeCodec.java | 2 +- .../test/UnionTypeWithIdentityrefTest.java | 19 ++++++++++++++++--- .../bug/_6006/rev160607/UnionTypeBuilder.java | 8 +++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/UnionTypeCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/UnionTypeCodec.java index bdb6a99efe..d05503f581 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/UnionTypeCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/UnionTypeCodec.java @@ -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); } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/UnionTypeWithIdentityrefTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/UnionTypeWithIdentityrefTest.java index d69c183e8b..2c3e0f220e 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/UnionTypeWithIdentityrefTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/yangtools/binding/data/codec/test/UnionTypeWithIdentityrefTest.java @@ -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()); + } } diff --git a/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 b/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 98105ac775..1cdf3dc21d 100644 --- a/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 +++ b/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 @@ -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 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); } -- 2.36.6