Bug 6135: Java binding v1: IAE from provideTypeForLeafref 02/48702/1
authorMartin Ciglan <mciglan@cisco.com>
Fri, 18 Nov 2016 14:25:13 +0000 (15:25 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 25 Nov 2016 13:58:25 +0000 (13:58 +0000)
- 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 <mciglan@cisco.com>
(cherry picked from commit 504fb56ec17458fc9cdd62127484bd780e53f04c)

binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/generator/impl/Bug6135Test.java [new file with mode: 0644]
binding/mdsal-binding-generator-impl/src/test/resources/bug-6135/foo.yang [new file with mode: 0644]

index 9e99a2ac40fdd3a5db54eefa50897b3eeb4c1941..8ae66d0d0b6ccb1090f5b222ee5592c2650190f7 100644 (file)
@@ -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 (file)
index 0000000..8024f37
--- /dev/null
@@ -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<Type> 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<Enumeration> 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 (file)
index 0000000..788b0f2
--- /dev/null
@@ -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