From: Robert Varga Date: Tue, 26 Aug 2014 19:49:33 +0000 (+0200) Subject: BUG-650: fromYangInstanceIdentifier() can return null X-Git-Tag: release/helium~196^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=30fea9dd03fc41b70c20145251514fa82920b0a3 BUG-650: fromYangInstanceIdentifier() can return null Properly interpret a null return as an absent identifier. Clarified cast in #toBinding(Entry) and explained why it is necessary, even if Eclipse reports it as unnecessary (difference in various java compilers). Change-Id: I2dd7cd631cb958a28ddce8db62d20e0292ae8a39 Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java index bbb269cf59..d7314e5362 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/BindingToNormalizedNodeCodec.java @@ -13,6 +13,8 @@ import com.google.common.base.Optional; import java.util.Iterator; import java.util.Map.Entry; +import javax.annotation.Nonnull; + import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer; @@ -72,7 +74,7 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener,AutoC public Optional> toBinding(final YangInstanceIdentifier normalized) throws DeserializationException { try { - return Optional.>of(codecRegistry.fromYangInstanceIdentifier(normalized)); + return Optional.>fromNullable(codecRegistry.fromYangInstanceIdentifier(normalized)); } catch (IllegalArgumentException e) { return Optional.absent(); } @@ -82,14 +84,26 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener,AutoC return legacyToNormalized; } - @SuppressWarnings("unchecked") public Optional, DataObject>> toBinding( - final Entry> normalized) + final @Nonnull Entry> normalized) throws DeserializationException { try { - @SuppressWarnings("rawtypes") - Entry binding = codecRegistry.fromNormalizedNode(normalized.getKey(), normalized.getValue()); - return Optional., DataObject>>fromNullable(binding); + /* + * This cast is required, due to generics behaviour in openjdk / oracle javac + * + * InstanceIdentifier has definition InstanceIdentifier, + * this means '?' is always  . Eclipse compiler + * is able to determine this relationship and treats + * Entry,DataObject> and Entry + * as assignable. However openjdk / oracle javac treats this two types + * as incompatible and issues a compile error. + * + * It is safe to loose generic information and cast it to other generic signature. + * + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + final Entry, DataObject> binding = (Entry) codecRegistry.fromNormalizedNode(normalized.getKey(), normalized.getValue()); + return Optional.fromNullable(binding); } catch (IllegalArgumentException e) { return Optional.absent(); } @@ -130,7 +144,7 @@ public class BindingToNormalizedNodeCodec implements SchemaContextListener,AutoC } @Override - public void close() throws Exception { + public void close() { // NOOP Intentionally } }