From: Robert Varga Date: Thu, 27 Feb 2020 09:38:33 +0000 (+0100) Subject: Fix action/grouping lookup mechanics X-Git-Tag: v4.0.12~8 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=mdsal.git;a=commitdiff_plain;h=ed45870f6415138a7b11cbedf1dcff8bdd442e38 Fix action/grouping lookup mechanics When we are following references towards the original definitions we need to mind the fact that 'uses' statement may point to a grouping in a different module and hence we need to adjust namespace accordingly. The same thing applies when we want to find generated types for such actions' input/output -- here we need to acquire the correct ModuleContext. JIRA: MDSAL-516 Change-Id: I1931279beb8e663e6d8558d50c5d7d274e248cf3 Signed-off-by: Robert Varga --- 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 678200e287..7db5d01ff7 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 @@ -437,8 +437,11 @@ abstract class AbstractTypeGenerator { final GeneratedType output; if (action.isAddedByUses()) { final ActionDefinition orig = findOrigAction(parentSchema, action).get(); - input = context.getChildNode(orig.getInput().getPath()).build(); - output = context.getChildNode(orig.getOutput().getPath()).build(); + // Original definition may live in a different module, make sure we account for that + final ModuleContext origContext = moduleContext( + orig.getPath().getPathFromRoot().iterator().next().getModule()); + input = origContext.getChildNode(orig.getInput().getPath()).build(); + output = origContext.getChildNode(orig.getOutput().getPath()).build(); } else { input = actionContainer(context, RPC_INPUT, action.getInput(), inGrouping); output = actionContainer(context, RPC_OUTPUT, action.getOutput(), inGrouping); @@ -466,9 +469,12 @@ abstract class AbstractTypeGenerator { } private Optional findOrigAction(final DataNodeContainer parent, final ActionDefinition action) { + final QName qname = action.getQName(); for (UsesNode uses : parent.getUses()) { final GroupingDefinition grp = findUsedGrouping(uses); - final Optional found = grp.findAction(action.getQName()); + // Target grouping may reside in a different module, hence we need to rebind the QName to match grouping's + // namespace + final Optional found = grp.findAction(qname.withModule(grp.getQName().getModule())); if (found.isPresent()) { final ActionDefinition result = found.get(); return result.isAddedByUses() ? findOrigAction(grp, result) : found; diff --git a/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal516Test.java b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal516Test.java new file mode 100644 index 0000000000..3142bfd58a --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/mdsal/binding/generator/impl/Mdsal516Test.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 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 java.util.List; +import org.junit.Test; +import org.opendaylight.mdsal.binding.model.api.Type; +import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; + +public class Mdsal516Test { + @Test + public void testGroupingActionType() { + final List types = new BindingGeneratorImpl().generateTypes( + YangParserTestUtils.parseYangResourceDirectory("/mdsal-516")); + assertNotNull(types); + assertEquals(7, types.size()); + } +} diff --git a/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/bar.yang b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/bar.yang new file mode 100644 index 0000000000..abf384c3ce --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/bar.yang @@ -0,0 +1,10 @@ +module bar { + yang-version 1.1; + namespace "bar"; + prefix bar; + + grouping bar-grp { + action something; + } +} + diff --git a/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/foo.yang b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/foo.yang new file mode 100644 index 0000000000..02e8bc5f4b --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/resources/mdsal-516/foo.yang @@ -0,0 +1,18 @@ +module foo { + yang-version 1.1; + namespace "foo"; + prefix foo; + + import bar { + prefix bar; + } + + grouping foo-grp { + uses bar:bar-grp; + } + + container foo { + uses foo-grp; + } +} +