Merge changes I296b2805,Iee01f474,I13dab228
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / ModuleBuilder.java
index c434f3397549f3f42b9ca493b0d2da60fc95c74a..5c4afe6ae17b49e99535784d7e4ab2a74c28f26a 100644 (file)
@@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import com.google.common.base.Preconditions;
 import com.google.common.io.ByteSource;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -16,13 +15,14 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.Deque;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-
 import org.apache.commons.io.IOUtils;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -76,7 +76,12 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
     private final Deque<Builder> actualPath = new LinkedList<>();
     private final Set<TypeAwareBuilder> dirtyNodes = new HashSet<>();
 
-    final Set<ModuleImport> imports = new HashSet<>();
+    final Map<String, ModuleImport> imports = new HashMap<>();
+    final Map<String, ModuleBuilder> importedModules = new HashMap<>();
+
+    final Set<ModuleBuilder> addedSubmodules = new HashSet<>();
+    final Set<Module> submodules = new HashSet<>();
+    final Map<String, Date> includedModules = new HashMap<>();
 
     private final Set<AugmentationSchema> augments = new LinkedHashSet<>();
     private final List<AugmentationSchemaBuilder> augmentBuilders = new ArrayList<>();
@@ -126,7 +131,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
     }
 
     public ModuleBuilder(final Module base) {
-        super(base.getName(), 0, new QName(base.getNamespace(), base.getRevision(), base.getPrefix(), base.getName()),
+        super(base.getName(), 0, QName.create(base.getQNameModule(), base.getPrefix(), base.getName()),
                 SCHEMA_PATH, base);
         this.name = base.getName();
         this.sourcePath = base.getModuleSourcePath();
@@ -168,6 +173,11 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
 
         buildChildren();
 
+        // SUBMODULES
+        for (ModuleBuilder submodule : addedSubmodules) {
+            submodules.add(submodule.build());
+        }
+
         // FEATURES
         for (FeatureBuilder fb : addedFeatures) {
             features.add(fb.build());
@@ -346,10 +356,35 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
         return qnameModule.getRevision();
     }
 
-    protected Set<ModuleImport> getImports() {
+    public ModuleImport getImport(final String prefix) {
+        return imports.get(prefix);
+    }
+
+    public Map<String, ModuleImport> getImports() {
         return imports;
     }
 
+    public ModuleBuilder getImportedModule(final String prefix) {
+        return importedModules.get(prefix);
+    }
+
+    public void addImportedModule(final String prefix, final ModuleBuilder module) {
+        checkPrefix(prefix);
+        importedModules.put(prefix, module);
+    }
+
+    public Map<String, Date> getIncludedModules() {
+        return includedModules;
+    }
+
+    public void addInclude(final String name, final Date revision) {
+        includedModules.put(name, revision);
+    }
+
+    public void addSubmodule(final ModuleBuilder submodule) {
+        addedSubmodules.add(submodule);
+    }
+
     protected String getSource() {
         return source;
     }
@@ -391,14 +426,20 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
         this.contact = contact;
     }
 
-    public boolean addModuleImport(final String moduleName, final Date revision, final String prefix) {
+    public void addModuleImport(final String moduleName, final Date revision, final String prefix) {
+        checkPrefix(prefix);
         checkNotSealed();
         final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix);
-        return imports.add(moduleImport);
+        imports.put(prefix, moduleImport);
     }
 
-    public Set<ModuleImport> getModuleImports() {
-        return imports;
+    private void checkPrefix(final String prefix) {
+        if (prefix == null || prefix.isEmpty()) {
+            throw new IllegalArgumentException("Cannot add imported module with undefined prefix");
+        }
+        if (prefix.equals(this.prefix)) {
+            throw new IllegalArgumentException("Cannot add imported module with prefix equals to module prefix");
+        }
     }
 
     public ExtensionBuilder addExtension(final QName qname, final int line, final SchemaPath path) {
@@ -506,9 +547,11 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
         return builder;
     }
 
-    public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, final int order) {
+    public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr,
+            final SchemaPath targetPath, final int order) {
         checkNotSealed();
-        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, order);
+        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr,
+                targetPath, order);
 
         Builder parent = getActualNode();
         builder.setParent(parent);
@@ -540,9 +583,9 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
         return builder;
     }
 
-    public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) {
+    public UsesNodeBuilder addUsesNode(final int line, final SchemaPath grouping) {
         checkNotSealed();
-        final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr);
+        final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, grouping);
 
         Builder parent = getActualNode();
         usesBuilder.setParent(parent);
@@ -551,7 +594,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
             addUsesNode(usesBuilder);
         } else {
             if (!(parent instanceof DataNodeContainerBuilder)) {
-                throw new YangParseException(name, line, "Unresolved parent of uses '" + groupingPathStr + "'.");
+                throw new YangParseException(name, line, "Unresolved parent of uses '" + grouping + "'.");
             }
             ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder);
         }
@@ -804,7 +847,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im
         }
     }
 
-    public DeviationBuilder addDeviation(final int line, final String targetPath) {
+    public DeviationBuilder addDeviation(final int line, final SchemaPath targetPath) {
         Builder parent = getActualNode();
         if (!(parent.equals(this))) {
             throw new YangParseException(name, line, "deviation can be defined only in module or submodule");