*/
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;
import java.util.ArrayList;
-import java.util.Collection;
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;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
import org.opendaylight.yangtools.yang.model.api.Deviation;
import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
private final String name;
private final String sourcePath;
private static final SchemaPath SCHEMA_PATH = SchemaPath.create(Collections.<QName> emptyList(), true);
- private URI namespace;
private String prefix;
- private Date revision;
+ private QNameModule qnameModule = QNameModule.create(null, null);
private final boolean submodule;
private String belongsTo;
private final Deque<Builder> actualPath = new LinkedList<>();
private final Set<TypeAwareBuilder> dirtyNodes = new HashSet<>();
- final Set<ModuleImport> imports = new HashSet<ModuleImport>();
+ final Map<String, ModuleImport> imports = new HashMap<>();
+ final Map<String, ModuleBuilder> importedModules = new HashMap<>();
private final Set<AugmentationSchema> augments = new LinkedHashSet<>();
private final List<AugmentationSchemaBuilder> augmentBuilders = new ArrayList<>();
private final List<ListSchemaNodeBuilder> allLists = new ArrayList<>();
- String source;
+ private String source;
private String yangVersion;
private String organization;
private String contact;
this.name = name;
this.sourcePath = sourcePath;
this.submodule = submodule;
- actualPath.push(this);
+ actualPath.push(this);//FIXME: this escapes constructor
}
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();
submodule = false;
yangVersion = base.getYangVersion();
- actualPath.push(this);
- namespace = base.getNamespace();
+ actualPath.push(this);//FIXME: this escapes constructor
prefix = base.getPrefix();
- revision = base.getRevision();
+ qnameModule = base.getQNameModule();
augments.addAll(base.getAugmentations());
rpcs.addAll(base.getRpcs());
deviations.addAll(base.getDeviations());
extensions.addAll(base.getExtensionSchemaNodes());
unknownNodes.addAll(base.getUnknownSchemaNodes());
+ source = base.getSource();
}
@Override
}
public URI getNamespace() {
- return namespace;
+ return qnameModule.getNamespace();
+ }
+
+ public QNameModule getQNameModule() {
+ return qnameModule;
+ }
+
+ public void setQNameModule(final QNameModule qnameModule) {
+ this.qnameModule = Preconditions.checkNotNull(qnameModule);
}
public void setNamespace(final URI namespace) {
- this.namespace = namespace;
+ this.qnameModule = QNameModule.create(namespace, qnameModule.getRevision());
}
public String getPrefix() {
}
public Date getRevision() {
- return revision;
+ return qnameModule.getRevision();
+ }
+
+ public ModuleImport getImport(final String prefix) {
+ return imports.get(prefix);
}
- protected Set<ModuleImport> getImports() {
+ 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);
+ }
+
protected String getSource() {
return source;
}
}
public void setRevision(final Date revision) {
- this.revision = revision;
+ this.qnameModule = QNameModule.create(qnameModule.getNamespace(), revision);
}
public void setPrefix(final String prefix) {
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) {
((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");
addedUnknownNodes.add(builder);
} else {
if (parent instanceof SchemaNodeBuilder) {
- ((SchemaNodeBuilder) parent).addUnknownNodeBuilder(builder);
+ parent.addUnknownNodeBuilder(builder);
} else if (parent instanceof DataNodeContainerBuilder) {
- ((DataNodeContainerBuilder) parent).addUnknownNodeBuilder(builder);
+ parent.addUnknownNodeBuilder(builder);
} else if (parent instanceof RefineHolderImpl) {
- ((RefineHolderImpl) parent).addUnknownNodeBuilder(builder);
+ parent.addUnknownNodeBuilder(builder);
} else {
throw new YangParseException(name, line, "Unresolved parent of unknown node '" + qname.getLocalName()
+ "'");
return "module " + name;
}
+ public void setSource(final ByteSource byteSource) throws IOException {
+ try (InputStream stream = byteSource.openStream()) {
+ setSource(IOUtils.toString(stream));
+ }
+ }
+
public void setSource(final String source) {
this.source = source;
}
}
private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) {
- final ModuleImport moduleImport = new ModuleImportImpl(moduleName, revision, prefix);
- return moduleImport;
+ return new ModuleImportImpl(moduleName, revision, prefix);
}
private void raiseYangParserException(final String cantAddType, final String type, final String name,
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
- result = prime * result + ((revision == null) ? 0 : revision.hashCode());
+ result = prime * result + qnameModule.hashCode();
result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
return result;
} else if (!name.equals(other.name)) {
return false;
}
- if (namespace == null) {
- if (other.namespace != null) {
- return false;
- }
- } else if (!namespace.equals(other.namespace)) {
+ if (!qnameModule.equals(other.qnameModule)) {
return false;
}
if (prefix == null) {
} else if (!prefix.equals(other.prefix)) {
return false;
}
- if (revision == null) {
- if (other.revision != null) {
- return false;
- }
- } else if (!revision.equals(other.revision)) {
- return false;
- }
return true;
}