Refactor DataObjectCodecContext.getBindingChildValue() 23/77623/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Nov 2018 14:01:07 +0000 (15:01 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Nov 2018 14:30:33 +0000 (15:30 +0100)
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 <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java

index e7961a546a5a32c45510bef6f8df87df4d6d8589..584ea26a6e6e9454a46c6de5cb45786a2323a286 100644 (file)
@@ -368,13 +368,10 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
         final NodeCodecContext<?> childContext = byMethod.get(method).get();
         @SuppressWarnings("unchecked")
         final Optional<NormalizedNode<?, ?>> 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")
index 9844149cc7202d7ebf0f343d7c01234179a310f1..385c6095f0e1b8e2b40afdd1ebad887909d56af8 100644 (file)
@@ -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<D extends DataObject> 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;
     }
 }
index 3311ae59de63a11fb1fe65a7e3e6d05cf9267d1c..868aa3a804b12f65b64e57ca3f133c8612fe9315 100644 (file)
@@ -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<D extends DataObject> 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);
 }