Prevent submitting of structural reader for list node 70/4870/2
authorJan Srnicek <jsrnicek@cisco.com>
Tue, 7 Feb 2017 08:33:38 +0000 (09:33 +0100)
committerJan Srnicek <jsrnicek@cisco.com>
Tue, 7 Feb 2017 08:33:38 +0000 (09:33 +0100)
 Static customizer must be provided instead till
 HONEYCOMB-344 is resolved

Change-Id: Id71f69fe23b156e6de10eed06a3596de8e602bbe
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
infra/translate-impl/src/main/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryBuilder.java
infra/translate-impl/src/test/java/io/fd/honeycomb/translate/impl/read/registry/CompositeReaderRegistryBuilderTest.java
infra/translate-utils/src/test/java/io/fd/honeycomb/translate/util/DataObjects.java

index 36ab909..dd6a838 100644 (file)
@@ -25,18 +25,23 @@ import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder;
 import io.fd.honeycomb.translate.read.registry.ReaderRegistry;
 import io.fd.honeycomb.translate.read.registry.ReaderRegistryBuilder;
 import io.fd.honeycomb.translate.util.AbstractSubtreeManagerRegistryBuilderBuilder;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.NotThreadSafe;
+
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static com.google.common.base.Preconditions.checkArgument;
+
 @NotThreadSafe
 public final class CompositeReaderRegistryBuilder
         extends AbstractSubtreeManagerRegistryBuilderBuilder<Reader<? extends DataObject, ? extends Builder<?>>, ReaderRegistry>
@@ -48,13 +53,18 @@ public final class CompositeReaderRegistryBuilder
     protected Reader<? extends DataObject, ? extends Builder<?>> getSubtreeHandler(@Nonnull final Set<InstanceIdentifier<?>> handledChildren,
                                                                                    @Nonnull final Reader<? extends DataObject, ? extends Builder<?>> reader) {
         return reader instanceof Initializer
-                ? InitSubtreeReader.createForReader(handledChildren, (InitReader<?, ?>)reader)
+                ? InitSubtreeReader.createForReader(handledChildren, (InitReader<?, ?>) reader)
                 : SubtreeReader.createForReader(handledChildren, reader);
     }
 
     @Override
     public <D extends DataObject> void addStructuralReader(@Nonnull InstanceIdentifier<D> id,
                                                            @Nonnull Class<? extends Builder<D>> builderType) {
+        // TODO https://jira.fd.io/browse/HONEYCOMB-344 provide variant of this method for list nodes
+        // prevent case to submit structural reader for list, which would cause fail because target setter consumes
+        // List<TargetType>, not Target type. If node is static, customizer that handles it should return static list
+        // of IDs.
+        checkArgument(!Identifiable.class.isAssignableFrom(id.getTargetType()), "Structural readers cannot be used for keyed nodes[node type %s]", id.getTargetType());
         add(GenericReader.createReflexive(id, builderType));
     }
 
index 4dee8e6..0c7c71e 100644 (file)
@@ -66,6 +66,11 @@ public class CompositeReaderRegistryBuilderTest {
         return mock;
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testPreventStructuralReaderForList() {
+        new CompositeReaderRegistryBuilder().addStructuralReader(InstanceIdentifier.create(DataObjects.DataObjectK.class), DataObjects.DataObjectKBuilder.class);
+    }
+
     @Test
     public void testCompositeStructure() throws Exception {
         final CompositeReaderRegistryBuilder compositeReaderRegistryBuilder = new CompositeReaderRegistryBuilder();
index 8dd3d20..77db65c 100644 (file)
@@ -60,6 +60,9 @@ public class DataObjects {
         }
     }
 
+    public interface DataObjectKBuilder extends org.opendaylight.yangtools.concepts.Builder<DataObjectK>{
+    }
+
     public interface DataObject1ChildK extends DataObject, ChildOf<DataObject1>, Identifiable<DataObject1ChildKey> {
         // needs to be defined like this to have paths totally equal after cutting path for internally keyed id inside infra
         InstanceIdentifier<DataObject1ChildK> IID =