From 5376803e1c41d25f4c8e6e2ca38dc5e4d9fc18fb Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 8 Nov 2018 15:01:07 +0100 Subject: [PATCH] Refactor DataObjectCodecContext.getBindingChildValue() Using instanceof checks is an OOP anti-pattern, which we do not want here anyways. Generalize NodeCodecContext.defaultObject() to return null by default and refactor decoding to rely on it, with LeafNodeCodecContext returning whatever it has as a default value. Change-Id: I2b58bc7f1a16496cf6bc93fd7a33aec38f864597 JIRA: MDSAL-18 Signed-off-by: Robert Varga --- .../dom/codec/impl/DataObjectCodecContext.java | 11 ++++------- .../binding/dom/codec/impl/LeafNodeCodecContext.java | 9 ++------- .../binding/dom/codec/impl/NodeCodecContext.java | 11 +++++++++++ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java index e7961a546a..584ea26a6e 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java @@ -368,13 +368,10 @@ abstract class DataObjectCodecContext childContext = byMethod.get(method).get(); @SuppressWarnings("unchecked") final Optional> domChild = domData.getChild(childContext.getDomPathArgument()); - if (domChild.isPresent()) { - return childContext.deserializeObject(domChild.get()); - } else if (childContext instanceof LeafNodeCodecContext) { - return ((LeafNodeCodecContext)childContext).defaultObject(); - } else { - return null; - } + + // We do not want to use Optional.map() here because we do not want to invoke defaultObject() when we have + // normal value because defaultObject() may end up throwing an exception intentionally. + return domChild.isPresent() ? childContext.deserializeObject(domChild.get()) : childContext.defaultObject(); } @SuppressWarnings("checkstyle:illegalCatch") diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java index 9844149cc7..385c6095f0 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.Set; -import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec; import org.opendaylight.yangtools.concepts.Codec; @@ -230,12 +229,8 @@ final class LeafNodeCodecContext extends NodeCodecContext< return ChildAddressabilitySummary.UNADDRESSABLE; } - /** - * Return the default value object. - * - * @return The default value object, or null if the default value is not defined. - */ - @Nullable Object defaultObject() { + @Override + Object defaultObject() { return defaultObject; } } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java index 3311ae59de..868aa3a804 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java @@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import com.google.common.collect.ImmutableMap; import java.util.List; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.concepts.Codec; @@ -94,5 +95,15 @@ abstract class NodeCodecContext implements BindingCodecTre } } + /** + * Return the default value object. Implementations of this method are explicitly allowed to throw unchecked + * exceptions, which are propagated as-is upwards the stack. + * + * @return The default value object, or null if the default value is not defined. + */ + @Nullable Object defaultObject() { + return null; + } + protected abstract Object deserializeObject(NormalizedNode normalizedNode); } -- 2.36.6