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=f40cbcaa3dff249ad6cc8443028d380853fa8485;hb=300aed51915840a41a1483980ff7d045bde905cb;hp=01f94dff04685700333ab605828ba2f746977c22;hpb=5aa88fe073db6259099ea6614922ca16dbac3a19;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 01f94dff04..f40cbcaa3d 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 @@ -21,8 +21,6 @@ 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 @@ -54,6 +52,9 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.sonatype.plexus.build.incremental.BuildContext import org.sonatype.plexus.build.incremental.DefaultBuildContext +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier +import com.google.common.collect.Iterables class GeneratorImpl { @@ -64,6 +65,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; @@ -299,13 +304,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 module = ctx.findModuleByNamespaceAndRevision(pathElement.namespace, pathElement.revision); + if (module !== null) { + 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) { @@ -593,15 +754,15 @@ class GeneratorImpl { def CharSequence tree(Module module) ''' «strong(module.name)» - «module.childNodes.treeSet(InstanceIdentifier.builder.toInstance())» + «module.childNodes.treeSet(YangInstanceIdentifier.builder.toInstance())» ''' - private def dispatch CharSequence tree(ChoiceNode node,InstanceIdentifier path) ''' + private def dispatch CharSequence tree(ChoiceNode node,YangInstanceIdentifier path) ''' «node.nodeName» (choice) «casesTree(node.cases,path)» ''' - def casesTree(Set nodes,InstanceIdentifier path) ''' + def casesTree(Set nodes,YangInstanceIdentifier path) '''
    «FOR node : nodes»
  • @@ -612,17 +773,17 @@ class GeneratorImpl {
''' - private def dispatch CharSequence tree(DataSchemaNode node,InstanceIdentifier path) ''' + private def dispatch CharSequence tree(DataSchemaNode node,YangInstanceIdentifier path) ''' «node.nodeName» ''' - private def dispatch CharSequence tree(ListSchemaNode node,InstanceIdentifier path) ''' + private def dispatch CharSequence tree(ListSchemaNode node,YangInstanceIdentifier path) ''' «val newPath = path.append(node)» «localLink(newPath,node.nodeName)» «node.childNodes.treeSet(newPath)» ''' - private def dispatch CharSequence tree(ContainerSchemaNode node,InstanceIdentifier path) ''' + private def dispatch CharSequence tree(ContainerSchemaNode node,YangInstanceIdentifier path) ''' «val newPath = path.append(node)» «localLink(newPath,node.nodeName)» «node.childNodes.treeSet(newPath)» @@ -633,7 +794,7 @@ class GeneratorImpl { «IF !childNodes.nullOrEmpty»

Child nodes

- «childNodes.printChildren(3,InstanceIdentifier.builder().toInstance())» + «childNodes.printChildren(3,YangInstanceIdentifier.builder().toInstance())» «ENDIF» ''' @@ -649,8 +810,7 @@ class GeneratorImpl { «ENDFOR»
    - «val Set> typedefs = dataNode.typeDefinitions» - «FOR typeDef : typedefs» + «FOR typeDef : dataNode.typeDefinitions» «typeDef.restrictions» «ENDFOR»
@@ -671,18 +831,15 @@ class GeneratorImpl { def String typeAnchorLink(SchemaPath path, CharSequence text) { if(path !== null) { - val prefix = path.path.last.prefix - if(prefix == this.currentModule.prefix) { + val lastElement = Iterables.getLast(path.pathFromRoot) + val ns = lastElement.namespace + if (ns == this.currentModule.namespace) { return '''«text»''' - } else if(!prefix.nullOrEmpty){ - val String module = imports.get(prefix) - if(!module.nullOrEmpty) { - return '''«prefix»:«text»''' - //to enable external (import) links - //return '''«prefix»:«text»''' - } + } else { + return '''(«ns»)«text»''' + //to enable external (import) links + //return '''«prefix»:«text»''' } - return text.toString } } @@ -788,7 +945,7 @@ class GeneratorImpl { ''' } - def CharSequence printChildren(Set nodes, int level, InstanceIdentifier path) { + def CharSequence printChildren(Iterable nodes, int level, YangInstanceIdentifier path) { val anyxmlNodes = nodes.filter(AnyXmlSchemaNode) val leafNodes = nodes.filter(LeafSchemaNode) val leafListNodes = nodes.filter(LeafListSchemaNode) @@ -818,9 +975,9 @@ class GeneratorImpl { «ENDIF» - «IF !path.path.empty» + «IF path.pathArguments.iterator.hasNext»

XML example

- «nodes.xmlExample(path.path.last.nodeType,path)» + «nodes.xmlExample(path.pathArguments.last.nodeType,path)» «ENDIF» «FOR childNode : containers» @@ -838,13 +995,13 @@ class GeneratorImpl { ''' } - def CharSequence xmlExample(Set nodes, QName name,InstanceIdentifier path) ''' + def CharSequence xmlExample(Iterable nodes, QName name,YangInstanceIdentifier path) '''
         «xmlExampleTag(name,nodes.xmplExampleTags(path))»
     
''' - def CharSequence xmplExampleTags(Set nodes, InstanceIdentifier identifier) ''' + def CharSequence xmplExampleTags(Iterable nodes, YangInstanceIdentifier identifier) ''' «FOR node : nodes» @@ -853,29 +1010,29 @@ class GeneratorImpl { ''' - private def dispatch CharSequence asXmlExampleTag(LeafSchemaNode node, InstanceIdentifier identifier) ''' + private def dispatch CharSequence asXmlExampleTag(LeafSchemaNode node, YangInstanceIdentifier identifier) ''' «node.QName.xmlExampleTag("...")» ''' - private def dispatch CharSequence asXmlExampleTag(LeafListSchemaNode node, InstanceIdentifier identifier) ''' + private def dispatch CharSequence asXmlExampleTag(LeafListSchemaNode node, YangInstanceIdentifier identifier) ''' <!-- This node could appear multiple times --> «node.QName.xmlExampleTag("...")» ''' - private def dispatch CharSequence asXmlExampleTag(ContainerSchemaNode node, InstanceIdentifier identifier) ''' + private def dispatch CharSequence asXmlExampleTag(ContainerSchemaNode node, YangInstanceIdentifier identifier) ''' <!-- See «localLink(identifier.append(node),"definition")» for child nodes. --> «node.QName.xmlExampleTag("...")» ''' - private def dispatch CharSequence asXmlExampleTag(ListSchemaNode node, InstanceIdentifier identifier) ''' + private def dispatch CharSequence asXmlExampleTag(ListSchemaNode node, YangInstanceIdentifier identifier) ''' <!-- See «localLink(identifier.append(node),"definition")» for child nodes. --> <!-- This node could appear multiple times --> «node.QName.xmlExampleTag("...")» ''' - private def dispatch CharSequence asXmlExampleTag(DataSchemaNode node, InstanceIdentifier identifier) ''' + private def dispatch CharSequence asXmlExampleTag(DataSchemaNode node, YangInstanceIdentifier identifier) ''' ''' @@ -887,19 +1044,19 @@ class GeneratorImpl { def header(int level,QName name) '''«name.localName»''' - def header(int level,InstanceIdentifier name) ''' - - «FOR cmp : name.path SEPARATOR "/"»«cmp.nodeType.localName»«ENDFOR» + def header(int level,YangInstanceIdentifier name) ''' + + «FOR cmp : name.pathArguments SEPARATOR "/"»«cmp.nodeType.localName»«ENDFOR» ''' - private def dispatch CharSequence printInfo(DataSchemaNode node, int level, InstanceIdentifier path) ''' + private def dispatch CharSequence printInfo(DataSchemaNode node, int level, YangInstanceIdentifier path) ''' «header(level+1,node.QName)» ''' - private def dispatch CharSequence printInfo(ContainerSchemaNode node, int level, InstanceIdentifier path) ''' + private def dispatch CharSequence printInfo(ContainerSchemaNode node, int level, YangInstanceIdentifier path) ''' «val newPath = path.append(node)» «header(level,newPath)»
@@ -911,7 +1068,7 @@ class GeneratorImpl { «node.childNodes.printChildren(level,newPath)» ''' - private def dispatch CharSequence printInfo(ListSchemaNode node, int level, InstanceIdentifier path) ''' + private def dispatch CharSequence printInfo(ListSchemaNode node, int level, YangInstanceIdentifier path) ''' «val newPath = path.append(node)» «header(level,newPath)»
@@ -923,46 +1080,68 @@ class GeneratorImpl { «node.childNodes.printChildren(level,newPath)» ''' - private def dispatch CharSequence printInfo(ChoiceNode node, int level, InstanceIdentifier path) ''' + private def dispatch CharSequence printInfo(ChoiceNode node, int level, YangInstanceIdentifier path) ''' «val Set choiceCases = new HashSet(node.cases)» «choiceCases.printChildren(level,path)» ''' - private def dispatch CharSequence printInfo(ChoiceCaseNode node, int level, InstanceIdentifier path) ''' + private def dispatch CharSequence printInfo(ChoiceCaseNode node, int level, YangInstanceIdentifier path) ''' «node.childNodes.printChildren(level,path)» ''' - def CharSequence printShortInfo(ContainerSchemaNode node, int level, InstanceIdentifier path) { + def CharSequence printShortInfo(ContainerSchemaNode node, int level, YangInstanceIdentifier 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) { + def CharSequence printShortInfo(ListSchemaNode node, int level, YangInstanceIdentifier 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) { + def CharSequence printShortInfo(AnyXmlSchemaNode node, int level, YangInstanceIdentifier 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) { + def CharSequence printShortInfo(LeafSchemaNode node, int level, YangInstanceIdentifier 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) { + def CharSequence printShortInfo(LeafListSchemaNode node, int level, YangInstanceIdentifier path) { return ''' -
  • «strong((node.QName.localName))» (leaf-list)
  • +
  • «strong((node.QName.localName))» (leaf-list) +
      +
    • configuration data: «strong(String.valueOf(node.configuration))»
    • +
    +
  • ''' } @@ -972,16 +1151,16 @@ class GeneratorImpl { ''' } - def CharSequence localLink(InstanceIdentifier identifier, CharSequence text) ''' - «text» + def CharSequence localLink(YangInstanceIdentifier identifier, CharSequence text) ''' + «text» ''' - private def dispatch InstanceIdentifier append(InstanceIdentifier identifier, ContainerSchemaNode node) { + private def dispatch YangInstanceIdentifier append(YangInstanceIdentifier identifier, ContainerSchemaNode node) { return identifier.node(node.QName); } - private def dispatch InstanceIdentifier append(InstanceIdentifier identifier, ListSchemaNode node) { + private def dispatch YangInstanceIdentifier append(YangInstanceIdentifier identifier, ListSchemaNode node) { val keyValues = new LinkedHashMap(); if(node.keyDefinition !== null) { for(definition : node.keyDefinition) { @@ -993,22 +1172,22 @@ class GeneratorImpl { } - def asXmlPath(InstanceIdentifier identifier) { + def asXmlPath(YangInstanceIdentifier identifier) { return ""; } - def asRestconfPath(InstanceIdentifier identifier) { + def asRestconfPath(YangInstanceIdentifier identifier) { val it = new StringBuilder(); append(currentModule.name) append(":") var previous = false; - for(arg : identifier.path) { + for(arg : identifier.pathArguments) { if(previous) append("/") append(arg.nodeType.localName); previous = true; if(arg instanceof NodeIdentifierWithPredicates) { val nodeIdentifier = arg as NodeIdentifierWithPredicates; - for(qname : nodeIdentifier.keyValues.keySet) { + for(qname : nodeIdentifier.getKeyValues.keySet) { append("/{"); append(qname.localName) append("}") @@ -1023,7 +1202,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) @@ -1049,17 +1228,12 @@ class GeneratorImpl { } } - var String prefix = name.prefix - var String moduleName - if (prefix == null || "".equals(prefix) || prefix.equals(module.prefix)) { - moduleName = module.name - } else { - moduleName = imports.get(prefix) - } + val pathElementModule = ctx.findModuleByNamespaceAndRevision(name.namespace, name.revision) + val String moduleName = pathElementModule.name 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) { @@ -1094,7 +1268,7 @@ class GeneratorImpl { «ENDIF» ''' - private def CharSequence treeSet(Collection childNodes, InstanceIdentifier path) ''' + private def CharSequence treeSet(Collection childNodes, YangInstanceIdentifier path) ''' «IF childNodes !== null && !childNodes.empty»
      «FOR child : childNodes» @@ -1117,7 +1291,7 @@ class GeneratorImpl {
    ''' - private def dispatch CharSequence tree(Void obj, InstanceIdentifier path) ''' + private def dispatch CharSequence tree(Void obj, YangInstanceIdentifier path) ''' '''