From: Martin Ciglan Date: Fri, 18 Nov 2016 14:25:13 +0000 (+0100) Subject: Bug 6135: Java binding v1: IAE from provideTypeForLeafref X-Git-Tag: release/boron-sr2~2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=inline;h=ecbf2bf2d0398d008f8eeb9c7200e72f450a120a;hp=62a591d105563555955efeeddb4f16af38529d57;p=mdsal.git Bug 6135: Java binding v1: IAE from provideTypeForLeafref - add referenced types in order to resolve leafrefs (main idea of this bug) - do it in rather conservative way to not to spoil BGPCEP build - fix back non-sense change in GenEnumResolvingTest.java to original state Change-Id: I0d7083c7b71e07cb60a22f3106657060a2936c9c Signed-off-by: Martin Ciglan (cherry picked from commit 504fb56ec17458fc9cdd62127484bd780e53f04c) --- diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java index 9e99a2ac40..8ae66d0d0b 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -27,6 +27,7 @@ import static org.opendaylight.yangtools.binding.generator.util.Types.typeForCla import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findNodeInSchemaContext; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -1420,7 +1421,6 @@ public class BindingGeneratorImpl implements BindingGenerator { final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(), typeBuilder, module); - if (enumBuilder != null) { returnType = enumBuilder.toInstance(typeBuilder); } @@ -1453,6 +1453,10 @@ public class BindingGeneratorImpl implements BindingGenerator { return null; } + if (typeDef instanceof EnumTypeDefinition) { + ((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType); + } + String leafDesc = leaf.getDescription(); if (leafDesc == null) { leafDesc = ""; diff --git a/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/Bug6135Test.java b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/Bug6135Test.java new file mode 100644 index 0000000000..8024f377a8 --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/Bug6135Test.java @@ -0,0 +1,51 @@ +/* + * 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.yangtools.sal.binding.generator.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.util.List; +import org.junit.Ignore; +import org.junit.Test; +import org.opendaylight.yangtools.sal.binding.model.api.Enumeration; +import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType; +import org.opendaylight.yangtools.sal.binding.model.api.Type; +import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; +import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext; + +public class Bug6135Test { + + @Ignore + @Test + public void bug6135Test() throws ReactorException { + final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild(); + reactor.addSource(new YangStatementSourceImpl("/bug-6135/foo.yang", false)); + + final EffectiveSchemaContext context = reactor.buildEffective(); + assertNotNull(context); + + final List generateTypes = new BindingGeneratorImpl(false).generateTypes(context); + assertFalse(generateTypes.isEmpty()); + + GeneratedType genInterface = null; + for (final Type type : generateTypes) { + if (type.getName().equals("TestLeafrefData")) { + genInterface = (GeneratedType) type; + break; + } + } + assertNotNull(genInterface); + final List enums = genInterface.getEnumerations(); + assertEquals(2, enums.size()); + } +} \ No newline at end of file diff --git a/binding/mdsal-binding-generator-impl/src/test/resources/bug-6135/foo.yang b/binding/mdsal-binding-generator-impl/src/test/resources/bug-6135/foo.yang new file mode 100644 index 0000000000..788b0f28eb --- /dev/null +++ b/binding/mdsal-binding-generator-impl/src/test/resources/bug-6135/foo.yang @@ -0,0 +1,72 @@ +module test-leafref { + + namespace "odl:test:leafref"; + prefix "tl"; + revision 2015-04-09; + + typedef my-enum { + type enumeration { + enum one { + value 1; + } + } + } + + leaf my-inner-leaf { + type my-enum; + } + + leaf my-leafref-inner { + type leafref { + path "/tl:my-inner-leaf"; + } + } + + leaf my-leaf { + type enumeration { + enum one { + value 1; + } + } + } + + leaf my-leafref { + type leafref { + path "/tl:my-leaf"; + } + } + + leaf-list list-of-enums-inner { + type enumeration { + enum x; + enum y; + enum z; + } + } + + leaf-list enums { + type leafref { + path "/tl:list-of-enums"; + } + } + + leaf-list list-of-enums { + type leafref { + path "/tl:my-leaf"; + } + } + + grouping my-group { + container my-cont { + leaf my-enum { + type my-enum; + mandatory true; + } + } + } + + container my-cont2 { + uses my-group; + } + +} \ No newline at end of file