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=ec46831b4fba538f1a1359c917efc8311eac4db4;hp=41392b0f49fc80195f0064ac349b2ecb94cc81ee;hb=53e740af349a154f3f1a6b8c041303446f599718;hpb=b571c5f3e6e9b2dcf2cff2314537c7b1c61533b4 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 41392b0f49..ec46831b4f 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 @@ -12,7 +12,6 @@ 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.Collections; import java.util.Date; @@ -34,13 +33,8 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker; 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.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; @@ -123,7 +117,8 @@ public class YangParserImpl implements YangModelParser { private Map> resolveModuleBuilders( final List yangFileStreams) { - //Linked Hash Map MUST be used because Linked Hash Map preserves ORDER of items stored in map. + // Linked Hash Map MUST be used because Linked Hash Map preserves ORDER + // of items stored in map. final Map> modules = new LinkedHashMap>(); final ParseTreeWalker walker = new ParseTreeWalker(); final List trees = parseStreams(yangFileStreams); @@ -141,7 +136,7 @@ public class YangParserImpl implements YangModelParser { // module dependency graph sorted List sorted = ModuleDependencySort.sort(builders); - + for (ModuleBuilder builder : sorted) { final String builderName = builder.getName(); Date builderRevision = builder.getRevision(); @@ -195,7 +190,8 @@ public class YangParserImpl implements YangModelParser { resolveAugments(modules); // build - // Linked Hash Set MUST be used otherwise the Set will not maintain order! + // Linked Hash Set MUST be used otherwise the Set will not maintain + // order! // http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html final Set result = new LinkedHashSet(); for (Map.Entry> entry : modules @@ -224,7 +220,7 @@ public class YangParserImpl implements YangModelParser { /** * Search for dirty nodes (node which contains UnknownType) and resolve * unknown types. - * + * * @param modules * all available modules * @param module @@ -544,38 +540,36 @@ public class YangParserImpl implements YangModelParser { } /** - * Go through all typedef statements from given module and search for one - * with given name - * - * @param typedefs - * typedef statements to search + * Search for type definition builder by name. + * + * @param dependentModule + * module to search * @param name - * name of searched typedef - * @return typedef with name equals to given name + * name of type definition + * @param currentModuleName + * current module name + * @param line + * current line in yang model + * @return */ private TypeDefinitionBuilder findTypedefBuilderByName( final ModuleBuilder dependentModule, final String name, final String currentModuleName, final int line) { - TypeDefinitionBuilder result = null; final Set typedefs = dependentModule .getModuleTypedefs(); for (TypeDefinitionBuilder td : typedefs) { if (td.getQName().getLocalName().equals(name)) { - result = td; - break; + return td; } } - if (result == null) { - throw new YangParseException(currentModuleName, line, - "Target module '" + dependentModule.getName() - + "' does not contain typedef '" + name + "'."); - } - return result; + throw new YangParseException(currentModuleName, line, "Target module '" + + dependentModule.getName() + "' does not contain typedef '" + + name + "'."); } /** * Pull restriction from referenced type and add them to given constraints - * + * * @param referencedType * @param constraints */ @@ -603,9 +597,9 @@ public class YangParserImpl implements YangModelParser { } /** - * Go through all augmentation definitions and resolve them. This method - * also finds referenced node and add child nodes to it. - * + * Go through all augment definitions and resolve them. This method also + * finds augment target node and add child nodes to it. + * * @param modules * all available modules */ @@ -648,7 +642,7 @@ public class YangParserImpl implements YangModelParser { } /** - * + * * @param modules * all available modules * @param module @@ -666,8 +660,7 @@ public class YangParserImpl implements YangModelParser { .getTargetPath(); final List path = augmentTargetSchemaPath.getPath(); - int i = 0; - final QName qname = path.get(i); + final QName qname = path.get(0); String prefix = qname.getPrefix(); if (prefix == null) { prefix = module.getPrefix(); @@ -682,12 +675,11 @@ public class YangParserImpl implements YangModelParser { if (childQName.getLocalName().equals( qname.getLocalName())) { currentParent = child; - i++; break; } } - for (; i < path.size(); i++) { + for (int i = 1; i < path.size(); i++) { final QName currentQName = path.get(i); DataSchemaNodeBuilder newParent = null; for (DataSchemaNodeBuilder child : ((ChildNodeBuilder) currentParent) @@ -730,7 +722,7 @@ public class YangParserImpl implements YangModelParser { /** * Go through identity statements defined in current module and resolve * their 'base' statement if present. - * + * * @param modules * all modules * @param module @@ -772,7 +764,7 @@ public class YangParserImpl implements YangModelParser { /** * Go through uses statements defined in current module and resolve their * refine statements. - * + * * @param modules * all modules * @param module @@ -787,120 +779,55 @@ public class YangParserImpl implements YangModelParser { .entrySet()) { final List key = entry.getKey(); final UsesNodeBuilder usesNode = entry.getValue(); + final int line = usesNode.getLine(); final String groupingName = key.get(key.size() - 1); for (RefineHolder refine : usesNode.getRefines()) { - // 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(); - final List unknownNodes = refine - .getUnknownNodes(); - - Builder refineTarget = getRefineTargetBuilder(groupingName, + Builder refineTarget = getRefineNodeBuilderCopy(groupingName, refine, modules, module); + ParserUtils.refineDefault(refineTarget, refine, line); if (refineTarget instanceof LeafSchemaNodeBuilder) { final LeafSchemaNodeBuilder leaf = (LeafSchemaNodeBuilder) refineTarget; - if (defaultStr != null && !("".equals(defaultStr))) { - leaf.setDefaultStr(defaultStr); - } - if (mandatory != null) { - leaf.getConstraints().setMandatory(mandatory); - } - if (must != null) { - leaf.getConstraints().addMustDefinition(must); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - leaf.addUnknownSchemaNode(unknown); - } - } + ParserUtils.refineLeaf(leaf, refine, line); usesNode.addRefineNode(leaf); } else if (refineTarget instanceof ContainerSchemaNodeBuilder) { final ContainerSchemaNodeBuilder container = (ContainerSchemaNodeBuilder) refineTarget; - if (presence != null) { - container.setPresence(presence); - } - if (must != null) { - container.getConstraints().addMustDefinition(must); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - container.addUnknownSchemaNode(unknown); - } - } + ParserUtils.refineContainer(container, refine, line); usesNode.addRefineNode(container); } else if (refineTarget instanceof ListSchemaNodeBuilder) { final ListSchemaNodeBuilder list = (ListSchemaNodeBuilder) refineTarget; - if (must != null) { - list.getConstraints().addMustDefinition(must); - } - if (min != null) { - list.getConstraints().setMinElements(min); - } - if (max != null) { - list.getConstraints().setMaxElements(max); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - list.addUnknownSchemaNode(unknown); - } - } + ParserUtils.refineList(list, refine, line); + usesNode.addRefineNode(list); } else if (refineTarget instanceof LeafListSchemaNodeBuilder) { - 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); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - leafList.addUnknownSchemaNode(unknown); - } - } + final LeafListSchemaNodeBuilder leafList = (LeafListSchemaNodeBuilder) refineTarget; + ParserUtils.refineLeafList(leafList, refine, line); + usesNode.addRefineNode(leafList); } else if (refineTarget instanceof ChoiceBuilder) { final ChoiceBuilder choice = (ChoiceBuilder) refineTarget; - if (defaultStr != null) { - choice.setDefaultCase(defaultStr); - } - if (mandatory != null) { - choice.getConstraints().setMandatory(mandatory); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - choice.addUnknownSchemaNode(unknown); - } - } + ParserUtils.refineChoice(choice, refine, line); + usesNode.addRefineNode(choice); } else if (refineTarget instanceof AnyXmlBuilder) { final AnyXmlBuilder anyXml = (AnyXmlBuilder) refineTarget; - if (mandatory != null) { - anyXml.getConstraints().setMandatory(mandatory); - } - if (must != null) { - anyXml.getConstraints().addMustDefinition(must); - } - if (unknownNodes != null) { - for (UnknownSchemaNodeBuilder unknown : unknownNodes) { - anyXml.addUnknownSchemaNode(unknown); - } - } + ParserUtils.refineAnyxml(anyXml, refine, line); + usesNode.addRefineNode(anyXml); + } else if(refineTarget instanceof GroupingBuilder) { + usesNode.addRefineNode((GroupingBuilder)refineTarget); + } else if(refineTarget instanceof TypedefBuilder) { + usesNode.addRefineNode((TypedefBuilder)refineTarget); } } } } /** - * Find original builder of refine node and return copy of this builder. - * + * Find original builder of node to refine and return copy of this builder. + *

+ * We must make a copy of builder to preserve original builder, because this + * object will be refined (modified) and later added to + * {@link UsesNodeBuilder}. + *

+ * * @param groupingPath * path to grouping which contains node to refine * @param refine @@ -909,10 +836,10 @@ public class YangParserImpl implements YangModelParser { * 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 + * @return copy of node to be refined if it is present in grouping, null + * otherwise */ - private Builder getRefineTargetBuilder(final String groupingPath, + private Builder getRefineNodeBuilderCopy(final String groupingPath, final RefineHolder refine, final Map> modules, final ModuleBuilder module) { @@ -937,6 +864,12 @@ public class YangParserImpl implements YangModelParser { } else if (lookedUpBuilder instanceof AnyXmlBuilder) { result = ParserUtils .copyAnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder); + } else if (lookedUpBuilder instanceof GroupingBuilder) { + result = ParserUtils + .copyGroupingBuilder((GroupingBuilder) lookedUpBuilder); + } else if (lookedUpBuilder instanceof TypeDefinitionBuilder) { + result = ParserUtils + .copyTypedefBuilder((TypedefBuilder) lookedUpBuilder); } else { throw new YangParseException(module.getName(), refine.getLine(), "Target '" + refine.getName() + "' can not be refined"); @@ -946,11 +879,11 @@ public class YangParserImpl implements YangModelParser { /** * Find builder of refine node. - * + * * @param groupingPath * path to grouping which contains node to refine - * @param refineNodeName - * name of node to be refined + * @param refine + * object containing refine information * @param modules * all loaded modules * @param module @@ -962,6 +895,7 @@ public class YangParserImpl implements YangModelParser { final RefineHolder refine, final Map> modules, final ModuleBuilder module) { + final String refineNodeName = refine.getName(); final SchemaPath path = ParserUtils.parseUsesPath(groupingPath); final List builderPath = new ArrayList(); String prefix = null; @@ -980,7 +914,26 @@ public class YangParserImpl implements YangModelParser { final GroupingBuilder builder = (GroupingBuilder) dependentModule .getNode(builderPath); - return builder.getChildNode(refine.getName()); + Builder result = builder.getChildNode(refineNodeName); + if(result == null) { + Set grps = builder.getGroupings(); + for(GroupingBuilder gr : grps) { + if(gr.getQName().getLocalName().equals(refineNodeName)) { + result = gr; + break; + } + } + } + if(result == null) { + Set typedefs = builder.getTypedefs(); + for(TypeDefinitionBuilder typedef : typedefs) { + if(typedef.getQName().getLocalName().equals(refineNodeName)) { + result = typedef; + break; + } + } + } + return result; } private QName findFullQName( @@ -1033,7 +986,7 @@ public class YangParserImpl implements YangModelParser { /** * Find dependent module based on given prefix - * + * * @param modules * all available modules * @param module @@ -1086,82 +1039,4 @@ public class YangParserImpl implements YangModelParser { return dependentModule; } - private static class SchemaContextImpl implements SchemaContext { - private final Set modules; - - private SchemaContextImpl(final Set modules) { - this.modules = modules; - } - - @Override - public Set getDataDefinitions() { - final Set dataDefs = new HashSet(); - for (Module m : modules) { - dataDefs.addAll(m.getChildNodes()); - } - return dataDefs; - } - - @Override - public Set getModules() { - return modules; - } - - @Override - public Set getNotifications() { - final Set notifications = new HashSet(); - for (Module m : modules) { - notifications.addAll(m.getNotifications()); - } - return notifications; - } - - @Override - public Set getOperations() { - final Set rpcs = new HashSet(); - for (Module m : modules) { - rpcs.addAll(m.getRpcs()); - } - return rpcs; - } - - @Override - public Set getExtensions() { - final Set extensions = new HashSet(); - for (Module m : modules) { - extensions.addAll(m.getExtensionSchemaNodes()); - } - return extensions; - } - - @Override - public Module findModuleByName(final String name, final Date revision) { - if (name != null) { - for (final Module module : modules) { - if (revision == null) { - if (module.getName().equals(name)) { - return module; - } - } else 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; - } - } - }