X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fmaven-sal-api-gen-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Funified%2Fdoc%2Fgenerator%2FGeneratorImpl.xtend;h=bc4e267b0c6c429f1a52b8cf43dcf4cce1704d6b;hb=5feac31a11a337a0c840f73c5c4612a6c997fa2a;hp=3b35de381e017df6de77db10784db10a081fd19b;hpb=a73fdae41d261d896eb26f4fbe689ad2f2dc0f42;p=yangtools.git diff --git a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/unified/doc/generator/GeneratorImpl.xtend b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/unified/doc/generator/GeneratorImpl.xtend index 3b35de381e..bc4e267b0c 100644 --- a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/unified/doc/generator/GeneratorImpl.xtend +++ b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/unified/doc/generator/GeneratorImpl.xtend @@ -7,55 +7,53 @@ */ package org.opendaylight.yangtools.yang.unified.doc.generator -import org.opendaylight.yangtools.yang.model.api.SchemaContext +import java.io.BufferedWriter import java.io.File -import java.util.Set -import org.opendaylight.yangtools.yang.model.api.Module import java.io.IOException +import java.io.OutputStreamWriter +import java.text.SimpleDateFormat +import java.util.ArrayList +import java.util.Collection +import java.util.HashMap import java.util.HashSet -import java.io.BufferedWriter -import java.io.OutputStreamWriter; +import java.util.LinkedHashMap +import java.util.List +import java.util.Map +import java.util.Set +import org.opendaylight.yangtools.yang.common.QName +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates +import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode +import org.opendaylight.yangtools.yang.model.api.AugmentationTarget +import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode +import org.opendaylight.yangtools.yang.model.api.ChoiceNode +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer import org.opendaylight.yangtools.yang.model.api.DataSchemaNode +import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition +import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode +import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode import org.opendaylight.yangtools.yang.model.api.ListSchemaNode -import org.opendaylight.yangtools.yang.model.api.TypeDefinition +import org.opendaylight.yangtools.yang.model.api.Module +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition +import org.opendaylight.yangtools.yang.model.api.SchemaContext import org.opendaylight.yangtools.yang.model.api.SchemaNode -import org.opendaylight.yangtools.yang.model.util.ExtendedType -import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition -import java.text.SimpleDateFormat -import java.util.Collection -import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint +import org.opendaylight.yangtools.yang.model.api.SchemaPath +import org.opendaylight.yangtools.yang.model.api.TypeDefinition +import org.opendaylight.yangtools.yang.model.api.UsesNode import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition -import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition +import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint +import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint +import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer -import org.slf4j.LoggerFactory +import org.opendaylight.yangtools.yang.model.util.ExtendedType import org.slf4j.Logger -import java.util.List -import org.opendaylight.yangtools.yang.common.QName -import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition -import java.util.ArrayList -import java.util.Map -import org.opendaylight.yangtools.yang.model.api.SchemaPath - -import org.sonatype.plexus.build.incremental.BuildContext; -import org.sonatype.plexus.build.incremental.DefaultBuildContext; - -import org.opendaylight.yangtools.yang.model.api.ChoiceNode -import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates -import java.util.LinkedHashMap -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode import java.util.HashMap -import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode -import org.opendaylight.yangtools.yang.model.api.UsesNode -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition -import org.opendaylight.yangtools.yang.model.api.AugmentationTarget +import org.slf4j.LoggerFactory +import org.sonatype.plexus.build.incremental.BuildContext +import org.sonatype.plexus.build.incremental.DefaultBuildContext class GeneratorImpl { @@ -66,6 +64,10 @@ class GeneratorImpl { var Module currentModule; val Map imports = new HashMap(); var SchemaContext ctx; + + StringBuilder augmentChildNodesAsString + + DataSchemaNode lastNodeInTargetPath = null def generate(SchemaContext context, File targetPath, Set modulesToGen) throws IOException { path = targetPath; @@ -301,13 +303,14 @@ class GeneratorImpl { } return '''

Augmentations

- + ''' } + + private def createAugmentChildNodesAsString(List childNodes) { + augmentChildNodesAsString = new StringBuilder(); + augmentChildNodesAsString.append(printNodeChildren(childNodes)) + return '' + } + + private def parseTargetPath(SchemaPath path) { + val List nodes = new ArrayList(); + for (QName pathElement : path.pathFromRoot) { + val prefix = pathElement.prefix + val moduleName = imports.get(prefix) + if(moduleName != null) { + val revision = pathElement.revision + val module = ctx.findModuleByName(moduleName, revision) + var foundNode = module.getDataChildByName(pathElement) + if(foundNode == null) { + val child = nodes.last + if (child instanceof DataNodeContainer) { + val dataContNode = child as DataNodeContainer + foundNode = findNodeInChildNodes(pathElement, dataContNode.childNodes) + } + } + if(foundNode != null) { + nodes.add(foundNode); + } + } + } + if(! nodes.empty) { + lastNodeInTargetPath = nodes.get(nodes.size() - 1) + } + + val List targetPathNodes = new ArrayList(); + targetPathNodes.add(lastNodeInTargetPath) + + return targetPathNodes + } + + private def DataSchemaNode findNodeInChildNodes(QName findingNode, Iterable childNodes) { + for(child : childNodes) { + if (child.QName.equals(findingNode)) + return child; + } + // find recursively + for(child : childNodes) { + if(child instanceof ContainerSchemaNode) { + val contChild = child as ContainerSchemaNode + val foundChild = findNodeInChildNodes(findingNode, contChild.childNodes) + if (foundChild != null) + return foundChild; + } + else if(child instanceof ListSchemaNode) { + val listChild = child as ListSchemaNode + val foundChild = findNodeInChildNodes(findingNode, listChild.childNodes) + if (foundChild != null) + return foundChild; + } + } + } + + private def printNodeChildren(List childNodes) { + if (childNodes.empty) { + return '' + } + + return + ''' +
+        «printAugmentedNode(childNodes.get(0))»
+        
+ ''' + } + + private def printAugmentedNode(DataSchemaNode child) { + + if(child instanceof ChoiceCaseNode) + return '' + + return + ''' + «IF child instanceof ContainerSchemaNode» + «printContainerNode(child as ContainerSchemaNode)» + «ENDIF» + «IF child instanceof AnyXmlSchemaNode» + «printAnyXmlNode(child as AnyXmlSchemaNode)» + «ENDIF» + «IF child instanceof LeafSchemaNode» + «printLeafNode(child as LeafSchemaNode)» + «ENDIF» + «IF child instanceof LeafListSchemaNode» + «printLeafListNode(child as LeafListSchemaNode)» + «ENDIF» + «IF child instanceof ListSchemaNode» + «printListNode(child as ListSchemaNode)» + «ENDIF» + «IF child instanceof ChoiceNode» + «printChoiceNode(child as ChoiceNode)» + «ENDIF» + ''' + } + + private def printChoiceNode(ChoiceNode child) { + val List cases = new ArrayList(child.cases); + if(!cases.empty) { + val ChoiceCaseNode aCase = cases.get(0) + for(caseChildNode : aCase.childNodes) + printAugmentedNode(caseChildNode) + } + } + + private def printListNode(ListSchemaNode listNode) { + return + ''' + <«listNode.QName.localName»«IF !listNode.QName.namespace.equals(currentModule.namespace)» xmlns="«listNode.QName.namespace»"«ENDIF»> + «FOR child : listNode.childNodes» + «printAugmentedNode(child)» + «ENDFOR» + </«listNode.QName.localName»> + ''' + } + + private def printContainerNode(ContainerSchemaNode containerNode) { + return + ''' + <«containerNode.QName.localName»«IF !containerNode.QName.namespace.equals(currentModule.namespace)» xmlns="«containerNode.QName.namespace»"«ENDIF»> + «FOR child : containerNode.childNodes» + «printAugmentedNode(child)» + «ENDFOR» + </«containerNode.QName.localName»> + ''' + } + + private def printLeafListNode(LeafListSchemaNode leafListNode) { + return + ''' + <«leafListNode.QName.localName»>. . .</«leafListNode.QName.localName»> + <«leafListNode.QName.localName»>. . .</«leafListNode.QName.localName»> + <«leafListNode.QName.localName»>. . .</«leafListNode.QName.localName»> + ''' + } + + private def printAnyXmlNode(AnyXmlSchemaNode anyXmlNode) { + return + ''' + <«anyXmlNode.QName.localName»>. . .</«anyXmlNode.QName.localName»> + ''' + } + + private def printLeafNode(LeafSchemaNode leafNode) { + return + ''' + <«leafNode.QName.localName»>. . .</«leafNode.QName.localName»> + ''' + } private def augmentationsSummary(Module module, SchemaContext context) { if (module.augmentations.empty) { @@ -767,7 +928,7 @@ class GeneratorImpl { def CharSequence printUses(UsesNode usesNode) { return ''' - «strong(listItem("uses", typeAnchorLink(usesNode.groupingPath, usesNode.groupingPath.path.last.localName)))» + «strong(listItem("uses", typeAnchorLink(usesNode.groupingPath, usesNode.groupingPath.pathTowardsRoot.iterator.next.localName)))»
  • refines:
      @@ -789,7 +950,7 @@ class GeneratorImpl { ''' } - def CharSequence printChildren(Set nodes, int level, InstanceIdentifier path) { + def CharSequence printChildren(Iterable nodes, int level, InstanceIdentifier path) { val anyxmlNodes = nodes.filter(AnyXmlSchemaNode) val leafNodes = nodes.filter(LeafSchemaNode) val leafListNodes = nodes.filter(LeafListSchemaNode) @@ -839,13 +1000,13 @@ class GeneratorImpl { ''' } - def CharSequence xmlExample(Set nodes, QName name,InstanceIdentifier path) ''' + def CharSequence xmlExample(Iterable nodes, QName name,InstanceIdentifier path) '''
               «xmlExampleTag(name,nodes.xmplExampleTags(path))»
           
      ''' - def CharSequence xmplExampleTags(Set nodes, InstanceIdentifier identifier) ''' + def CharSequence xmplExampleTags(Iterable nodes, InstanceIdentifier identifier) ''' «FOR node : nodes» @@ -938,32 +1099,54 @@ class GeneratorImpl { def CharSequence printShortInfo(ContainerSchemaNode node, int level, InstanceIdentifier path) { val newPath = path.append(node); return ''' -
    • «strong(localLink(newPath,node.QName.localName))» (container)
    • +
    • «strong(localLink(newPath,node.QName.localName))» (container) +
        +
      • configuration data: «strong(String.valueOf(node.configuration))»
      • +
      +
    • ''' } def CharSequence printShortInfo(ListSchemaNode node, int level, InstanceIdentifier path) { val newPath = path.append(node); return ''' -
    • «strong(localLink(newPath,node.QName.localName))» (list)
    • +
    • «strong(localLink(newPath,node.QName.localName))» (list) +
        +
      • configuration data: «strong(String.valueOf(node.configuration))»
      • +
      +
    • ''' } def CharSequence printShortInfo(AnyXmlSchemaNode node, int level, InstanceIdentifier path) { return ''' -
    • «strong((node.QName.localName))» (anyxml)
    • +
    • «strong((node.QName.localName))» (anyxml) +
        +
      • configuration data: «strong(String.valueOf(node.configuration))»
      • +
      • mandatory: «strong(String.valueOf(node.constraints.mandatory))»
      • +
      +
    • ''' } def CharSequence printShortInfo(LeafSchemaNode node, int level, InstanceIdentifier path) { return ''' -
    • «strong((node.QName.localName))» (leaf)
    • +
    • «strong((node.QName.localName))» (leaf) +
        +
      • configuration data: «strong(String.valueOf(node.configuration))»
      • +
      • mandatory: «strong(String.valueOf(node.constraints.mandatory))»
      • +
      +
    • ''' } def CharSequence printShortInfo(LeafListSchemaNode node, int level, InstanceIdentifier path) { return ''' -
    • «strong((node.QName.localName))» (leaf-list)
    • +
    • «strong((node.QName.localName))» (leaf-list) +
        +
      • configuration data: «strong(String.valueOf(node.configuration))»
      • +
      +
    • ''' } @@ -979,21 +1162,18 @@ class GeneratorImpl { private def dispatch InstanceIdentifier append(InstanceIdentifier identifier, ContainerSchemaNode node) { - val pathArguments = new ArrayList(identifier.path) - pathArguments.add(new NodeIdentifier(node.QName)); - return new InstanceIdentifier(pathArguments); + return identifier.node(node.QName); } private def dispatch InstanceIdentifier append(InstanceIdentifier identifier, ListSchemaNode node) { - val pathArguments = new ArrayList(identifier.path) val keyValues = new LinkedHashMap(); if(node.keyDefinition !== null) { for(definition : node.keyDefinition) { keyValues.put(definition,new Object); } } - pathArguments.add(new NodeIdentifierWithPredicates(node.QName,keyValues)); - return new InstanceIdentifier(pathArguments); + + return identifier.node(new NodeIdentifierWithPredicates(node.QName, keyValues)); } @@ -1027,7 +1207,7 @@ class GeneratorImpl { val List path = schemaPath.path val StringBuilder pathString = new StringBuilder() if (schemaPath.absolute) { - pathString.append("/") + pathString.append('/') } val QName qname = path.get(0) @@ -1055,15 +1235,15 @@ class GeneratorImpl { var String prefix = name.prefix var String moduleName - if (prefix == null || "".equals(prefix) || prefix.equals(module.prefix)) { + if (prefix == null || prefix.empty || prefix.equals(module.prefix)) { moduleName = module.name } else { moduleName = imports.get(prefix) } pathString.append(moduleName) - pathString.append(":") + pathString.append(':') pathString.append(name.localName) - pathString.append("/") + pathString.append('/') if(node instanceof ChoiceNode && dataNode !== null) { val DataSchemaNode caseNode = dataNode.childNodes.findFirst[DataSchemaNode e | e instanceof ChoiceCaseNode]; if(caseNode !== null) { @@ -1257,7 +1437,7 @@ class GeneratorImpl { var i = 0; for (pathElement : path) { actual.add(pathElement) - val DataSchemaNode nodeByPath = childNodes.get(new SchemaPath(actual, absolute)) + val DataSchemaNode nodeByPath = childNodes.get(SchemaPath.create(actual, absolute)) if (!(nodeByPath instanceof ChoiceNode) && !(nodeByPath instanceof ChoiceCaseNode)) { result.append(pathElement.localName) if (i != path.size - 1) {