From: Filip Gregor Date: Fri, 8 Apr 2016 07:39:44 +0000 (+0200) Subject: Bug 5524: NPE in BA->BI serialization X-Git-Tag: release/boron~160 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=mdsal.git;a=commitdiff_plain;h=03c0646c8686c098215e2dc2265512807afe6fa1 Bug 5524: NPE in BA->BI serialization added check to RuntimeContext, tests Change-Id: I5574469506cd6a7df5a54b47e3cdca34a68c7834 Signed-off-by: Filip Gregor --- 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 index 0000000000..3bc5421ede --- /dev/null +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java @@ -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 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 diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java index bdcd7c7198..48da02b8ff 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java @@ -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 childNames = new HashSet<>(); final Set 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 getEnumMapping(final Class enumClass) { - final Map.Entry typeWithSchema = getTypeWithSchema(enumClass); + final Entry typeWithSchema = getTypeWithSchema(enumClass); return getEnumMapping(typeWithSchema); } @@ -325,7 +335,7 @@ public class BindingRuntimeContext implements Immutable { * See {@link #getEnumMapping(Class)}} */ public BiMap getEnumMapping(final String enumClass) { - final Map.Entry typeWithSchema = getTypeWithSchema(enumClass); + final Entry 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 index 0000000000..81380b18d8 --- /dev/null +++ b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module1.yang @@ -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 index 0000000000..2861591278 --- /dev/null +++ b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module2.yang @@ -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 index 0000000000..380cea2c68 --- /dev/null +++ b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module3.yang @@ -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 index 0000000000..4741754ff9 --- /dev/null +++ b/binding/mdsal-binding-test-model/src/main/yang/opendaylight-bug-5524-module4.yang @@ -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