import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.TreeMap;
import org.opendaylight.controller.antlrv4.code.gen.YangLexer;
import org.opendaylight.controller.antlrv4.code.gen.YangParser;
import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.model.api.AugmentationSchema;
import org.opendaylight.controller.yang.model.api.DataSchemaNode;
import org.opendaylight.controller.yang.model.api.ExtensionDefinition;
import org.opendaylight.controller.yang.model.api.Module;
import org.opendaylight.controller.yang.model.api.ModuleImport;
+import org.opendaylight.controller.yang.model.api.MustDefinition;
import org.opendaylight.controller.yang.model.api.NotificationDefinition;
import org.opendaylight.controller.yang.model.api.RpcDefinition;
import org.opendaylight.controller.yang.model.api.SchemaContext;
import org.opendaylight.controller.yang.model.api.SchemaPath;
import org.opendaylight.controller.yang.model.api.TypeDefinition;
import org.opendaylight.controller.yang.model.api.type.BinaryTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition.Bit;
import org.opendaylight.controller.yang.model.api.type.DecimalTypeDefinition;
import org.opendaylight.controller.yang.model.api.type.IntegerTypeDefinition;
import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationSchemaBuilder;
import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationTargetBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.api.Builder;
import org.opendaylight.controller.yang.model.parser.builder.api.ChildNodeBuilder;
import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;
import org.opendaylight.controller.yang.model.parser.builder.api.TypeAwareBuilder;
import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.api.UsesNodeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.AnyXmlBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.ChoiceBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.ContainerSchemaNodeBuilder;
import org.opendaylight.controller.yang.model.parser.builder.impl.IdentitySchemaNodeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.IdentityrefTypeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.LeafListSchemaNodeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.LeafSchemaNodeBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.ListSchemaNodeBuilder;
import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.TypedefBuilder;
import org.opendaylight.controller.yang.model.parser.builder.impl.UnionTypeBuilder;
+import org.opendaylight.controller.yang.model.parser.util.ParserUtils;
+import org.opendaylight.controller.yang.model.parser.util.RefineHolder;
+import org.opendaylight.controller.yang.model.parser.util.RefineHolder.Refine;
import org.opendaylight.controller.yang.model.parser.util.TypeConstraints;
import org.opendaylight.controller.yang.model.parser.util.YangParseException;
-import org.opendaylight.controller.yang.model.util.BinaryType;
-import org.opendaylight.controller.yang.model.util.BitsType;
-import org.opendaylight.controller.yang.model.util.StringType;
+import org.opendaylight.controller.yang.model.util.ExtendedType;
+import org.opendaylight.controller.yang.model.util.IdentityrefType;
import org.opendaylight.controller.yang.model.util.UnknownType;
-import org.opendaylight.controller.yang.model.util.YangTypesConverter;
+import org.opendaylight.controller.yang.model.validator.YangModelBasicValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
.getLogger(YangModelParserImpl.class);
@Override
- public Module parseYangModel(String yangFile) {
- final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersFromStreams(yangFile);
- Set<Module> result = build(modules);
+ public Module parseYangModel(final String yangFile) {
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(yangFile);
+ final Set<Module> result = build(modules);
return result.iterator().next();
}
@Override
- public Set<Module> parseYangModels(String... yangFiles) {
- final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersFromStreams(yangFiles);
- Set<Module> result = build(modules);
- return result;
+ public Set<Module> parseYangModels(final String... yangFiles) {
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(yangFiles);
+ return build(modules);
}
@Override
public Set<Module> parseYangModelsFromStreams(
- InputStream... yangModelStreams) {
- final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuildersFromStreams(yangModelStreams);
- Set<Module> result = build(modules);
- return result;
+ final InputStream... yangModelStreams) {
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules = resolveModuleBuilders(yangModelStreams);
+ return build(modules);
}
@Override
- public SchemaContext resolveSchemaContext(Set<Module> modules) {
+ public SchemaContext resolveSchemaContext(final Set<Module> modules) {
return new SchemaContextImpl(modules);
}
- private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuildersFromStreams(
- String... yangFiles) {
- InputStream[] streams = new InputStream[yangFiles.length];
+ private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuilders(
+ final String... yangFiles) {
+ final InputStream[] streams = loadStreams(yangFiles);
+ Map<String, TreeMap<Date, ModuleBuilder>> result = Collections
+ .emptyMap();
+
+ if (streams != null) {
+ result = resolveModuleBuilders(streams);
+ closeStreams(streams);
+ }
+ return result;
+ }
+
+ private InputStream[] loadStreams(final String... yangFiles) {
+ final InputStream[] streams = new InputStream[yangFiles.length];
for (int i = 0; i < yangFiles.length; i++) {
final String yangFileName = yangFiles[i];
final File yangFile = new File(yangFileName);
- FileInputStream inStream = null;
try {
- inStream = new FileInputStream(yangFile);
+ streams[i] = new FileInputStream(yangFile);
} catch (FileNotFoundException e) {
- logger.warn("Exception while reading yang stream: " + inStream,
- e);
+ logger.warn("Exception while reading yang stream: "
+ + streams[i], e);
+ }
+ }
+ return streams;
+ }
+
+ private void closeStreams(final InputStream[] streams) {
+ if (streams != null) {
+ for (int i = 0; i < streams.length; i++) {
+ try {
+ if (streams[i] != null) {
+ streams[i].close();
+ }
+ } catch (IOException e) {
+ logger.warn("Exception while closing yang stream: "
+ + streams[i], e);
+ }
}
- streams[i] = inStream;
}
- return resolveModuleBuildersFromStreams(streams);
}
- private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuildersFromStreams(
- InputStream... yangFiles) {
+ private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuilders(
+ final InputStream... yangFiles) {
final Map<String, TreeMap<Date, ModuleBuilder>> modules = new HashMap<String, TreeMap<Date, ModuleBuilder>>();
final ParseTreeWalker walker = new ParseTreeWalker();
final List<ParseTree> trees = parseStreams(yangFiles);
final ModuleBuilder[] builders = new ModuleBuilder[trees.size()];
+ // validate yang
+ new YangModelBasicValidator(walker).validate(trees);
+
+ YangModelParserListenerImpl yangModelParser = null;
for (int i = 0; i < trees.size(); i++) {
- final YangModelParserListenerImpl yangModelParser = new YangModelParserListenerImpl();
+ yangModelParser = new YangModelParserListenerImpl();
walker.walk(yangModelParser, trees.get(i));
builders[i] = yangModelParser.getModuleBuilder();
}
final String builderName = builder.getName();
Date builderRevision = builder.getRevision();
if (builderRevision == null) {
- builderRevision = createEpochTime();
+ builderRevision = new Date(0L);
}
TreeMap<Date, ModuleBuilder> builderByRevision = modules
.get(builderName);
return modules;
}
- private List<ParseTree> parseStreams(InputStream... yangStreams) {
- List<ParseTree> trees = new ArrayList<ParseTree>();
+ private List<ParseTree> parseStreams(final InputStream... yangStreams) {
+ final List<ParseTree> trees = new ArrayList<ParseTree>();
for (InputStream yangStream : yangStreams) {
trees.add(parseStream(yangStream));
}
return trees;
}
- private ParseTree parseStream(InputStream yangStream) {
+ private ParseTree parseStream(final InputStream yangStream) {
ParseTree result = null;
try {
final ANTLRInputStream input = new ANTLRInputStream(yangStream);
return result;
}
- private Set<Module> build(Map<String, TreeMap<Date, ModuleBuilder>> modules) {
- // validate
+ private Set<Module> build(
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+ // fix unresolved nodes
for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules
.entrySet()) {
for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue()
.entrySet()) {
- ModuleBuilder moduleBuilder = childEntry.getValue();
- validateBuilder(modules, moduleBuilder);
+ final ModuleBuilder moduleBuilder = childEntry.getValue();
+ fixUnresolvedNodes(modules, moduleBuilder);
}
}
+ resolveAugments(modules);
+
// build
final Set<Module> result = new HashSet<Module>();
for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules
final Map<Date, Module> modulesByRevision = new HashMap<Date, Module>();
for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue()
.entrySet()) {
- ModuleBuilder moduleBuilder = childEntry.getValue();
- modulesByRevision.put(childEntry.getKey(),
- moduleBuilder.build());
- result.add(moduleBuilder.build());
+ final ModuleBuilder moduleBuilder = childEntry.getValue();
+ final Module module = moduleBuilder.build();
+ modulesByRevision.put(childEntry.getKey(), module);
+ result.add(module);
}
}
-
return result;
}
- private void validateBuilder(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder builder) {
- resolveTypedefs(modules, builder);
- resolveAugments(modules, builder);
+ private void fixUnresolvedNodes(
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
+ resolveDirtyNodes(modules, builder);
resolveIdentities(modules, builder);
+ resolveUses(modules, builder);
}
/**
* @param module
* current module
*/
- private void resolveTypedefs(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder module) {
- Map<List<String>, TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();
- if (dirtyNodes.size() == 0) {
- return;
- } else {
+ private void resolveDirtyNodes(
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ final Map<List<String>, TypeAwareBuilder> dirtyNodes = module
+ .getDirtyNodes();
+ if (!dirtyNodes.isEmpty()) {
for (Map.Entry<List<String>, TypeAwareBuilder> entry : dirtyNodes
.entrySet()) {
- TypeAwareBuilder typeToResolve = entry.getValue();
- if (typeToResolve instanceof UnionTypeBuilder) {
- resolveUnionTypeBuilder(modules, module,
- (UnionTypeBuilder) typeToResolve);
+ final TypeAwareBuilder nodeToResolve = entry.getValue();
+ // different handling for union types
+ if (nodeToResolve instanceof UnionTypeBuilder) {
+ final UnionTypeBuilder union = (UnionTypeBuilder) nodeToResolve;
+ final List<TypeDefinition<?>> unionTypes = union.getTypes();
+ final List<UnknownType> toRemove = new ArrayList<UnknownType>();
+ for (TypeDefinition<?> td : unionTypes) {
+ if (td instanceof UnknownType) {
+ final UnknownType unknownType = (UnknownType) td;
+ final TypeDefinitionBuilder resolvedType = resolveTypeUnion(
+ nodeToResolve, unknownType, modules, module);
+ union.setType(resolvedType);
+ toRemove.add(unknownType);
+ }
+ }
+ unionTypes.removeAll(toRemove);
+ } else if(nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) {
+ IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder)nodeToResolve.getTypedef();
+ nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref)));
} else {
- UnknownType ut = (UnknownType) typeToResolve.getType();
- TypeDefinition<?> resolvedType = findTargetType(ut,
- modules, module);
- typeToResolve.setType(resolvedType);
+ final TypeDefinitionBuilder resolvedType = resolveType(
+ nodeToResolve, modules, module);
+ nodeToResolve.setType(resolvedType);
}
}
}
}
- private UnionTypeBuilder resolveUnionTypeBuilder(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder builder, UnionTypeBuilder unionTypeBuilderToResolve) {
- List<TypeDefinition<?>> resolvedTypes = new ArrayList<TypeDefinition<?>>();
- List<TypeDefinition<?>> typesToRemove = new ArrayList<TypeDefinition<?>>();
+ private TypeDefinitionBuilder resolveType(
+ final TypeAwareBuilder typeToResolve,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
+ final TypeConstraints constraints = new TypeConstraints();
- for (TypeDefinition<?> td : unionTypeBuilderToResolve.getTypes()) {
- if (td instanceof UnknownType) {
- TypeDefinition<?> resolvedType = findTargetType(
- (UnknownType) td, modules, builder);
- resolvedTypes.add(resolvedType);
- typesToRemove.add(td);
- }
+ final TypeDefinitionBuilder targetType = getTypedefBuilder(
+ typeToResolve, modules, builder);
+ final TypeConstraints tConstraints = findConstraints(typeToResolve,
+ constraints, modules, builder);
+ targetType.setRanges(tConstraints.getRange());
+ targetType.setLengths(tConstraints.getLength());
+ targetType.setPatterns(tConstraints.getPatterns());
+ targetType.setFractionDigits(tConstraints.getFractionDigits());
+
+ return targetType;
+ }
+
+ private TypeDefinitionBuilder resolveTypeUnion(
+ final TypeAwareBuilder typeToResolve,
+ final UnknownType unknownType,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
+ final TypeConstraints constraints = new TypeConstraints();
+
+ final TypeDefinitionBuilder targetType = getUnionBuilder(typeToResolve,
+ unknownType, modules, builder);
+ final TypeConstraints tConstraints = findConstraints(typeToResolve,
+ constraints, modules, builder);
+ targetType.setRanges(tConstraints.getRange());
+ targetType.setLengths(tConstraints.getLength());
+ targetType.setPatterns(tConstraints.getPatterns());
+ targetType.setFractionDigits(tConstraints.getFractionDigits());
+
+ return targetType;
+ }
+
+ private TypeDefinitionBuilder getTypedefBuilder(
+ final TypeAwareBuilder nodeToResolve,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
+
+ final TypeDefinition<?> nodeToResolveBase = nodeToResolve.getType();
+ if (nodeToResolveBase != null
+ && !(nodeToResolveBase instanceof UnknownType)) {
+ return (TypeDefinitionBuilder) nodeToResolve;
}
- List<TypeDefinition<?>> unionTypeBuilderTypes = unionTypeBuilderToResolve
- .getTypes();
- unionTypeBuilderTypes.addAll(resolvedTypes);
- unionTypeBuilderTypes.removeAll(typesToRemove);
+ final UnknownType unknownType = (UnknownType) nodeToResolve.getType();
+ final QName unknownTypeQName = unknownType.getQName();
- return unionTypeBuilderToResolve;
+ // search for module which contains referenced typedef
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ builder, unknownTypeQName.getPrefix());
+ final TypeDefinitionBuilder lookedUpBuilder = findTypedefBuilderByName(
+ dependentModule, unknownTypeQName.getLocalName());
+
+ final TypeDefinitionBuilder lookedUpBuilderCopy = copyTypedefBuilder(
+ lookedUpBuilder, nodeToResolve instanceof TypeDefinitionBuilder);
+ final TypeDefinitionBuilder resolvedCopy = resolveCopiedBuilder(
+ lookedUpBuilderCopy, modules, dependentModule);
+ return resolvedCopy;
}
- private TypeDefinition<?> findTargetType(UnknownType ut,
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder builder) {
+ private TypeDefinitionBuilder getUnionBuilder(
+ final TypeAwareBuilder nodeToResolve,
+ final UnknownType unknownType,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+
+ final TypeDefinition<?> baseTypeToResolve = nodeToResolve.getType();
+ if (baseTypeToResolve != null
+ && !(baseTypeToResolve instanceof UnknownType)) {
+ return (TypeDefinitionBuilder) nodeToResolve;
+ }
- TypeConstraints constraints = new TypeConstraints();
- // RANGE
- List<RangeConstraint> ranges = ut.getRangeStatements();
- constraints.addRanges(ranges);
- // LENGTH
- List<LengthConstraint> lengths = ut.getLengthStatements();
- constraints.addLengths(lengths);
- // PATTERN
- List<PatternConstraint> patterns = ut.getPatterns();
- constraints.addPatterns(patterns);
- // Fraction Digits
- Integer fractionDigits = ut.getFractionDigits();
+ final QName unknownTypeQName = unknownType.getQName();
+ // search for module which contains referenced typedef
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ module, unknownTypeQName.getPrefix());
+ final TypeDefinitionBuilder lookedUpBuilder = findTypedefBuilderByName(
+ dependentModule, unknownTypeQName.getLocalName());
- Map<TypeDefinitionBuilder, TypeConstraints> foundedTypeDefinitionBuilder = findTypeDefinitionBuilderWithConstraints(
- constraints, modules, ut, builder);
- TypeDefinitionBuilder targetType = foundedTypeDefinitionBuilder
- .entrySet().iterator().next().getKey();
+ final TypeDefinitionBuilder lookedUpBuilderCopy = copyTypedefBuilder(
+ lookedUpBuilder, nodeToResolve instanceof TypeDefinitionBuilder);
+ final TypeDefinitionBuilder resolvedCopy = resolveCopiedBuilder(
+ lookedUpBuilderCopy, modules, dependentModule);
+ return resolvedCopy;
+ }
- TypeDefinition<?> targetTypeBaseType = targetType.getBaseType();
- targetTypeBaseType = mergeConstraints(targetTypeBaseType, constraints,
- fractionDigits);
+ private TypeDefinitionBuilder copyTypedefBuilder(
+ final TypeDefinitionBuilder old, final boolean seekByTypedefBuilder) {
+ if (old instanceof UnionTypeBuilder) {
+ final UnionTypeBuilder oldUnion = (UnionTypeBuilder) old;
+ final UnionTypeBuilder newUnion = new UnionTypeBuilder();
+ for (TypeDefinition<?> td : oldUnion.getTypes()) {
+ newUnion.setType(td);
+ }
+ for (TypeDefinitionBuilder tdb : oldUnion.getTypedefs()) {
+ newUnion.setType(copyTypedefBuilder(tdb, true));
+ }
+ return newUnion;
+ }
- return targetTypeBaseType;
+ final QName oldName = old.getQName();
+ final QName newName = new QName(oldName.getNamespace(),
+ oldName.getRevision(), oldName.getPrefix(),
+ oldName.getLocalName());
+ final TypeDefinitionBuilder tdb = new TypedefBuilder(newName);
+
+ tdb.setRanges(old.getRanges());
+ tdb.setLengths(old.getLengths());
+ tdb.setPatterns(old.getPatterns());
+ tdb.setFractionDigits(old.getFractionDigits());
+
+ final TypeDefinition<?> oldType = old.getType();
+ if (oldType == null) {
+ tdb.setType(old.getTypedef());
+ } else {
+ tdb.setType(oldType);
+ }
+
+ if (!seekByTypedefBuilder) {
+ tdb.setDescription(old.getDescription());
+ tdb.setReference(old.getReference());
+ tdb.setStatus(old.getStatus());
+ tdb.setDefaultValue(old.getDefaultValue());
+ tdb.setUnits(old.getUnits());
+ }
+ return tdb;
}
- /**
- * Traverse through all referenced types chain until base YANG type is
- * founded.
- *
- * @param constraints
- * current type constraints
- * @param modules
- * all available modules
- * @param unknownType
- * unknown type
- * @param builder
- * current module
- * @return map, where key is type referenced and value is its constraints
- */
- private Map<TypeDefinitionBuilder, TypeConstraints> findTypeDefinitionBuilderWithConstraints(
- TypeConstraints constraints,
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- UnknownType unknownType, ModuleBuilder builder) {
- Map<TypeDefinitionBuilder, TypeConstraints> result = new HashMap<TypeDefinitionBuilder, TypeConstraints>();
- QName unknownTypeQName = unknownType.getQName();
- String unknownTypeName = unknownTypeQName.getLocalName();
- String unknownTypePrefix = unknownTypeQName.getPrefix();
+ private TypeDefinitionBuilder resolveCopiedBuilder(
+ final TypeDefinitionBuilder copy,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
+
+ if (copy instanceof UnionTypeBuilder) {
+ final UnionTypeBuilder union = (UnionTypeBuilder) copy;
+ final List<TypeDefinition<?>> unionTypes = union.getTypes();
+ final List<UnknownType> toRemove = new ArrayList<UnknownType>();
+ for (TypeDefinition<?> td : unionTypes) {
+ if (td instanceof UnknownType) {
+ final UnknownType unknownType = (UnknownType) td;
+ final TypeDefinitionBuilder resolvedType = resolveTypeUnion(
+ union, unknownType, modules, builder);
+ union.setType(resolvedType);
+ toRemove.add(unknownType);
+ }
+ }
+ unionTypes.removeAll(toRemove);
+
+ return union;
+ }
+
+ final TypeDefinition<?> base = copy.getType();
+ final TypeDefinitionBuilder baseTdb = copy.getTypedef();
+ if (base != null && !(base instanceof UnknownType)) {
+ return copy;
+ } else if (base instanceof UnknownType) {
+ final UnknownType unknownType = (UnknownType) base;
+ final QName unknownTypeQName = unknownType.getQName();
+ final String unknownTypePrefix = unknownTypeQName.getPrefix();
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ builder, unknownTypePrefix);
+ final TypeDefinitionBuilder utBuilder = getTypedefBuilder(copy,
+ modules, dependentModule);
+ copy.setType(utBuilder);
+ return copy;
+ } else if (base == null && baseTdb != null) {
+ // make a copy of baseTypeDef and call again
+ final TypeDefinitionBuilder baseTdbCopy = copyTypedefBuilder(
+ baseTdb, true);
+ final TypeDefinitionBuilder baseTdbCopyResolved = resolveCopiedBuilder(
+ baseTdbCopy, modules, builder);
+ copy.setType(baseTdbCopyResolved);
+ return copy;
+ } else {
+ throw new IllegalStateException(
+ "TypeDefinitionBuilder in unexpected state");
+ }
+ }
+
+ private TypeDefinitionBuilder findTypedefBuilder(
+ final QName unknownTypeQName,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
// search for module which contains referenced typedef
- ModuleBuilder dependentModuleBuilder = findDependentModule(modules,
- builder, unknownTypePrefix);
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ builder, unknownTypeQName.getPrefix());
+
+ final TypeDefinitionBuilder lookedUpBuilder = findTypedefBuilderByName(
+ dependentModule, unknownTypeQName.getLocalName());
+
+ return copyTypedefBuilder(lookedUpBuilder, true);
+ }
+
+ private TypeConstraints findConstraints(
+ final TypeAwareBuilder nodeToResolve,
+ final TypeConstraints constraints,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder builder) {
- TypeDefinitionBuilder lookedUpBuilder = findTypedefBuilder(
- dependentModuleBuilder.getModuleTypedefs(), unknownTypeName);
+ // union type cannot be restricted
+ if (nodeToResolve instanceof UnionTypeBuilder) {
+ return constraints;
+ }
// if referenced type is UnknownType again, search recursively with
// current constraints
- TypeDefinition<?> referencedType = lookedUpBuilder.getBaseType();
- if (referencedType instanceof UnknownType) {
- UnknownType unknown = (UnknownType) referencedType;
-
- final List<RangeConstraint> ranges = unknown.getRangeStatements();
+ final TypeDefinition<?> referencedType = nodeToResolve.getType();
+ List<RangeConstraint> ranges = Collections.emptyList();
+ List<LengthConstraint> lengths = Collections.emptyList();
+ List<PatternConstraint> patterns = Collections.emptyList();
+ Integer fractionDigits = null;
+ if (referencedType == null) {
+ final TypeDefinitionBuilder tdb = (TypeDefinitionBuilder) nodeToResolve;
+ ranges = tdb.getRanges();
+ constraints.addRanges(ranges);
+ lengths = tdb.getLengths();
+ constraints.addLengths(lengths);
+ patterns = tdb.getPatterns();
+ constraints.addPatterns(patterns);
+ fractionDigits = tdb.getFractionDigits();
+ constraints.setFractionDigits(fractionDigits);
+ return constraints;
+ } else if (referencedType instanceof ExtendedType) {
+ final ExtendedType ext = (ExtendedType) referencedType;
+ ranges = ext.getRanges();
constraints.addRanges(ranges);
- final List<LengthConstraint> lengths = unknown
- .getLengthStatements();
+ lengths = ext.getLengths();
constraints.addLengths(lengths);
- final List<PatternConstraint> patterns = unknown.getPatterns();
+ patterns = ext.getPatterns();
constraints.addPatterns(patterns);
- return findTypeDefinitionBuilderWithConstraints(constraints,
- modules, unknown, dependentModuleBuilder);
+ fractionDigits = ext.getFractionDigits();
+ constraints.setFractionDigits(fractionDigits);
+ return findConstraints(
+ findTypedefBuilder(ext.getQName(), modules, builder),
+ constraints, modules, builder);
+ } else if (referencedType instanceof UnknownType) {
+ final UnknownType unknown = (UnknownType) referencedType;
+ ranges = unknown.getRangeStatements();
+ constraints.addRanges(ranges);
+ lengths = unknown.getLengthStatements();
+ constraints.addLengths(lengths);
+ patterns = unknown.getPatterns();
+ constraints.addPatterns(patterns);
+ fractionDigits = unknown.getFractionDigits();
+ constraints.setFractionDigits(fractionDigits);
+
+ String unknownTypePrefix = unknown.getQName().getPrefix();
+ if (unknownTypePrefix == null || "".equals(unknownTypePrefix)) {
+ unknownTypePrefix = builder.getPrefix();
+ }
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ builder, unknown.getQName().getPrefix());
+ final TypeDefinitionBuilder utBuilder = findTypedefBuilder(
+ unknown.getQName(), modules, builder);
+ return findConstraints(utBuilder, constraints, modules,
+ dependentModule);
} else {
+ // HANDLE BASE YANG TYPE
mergeConstraints(referencedType, constraints);
- result.put(lookedUpBuilder, constraints);
- return result;
+ return constraints;
}
+
}
/**
* name of searched typedef
* @return typedef with name equals to given name
*/
- private TypeDefinitionBuilder findTypedefBuilder(
- Set<TypeDefinitionBuilder> typedefs, String name) {
+ private TypeDefinitionBuilder findTypedefBuilderByName(
+ final ModuleBuilder dependentModule, final String name) {
TypeDefinitionBuilder result = null;
+ final Set<TypeDefinitionBuilder> typedefs = dependentModule
+ .getModuleTypedefs();
for (TypeDefinitionBuilder td : typedefs) {
if (td.getQName().getLocalName().equals(name)) {
result = td;
}
}
if (result == null) {
- throw new YangParseException(
- "Target module does not contain typedef '" + name + "'.");
+ throw new YangParseException("Target module '"
+ + dependentModule.getName()
+ + "' does not contain typedef '" + name + "'.");
}
return result;
}
/**
- * Merge curent constraints with founded type constraints
- *
- * @param targetTypeBaseType
- * @param constraints
- * @param fractionDigits
- * @return
- */
- private TypeDefinition<?> mergeConstraints(
- TypeDefinition<?> targetTypeBaseType, TypeConstraints constraints,
- Integer fractionDigits) {
- String targetTypeBaseTypeName = targetTypeBaseType.getQName()
- .getLocalName();
- // enumeration, leafref and identityref omitted because they have no
- // restrictions
- if (targetTypeBaseType instanceof DecimalTypeDefinition) {
- List<RangeConstraint> ranges = constraints.getRange();
- Integer fd = fractionDigits == null ? constraints
- .getFractionDigits() : fractionDigits;
- targetTypeBaseType = YangTypesConverter
- .javaTypeForBaseYangDecimal64Type(ranges, fd);
- } else if (targetTypeBaseType instanceof IntegerTypeDefinition) {
- List<RangeConstraint> ranges = constraints.getRange();
- if (targetTypeBaseTypeName.startsWith("int")) {
- targetTypeBaseType = YangTypesConverter
- .javaTypeForBaseYangSignedIntegerType(
- targetTypeBaseTypeName, ranges);
- } else {
- targetTypeBaseType = YangTypesConverter
- .javaTypeForBaseYangUnsignedIntegerType(
- targetTypeBaseTypeName, ranges);
- }
- } else if (targetTypeBaseType instanceof StringTypeDefinition) {
- List<LengthConstraint> lengths = constraints.getLength();
- List<PatternConstraint> patterns = constraints.getPatterns();
- targetTypeBaseType = new StringType(lengths, patterns);
- } else if (targetTypeBaseType instanceof BitsTypeDefinition) {
- BitsTypeDefinition bitsType = (BitsTypeDefinition) targetTypeBaseType;
- List<Bit> bits = bitsType.getBits();
- targetTypeBaseType = new BitsType(bits);
- } else if (targetTypeBaseType instanceof BinaryTypeDefinition) {
- List<LengthConstraint> lengths = constraints.getLength();
- List<Byte> bytes = Collections.emptyList();
- targetTypeBaseType = new BinaryType(bytes, lengths, null);
- }
- return targetTypeBaseType;
- }
-
- /**
- * Pull restriction from base type and add them to given constraints
+ * Pull restriction from referenced type and add them to given constraints
*
* @param referencedType
* @param constraints
*/
- private void mergeConstraints(TypeDefinition<?> referencedType,
- TypeConstraints constraints) {
+ private void mergeConstraints(final TypeDefinition<?> referencedType,
+ final TypeConstraints constraints) {
if (referencedType instanceof DecimalTypeDefinition) {
constraints.addRanges(((DecimalTypeDefinition) referencedType)
}
/**
- * Go through all augmentation definitions and resolve them. This means find
- * referenced node and add child nodes to it.
+ * Go through all augmentation definitions and resolve them. This method
+ * also finds referenced node and add child nodes to it.
*
* @param modules
* all available modules
- * @param module
- * current module
*/
private void resolveAugments(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder module) {
- Set<AugmentationSchemaBuilder> augmentBuilders = module
- .getAddedAugments();
-
- Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();
- for (AugmentationSchemaBuilder augmentBuilder : augmentBuilders) {
- SchemaPath augmentTargetSchemaPath = augmentBuilder.getTargetPath();
- String prefix = null;
- List<String> augmentTargetPath = new ArrayList<String>();
-
- for (QName pathPart : augmentTargetSchemaPath.getPath()) {
- prefix = pathPart.getPrefix();
- augmentTargetPath.add(pathPart.getLocalName());
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+ final List<ModuleBuilder> allModulesList = new ArrayList<ModuleBuilder>();
+ final Set<ModuleBuilder> allModulesSet = new HashSet<ModuleBuilder>();
+ for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules
+ .entrySet()) {
+ for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue()
+ .entrySet()) {
+ allModulesList.add(inner.getValue());
+ allModulesSet.add(inner.getValue());
}
- ModuleBuilder dependentModule = findDependentModule(modules,
- module, prefix);
- augmentTargetPath.add(0, dependentModule.getName());
+ }
- AugmentationTargetBuilder augmentTarget = (AugmentationTargetBuilder) dependentModule
- .getNode(augmentTargetPath);
- AugmentationSchema result = augmentBuilder.build();
- augmentTarget.addAugmentation(result);
- fillAugmentTarget(augmentBuilder, (ChildNodeBuilder) augmentTarget);
- augments.add(result);
+ for (int i = 0; i < allModulesList.size(); i++) {
+ final ModuleBuilder module = allModulesList.get(i);
+ // try to resolve augments in module
+ resolveAugment(modules, module);
+ // while all augments are not resolved
+ final Iterator<ModuleBuilder> allModulesIterator = allModulesSet
+ .iterator();
+ while (!(module.getAugmentsResolved() == module.getAddedAugments()
+ .size())) {
+ ModuleBuilder nextModule = null;
+ // try resolve other module augments
+ try {
+ nextModule = allModulesIterator.next();
+ resolveAugment(modules, nextModule);
+ } catch (NoSuchElementException e) {
+ throw new YangParseException(
+ "Failed to resolve augments in module '"
+ + module.getName() + "'.", e);
+ }
+ // then try to resolve first module again
+ resolveAugment(modules, module);
+ }
+ }
+ }
+
+ private void resolveAugment(
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ if (module.getAugmentsResolved() < module.getAddedAugments().size()) {
+ for (AugmentationSchemaBuilder augmentBuilder : module
+ .getAddedAugments()) {
+ final SchemaPath augmentTargetSchemaPath = augmentBuilder
+ .getTargetPath();
+ final List<QName> path = augmentTargetSchemaPath.getPath();
+
+ int i = 0;
+ final QName qname = path.get(i);
+ String prefix = qname.getPrefix();
+ if(prefix == null) {
+ prefix = module.getPrefix();
+ }
+
+ DataSchemaNodeBuilder currentParent = null;
+ final ModuleBuilder dependentModule = findDependentModule(
+ modules, module, prefix);
+ for (DataSchemaNodeBuilder child : dependentModule
+ .getChildNodes()) {
+ final QName childQName = child.getQName();
+ if (childQName.getLocalName().equals(qname.getLocalName())) {
+ currentParent = child;
+ i++;
+ break;
+ }
+ }
+
+ for (; i < path.size(); i++) {
+ final QName currentQName = path.get(i);
+ DataSchemaNodeBuilder newParent = null;
+ for (DataSchemaNodeBuilder child : ((ChildNodeBuilder) currentParent)
+ .getChildNodes()) {
+ final QName childQName = child.getQName();
+ if (childQName.getLocalName().equals(
+ currentQName.getLocalName())) {
+ newParent = child;
+ break;
+ }
+ }
+ if (newParent == null) {
+ break; // node not found, quit search
+ } else {
+ currentParent = newParent;
+ }
+ }
+
+ final QName currentQName = currentParent.getQName();
+ final QName lastAugmentPathElement = path.get(path.size() - 1);
+
+ if (currentQName.getLocalName().equals(
+ lastAugmentPathElement.getLocalName())) {
+ fillAugmentTarget(augmentBuilder,
+ (ChildNodeBuilder) currentParent);
+ ((AugmentationTargetBuilder) currentParent)
+ .addAugmentation(augmentBuilder);
+ module.augmentResolved();
+ }
+ }
}
- module.setAugmentations(augments);
}
/**
* @param augment
* @param target
*/
- private void fillAugmentTarget(AugmentationSchemaBuilder augment,
- ChildNodeBuilder target) {
+ private void fillAugmentTarget(final AugmentationSchemaBuilder augment,
+ final ChildNodeBuilder target) {
for (DataSchemaNodeBuilder builder : augment.getChildNodes()) {
builder.setAugmenting(true);
target.addChildNode(builder);
* module being resolved
*/
private void resolveIdentities(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder module) {
- Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ final Set<IdentitySchemaNodeBuilder> identities = module
+ .getAddedIdentities();
for (IdentitySchemaNodeBuilder identity : identities) {
- String baseIdentityName = identity.getBaseIdentityName();
+ final String baseIdentityName = identity.getBaseIdentityName();
if (baseIdentityName != null) {
String baseIdentityPrefix = null;
String baseIdentityLocalName = null;
if (baseIdentityName.contains(":")) {
- String[] splitted = baseIdentityName.split(":");
+ final String[] splitted = baseIdentityName.split(":");
baseIdentityPrefix = splitted[0];
baseIdentityLocalName = splitted[1];
} else {
baseIdentityPrefix = module.getPrefix();
baseIdentityLocalName = baseIdentityName;
}
- ModuleBuilder dependentModule = findDependentModule(modules,
- module, baseIdentityPrefix);
+ final ModuleBuilder dependentModule = findDependentModule(
+ modules, module, baseIdentityPrefix);
- Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModule
+ final Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModule
.getAddedIdentities();
for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {
if (idBuilder.getQName().getLocalName()
}
}
+ /**
+ * Go through uses statements defined in current module and resolve their
+ * refine statements.
+ *
+ * @param modules
+ * all modules
+ * @param module
+ * module being resolved
+ */
+ private void resolveUses(
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ final Map<List<String>, UsesNodeBuilder> moduleUses = module
+ .getAddedUsesNodes();
+ for (Map.Entry<List<String>, UsesNodeBuilder> entry : moduleUses
+ .entrySet()) {
+ final List<String> key = entry.getKey();
+ final UsesNodeBuilder usesNode = entry.getValue();
+
+ final String groupingName = key.get(key.size() - 1);
+
+ final List<RefineHolder> refines = usesNode.getRefines();
+ for (RefineHolder refine : refines) {
+ final Refine refineType = refine.getType();
+ // refine statements
+ final String defaultStr = refine.getDefaultStr();
+ final Boolean mandatory = refine.isMandatory();
+ final MustDefinition must = refine.getMust();
+ final Boolean presence = refine.isPresence();
+ final Integer min = refine.getMinElements();
+ final Integer max = refine.getMaxElements();
+
+ switch (refineType) {
+ case LEAF:
+ final LeafSchemaNodeBuilder leaf = (LeafSchemaNodeBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (defaultStr != null && !("".equals(defaultStr))) {
+ leaf.setDefaultStr(defaultStr);
+ }
+ if (mandatory != null) {
+ leaf.getConstraints().setMandatory(mandatory);
+ }
+ if (must != null) {
+ leaf.getConstraints().addMustDefinition(must);
+ }
+ usesNode.addRefineNode(leaf);
+ break;
+ case CONTAINER:
+ final ContainerSchemaNodeBuilder container = (ContainerSchemaNodeBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (presence != null) {
+ container.setPresence(presence);
+ }
+ if (must != null) {
+ container.getConstraints().addMustDefinition(must);
+ }
+ usesNode.addRefineNode(container);
+ break;
+ case LIST:
+ final ListSchemaNodeBuilder list = (ListSchemaNodeBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (must != null) {
+ list.getConstraints().addMustDefinition(must);
+ }
+ if (min != null) {
+ list.getConstraints().setMinElements(min);
+ }
+ if (max != null) {
+ list.getConstraints().setMaxElements(max);
+ }
+ break;
+ case LEAF_LIST:
+ final LeafListSchemaNodeBuilder leafList = (LeafListSchemaNodeBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (must != null) {
+ leafList.getConstraints().addMustDefinition(must);
+ }
+ if (min != null) {
+ leafList.getConstraints().setMinElements(min);
+ }
+ if (max != null) {
+ leafList.getConstraints().setMaxElements(max);
+ }
+ break;
+ case CHOICE:
+ final ChoiceBuilder choice = (ChoiceBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (defaultStr != null) {
+ choice.setDefaultCase(defaultStr);
+ }
+ if (mandatory != null) {
+ choice.getConstraints().setMandatory(mandatory);
+ }
+ break;
+ case ANYXML:
+ final AnyXmlBuilder anyXml = (AnyXmlBuilder) getRefineTargetBuilder(
+ groupingName, refine, modules, module);
+ if (mandatory != null) {
+ anyXml.getConstraints().setMandatory(mandatory);
+ }
+ if (must != null) {
+ anyXml.getConstraints().addMustDefinition(must);
+ }
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Find original builder of refine node and return copy of this builder.
+ *
+ * @param groupingPath
+ * path to grouping which contains node to refine
+ * @param refine
+ * refine object containing informations about refine
+ * @param modules
+ * all loaded modules
+ * @param module
+ * current module
+ * @return copy of Builder object of node to be refined if it is present in
+ * grouping, null otherwise
+ */
+ private Builder getRefineTargetBuilder(final String groupingPath,
+ final RefineHolder refine,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ Builder result = null;
+ final Builder lookedUpBuilder = findRefineTargetBuilder(groupingPath,
+ refine.getName(), modules, module);
+ if (lookedUpBuilder instanceof LeafSchemaNodeBuilder) {
+ result = ParserUtils
+ .copyLeafBuilder((LeafSchemaNodeBuilder) lookedUpBuilder);
+ } else if (lookedUpBuilder instanceof ContainerSchemaNodeBuilder) {
+ result = ParserUtils
+ .copyContainerBuilder((ContainerSchemaNodeBuilder) lookedUpBuilder);
+ } else if (lookedUpBuilder instanceof ListSchemaNodeBuilder) {
+ result = ParserUtils
+ .copyListBuilder((ListSchemaNodeBuilder) lookedUpBuilder);
+ } else if (lookedUpBuilder instanceof LeafListSchemaNodeBuilder) {
+ result = ParserUtils
+ .copyLeafListBuilder((LeafListSchemaNodeBuilder) lookedUpBuilder);
+ } else if (lookedUpBuilder instanceof ChoiceBuilder) {
+ result = ParserUtils
+ .copyChoiceBuilder((ChoiceBuilder) lookedUpBuilder);
+ } else if (lookedUpBuilder instanceof AnyXmlBuilder) {
+ result = ParserUtils
+ .copyAnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder);
+ } else {
+ throw new YangParseException("Target '" + refine.getName()
+ + "' can not be refined");
+ }
+ return result;
+ }
+
+ /**
+ * Find builder of refine node.
+ *
+ * @param groupingPath
+ * path to grouping which contains node to refine
+ * @param refineNodeName
+ * name of node to be refined
+ * @param modules
+ * all loaded modules
+ * @param module
+ * current module
+ * @return Builder object of refine node if it is present in grouping, null
+ * otherwise
+ */
+ private Builder findRefineTargetBuilder(final String groupingPath,
+ final String refineNodeName,
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module) {
+ final SchemaPath path = ParserUtils.parseUsesPath(groupingPath);
+ final List<String> builderPath = new ArrayList<String>();
+ String prefix = null;
+ for (QName qname : path.getPath()) {
+ builderPath.add(qname.getLocalName());
+ prefix = qname.getPrefix();
+ }
+ if (prefix == null) {
+ prefix = module.getPrefix();
+ }
+
+ final ModuleBuilder dependentModule = findDependentModule(modules,
+ module, prefix);
+ builderPath.add(0, "grouping");
+ builderPath.add(0, dependentModule.getName());
+ final GroupingBuilder builder = (GroupingBuilder) dependentModule
+ .getNode(builderPath);
+
+ return builder.getChildNode(refineNodeName);
+ }
+
+ private QName findFullQName(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module, final IdentityrefTypeBuilder idref) {
+ QName result = null;
+ String baseString = idref.getBaseString();
+ if(baseString.contains(":")) {
+ String[] splittedBase = baseString.split(":");
+ if(splittedBase.length > 2) {
+ throw new YangParseException("Failed to parse identity base: "+ baseString);
+ }
+ String prefix = splittedBase[0];
+ String name = splittedBase[1];
+ ModuleBuilder dependentModule = findDependentModule(modules, module, prefix);
+ result = new QName(dependentModule.getNamespace(), dependentModule.getRevision(), prefix, name);
+ } else {
+ result = new QName(module.getNamespace(), module.getRevision(), module.getPrefix(), baseString);
+ }
+ return result;
+ }
+
/**
* Find dependent module based on given prefix
*
* @return
*/
private ModuleBuilder findDependentModule(
- Map<String, TreeMap<Date, ModuleBuilder>> modules,
- ModuleBuilder module, String prefix) {
+ final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final ModuleBuilder module, final String prefix) {
ModuleBuilder dependentModule = null;
Date dependentModuleRevision = null;
if (prefix.equals(module.getPrefix())) {
dependentModule = module;
} else {
- ModuleImport dependentModuleImport = getModuleImport(module, prefix);
+ final ModuleImport dependentModuleImport = getModuleImport(module,
+ prefix);
if (dependentModuleImport == null) {
throw new YangParseException("No import found with prefix '"
+ prefix + "' in module " + module.getName() + "'.");
}
- String dependentModuleName = dependentModuleImport.getModuleName();
+ final String dependentModuleName = dependentModuleImport
+ .getModuleName();
dependentModuleRevision = dependentModuleImport.getRevision();
- TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules
+ final TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules
.get(dependentModuleName);
+ if (moduleBuildersByRevision == null) {
+ throw new YangParseException(
+ "Failed to find dependent module '"
+ + dependentModuleName + "' needed by module '"
+ + module.getName() + "'.");
+ }
if (dependentModuleRevision == null) {
dependentModule = moduleBuildersByRevision.lastEntry()
.getValue();
* prefix associated with import
* @return ModuleImport based on given prefix
*/
- private ModuleImport getModuleImport(ModuleBuilder builder, String prefix) {
+ private ModuleImport getModuleImport(final ModuleBuilder builder,
+ final String prefix) {
ModuleImport moduleImport = null;
for (ModuleImport mi : builder.getModuleImports()) {
if (mi.getPrefix().equals(prefix)) {
return moduleImport;
}
- private Date createEpochTime() {
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(0);
- return c.getTime();
- }
-
private static class SchemaContextImpl implements SchemaContext {
private final Set<Module> modules;
- private SchemaContextImpl(Set<Module> modules) {
+ private SchemaContextImpl(final Set<Module> modules) {
this.modules = modules;
}
}
return extensions;
}
+
+ @Override
+ public Module findModuleByName(final String name, final Date revision) {
+ if ((name != null) && (revision != null)) {
+ for (final Module module : modules) {
+ if (module.getName().equals(name)
+ && module.getRevision().equals(revision)) {
+ return module;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Module findModuleByNamespace(final URI namespace) {
+ if (namespace != null) {
+ for (final Module module : modules) {
+ if (module.getNamespace().equals(namespace)) {
+ return module;
+ }
+ }
+ }
+ return null;
+ }
}
}