Bug 5524: NPE in BA->BI serialization 12/37312/3
authorFilip Gregor <fgregor@cisco.com>
Fri, 8 Apr 2016 07:39:44 +0000 (09:39 +0200)
committerFilip Gregor <fgregor@cisco.com>
Wed, 13 Apr 2016 09:07:26 +0000 (11:07 +0200)
added check to RuntimeContext, tests

Change-Id: I5574469506cd6a7df5a54b47e3cdca34a68c7834
Signed-off-by: Filip Gregor <fgregor@cisco.com>
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java [new file with mode: 0644]
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java
binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module1.yang [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module2.yang [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module3.yang [new file with mode: 0644]
binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module4.yang [new file with mode: 0644]

diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java
new file mode 100644 (file)
index 0000000..3bc5421
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.mdsal.binding.dom.adapter.test;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.Collections;
+import javassist.ClassPool;
+import org.junit.Test;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.ListModule11Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.ListModule12Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.list.module1._2.ContainerModule1Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.ContainerManualListModule11Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.ContainerModule11;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.ContainerModule11Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.ManualListModule11Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.container.manual.list.module1._1.ContainerManualListModule12Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.container.manual.list.module1._1.container.manual.list.module1._2.ContainerManualContainerModule1Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.container.manual.list.module1._1.container.manual.list.module1._2.container.manual.container.module1.ContainerManualContainerModule2Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.manual.list.module1._1.ManualListModule12Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module3.rev160101.grouping.module3.manual.list.module1._1.manual.list.module1._2.ManualContainerModule1Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.Module4Main;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.Module4MainBuilder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.ContainerModule4Builder;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.container.module._4.ManualContainerModule11;
+import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.container.module._4.ManualContainerModule11Builder;
+import org.opendaylight.yangtools.binding.data.codec.gen.impl.StreamWriterGenerator;
+import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.sal.binding.generator.util.JavassistUtils;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+public class Bug5524augmentUses extends AbstractDataBrokerTest {
+
+    @Test
+    public void testBug5224() throws Exception {
+        final BindingToNormalizedNodeCodec mappingService = new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
+                new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))));
+        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Module4Main.class));
+        mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
+
+        final Module4Main module4Main = new Module4MainBuilder().setContainerModule4(
+                new ContainerModule4Builder().setListModule11(Collections.singletonList(
+                        new ListModule11Builder().setListModule12(Collections.singletonList(
+                                new ListModule12Builder().setContainerModule1(
+                                        new ContainerModule1Builder().addAugmentation(ContainerModule11.class, new ContainerModule11Builder().build()).build())
+                                        .build())).build())).build()).build();
+
+        final Module4Main manualModule4Main = new Module4MainBuilder().setContainerModule4(
+                new ContainerModule4Builder().setManualListModule11(Collections.singletonList(
+                        new ManualListModule11Builder().setManualListModule12(Collections.singletonList(
+                                new ManualListModule12Builder().setManualContainerModule1(
+                                        new ManualContainerModule1Builder().addAugmentation(ManualContainerModule11.class, new ManualContainerModule11Builder().build()).build())
+                                        .build())).build())).build()).build();
+
+        final Module4Main contManualModule4Main = new Module4MainBuilder().setContainerModule4(
+                new ContainerModule4Builder().setContainerManualListModule11(Collections.singletonList(
+                        new ContainerManualListModule11Builder().setContainerManualListModule12(Collections.singletonList(
+                                new ContainerManualListModule12Builder().setContainerManualContainerModule1(
+                                        new ContainerManualContainerModule1Builder().setContainerManualContainerModule2
+                                                (new ContainerManualContainerModule2Builder().build()).build())
+                                        .build())).build())).build()).build();
+
+        final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
+        final BindingCodecTreeNode<Module4Main> subtreeCodec = codecContext.getSubtreeCodec(InstanceIdentifier.create(Module4Main.class));
+        final NormalizedNode<?, ?> serialized = subtreeCodec.serialize(module4Main);
+        final NormalizedNode<?, ?> manualSerialized = subtreeCodec.serialize(manualModule4Main);
+        final NormalizedNode<?, ?> containerManualSerialized = subtreeCodec.serialize(contManualModule4Main);
+        assertNotNull(serialized);
+        assertNotNull(manualSerialized);
+        assertNotNull(containerManualSerialized);
+    }
+}
\ No newline at end of file
index bdcd7c719886e464611b7fd98ed0edb6e60c0487..48da02b8ffdbc25c65e03992a4d224150cdf7d37 100644 (file)
@@ -18,7 +18,6 @@ import com.google.common.collect.HashBiMap;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimap;
-import java.util.AbstractMap;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.Collection;
 import java.util.HashMap;
@@ -214,13 +213,24 @@ public class BindingRuntimeContext implements Immutable {
         final Set<QName> childNames = new HashSet<>();
         final Set<DataSchemaNode> realChilds = new HashSet<>();
         for (final DataSchemaNode child : origSchema.getChildNodes()) {
-            realChilds.add(target.getDataChildByName(child.getQName()));
-            childNames.add(child.getQName());
+            final DataSchemaNode dataChildQNname = target.getDataChildByName(child.getQName());
+            final String childLocalName = child.getQName().getLocalName();
+            if (dataChildQNname == null) {
+                for (DataSchemaNode dataSchemaNode : target.getChildNodes()) {
+                    if (childLocalName.equals(dataSchemaNode.getQName().getLocalName())) {
+                        realChilds.add(dataSchemaNode);
+                        childNames.add(dataSchemaNode.getQName());
+                    }
+                }
+            } else {
+                realChilds.add(dataChildQNname);
+                childNames.add(child.getQName());
+            }
         }
 
         final AugmentationIdentifier identifier = new AugmentationIdentifier(childNames);
         final AugmentationSchema proxy = new EffectiveAugmentationSchema(origSchema, realChilds);
-        return new AbstractMap.SimpleEntry<>(identifier, proxy);
+        return new SimpleEntry<>(identifier, proxy);
     }
 
     /**
@@ -317,7 +327,7 @@ public class BindingRuntimeContext implements Immutable {
      * @return mapped enum constants from yang with their corresponding values in generated binding classes
      */
     public BiMap<String, String> getEnumMapping(final Class<?> enumClass) {
-        final Map.Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
+        final Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
         return getEnumMapping(typeWithSchema);
     }
 
@@ -325,7 +335,7 @@ public class BindingRuntimeContext implements Immutable {
      * See {@link #getEnumMapping(Class)}}
      */
     public BiMap<String, String> getEnumMapping(final String enumClass) {
-        final Map.Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
+        final Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
         return getEnumMapping(typeWithSchema);
     }
 
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module1.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module1.yang
new file mode 100644 (file)
index 0000000..81380b1
--- /dev/null
@@ -0,0 +1,53 @@
+module opendaylight-bug-5524-module1 {
+    namespace "urn:test:opendaylight-bug-5524-module1";
+    prefix module1;
+
+    revision 2016-01-01 {
+    }
+
+    notification notification-module1 {
+        uses grouping-module1;
+    }
+
+    grouping grouping-module1 {
+        list list-module1-1 {
+            list list-module1-2 {
+                container container-module1 {
+                }
+            }
+        }
+    }
+
+    grouping uses-grouping-augmet-testgrouping-inner {
+        container container-augmet-1 {
+        }
+    }
+
+    grouping uses-grouping-augmet-testgrouping-outer {
+        uses uses-grouping-augmet-testgrouping-inner {
+            augment "container-augmet-1" {
+                container container-2 {
+                }
+            }
+        }
+    }
+
+    grouping uses-grouping-testgrouping-inner {
+        container container-1 {
+            container container-2 {
+            }
+        }
+    }
+
+    grouping uses-grouping-testgrouping-outer {
+        uses uses-grouping-testgrouping-inner;
+    }
+
+    container container-augment {
+        uses uses-grouping-augmet-testgrouping-outer;
+    }
+
+    container container-manual {
+        uses uses-grouping-testgrouping-outer;
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module2.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module2.yang
new file mode 100644 (file)
index 0000000..2861591
--- /dev/null
@@ -0,0 +1,21 @@
+module opendaylight-bug-5524-module2 {
+    namespace "urn:test:opendaylight-bug-5524-module2";
+    prefix module2;
+
+    revision 2016-01-01 {
+    }
+
+    import opendaylight-bug-5524-module1 {
+        prefix mod1;
+        revision-date 2016-01-01;
+    }
+
+    grouping grouping-module2 {
+        container container-module2 {
+        }
+    }
+
+    augment "/mod1:notification-module1/mod1:list-module1-1/mod1:list-module1-2/mod1:container-module1" {
+        uses grouping-module2;
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module3.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module3.yang
new file mode 100644 (file)
index 0000000..380cea2
--- /dev/null
@@ -0,0 +1,51 @@
+module opendaylight-bug-5524-module3 {
+    namespace "urn:test:opendaylight-bug-5524-module3";
+    prefix module3;
+
+    revision 2016-01-01 {
+    }
+
+    import opendaylight-bug-5524-module1 {
+        prefix mod1;
+        revision-date 2016-01-01;
+    }
+
+    import opendaylight-bug-5524-module2 {
+        prefix mod2;
+        revision-date 2016-01-01;
+    }
+
+    grouping grouping-module3 {
+        list container-manual-list-module1-1 {
+            list container-manual-list-module1-2 {
+                container container-manual-container-module1 {
+                    container container-manual-container-module2 {
+                    }
+                }
+            }
+        }
+        list manual-list-module1-1 {
+            list manual-list-module1-2 {
+                container manual-container-module1 {
+                }
+            }
+        }
+        uses mod1:grouping-module1 {
+            augment "list-module1-1/list-module1-2/container-module1" {
+                uses mod2:grouping-module2;
+            }
+        }
+    }
+
+    container module3-main {
+        container container-module-3 {
+            uses grouping-module3;
+        }
+    }
+
+    grouping grouping-module3-main {
+        container container-module3 {
+            uses grouping-module3;
+        }
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module4.yang b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module4.yang
new file mode 100644 (file)
index 0000000..4741754
--- /dev/null
@@ -0,0 +1,27 @@
+module opendaylight-bug-5524-module4 {
+    namespace "urn:test:opendaylight-bug-5524-module4";
+    prefix module4;
+
+    revision 2016-01-01 {
+    }
+
+    import opendaylight-bug-5524-module3 {
+        prefix mod3;
+        revision-date 2016-01-01;
+    }
+
+    import opendaylight-bug-5524-module2 {
+        prefix mod2;
+        revision-date 2016-01-01;
+    }
+
+    container module4-main {
+        container container-module-4 {
+            uses mod3:grouping-module3 {
+                augment "manual-list-module1-1/manual-list-module1-2/manual-container-module1" {
+                    uses mod2:grouping-module2;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file