Bug 1443: Fixed incorrect throw of IllegalArgumentException in getAugmentation 99/10099/2
authorTony Tkacik <ttkacik@cisco.com>
Wed, 20 Aug 2014 08:55:10 +0000 (10:55 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Wed, 20 Aug 2014 13:53:34 +0000 (15:53 +0200)
Change-Id: If58292afba9c634fb4368f70d541d4a7cdf02cf6
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/ChoiceNodeCodecContext.java
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/DataContainerCodecContext.java
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/DataObjectCodecContext.java
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/LazyDataObject.java
code-generator/binding-data-codec/src/main/java/org/opendaylight/yangtools/binding/data/codec/impl/SchemaRootCodecContext.java

index dcaecd34c8b637c19f4f1a92dad692aa5eb46c8a..700476f86bae3d79c3ed8c8d4d6e4315a7bac807 100644 (file)
@@ -11,10 +11,8 @@ import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
-
 import java.util.HashMap;
 import java.util.Map;
-
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -59,7 +57,18 @@ final class ChoiceNodeCodecContext extends DataContainerCodecContext<ChoiceNode>
 
     @Override
     protected DataContainerCodecContext<?> getStreamChild(final Class<?> childClass) {
-        return byClass.get(childClass).get();
+        DataContainerCodecPrototype<?> child = byClass.get(childClass);
+        Preconditions.checkArgument(child != null,"Supplied class is not valid case",childClass);
+        return child.get();
+    }
+
+    @Override
+    protected Optional<DataContainerCodecContext<?>> getPossibleStreamChild(final Class<?> childClass) {
+        DataContainerCodecPrototype<?> child = byClass.get(childClass);
+        if(child != null) {
+            return Optional.<DataContainerCodecContext<?>>of(child.get());
+        }
+        return Optional.absent();
     }
 
     Iterable<Class<?>> getCaseChildrenClasses() {
index 6b1124c30e96e012b14c4b0ab6ebe9fec83a8698..e873126598ba7f8cac91c29a1cbf7983c39e56ed 100644 (file)
@@ -7,8 +7,8 @@
  */
 package org.opendaylight.yangtools.binding.data.codec.impl;
 
+import com.google.common.base.Optional;
 import java.util.List;
-
 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
@@ -92,8 +92,20 @@ abstract class DataContainerCodecContext<T> extends NodeCodecContext {
      *
      * @param childClass
      * @return Context of child
+     * @throws IllegalArgumentException If supplied child class is not valid in specified context.
      */
-    protected abstract DataContainerCodecContext<?> getStreamChild(final Class<?> childClass);
+    protected abstract DataContainerCodecContext<?> getStreamChild(final Class<?> childClass) throws IllegalArgumentException;
+
+    /**
+    *
+    * Returns child context as if it was walked by
+    * {@link BindingStreamEventWriter}. This means that to enter case, one
+    * must issue getChild(ChoiceClass).getChild(CaseClass).
+    *
+    * @param childClass
+    * @return Context of child or Optional absent is supplied class is not applicable in context.
+    */
+   protected abstract Optional<DataContainerCodecContext<?>> getPossibleStreamChild(final Class<?> childClass);
 
     @Override
     public String toString() {
index 321f8ded5b5acaa573fc3cd1c5cf0612692efca4..32fdf6d80ea597da1c4ec000bcecb880c9564564 100644 (file)
@@ -10,14 +10,12 @@ package org.opendaylight.yangtools.binding.data.codec.impl;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
-
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-
 import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
@@ -113,6 +111,15 @@ abstract class DataObjectCodecContext<T extends DataNodeContainer> extends DataC
         return childProto.get();
     }
 
+    @Override
+    protected Optional<DataContainerCodecContext<?>> getPossibleStreamChild(final Class<?> childClass) {
+        DataContainerCodecPrototype<?> childProto = byStreamClass.get(childClass);
+        if(childProto != null) {
+            return Optional.<DataContainerCodecContext<?>>of(childProto.get());
+        }
+        return Optional.absent();
+    }
+
     @Override
     protected DataContainerCodecContext<?> getIdentifierChild(final InstanceIdentifier.PathArgument arg,
             final List<YangInstanceIdentifier.PathArgument> builder) {
index d7ede0fbb83ad1dc719ab4e211b0095ca8c70959..c86585c7e09c6541069fed00158c306dc625f753 100644 (file)
@@ -11,7 +11,6 @@ import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
-
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -19,7 +18,6 @@ import java.lang.reflect.Proxy;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
-
 import org.opendaylight.yangtools.binding.data.codec.util.AugmentationReader;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
@@ -164,11 +162,13 @@ class LazyDataObject implements InvocationHandler, AugmentationReader {
         if (aug != null) {
             return aug.get(cls);
         }
-
-        final DataContainerCodecContext<?> augCtx = context.getStreamChild(cls);
-        final Optional<NormalizedNode<?, ?>> augData = data.getChild(augCtx.getDomPathArgument());
-        if (augData.isPresent()) {
-            return augCtx.dataFromNormalizedNode(augData.get());
+        Preconditions.checkNotNull(cls,"Supplied augmentation must not be null.");
+        final Optional<DataContainerCodecContext<?>> augCtx= context.getPossibleStreamChild(cls);
+        if(augCtx.isPresent()) {
+            final Optional<NormalizedNode<?, ?>> augData = data.getChild(augCtx.get().getDomPathArgument());
+            if (augData.isPresent()) {
+                return augCtx.get().dataFromNormalizedNode(augData.get());
+            }
         }
         return null;
     }
index 1a57b21623f7f7dec3c27e66275e873d5792c90f..be328ca199ddd388df298159df847e3d90b6f46d 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.yangtools.binding.data.codec.impl;
 
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
-
 import org.opendaylight.yangtools.util.ClassLoaderUtils;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataRoot;
@@ -59,6 +59,11 @@ class SchemaRootCodecContext extends DataContainerCodecContext<SchemaContext> {
         return children.getUnchecked(childClass);
     }
 
+    @Override
+    protected Optional<DataContainerCodecContext<?>> getPossibleStreamChild(final Class<?> childClass) {
+        throw new UnsupportedOperationException("Not supported");
+    }
+
     @Override
     protected YangInstanceIdentifier.PathArgument getDomPathArgument() {
         throw new UnsupportedOperationException();