Binding generator v2 - augment statement #4 71/60471/2
authorJie Han <han.jie@zte.com.cn>
Mon, 10 Jul 2017 07:26:59 +0000 (15:26 +0800)
committerMartin Ciglan <martin.ciglan@pantheon.tech>
Mon, 17 Jul 2017 11:24:59 +0000 (11:24 +0000)
- resolve augmentation that target in same module

Change-Id: Ic01b3e34271ba3f667ef3a6dc95482640bd9b895
Signed-off-by: Jie Han <han.jie@zte.com.cn>
(cherry picked from commit b1fa86d7d82b6f20576b8b1f94af90081b44a3e6)

binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java
binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement1.yang [new file with mode: 0644]
binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement2.yang [new file with mode: 0644]

index 2c2f77027704aec7b3df83fe03965876e313a02b..641b71232c5cac92d30cff32516452df569cddd1 100644 (file)
@@ -166,15 +166,19 @@ final class AugmentToGenType {
 
         final Set<AugmentationSchema> augmentations = module.getAugmentations();
         final List<AugmentationSchema> sortedAugmentations = new ArrayList<>(augmentations).stream()
-                .filter(aug -> !module.equals(schemaContext.findModuleByNamespaceAndRevision(
-                        aug.getTargetPath().getLastComponent().getNamespace(),
-                        aug.getTargetPath().getLastComponent().getRevision())))
+                .filter(aug -> !module.equals(findAugmentTargetModule(schemaContext, aug)))
                 .collect(Collectors.toList());
         Collections.sort(sortedAugmentations, AUGMENT_COMP);
 
         return sortedAugmentations;
     }
 
+    public static Module findAugmentTargetModule(final SchemaContext schemaContext , final AugmentationSchema aug) {
+        Preconditions.checkNotNull(aug, "Augmentation schema can not be null.");
+        final QName first = aug.getTargetPath().getPathFromRoot().iterator().next();
+        return schemaContext.findModuleByNamespaceAndRevision(first.getNamespace(), first.getRevision());
+    }
+
     /**
      * Converts <code>augSchema</code> to list of <code>Type</code> which
      * contains generated type for augmentation. In addition there are also
index d10b724bbeae6ed483bbd38a49d2a3b87812e9c0..4ed8c68fabdca4fcc756a52c4eab4e15f945dece 100644 (file)
@@ -11,7 +11,6 @@ package org.opendaylight.mdsal.binding.javav2.generator.impl;
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.addTOToTypeBuilder;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.annotateDeprecatedIfNecessary;
-import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.augGenTypeName;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.constructGetter;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.createDescription;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.AuxiliaryGenUtils.createReturnTypeForUnion;
@@ -38,7 +37,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
@@ -52,7 +50,6 @@ import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.build
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.GroupingDefinitionDependencySort;
 import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl;
 import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier;
-import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions;
@@ -68,7 +65,6 @@ import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
 import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable;
 import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -91,6 +87,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.meta.ModelStatement;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
@@ -245,7 +242,7 @@ final class GenHelperUtil {
 
         if (schemaNodes != null && parent != null) {
             for (final DataSchemaNode schemaNode : schemaNodes) {
-                if (resolveDataSchemaNodesCheck(schemaNode)) {
+                if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) {
                     addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, parent, childOf, module, genCtx,
                             schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
                 }
@@ -254,9 +251,18 @@ final class GenHelperUtil {
         return parent;
     }
 
-    static boolean resolveDataSchemaNodesCheck(final DataSchemaNode schemaNode) {
-        if (!(schemaNode.isAugmenting() && !schemaNode.isAddedByUses())) {
+    static boolean resolveDataSchemaNodesCheck(final Module module, final SchemaContext schemaContext,
+            final DataSchemaNode schemaNode) {
+        if (!schemaNode.isAugmenting()) {
             return true;
+        } else if (schemaNode.isAugmenting()) {
+            Preconditions.checkState(schemaNode instanceof ModelStatement<?>);
+            QName qname = schemaNode.getPath().getLastComponent();
+            final Module originalModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(),
+                    qname.getRevision());
+            if (module.equals(originalModule)) {
+                return true;
+            }
         }
 
         return false;
@@ -772,7 +778,7 @@ final class GenHelperUtil {
             if (namespaceType.equals(BindingNamespaceType.Grouping)) {
                 final GeneratedTypeBuilder genTypeBuilder = resolveListKeyTypeBuilder(packageName, node);
                 for (final DataSchemaNode schemaNode : node.getChildNodes()) {
-                    if (resolveDataSchemaNodesCheck(schemaNode)) {
+                    if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) {
                         addSchemaNodeToListTypeBuilders(nodeName, basePackageName, schemaNode, genType, genTypeBuilder, listKeys,
                                 module, typeProvider, schemaContext, genCtx, genTypeBuilders, verboseClassComments, namespaceType);
                     }
@@ -784,7 +790,7 @@ final class GenHelperUtil {
             } else {
                 final GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, node);
                 for (final DataSchemaNode schemaNode : node.getChildNodes()) {
-                    if (resolveDataSchemaNodesCheck(schemaNode)) {
+                    if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) {
                         addSchemaNodeToListBuilders(nodeName, basePackageName, schemaNode, genType, genTOBuilder, listKeys,
                                 module, typeProvider, schemaContext, genCtx, genTypeBuilders, verboseClassComments, namespaceType);
                     }
@@ -1026,7 +1032,7 @@ final class GenHelperUtil {
         }
 
         for (final ChoiceCaseNode caseNode : caseNodes) {
-            if (caseNode != null && resolveDataSchemaNodesCheck(caseNode)) {
+            if (caseNode != null && resolveDataSchemaNodesCheck(module, schemaContext, caseNode)) {
                 final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(basePackageName, caseNode,
                     module, genCtx, schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
                 caseTypeBuilder.addImplementsType(refChoiceType);
index 125df3b830969fb03de3cd69c3525c2fef6804ec..1c0557cc181d405a3d42e4e6f7b3950c42be6c88 100644 (file)
@@ -285,8 +285,8 @@ public class AugmentToGenTypeTest {
         augmentations.add(augmentationSchema2);
 
         when(m.getAugmentations()).thenReturn(augmentations);
-        when(schemaContext.findModuleByNamespaceAndRevision(q2.getNamespace(), q2.getRevision())).thenReturn(m2);
-        when(schemaContext.findModuleByNamespaceAndRevision(q5.getNamespace(), q5.getRevision())).thenReturn(m2);
+        when(schemaContext.findModuleByNamespaceAndRevision(q1.getNamespace(), q1.getRevision())).thenReturn(m2);
+        when(schemaContext.findModuleByNamespaceAndRevision(q3.getNamespace(), q3.getRevision())).thenReturn(m2);
 
         final Object[] args = { m, schemaContext };
 
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement1.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement1.yang
new file mode 100644 (file)
index 0000000..1c49bb3
--- /dev/null
@@ -0,0 +1,24 @@
+module test-augment-statement1 {
+    yang-version 1.1;
+
+    namespace "urn:test:augment:statement1";
+    prefix test-augment-statement1;
+    organization "test.type.org";
+    revision "2017-07-10";
+
+    grouping s1-grp {
+        leaf leaf-s1-grp {
+            type string;
+        }
+        container cont-s1-grp {
+        }
+    }
+
+    container top {
+    }
+
+    augment "/top" {
+        container foo {
+        }
+    }
+}
diff --git a/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement2.yang b/binding2/mdsal-binding2-generator-impl/src/test/resources/uses-statement/test-augment-statement2.yang
new file mode 100644 (file)
index 0000000..b52c044
--- /dev/null
@@ -0,0 +1,38 @@
+module test-augment-statement2 {
+    yang-version 1.1;
+
+    namespace "urn:test:augment:statement2";
+    prefix test-augment-statement2;
+    organization "test.type.org";
+    revision "2017-07-10";
+
+    import test-augment-statement1 {
+        prefix "s1";
+    }
+
+    grouping s2-grp {
+        leaf leaf-s2-grp {
+            type string;
+        }
+
+    }
+
+    container bar {
+    }
+
+    augment "/s1:top" {
+        container bar1 {
+        }
+        leaf leaf-s2-aug {
+            type string;
+        }
+        uses s2-grp;
+    }
+
+    augment "/s1:top" {
+        container bar2 {
+        }
+
+        uses s1:s1-grp;
+    }
+}