X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fimpl%2FYangParserImpl.java;h=4a3701d45f13c7d2e5461088565f1ee9c9dc1233;hb=f75b7abb9dcc2ba02a14a316212da1c1b434a9b3;hp=160e9c907b7a18dce8130eea0f37d306efff66ac;hpb=1380de45de623d7bbce26cc7dd2ed28131a72067;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index 160e9c907b..4a3701d45f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -15,6 +15,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -40,11 +41,11 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.ModuleImport; 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.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.Builder; import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; @@ -68,6 +69,7 @@ import org.opendaylight.yangtools.yang.validator.YangModelBasicValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -77,6 +79,58 @@ public final class YangParserImpl implements YangModelParser { private static final String FAIL_DEVIATION_TARGET = "Failed to find deviation target."; + @Override + public Set parseYangModels(final File yangFile, final File directory) { + Preconditions.checkState(yangFile.exists(), yangFile + " does not exists"); + Preconditions.checkState(directory.exists(), directory + " does not exists"); + Preconditions.checkState(directory.isDirectory(), directory + " is not a directory"); + + final String yangFileName = yangFile.getName(); + final String[] fileList = directory.list(); + Preconditions.checkNotNull(fileList, directory + " not found"); + + FileInputStream yangFileStream = null; + LinkedHashMap streamToFileMap = new LinkedHashMap<>(); + + try { + yangFileStream = new FileInputStream(yangFile); + streamToFileMap.put(yangFileStream, yangFile); + } catch(FileNotFoundException e) { + LOG.warn("Exception while reading yang file: " + yangFile.getName(), e); + } + + for (String fileName : fileList) { + if (fileName.equals(yangFileName)) { + continue; + } + File dependency = new File(directory, fileName); + try { + if (dependency.isFile()) { + streamToFileMap.put(new FileInputStream(dependency), dependency); + } + } catch(FileNotFoundException e) { + LOG.warn("Exception while reading yang file: " + fileName, e); + } + } + + Map parsedBuilders = parseModuleBuilders( + new ArrayList<>(streamToFileMap.keySet()), new HashMap()); + ModuleBuilder main = parsedBuilders.get(yangFileStream); + + List moduleBuilders = new ArrayList<>(); + moduleBuilders.add(main); + filterImports(main, new ArrayList<>(parsedBuilders.values()), moduleBuilders); + + ModuleBuilder[] builders = new ModuleBuilder[moduleBuilders.size()]; + moduleBuilders.toArray(builders); + + // module dependency graph sorted + List sorted = ModuleDependencySort.sort(builders); + + final LinkedHashMap> modules = orderModules(sorted); + return new LinkedHashSet<>(build(modules).values()); + } + @Override public Set parseYangModels(final List yangFiles) { return Sets.newLinkedHashSet(parseYangModelsMapped(yangFiles).values()); @@ -96,7 +150,6 @@ public final class YangParserImpl implements YangModelParser { } Map builderToStreamMap = Maps.newHashMap(); - final Map> modules = resolveModuleBuilders( Lists.newArrayList(inputStreams.keySet()), builderToStreamMap); @@ -108,7 +161,7 @@ public final class YangParserImpl implements YangModelParser { } } - return new LinkedHashSet(buildWithContext(modules, context).values()); + return new LinkedHashSet<>(buildWithContext(modules, context).values()); } return Collections.emptySet(); } @@ -124,7 +177,7 @@ public final class YangParserImpl implements YangModelParser { Map builderToStreamMap = Maps.newHashMap(); final Map> modules = resolveModuleBuildersWithContext( yangModelStreams, builderToStreamMap, context); - return new LinkedHashSet(buildWithContext(modules, context).values()); + return new LinkedHashSet<>(buildWithContext(modules, context).values()); } return Collections.emptySet(); } @@ -187,26 +240,27 @@ public final class YangParserImpl implements YangModelParser { return new SchemaContextImpl(modules); } - private ModuleBuilder[] parseModuleBuilders(List inputStreams, + private Map parseModuleBuilders(List inputStreams, Map streamToBuilderMap) { final ParseTreeWalker walker = new ParseTreeWalker(); - final List trees = parseStreams(inputStreams); - final ModuleBuilder[] builders = new ModuleBuilder[trees.size()]; + final Map trees = parseStreams(inputStreams); + final Map builders = new LinkedHashMap<>(); // validate yang - new YangModelBasicValidator(walker).validate(trees); + new YangModelBasicValidator(walker).validate(new ArrayList<>(trees.values())); - YangParserListenerImpl yangModelParser = null; - for (int i = 0; i < trees.size(); i++) { + YangParserListenerImpl yangModelParser; + for(Map.Entry entry : trees.entrySet()) { yangModelParser = new YangParserListenerImpl(); - walker.walk(yangModelParser, trees.get(i)); + walker.walk(yangModelParser, entry.getValue()); ModuleBuilder moduleBuilder = yangModelParser.getModuleBuilder(); // We expect the order of trees and streams has to be the same - streamToBuilderMap.put(moduleBuilder, inputStreams.get(i)); - builders[i] = moduleBuilder; + streamToBuilderMap.put(moduleBuilder, entry.getKey()); + builders.put(entry.getKey(), moduleBuilder); } + return builders; } @@ -218,20 +272,32 @@ public final class YangParserImpl implements YangModelParser { private Map> resolveModuleBuildersWithContext( final List yangFileStreams, final Map streamToBuilderMap, final SchemaContext context) { - final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, streamToBuilderMap); - - // LinkedHashMap must be used to preserve order - final LinkedHashMap> modules = new LinkedHashMap>(); + Map parsedBuilders = parseModuleBuilders(yangFileStreams, streamToBuilderMap); + ModuleBuilder[] builders = new ModuleBuilder[parsedBuilders.size()]; + parsedBuilders.values().toArray(builders); // module dependency graph sorted - List sorted = null; + List sorted; if (context == null) { sorted = ModuleDependencySort.sort(builders); } else { sorted = ModuleDependencySort.sortWithContext(context, builders); } - for (final ModuleBuilder builder : sorted) { + return orderModules(sorted); + } + + /** + * Order modules by name and revision. + * + * @param modules + * modules to order + * @return modules ordered by name and revision + */ + private LinkedHashMap> orderModules(List modules) { + // LinkedHashMap must be used to preserve order + LinkedHashMap> result = new LinkedHashMap<>(); + for (final ModuleBuilder builder : modules) { if (builder == null) { continue; } @@ -240,20 +306,42 @@ public final class YangParserImpl implements YangModelParser { if (builderRevision == null) { builderRevision = new Date(0L); } - TreeMap builderByRevision = modules.get(builderName); + TreeMap builderByRevision = result.get(builderName); if (builderByRevision == null) { - builderByRevision = new TreeMap(); + builderByRevision = new TreeMap<>(); } builderByRevision.put(builderRevision, builder); - modules.put(builderName, builderByRevision); + result.put(builderName, builderByRevision); } - return modules; + return result; } - private List parseStreams(final List yangStreams) { - final List trees = new ArrayList(); + private void filterImports(ModuleBuilder main, List other, List filtered) { + for (ModuleImport mi : main.getModuleImports()) { + for (ModuleBuilder builder : other) { + if (mi.getModuleName().equals(builder.getModuleName())) { + if (mi.getRevision() == null) { + if (!filtered.contains(builder)) { + filtered.add(builder); + filterImports(builder, other, filtered); + } + } else { + if (mi.getRevision().equals(builder.getRevision())) { + if (!filtered.contains(builder)) { + filtered.add(builder); + filterImports(builder, other, filtered); + } + } + } + } + } + } + } + + private Map parseStreams(final List yangStreams) { + final Map trees = new HashMap<>(); for (InputStream yangStream : yangStreams) { - trees.add(parseStream(yangStream)); + trees.put(yangStream, parseStream(yangStream)); } return trees; } @@ -277,7 +365,7 @@ public final class YangParserImpl implements YangModelParser { private Map build(final Map> modules) { // fix unresolved nodes - resolveAugmentsTargetPath(modules); + resolveAugmentsTargetPath(modules, null); resolveUsesTargetGrouping(modules, null); resolveDirtyNodes(modules); resolveAugments(modules); @@ -286,13 +374,11 @@ public final class YangParserImpl implements YangModelParser { resolveDeviations(modules); // build - final Map result = new LinkedHashMap(); + final Map result = new LinkedHashMap<>(); for (Map.Entry> entry : modules.entrySet()) { - final Map modulesByRevision = new HashMap(); for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder moduleBuilder = childEntry.getValue(); final Module module = moduleBuilder.build(); - modulesByRevision.put(childEntry.getKey(), module); result.put(moduleBuilder, module); } } @@ -302,22 +388,20 @@ public final class YangParserImpl implements YangModelParser { private Map buildWithContext(final Map> modules, final SchemaContext context) { // fix unresolved nodes - // TODO - // fixAugmentsTargetPath(modules); + resolveAugmentsTargetPath(modules, context); resolveUsesTargetGrouping(modules, context); resolvedDirtyNodesWithContext(modules, context); resolveAugmentsWithContext(modules, context); resolveUses(modules, true); + resolvedUsesPostProcessing(modules, true); resolveDeviationsWithContext(modules, context); // build - final Map result = new LinkedHashMap(); + final Map result = new LinkedHashMap<>(); for (Map.Entry> entry : modules.entrySet()) { - final Map modulesByRevision = new HashMap(); for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder moduleBuilder = childEntry.getValue(); final Module module = moduleBuilder.build(); - modulesByRevision.put(childEntry.getKey(), module); result.put(moduleBuilder, module); } } @@ -328,9 +412,9 @@ public final class YangParserImpl implements YangModelParser { for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder module = childEntry.getValue(); - resolveDirtyNodes(modules, module); - resolveIdentities(modules, module); resolveUnknownNodes(modules, module); + resolveIdentities(modules, module); + resolveDirtyNodes(modules, module); } } } @@ -340,9 +424,9 @@ public final class YangParserImpl implements YangModelParser { for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry childEntry : entry.getValue().entrySet()) { final ModuleBuilder module = childEntry.getValue(); - resolveDirtyNodesWithContext(modules, module, context); - resolveIdentitiesWithContext(modules, module, context); resolveUnknownNodesWithContext(modules, module, context); + resolveIdentitiesWithContext(modules, module, context); + resolveDirtyNodesWithContext(modules, module, context); } } } @@ -366,7 +450,13 @@ public final class YangParserImpl implements YangModelParser { } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) { // special handling for identityref types IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef(); - nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath())); + IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(), + idref.getLine()); + if (identity == null) { + throw new YangParseException(module.getName(), idref.getLine(), "Failed to find base identity"); + } + idref.setBaseIdentity(identity); + nodeToResolve.setType(idref.build(null)); } else { resolveType(nodeToResolve, modules, module); } @@ -385,7 +475,10 @@ public final class YangParserImpl implements YangModelParser { } else if (nodeToResolve.getTypedef() instanceof IdentityrefTypeBuilder) { // special handling for identityref types IdentityrefTypeBuilder idref = (IdentityrefTypeBuilder) nodeToResolve.getTypedef(); - nodeToResolve.setType(new IdentityrefType(findFullQName(modules, module, idref), idref.getPath())); + IdentitySchemaNodeBuilder identity = findBaseIdentity(modules, module, idref.getBaseString(), + idref.getLine()); + idref.setBaseIdentity(identity); + nodeToResolve.setType(idref.build(null)); } else { resolveTypeWithContext(nodeToResolve, modules, module, context); } @@ -399,7 +492,8 @@ public final class YangParserImpl implements YangModelParser { * @param modules * all loaded modules */ - private void resolveAugmentsTargetPath(final Map> modules) { + private void resolveAugmentsTargetPath(final Map> modules, + SchemaContext context) { // collect augments from all loaded modules final List allAugments = new ArrayList<>(); for (Map.Entry> entry : modules.entrySet()) { @@ -409,30 +503,42 @@ public final class YangParserImpl implements YangModelParser { } for (AugmentationSchemaBuilder augment : allAugments) { - setCorrectAugmentTargetPath(modules, augment); + setCorrectAugmentTargetPath(modules, augment, context); } } private void setCorrectAugmentTargetPath(final Map> modules, - final AugmentationSchemaBuilder augmentBuilder) { - ModuleBuilder module = ParserUtils.getParentModule(augmentBuilder); - SchemaPath oldSchemaPath = augmentBuilder.getTargetPath(); + final AugmentationSchemaBuilder augment, final SchemaContext context) { + ModuleBuilder module = ParserUtils.getParentModule(augment); + SchemaPath oldSchemaPath = augment.getTargetPath(); List oldPath = oldSchemaPath.getPath(); List newPath = new ArrayList<>(); for (QName qn : oldPath) { - ModuleBuilder currentModule = null; - String prefix = qn.getPrefix(); - if (prefix == null || "".equals(prefix)) { - currentModule = module; - } else { - currentModule = ParserUtils.findDependentModuleBuilder(modules, module, prefix, - augmentBuilder.getLine()); + URI ns = module.getNamespace(); + Date rev = module.getRevision(); + String pref = module.getPrefix(); + String localPrefix = qn.getPrefix(); + if (localPrefix != null && !("".equals(localPrefix))) { + ModuleBuilder currentModule = ParserUtils.findModuleFromBuilders(modules, module, localPrefix, + augment.getLine()); + if (currentModule == null) { + Module m = ParserUtils.findModuleFromContext(context, module, localPrefix, augment.getLine()); + if (m == null) { + throw new YangParseException(module.getName(), augment.getLine(), "Module with prefix " + + localPrefix + " not found."); + } + ns = m.getNamespace(); + rev = m.getRevision(); + pref = m.getPrefix(); + } else { + ns = currentModule.getNamespace(); + rev = currentModule.getRevision(); + pref = currentModule.getPrefix(); + } } - QName newQName = new QName(currentModule.getNamespace(), currentModule.getRevision(), prefix, - qn.getLocalName()); - newPath.add(newQName); + newPath.add(new QName(ns, rev, pref, qn.getLocalName())); } - augmentBuilder.setTargetPath(new SchemaPath(newPath, augmentBuilder.getTargetPath().isAbsolute())); + augment.setTargetNodeSchemaPath(new SchemaPath(newPath, augment.getTargetPath().isAbsolute())); } /** @@ -527,7 +633,7 @@ public final class YangParserImpl implements YangModelParser { List path = augment.getTargetPath().getPath(); Builder augmentParent = augment.getParent(); - Builder firstNodeParent = null; + Builder firstNodeParent; if (augmentParent instanceof ModuleBuilder) { // if augment is defined under module, parent of first node is // target module @@ -536,7 +642,7 @@ public final class YangParserImpl implements YangModelParser { if (prefix == null) { prefix = module.getPrefix(); } - firstNodeParent = findDependentModuleBuilder(modules, module, prefix, line); + firstNodeParent = findModuleFromBuilders(modules, module, prefix, line); } else if (augmentParent instanceof UsesNodeBuilder) { firstNodeParent = augmentParent.getParent(); } else { @@ -608,18 +714,17 @@ public final class YangParserImpl implements YangModelParser { } int line = augment.getLine(); ModuleBuilder module = getParentModule(augment); - List path = augment.getTargetPath().getPath(); + List path = augment.getTargetNodeSchemaPath().getPath(); final QName firstNameInPath = path.get(0); String prefix = firstNameInPath.getPrefix(); if (prefix == null) { prefix = module.getPrefix(); } Builder augmentParent = augment.getParent(); - Builder currentParent = null; - + Builder currentParent; if (augmentParent instanceof ModuleBuilder) { // if augment is defined under module, first parent is target module - currentParent = findDependentModuleBuilder(modules, module, prefix, line); + currentParent = findModuleFromBuilders(modules, module, prefix, line); } else if (augmentParent instanceof UsesNodeBuilder) { currentParent = augmentParent.getParent(); } else { @@ -648,25 +753,13 @@ public final class YangParserImpl implements YangModelParser { final Set identities = module.getIdentities(); for (IdentitySchemaNodeBuilder identity : identities) { final String baseIdentityName = identity.getBaseIdentityName(); + final int line = identity.getLine(); if (baseIdentityName != null) { - String baseIdentityPrefix = null; - String baseIdentityLocalName = null; - if (baseIdentityName.contains(":")) { - final String[] splitted = baseIdentityName.split(":"); - baseIdentityPrefix = splitted[0]; - baseIdentityLocalName = splitted[1]; + IdentitySchemaNodeBuilder baseIdentity = findBaseIdentity(modules, module, baseIdentityName, line); + if (baseIdentity == null) { + throw new YangParseException(module.getName(), identity.getLine(), "Failed to find base identity"); } else { - baseIdentityPrefix = module.getPrefix(); - baseIdentityLocalName = baseIdentityName; - } - final ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, baseIdentityPrefix, - identity.getLine()); - - final Set dependentModuleIdentities = dependentModule.getIdentities(); - for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) { - if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) { - identity.setBaseIdentity(idBuilder); - } + identity.setBaseIdentity(baseIdentity); } } } @@ -689,37 +782,15 @@ public final class YangParserImpl implements YangModelParser { final Set identities = module.getIdentities(); for (IdentitySchemaNodeBuilder identity : identities) { final String baseIdentityName = identity.getBaseIdentityName(); + final int line = identity.getLine(); if (baseIdentityName != null) { - String baseIdentityPrefix = null; - String baseIdentityLocalName = null; - if (baseIdentityName.contains(":")) { - final String[] splitted = baseIdentityName.split(":"); - baseIdentityPrefix = splitted[0]; - baseIdentityLocalName = splitted[1]; + IdentitySchemaNodeBuilder baseIdentity = findBaseIdentity(modules, module, baseIdentityName, line); + if (baseIdentity == null) { + IdentitySchemaNode baseId = findBaseIdentityFromContext(modules, module, baseIdentityName, line, + context); + identity.setBaseIdentity(baseId); } else { - baseIdentityPrefix = module.getPrefix(); - baseIdentityLocalName = baseIdentityName; - } - final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, - baseIdentityPrefix, identity.getLine()); - - if (dependentModuleBuilder == null) { - final Module dependentModule = findModuleFromContext(context, module, baseIdentityPrefix, - identity.getLine()); - final Set dependentModuleIdentities = dependentModule.getIdentities(); - for (IdentitySchemaNode idNode : dependentModuleIdentities) { - if (idNode.getQName().getLocalName().equals(baseIdentityLocalName)) { - identity.setBaseIdentity(idNode); - } - } - } else { - final Set dependentModuleIdentities = dependentModuleBuilder - .getIdentities(); - for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) { - if (idBuilder.getQName().getLocalName().equals(baseIdentityLocalName)) { - identity.setBaseIdentity(idBuilder); - } - } + identity.setBaseIdentity(baseIdentity); } } } @@ -776,9 +847,9 @@ public final class YangParserImpl implements YangModelParser { for (Map.Entry> entry : modules.entrySet()) { for (Map.Entry inner : entry.getValue().entrySet()) { ModuleBuilder module = inner.getValue(); - List usesNodes = null; boolean dataCollected = module.isAllUsesDataCollected(); + List usesNodes; while (!dataCollected) { usesNodes = new ArrayList<>(module.getAllUsesNodes()); for (UsesNodeBuilder usesNode : usesNodes) { @@ -836,7 +907,7 @@ public final class YangParserImpl implements YangModelParser { for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) { QName nodeType = usnb.getNodeType(); try { - ModuleBuilder dependentModule = findDependentModuleBuilder(modules, module, nodeType.getPrefix(), + ModuleBuilder dependentModule = findModuleFromBuilders(modules, module, nodeType.getPrefix(), usnb.getLine()); for (ExtensionBuilder extension : dependentModule.getExtensions()) { if (extension.getQName().getLocalName().equals(nodeType.getLocalName())) { @@ -857,7 +928,7 @@ public final class YangParserImpl implements YangModelParser { for (UnknownSchemaNodeBuilder usnb : module.getAllUnknownNodes()) { QName nodeType = usnb.getNodeType(); try { - ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, + ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, nodeType.getPrefix(), usnb.getLine()); if (dependentModuleBuilder == null) { @@ -922,7 +993,7 @@ public final class YangParserImpl implements YangModelParser { prefix = module.getPrefix(); } - ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line); + ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, prefix, line); processDeviation(dev, dependentModuleBuilder, path, module); } } @@ -968,19 +1039,16 @@ public final class YangParserImpl implements YangModelParser { if (prefix == null) { prefix = module.getPrefix(); } - String name = null; - ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, prefix, line); + ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, prefix, line); if (dependentModuleBuilder == null) { - Module dependentModule = findModuleFromContext(context, module, prefix, line); - Object currentParent = dependentModule; + Object currentParent = findModuleFromContext(context, module, prefix, line); - for (int i = 0; i < path.size(); i++) { + for (QName q : path) { if (currentParent == null) { throw new YangParseException(module.getName(), line, FAIL_DEVIATION_TARGET); } - QName q = path.get(i); - name = q.getLocalName(); + String name = q.getLocalName(); if (currentParent instanceof DataNodeContainer) { currentParent = ((DataNodeContainer) currentParent).getDataChildByName(name); } @@ -1016,11 +1084,10 @@ public final class YangParserImpl implements YangModelParser { final int line = dev.getLine(); Builder currentParent = dependentModuleBuilder; - for (int i = 0; i < path.size(); i++) { + for (QName q : path) { if (currentParent == null) { throw new YangParseException(module.getName(), line, FAIL_DEVIATION_TARGET); } - QName q = path.get(i); String name = q.getLocalName(); if (currentParent instanceof DataNodeContainerBuilder) { currentParent = ((DataNodeContainerBuilder) currentParent).getDataChildByName(name);