X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fyang-model-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fyang%2Fparser%2Fimpl%2FYangParserImpl.java;h=401189b1d1efbb11a79801c9837fb1053f1f226d;hp=ac2b5334fb3ec66e0cf8915fee70101f5da2e8bc;hb=9ceed566491d172e02220b04ec6869867f2f2473;hpb=24d031d133362f3b42eb2bc04173ad0199d39a51 diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java index ac2b5334fb..401189b1d1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java @@ -19,9 +19,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.NoSuchElementException; import java.util.Set; import java.util.TreeMap; @@ -49,6 +49,7 @@ import org.opendaylight.controller.yang.model.parser.api.YangModelParser; 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.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder; import org.opendaylight.controller.yang.parser.builder.api.Builder; @@ -81,35 +82,80 @@ import org.opendaylight.controller.yang.validator.YangModelBasicValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + public final class YangParserImpl implements YangModelParser { private static final Logger logger = LoggerFactory .getLogger(YangParserImpl.class); @Override - public Set parseYangModels(final List yangFiles) { + public Map parseYangModelsMapped(List yangFiles) { if (yangFiles != null) { - final List inputStreams = new ArrayList(); + final Map inputStreams = Maps.newHashMap(); for (final File yangFile : yangFiles) { try { - inputStreams.add(new FileInputStream(yangFile)); + inputStreams.put(new FileInputStream(yangFile), yangFile); } catch (FileNotFoundException e) { logger.warn("Exception while reading yang file: " + yangFile.getName(), e); } } - final Map> modules = resolveModuleBuilders(inputStreams); - return build(modules); + + Map builderToStreamMap = Maps + .newHashMap(); + + final Map> modules = resolveModuleBuilders( + Lists.newArrayList(inputStreams.keySet()), + builderToStreamMap); + // return new LinkedHashSet(build(modules).values()); + + Map retVal = Maps.newLinkedHashMap(); + Map builderToModuleMap = build(modules); + + for (Entry builderToModule : builderToModuleMap + .entrySet()) { + retVal.put(inputStreams.get(builderToStreamMap + .get(builderToModule.getKey())), builderToModule + .getValue()); + } + + return retVal; } - return Collections.emptySet(); + return Collections.emptyMap(); + } + + @Override + public Set parseYangModels(final List yangFiles) { + return Sets.newLinkedHashSet(parseYangModelsMapped(yangFiles).values()); } @Override public Set parseYangModelsFromStreams( final List yangModelStreams) { - final Map> modules = resolveModuleBuilders(yangModelStreams); - return build(modules); + return Sets.newHashSet(parseYangModelsFromStreamsMapped( + yangModelStreams).values()); + } + + @Override + public Map parseYangModelsFromStreamsMapped( + final List yangModelStreams) { + Map builderToStreamMap = Maps.newHashMap(); + + final Map> modules = resolveModuleBuilders( + yangModelStreams, builderToStreamMap); + Map retVal = Maps.newLinkedHashMap(); + Map builderToModuleMap = build(modules); + + for (Entry builderToModule : builderToModuleMap + .entrySet()) { + retVal.put(builderToStreamMap.get(builderToModule.getKey()), + builderToModule.getValue()); + } + return retVal; } @Override @@ -117,13 +163,11 @@ public final class YangParserImpl implements YangModelParser { return new SchemaContextImpl(modules); } - private Map> resolveModuleBuilders( - final List yangFileStreams) { - // Linked Hash Map MUST be used because Linked Hash Map preserves ORDER - // of items stored in map. - final Map> modules = new LinkedHashMap>(); + private ModuleBuilder[] parseModuleBuilders(List inputStreams, + Map streamToBuilderMap) { + final ParseTreeWalker walker = new ParseTreeWalker(); - final List trees = parseStreams(yangFileStreams); + final List trees = parseStreams(inputStreams); final ModuleBuilder[] builders = new ModuleBuilder[trees.size()]; // validate yang @@ -133,8 +177,25 @@ public final class YangParserImpl implements YangModelParser { for (int i = 0; i < trees.size(); i++) { yangModelParser = new YangParserListenerImpl(); walker.walk(yangModelParser, trees.get(i)); - builders[i] = yangModelParser.getModuleBuilder(); + 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; } + return builders; + } + + private Map> resolveModuleBuilders( + final List yangFileStreams, + Map streamToBuilderMap) { + + final ModuleBuilder[] builders = parseModuleBuilders(yangFileStreams, + streamToBuilderMap); + + // Linked Hash Map MUST be used because Linked Hash Map preserves ORDER + // of items stored in map. + final LinkedHashMap> modules = new LinkedHashMap>(); // module dependency graph sorted List sorted = ModuleDependencySort.sort(builders); @@ -178,7 +239,7 @@ public final class YangParserImpl implements YangModelParser { return result; } - private Set build( + private Map build( final Map> modules) { // fix unresolved nodes for (Map.Entry> entry : modules @@ -192,10 +253,10 @@ public final class YangParserImpl implements YangModelParser { resolveAugments(modules); // build - // LinkedHashSet MUST be used otherwise the Set will not maintain + // LinkedHashMap MUST be used otherwise the values will not maintain // order! - // http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html - final Set result = new LinkedHashSet(); + // http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html + final Map result = new LinkedHashMap(); for (Map.Entry> entry : modules .entrySet()) { final Map modulesByRevision = new HashMap(); @@ -204,7 +265,7 @@ public final class YangParserImpl implements YangModelParser { final ModuleBuilder moduleBuilder = childEntry.getValue(); final Module module = moduleBuilder.build(); modulesByRevision.put(childEntry.getKey(), module); - result.add(module); + result.put(moduleBuilder, module); } } return result; @@ -492,11 +553,16 @@ public final class YangParserImpl implements YangModelParser { constraints.addPatterns(patterns); fractionDigits = ext.getFractionDigits(); constraints.setFractionDigits(fractionDigits); - return findConstraints( - findTypeDefinitionBuilder(nodeToResolve.getPath(), builder, - ext.getQName().getLocalName(), builder.getName(), - nodeToResolve.getLine()), constraints, modules, - builder); + if(YangTypesConverter.isBaseYangType(ext.getBaseType().getQName().getLocalName())) { + mergeConstraints(ext.getBaseType(), constraints); + return constraints; + } else { + return findConstraints( + findTypeDefinitionBuilder(nodeToResolve.getPath(), builder, + ext.getQName().getLocalName(), builder.getName(), + nodeToResolve.getLine()), constraints, modules, + builder); + } } else if (referencedType instanceof UnknownType) { final UnknownType unknown = (UnknownType) referencedType; ranges = unknown.getRangeStatements(); @@ -739,7 +805,7 @@ public final class YangParserImpl implements YangModelParser { if (currentQName.getLocalName().equals( lastAugmentPathElement.getLocalName())) { - if(currentParent instanceof ChoiceBuilder) { + if (currentParent instanceof ChoiceBuilder) { ParserUtils.fillAugmentTarget(augmentBuilder, (ChoiceBuilder) currentParent); } else {