Fixed path correction process of nodes defined by uses statement. 21/921/1
authorMartin Vitez <mvitez@cisco.com>
Tue, 20 Aug 2013 10:17:14 +0000 (12:17 +0200)
committerMartin Vitez <mvitez@cisco.com>
Tue, 20 Aug 2013 10:19:25 +0000 (12:19 +0200)
Signed-off-by: Martin Vitez <mvitez@cisco.com>
13 files changed:
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UnknownSchemaNode.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/GroupingUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserWithContextTest.java
yang/yang-parser-impl/src/test/resources/context-test/test3.yang

index b279c5c3125bc3068305deb2066ddb1aef6e11e0..e7f5d224b1c7b4fd6534f228b6d77ad10cf3a99d 100644 (file)
@@ -17,4 +17,11 @@ public interface UnknownSchemaNode extends SchemaNode {
 
     boolean isAddedByUses();
 
+    /**
+     * Get extension definition which identifies this node
+     *
+     * @return extension definition if exists, null otherwise
+     */
+    ExtensionDefinition getExtensionDefinition();
+
 }
index 0965f6421321b8fd957614b69cc8e7202a720bc7..344d8623dc57126c7698fb15aa1b9a1160377325 100644 (file)
@@ -71,6 +71,8 @@ public interface UsesNodeBuilder extends GroupingMember, Builder {
 
     void setTargetUnknownNodes(List<UnknownSchemaNodeBuilder> targetUnknownNodes);
 
+    boolean isCopy();
+
     boolean isDataCollected();
 
     void setDataCollected(boolean dataCollected);
index 3b6f2d3f6e3fca9ac9dd430e435802f55cf89810..64759bf083ceb1cbf6daca6ac38e8dc50ec94c88 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AbstractTypeAwareBuild
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder,
         GroupingMember {
@@ -62,6 +63,10 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             instance.setDefault(defaultStr);
             instance.setUnits(unitsStr);
 
+            if (type == null && typedef == null) {
+                throw new YangParseException(moduleName, line, "Failed to resolve leaf type.");
+            }
+
             // TYPE
             if (type == null) {
                 instance.setType(typedef.build());
index 67471068db920398c87a3358b10eaa1820998588..71ff0717b973df0c5d4d6afe190974999cb2e9b0 100644 (file)
@@ -255,6 +255,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         return addedDeviations;
     }
 
+    public List<ExtensionBuilder> getExtensions() {
+        return addedExtensions;
+    }
+
     public List<UnknownSchemaNodeBuilder> getAllUnknownNodes() {
         return allUnknownNodes;
     }
index 9f3855c0af268222d313fbde5f34ffaa177a7a57..68e1cf4b74b923603a2cf18112d1c46ef49eb50c 100644 (file)
@@ -12,6 +12,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -25,6 +26,9 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     private QName nodeType;
     private String nodeParameter;
 
+    private ExtensionDefinition extensionDefinition;
+    private ExtensionBuilder extensionBuilder;
+
     public UnknownSchemaNodeBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line, qname);
         instance = new UnknownSchemaNodeImpl(qname);
@@ -41,6 +45,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
             instance.setStatus(status);
             instance.setAddedByUses(addedByUses);
 
+            // EXTENSION
+            if (extensionDefinition != null) {
+                instance.setExtensionDefinition(extensionDefinition);
+            } else {
+                if (extensionBuilder != null) {
+                    instance.setExtensionDefinition(extensionBuilder.build());
+                }
+            }
+
             // UNKNOWN NODES
             if (unknownNodes == null) {
                 unknownNodes = new ArrayList<UnknownSchemaNode>();
@@ -81,9 +94,26 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
         this.nodeParameter = nodeParameter;
     }
 
+    public ExtensionDefinition getExtensionDefinition() {
+        return extensionDefinition;
+    }
+
+    public void setExtensionDefinition(final ExtensionDefinition extensionDefinition) {
+        this.extensionDefinition = extensionDefinition;
+    }
+
+    public ExtensionBuilder getExtensionBuilder() {
+        return extensionBuilder;
+    }
+
+    public void setExtensionBuilder(final ExtensionBuilder extension) {
+        this.extensionBuilder = extension;
+    }
+
     private final class UnknownSchemaNodeImpl implements UnknownSchemaNode {
         private final QName qname;
         private SchemaPath path;
+        private ExtensionDefinition extension;
         private String description;
         private String reference;
         private Status status = Status.CURRENT;
@@ -110,6 +140,15 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
             this.path = path;
         }
 
+        @Override
+        public ExtensionDefinition getExtensionDefinition() {
+            return extension;
+        }
+
+        private void setExtensionDefinition(final ExtensionDefinition extension) {
+            this.extension = extension;
+        }
+
         @Override
         public String getDescription() {
             return description;
index 7da9c5edffb5a45545e646a2f015ca12d3b3798b..05dd940551757bbc74e74e6a4253769bd872abc8 100644 (file)
@@ -52,9 +52,16 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     private Set<TypeDefinitionBuilder> targetTypedefs = new HashSet<>();\r
     private List<UnknownSchemaNodeBuilder> targetUnknownNodes = new ArrayList<>();\r
 \r
+    private final boolean isCopy;\r
     private boolean dataCollected;\r
     private boolean parentUpdated;\r
 \r
+\r
+    @Override\r
+    public boolean isCopy() {\r
+        return isCopy;\r
+    }\r
+\r
     @Override\r
     public boolean isDataCollected() {\r
         return dataCollected;\r
@@ -78,6 +85,13 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {\r
         super(moduleName, line);\r
         this.groupingName = groupingName;\r
+        isCopy = false;\r
+    }\r
+\r
+    public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) {\r
+        super(moduleName, line);\r
+        this.groupingName = groupingName;\r
+        this.isCopy = isCopy;\r
     }\r
 \r
     @Override\r
index 2eff93d47200ab1f57e236a12267b1796d940790..1021139555f0d19fdfdee4b4bad1841bf57b3078 100644 (file)
@@ -21,6 +21,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -35,6 +36,7 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -53,6 +55,7 @@ import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.DeviationBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.impl.ExtensionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.IdentitySchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
@@ -81,39 +84,33 @@ public final class YangParserImpl implements YangModelParser {
 
     @Override
     public Set<Module> parseYangModels(final List<File> yangFiles, final SchemaContext context) {
-        // TODO
-        throw new YangParseException("Not yet implemented");
-        // if (yangFiles != null) {
-        // final Map<InputStream, File> inputStreams = Maps.newHashMap();
-        //
-        // for (final File yangFile : yangFiles) {
-        // try {
-        // inputStreams.put(new FileInputStream(yangFile), yangFile);
-        // } catch (FileNotFoundException e) {
-        // LOG.warn("Exception while reading yang file: " + yangFile.getName(),
-        // e);
-        // }
-        // }
-        //
-        // Map<ModuleBuilder, InputStream> builderToStreamMap =
-        // Maps.newHashMap();
-        //
-        // final Map<String, TreeMap<Date, ModuleBuilder>> modules =
-        // resolveModuleBuilders(
-        // Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);
-        //
-        // for (InputStream is : inputStreams.keySet()) {
-        // try {
-        // is.close();
-        // } catch (IOException e) {
-        // LOG.debug("Failed to close stream.");
-        // }
-        // }
-        //
-        // return new LinkedHashSet<Module>(buildWithContext(modules,
-        // context).values());
-        // }
-        // return Collections.emptySet();
+        if (yangFiles != null) {
+            final Map<InputStream, File> inputStreams = Maps.newHashMap();
+
+            for (final File yangFile : yangFiles) {
+                try {
+                    inputStreams.put(new FileInputStream(yangFile), yangFile);
+                } catch (FileNotFoundException e) {
+                    LOG.warn("Exception while reading yang file: " + yangFile.getName(), e);
+                }
+            }
+
+            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
+
+            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(
+                    Lists.newArrayList(inputStreams.keySet()), builderToStreamMap);
+
+            for (InputStream is : inputStreams.keySet()) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    LOG.debug("Failed to close stream.");
+                }
+            }
+
+            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());
+        }
+        return Collections.emptySet();
     }
 
     @Override
@@ -123,18 +120,13 @@ public final class YangParserImpl implements YangModelParser {
 
     @Override
     public Set<Module> parseYangModelsFromStreams(final List<InputStream> yangModelStreams, SchemaContext context) {
-        // TODO
-        throw new YangParseException("Not yet implemented");
-        // if (yangModelStreams != null) {
-        // Map<ModuleBuilder, InputStream> builderToStreamMap =
-        // Maps.newHashMap();
-        // final Map<String, TreeMap<Date, ModuleBuilder>> modules =
-        // resolveModuleBuildersWithContext(
-        // yangModelStreams, builderToStreamMap, context);
-        // return new LinkedHashSet<Module>(buildWithContext(modules,
-        // context).values());
-        // }
-        // return Collections.emptySet();
+        if (yangModelStreams != null) {
+            Map<ModuleBuilder, InputStream> builderToStreamMap = Maps.newHashMap();
+            final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersWithContext(
+                    yangModelStreams, builderToStreamMap, context);
+            return new LinkedHashSet<Module>(buildWithContext(modules, context).values());
+        }
+        return Collections.emptySet();
     }
 
     @Override
@@ -228,8 +220,7 @@ public final class YangParserImpl implements YangModelParser {
             final SchemaContext context) {
         final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, streamToBuilderMap);
 
-        // Linked Hash Map MUST be used because Linked Hash Map preserves ORDER
-        // of items stored in map.
+        // LinkedHashMap must be used to preserve order
         final LinkedHashMap<String, TreeMap<Date, ModuleBuilder>> modules = new LinkedHashMap<String, TreeMap<Date, ModuleBuilder>>();
 
         // module dependency graph sorted
@@ -294,7 +285,6 @@ public final class YangParserImpl implements YangModelParser {
                 fixUnresolvedNodes(modules, moduleBuilder);
             }
         }
-
         finishResolveDirtyNodes(modules);
         resolveAugments(modules);
         resolveUses(modules);
@@ -325,7 +315,7 @@ public final class YangParserImpl implements YangModelParser {
                 fixUnresolvedNodesWithContext(modules, moduleBuilder, context);
             }
         }
-        // TODO finishResolveDirtyNodesWithContext(modules, context)
+        finishResolveDirtyNodes(modules);
         resolveAugmentsWithContext(modules, context);
         resolveUsesWithContext(modules, context);
         resolveDeviationsWithContext(modules, context);
@@ -409,9 +399,15 @@ public final class YangParserImpl implements YangModelParser {
                             nodeToResolve.getType());
                     nodeToResolve.setType(idRef);
                 } else {
-                    TypeDefinitionBuilder tdb = CopyUtils.copy(nodeToResolve.getTypedef(), nodeToResolve, false);
-                    ParserUtils.correctTypeAwareNodePath(tdb);
-                    nodeToResolve.setTypedef(tdb);
+                    if (nodeToResolve.getType() == null) {
+                        TypeDefinitionBuilder tdb = CopyUtils.copy(nodeToResolve.getTypedef(), nodeToResolve, false);
+                        ParserUtils.correctTypeAwareNodePath(tdb);
+                        nodeToResolve.setTypedef(tdb);
+                    } else {
+                        TypeDefinition<?> td = ParserUtils.createCorrectTypeDefinition(nodeToResolve.getPath(),
+                                nodeToResolve.getType());
+                        nodeToResolve.setType(td);
+                    }
                 }
             }
         }
@@ -567,26 +563,26 @@ public final class YangParserImpl implements YangModelParser {
      *
      * @param modules
      *            all loaded modules
-     * @param augmentBuilder
+     * @param augment
      *            augment to resolve
      * @param context
      *            SchemaContext containing already resolved modules
      * @return true if target node found, false otherwise
      */
     private boolean resolveAugmentWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final AugmentationSchemaBuilder augmentBuilder, final SchemaContext context) {
-        if (augmentBuilder.isResolved()) {
+            final AugmentationSchemaBuilder augment, final SchemaContext context) {
+        if (augment.isResolved()) {
             return true;
         }
-        int line = augmentBuilder.getLine();
-        ModuleBuilder module = getParentModule(augmentBuilder);
-        List<QName> path = augmentBuilder.getTargetPath().getPath();
+        int line = augment.getLine();
+        ModuleBuilder module = getParentModule(augment);
+        List<QName> path = augment.getTargetPath().getPath();
         final QName firstNameInPath = path.get(0);
         String prefix = firstNameInPath.getPrefix();
         if (prefix == null) {
             prefix = module.getPrefix();
         }
-        Builder augmentParent = augmentBuilder.getParent();
+        Builder augmentParent = augment.getParent();
         Builder currentParent = null;
 
         if (augmentParent instanceof ModuleBuilder) {
@@ -596,14 +592,14 @@ public final class YangParserImpl implements YangModelParser {
             currentParent = augmentParent.getParent();
         } else {
             // augment can be defined only under module or uses
-            throw new YangParseException(augmentBuilder.getModuleName(), augmentBuilder.getLine(),
+            throw new YangParseException(augment.getModuleName(), augment.getLine(),
                     "Error in augment parsing: Unresolved parent of augment: " + augmentParent);
         }
 
         if (currentParent == null) {
-            return processAugmentationOnContext(augmentBuilder, path, module, prefix, context);
+            return processAugmentationOnContext(augment, path, module, prefix, context);
         } else {
-            return processAugmentation(augmentBuilder, currentParent, path);
+            return processAugmentation(augment, currentParent, path);
         }
     }
 
@@ -702,6 +698,9 @@ public final class YangParserImpl implements YangModelParser {
      *
      * @param modules
      *            all loaded modules
+     * @param context
+     *            SchemaContext containing already resolved modules or null if
+     *            context is not available
      */
     private void findUsesTargets(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final SchemaContext context) {
         final List<UsesNodeBuilder> allUses = new ArrayList<>();
@@ -773,9 +772,17 @@ public final class YangParserImpl implements YangModelParser {
         for (UsesNodeBuilder usesNode : allModulesUses) {
             GroupingUtils.fixUsesNodesPath(usesNode);
         }
+
+        for (UsesNodeBuilder usesNode : allModulesUses) {
+            if (usesNode.isCopy()) {
+                usesNode.getParent().getUsesNodes().remove(usesNode);
+            }
+        }
     }
 
     /**
+     * Copy data from uses target, update uses parent and perform refinement.
+     * Augmentations have to be resolved already.
      *
      * @param modules
      *            all loaded modules
@@ -827,46 +834,53 @@ public final class YangParserImpl implements YangModelParser {
     private void resolveUnknownNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
         for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {
             QName nodeType = usnb.getNodeType();
-            if (nodeType.getNamespace() == null || nodeType.getRevision() == null) {
-                try {
-                    ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(),
-                            usnb.getLine());
-                    QName newNodeType = new QName(dependentModule.getNamespace(), dependentModule.getRevision(),
-                            nodeType.getPrefix(), nodeType.getLocalName());
-                    usnb.setNodeType(newNodeType);
-                } catch (YangParseException e) {
-                    LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node type: " + nodeType);
+            try {
+                ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(),
+                        usnb.getLine());
+                for (ExtensionBuilder extension : dependentModule.getExtensions()) {
+                    if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {
+                        usnb.setExtensionBuilder(extension);
+                        break;
+                    }
                 }
+            } catch (YangParseException e) {
+                LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: "
+                        + nodeType);
             }
         }
     }
 
     private void resolveUnknownNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
             final ModuleBuilder module, final SchemaContext context) {
-        for (UnknownSchemaNodeBuilder unknownNodeBuilder : module.getAllUnknownNodes()) {
-            QName nodeType = unknownNodeBuilder.getNodeType();
-            if (nodeType.getNamespace() == null || nodeType.getRevision() == null) {
-                try {
-                    ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,
-                            nodeType.getPrefix(), unknownNodeBuilder.getLine());
-
-                    QName newNodeType = null;
-                    if (dependentModuleBuilder == null) {
-                        Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(),
-                                unknownNodeBuilder.getLine());
-                        newNodeType = new QName(dependentModule.getNamespace(), dependentModule.getRevision(),
-                                nodeType.getPrefix(), nodeType.getLocalName());
-                    } else {
-                        newNodeType = new QName(dependentModuleBuilder.getNamespace(),
-                                dependentModuleBuilder.getRevision(), nodeType.getPrefix(), nodeType.getLocalName());
-                    }
+        for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) {
+            QName nodeType = usnb.getNodeType();
+            try {
+                ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module,
+                        nodeType.getPrefix(), usnb.getLine());
 
-                    unknownNodeBuilder.setNodeType(newNodeType);
-                } catch (YangParseException e) {
-                    LOG.debug(module.getName(), unknownNodeBuilder.getLine(), "Failed to find unknown node type: "
-                            + nodeType);
+                if (dependentModuleBuilder == null) {
+                    Module dependentModule = findModuleFromContext(context, module, nodeType.getPrefix(),
+                            usnb.getLine());
+                    for (ExtensionDefinition e : dependentModule.getExtensionSchemaNodes()) {
+                        if (e.getQName().getLocalName().equals(nodeType.getLocalName())) {
+                            usnb.setExtensionDefinition(e);
+                            break;
+                        }
+                    }
+                } else {
+                    for (ExtensionBuilder extension : dependentModuleBuilder.getExtensions()) {
+                        if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {
+                            usnb.setExtensionBuilder(extension);
+                            break;
+                        }
+                    }
                 }
+
+            } catch (YangParseException e) {
+                LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: "
+                        + nodeType);
             }
+
         }
     }
 
index 53ad43a32ef83f097952c90a00047abdcfcb81f0..5607f0d53a811306f304f9ec26881ad2a52902e9 100644 (file)
@@ -55,6 +55,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
 import org.opendaylight.yangtools.yang.model.util.YangTypesConverter;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
@@ -387,6 +388,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                     addNodeToPath(qname);
                     SchemaPath path = createActualSchemaPath(actualPath.peek());
                     UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision);
+                    Builder parent = moduleBuilder.getActualNode();
+                    unionBuilder.setParent(parent);
                     moduleBuilder.enterNode(unionBuilder);
                     unionBuilder.setPath(path);
                 } else if ("identityref".equals(typeName)) {
@@ -782,9 +785,9 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         final String nodeTypeStr = ctx.getChild(0).getText();
         final String[] splittedElement = nodeTypeStr.split(":");
         if (splittedElement.length == 1) {
-            nodeType = new QName(null, null, yangModelPrefix, splittedElement[0]);
+            nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]);
         } else {
-            nodeType = new QName(null, null, splittedElement[0], splittedElement[1]);
+            nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]);
         }
 
         QName qname;
index 4b5d8dc5662cd15dedf5ee043eaa31ea5b586bef..225b471a558bb3d3a7fe78e782e7bc57016102ff 100644 (file)
@@ -349,40 +349,6 @@ public class CopyUtils {
         return copy;
     }
 
-    public static GroupingBuilder copyGroupingWithoutDeep(GroupingBuilder old, Builder newParent, boolean updateQName) {
-        DataBean data = getdata(old, newParent, updateQName);
-        QName newQName = data.qname;
-        SchemaPath newSchemaPath = data.schemaPath;
-
-        GroupingBuilderImpl copy = new GroupingBuilderImpl(newParent.getModuleName(), newParent.getLine(), newQName);
-        copy.setParent(newParent);
-        copy.setPath(newSchemaPath);
-        copy.setDescription(old.getDescription());
-        copy.setReference(old.getReference());
-        copy.setStatus(old.getStatus());
-        copy.setAddedByUses(old.isAddedByUses());
-        copy.setChildNodes(old.getChildNodes());
-        for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
-            copy.addChildNode(copy(childNode, copy, updateQName));
-        }
-        copy.getGroupings().addAll(old.getGroupings());
-        for (GroupingBuilder grouping : old.getGroupingBuilders()) {
-            copy.addGrouping(copy(grouping, copy, updateQName));
-        }
-        for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) {
-            copy.addTypedef(copy(tdb, copy, updateQName));
-        }
-        for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
-            copy.addUsesNode(copyUses(oldUses, copy));
-
-        }
-        for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
-            copy.addUnknownNodeBuilder((copy(un, copy, updateQName)));
-        }
-
-        return copy;
-    }
-
     public static TypeDefinitionBuilder copy(TypeDefinitionBuilder old, Builder newParent, boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
@@ -446,7 +412,7 @@ public class CopyUtils {
 
     static UsesNodeBuilder copyUses(UsesNodeBuilder old, Builder newParent) {
         UsesNodeBuilder copy = new UsesNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(),
-                old.getGroupingName());
+                old.getGroupingName(), true);
         copy.setParent(newParent);
         copy.setGroupingPath(old.getGroupingPath());
         // TODO grouping vs grouping path?
@@ -464,7 +430,7 @@ public class CopyUtils {
 
         // add new uses to collection of uses in module
         ModuleBuilder module = ParserUtils.getParentModule(newParent);
-        module.addUsesNode(copy);
+        module.getAllUsesNodes().add(copy);
 
         return copy;
     }
@@ -546,9 +512,6 @@ public class CopyUtils {
                 newPath = new ArrayList<>(parent.getPath().getPath());
                 newPath.add(newQName);
             } else {
-                if(old == null) {
-                    System.out.println();
-                }
                 newQName = old.getQName();
                 newPath = new ArrayList<>(parent.getPath().getPath());
                 newPath.add(newQName);
index 9dda792c74916f162483c2221cc9bff09a83361f..76795548d26e4af9d927675e30e7a34e86752e84 100644 (file)
@@ -364,68 +364,40 @@ public class GroupingUtils {
 
         // child nodes
         Set<DataSchemaNodeBuilder> currentChildNodes = parent.getChildNodeBuilders();
-        Set<DataSchemaNodeBuilder> toRemove = new HashSet<>();
-        Set<DataSchemaNodeBuilder> toAdd = new HashSet<>();
         for (DataSchemaNodeBuilder child : currentChildNodes) {
             if (child instanceof GroupingMember) {
                 GroupingMember gm = (GroupingMember) child;
                 if (gm.isAddedByUses()) {
-                    toRemove.add(child);
-                    DataSchemaNodeBuilder copy = CopyUtils.copy(child, parent, true);
-                    ParserUtils.correctNodePath(copy, parent.getPath());
-                    toAdd.add(copy);
+                    ParserUtils.correctNodePath(child, parent.getPath());
                 }
             }
         }
-        currentChildNodes.removeAll(toRemove);
-        currentChildNodes.addAll(toAdd);
 
         // groupings
         Set<GroupingBuilder> currentGroupings = parent.getGroupingBuilders();
-        Set<GroupingBuilder> toRemoveG = new HashSet<>();
-        Set<GroupingBuilder> toAddG = new HashSet<>();
         for (GroupingBuilder child : currentGroupings) {
             if (child.isAddedByUses()) {
-                toRemoveG.add(child);
-                GroupingBuilder copy = CopyUtils.copy(child, parent, true);
-                ParserUtils.correctNodePath(copy, parent.getPath());
-                toAddG.add(copy);
+                ParserUtils.correctNodePath(child, parent.getPath());
             }
 
         }
-        currentGroupings.removeAll(toRemoveG);
-        currentGroupings.addAll(toAddG);
 
         // typedefs
         Set<TypeDefinitionBuilder> currentTypedefs = parent.getTypeDefinitionBuilders();
-        Set<TypeDefinitionBuilder> toRemoveTD = new HashSet<>();
-        Set<TypeDefinitionBuilder> toAddTD = new HashSet<>();
         for (TypeDefinitionBuilder child : currentTypedefs) {
             if (child.isAddedByUses()) {
-                toRemoveTD.add(child);
-                TypeDefinitionBuilder copy = CopyUtils.copy(child, parent, true);
-                ParserUtils.correctNodePath(copy, parent.getPath());
-                toAddTD.add(copy);
+                ParserUtils.correctNodePath(child, parent.getPath());
             }
 
         }
-        currentTypedefs.removeAll(toRemoveTD);
-        currentTypedefs.addAll(toAddTD);
 
         // unknown nodes
         List<UnknownSchemaNodeBuilder> currentUN = parent.getUnknownNodeBuilders();
-        List<UnknownSchemaNodeBuilder> toRemoveUN = new ArrayList<>();
-        List<UnknownSchemaNodeBuilder> toAddUN = new ArrayList<>();
         for (UnknownSchemaNodeBuilder un : currentUN) {
             if (un.isAddedByUses()) {
-                toRemoveUN.add(un);
-                UnknownSchemaNodeBuilder copy = CopyUtils.copy(un, parent, true);
-                ParserUtils.correctNodePath(copy, parent.getPath());
-                toAddUN.add(copy);
+                ParserUtils.correctNodePath(un, parent.getPath());
             }
         }
-        currentUN.removeAll(toRemoveUN);
-        currentUN.addAll(toAddUN);
     }
 
     /**
index 2cd239b4381a3065f819fa9048018c5aafa79249..b6ca8583e4b03c3ea7e2b1c537cf472b407fb7a5 100644 (file)
@@ -641,6 +641,10 @@ public final class ParserUtils {
      * @return builder of module where this node is defined
      */
     public static ModuleBuilder getParentModule(Builder node) {
+        if(node instanceof ModuleBuilder) {
+            return (ModuleBuilder)node;
+        }
+
         Builder parent = node.getParent();
         while (!(parent instanceof ModuleBuilder)) {
             parent = parent.getParent();
index 6117b256964aa7335c1a46db9b3c32cc9606f910..e2b79a989f673ffd2628295931c6dfabf247f6a1 100644 (file)
@@ -20,7 +20,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
@@ -45,7 +44,6 @@ import org.opendaylight.yangtools.yang.model.util.ExtendedType;
 
 import com.google.common.collect.Lists;
 
-@Ignore
 public class YangParserWithContextTest {
     private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
     private final YangParserImpl parser = new YangParserImpl();
@@ -318,8 +316,8 @@ public class YangParserWithContextTest {
 
         UnknownSchemaNode un = unknownNodes.get(0);
         QName unType = un.getNodeType();
-        assertEquals(URI.create("urn:custom.types.demo"), unType.getNamespace());
-        assertEquals(simpleDateFormat.parse("2012-04-16"), unType.getRevision());
+        assertEquals(URI.create("urn:simple.demo.test3"), unType.getNamespace());
+        assertEquals(simpleDateFormat.parse("2013-06-18"), unType.getRevision());
         assertEquals("custom", unType.getPrefix());
         assertEquals("mountpoint", unType.getLocalName());
         assertEquals("point", un.getNodeParameter());
index b597aab478159a3008dedb7ed155daf6506bc381..01e7c7a03d41413f41ff98b0dfa091e7b66ef5ff 100644 (file)
@@ -10,7 +10,7 @@ module test3 {
     
     organization "opendaylight";
     contact "WILL-BE-DEFINED-LATER";
-        revision 2013-06-18 {
+    revision 2013-06-18 {
     }
 
     identity pt {