From df985b44524785ba0eff9ade990ab4031c1a6c30 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 2 Jul 2019 13:49:06 +0200 Subject: [PATCH] Fix augmented action code generation When an action is introduced as part of an augment statement, we attempt to generate it in the augmented module, which refuses to generate its input/output statements, leading to a NPE. This patch updates codegen to ignore augmenting actions in the augmented module and process them as part of augmentation. JIRA: MDSAL-459 Change-Id: Ibd7d7abc5ec1eec6d32ee1885da00a0de69b2445 Signed-off-by: Robert Varga (cherry picked from commit dee452d009946a175273ac2a21dca4174b2142af) --- .../generator/impl/AbstractTypeGenerator.java | 7 +++- .../binding/generator/impl/Mdsal459Test.java | 40 +++++++++++++++++++ .../src/test/resources/mdsal-459/aug.yang | 16 ++++++++ .../src/test/resources/mdsal-459/base.yang | 10 +++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal459Test.java create mode 100644 binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/aug.yang create mode 100644 binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/base.yang diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java index 27d9cf9355..9942b680bd 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java @@ -416,6 +416,10 @@ abstract class AbstractTypeGenerator { private void actionsToGenType(final ModuleContext context, final Type parent, final T parentSchema, final Type keyType, final boolean inGrouping) { for (final ActionDefinition action : parentSchema.getActions()) { + if (action.isAugmenting()) { + continue; + } + final GeneratedType input; final GeneratedType output; if (action.isAddedByUses()) { @@ -920,12 +924,13 @@ abstract class AbstractTypeGenerator { addImplementedInterfaceFromUses(augSchema, augTypeBuilder); augSchemaNodeToMethods(context, augTypeBuilder, augSchema.getChildNodes(), inGrouping); + actionsToGenType(context, augTypeBuilder, augSchema, null, inGrouping); augmentBuilders.put(augTypeName, augTypeBuilder); if (!augSchema.getChildNodes().isEmpty()) { context.addTypeToAugmentation(augTypeBuilder, augSchema); - } + context.addAugmentType(augTypeBuilder); return augTypeBuilder; } diff --git a/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal459Test.java b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal459Test.java new file mode 100644 index 0000000000..fdbe9a3ab0 --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal459Test.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.generator.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import com.google.common.collect.ImmutableSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.Test; +import org.opendaylight.mdsal.binding.model.api.JavaTypeName; +import org.opendaylight.mdsal.binding.model.api.Type; +import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; + +public class Mdsal459Test { + + @Test + public void testAugmentedAction() { + final List types = new BindingGeneratorImpl().generateTypes( + YangParserTestUtils.parseYangResourceDirectory("/mdsal-459/")); + assertNotNull(types); + assertEquals(6, types.size()); + + final Set typeNames = types.stream().map(Type::getIdentifier).collect(Collectors.toSet()); + assertEquals(ImmutableSet.of( + JavaTypeName.create("org.opendaylight.yang.gen.v1.base.norev", "Foo"), + JavaTypeName.create("org.opendaylight.yang.gen.v1.base.norev", "BaseData"), + JavaTypeName.create("org.opendaylight.yang.gen.v1.aug.norev", "Foo1"), + JavaTypeName.create("org.opendaylight.yang.gen.v1.aug.norev.foo", "Bar"), + JavaTypeName.create("org.opendaylight.yang.gen.v1.aug.norev.foo.bar", "Output"), + JavaTypeName.create("org.opendaylight.yang.gen.v1.aug.norev.foo.bar", "Input")), typeNames); + } +} diff --git a/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/aug.yang b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/aug.yang new file mode 100644 index 0000000000..72504ea392 --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/aug.yang @@ -0,0 +1,16 @@ +module aug { + yang-version 1.1; + namespace "aug"; + prefix "aug"; + + import base { + prefix base; + } + + augment /base:foo { + action bar { + + } + } +} + diff --git a/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/base.yang b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/base.yang new file mode 100644 index 0000000000..e8801347d4 --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-459/base.yang @@ -0,0 +1,10 @@ +module base { + yang-version 1.1; + namespace "base"; + prefix "base"; + + container foo { + + } +} + -- 2.36.6