import com.google.common.base.Preconditions;
import com.google.common.io.ByteSource;
-
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
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;
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<>();
}
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();
buildChildren();
+ // SUBMODULES
+ for (ModuleBuilder submodule : addedSubmodules) {
+ submodules.add(submodule.build());
+ }
+
// FEATURES
for (FeatureBuilder fb : addedFeatures) {
features.add(fb.build());
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;
}
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) {
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);
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);
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);
}
((TypeAwareBuilder) parent).setType(type);
}
- public UnionTypeBuilder addUnionType(final int line, final URI namespace, final Date revision) {
+ public UnionTypeBuilder addUnionType(final int line, final QNameModule module) {
final Builder parent = getActualNode();
if (parent == null) {
throw new YangParseException(name, line, "Unresolved parent of union type");
}
}
- 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");