import java.util.Collections;
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 org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
import org.opendaylight.yangtools.yang.model.util.IdentityrefType;
import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
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.ModuleBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder;
import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.util.CopyUtils;
import org.opendaylight.yangtools.yang.parser.util.GroupingUtils;
import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
}
private Map<ModuleBuilder, Module> build(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
- findUsesTargets(modules, null);
-
// fix unresolved nodes
- for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
- for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
- final ModuleBuilder moduleBuilder = childEntry.getValue();
- fixUnresolvedNodes(modules, moduleBuilder);
- }
- }
- finishResolveDirtyNodes(modules);
+ findUsesTargets(modules, null);
+ resolveDirtyNodes(modules);
resolveAugments(modules);
resolveUses(modules);
resolveDeviations(modules);
}
private Map<ModuleBuilder, Module> buildWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
- SchemaContext context) {
- findUsesTargets(modules, context);
-
+ final SchemaContext context) {
// fix unresolved nodes
- for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
- for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
- final ModuleBuilder moduleBuilder = childEntry.getValue();
- fixUnresolvedNodesWithContext(modules, moduleBuilder, context);
- }
- }
- finishResolveDirtyNodes(modules);
+ findUsesTargets(modules, context);
+ resolvedDirtyNodesWithContext(modules, context);
resolveAugmentsWithContext(modules, context);
resolveUsesWithContext(modules, context);
resolveDeviationsWithContext(modules, context);
return result;
}
- private void fixUnresolvedNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder builder) {
- resolveDirtyNodes(modules, builder);
- resolveIdentities(modules, builder);
- resolveUnknownNodes(modules, builder);
+ private void resolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
+ for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
+ for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
+ final ModuleBuilder module = childEntry.getValue();
+ resolveDirtyNodes(modules, module);
+ resolveIdentities(modules, module);
+ resolveUnknownNodes(modules, module);
+ }
+ }
}
- private void fixUnresolvedNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
- final ModuleBuilder builder, final SchemaContext context) {
- resolveDirtyNodesWithContext(modules, builder, context);
- resolveIdentitiesWithContext(modules, builder, context);
- resolveUnknownNodesWithContext(modules, builder, context);
+ private void resolvedDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
+ final SchemaContext context) {
+ for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
+ for (Map.Entry<Date, ModuleBuilder> childEntry : entry.getValue().entrySet()) {
+ final ModuleBuilder module = childEntry.getValue();
+ resolveDirtyNodesWithContext(modules, module, context);
+ resolveIdentitiesWithContext(modules, module, context);
+ resolveUnknownNodesWithContext(modules, module, context);
+ }
+ }
}
/**
}
}
- private void finishResolveDirtyNodes(final Map<String, TreeMap<Date, ModuleBuilder>> modules) {
- final Set<TypeAwareBuilder> dirtyNodes = new HashSet<>();
- for (Map.Entry<String, TreeMap<Date, ModuleBuilder>> entry : modules.entrySet()) {
- for (Map.Entry<Date, ModuleBuilder> inner : entry.getValue().entrySet()) {
- dirtyNodes.addAll(inner.getValue().getDirtyNodes());
- }
- }
-
- if (!dirtyNodes.isEmpty()) {
- for (TypeAwareBuilder nodeToResolve : dirtyNodes) {
- if (nodeToResolve instanceof UnionTypeBuilder) {
- List<TypeDefinitionBuilder> newTypes = new ArrayList<>();
- List<TypeDefinitionBuilder> oldTypes = ((UnionTypeBuilder) nodeToResolve).getTypedefs();
- for (TypeDefinitionBuilder tdb : oldTypes) {
- TypeDefinitionBuilder newType = CopyUtils.copy(tdb, nodeToResolve, false);
- ParserUtils.correctTypeAwareNodePath(newType);
- newTypes.add(newType);
- }
- oldTypes.clear();
- oldTypes.addAll(newTypes);
- } else if (nodeToResolve.getType() instanceof IdentityrefType) {
- TypeDefinition<?> idRef = ParserUtils.createCorrectTypeDefinition(nodeToResolve.getPath(),
- nodeToResolve.getType());
- nodeToResolve.setType(idRef);
- } else {
- 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);
- }
- }
- }
- }
- }
-
private void resolveDirtyNodesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
final ModuleBuilder module, SchemaContext context) {
final Set<TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();
}
/**
- * Find target grouping for all uses nodes.
+ * Find and add reference of uses target grouping.
*
* @param modules
* all loaded modules
GroupingDefinition targetGroupingDefinition = GroupingUtils.getTargetGroupingFromContext(usesNode,
module, context);
usesNode.setGroupingDefinition(targetGroupingDefinition);
- usesNode.setGroupingPath(targetGroupingDefinition.getPath());
}
} else {
usesNode.setGrouping(targetGroupingBuilder);
- usesNode.setGroupingPath(targetGroupingBuilder.getPath());
}
}
}
usnb.getLine());
for (ExtensionBuilder extension : dependentModule.getExtensions()) {
if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) {
+ usnb.setNodeType(extension.getQName());
usnb.setExtensionBuilder(extension);
break;
}
}
} catch (YangParseException e) {
- LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: "
- + nodeType);
+ throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb
+ + ": no such extension definition found.");
}
}
}
usnb.getLine());
for (ExtensionDefinition e : dependentModule.getExtensionSchemaNodes()) {
if (e.getQName().getLocalName().equals(nodeType.getLocalName())) {
+ usnb.setNodeType(new QName(e.getQName().getNamespace(), e.getQName().getRevision(),
+ nodeType.getPrefix(), e.getQName().getLocalName()));
usnb.setExtensionDefinition(e);
break;
}
}
} catch (YangParseException e) {
- LOG.debug(module.getName(), usnb.getLine(), "Failed to find unknown node extension definition: "
- + nodeType);
+ throw new YangParseException(module.getName(), usnb.getLine(), "Failed to resolve node " + usnb
+ + ": no such extension definition found.");
}
}