Merge "Updated union builder template to throw an exception in getDefaultInstance...
authorTony Tkacik <ttkacik@cisco.com>
Tue, 17 Dec 2013 09:33:37 +0000 (09:33 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 17 Dec 2013 09:33:37 +0000 (09:33 +0000)
26 files changed:
code-generator/.gitignore
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend
code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/unified/doc/generator/GeneratorImpl.xtend
code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/WadlRestconfGenerator.xtend [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenerator.java [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenTest.java [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-network.yang [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-openflow.yang [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/demo-topology.yang [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-inet-types@2010-09-24.yang [new file with mode: 0644]
code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-yang-types@2010-09-24.yang [new file with mode: 0644]
model/yang-ext/pom.xml
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/UsesNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/UsesNodeBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/CopyUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserListenerUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/ParserUtils.xtend
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/RefineUtils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/AugmentTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/TestUtils.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/UsesAugmentTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserSimpleTest.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/YangParserTest.java

index acda8836cea878e3d670904f31751a69e9e6fa5a..e3b94d917510640e7a96c838a190b9ae44001539 100644 (file)
@@ -1,2 +1,3 @@
 /.settings
 /binding-java-api-generator/src/main/xtend-gen
+/maven-sal-api-gen-plugin/src/main/xtend-gen
index b9118ac0f513d7cc6e5dfc4f42481e4a1ee0d1b8..99a19687142de6054cd602c2c9f7994657801541 100644 (file)
@@ -279,15 +279,6 @@ abstract class BaseTemplate {
         return null;
     }
 
-    def GeneratedProperty getPropByName(Collection<GeneratedProperty> props, String name) {
-        for (GeneratedProperty prop : props) {
-            if (prop.name.equals(name)) {
-                return prop;
-            }
-        }
-        return null;
-    }
-
     def getRestrictions(Type type) {
         var Restrictions restrictions = null
         if (type instanceof ConcreteType) {
index 3bfc2f3d59154715cbec0ee30482e79db130185c..e7323720b2ed48c2e8d1539b3071cf2387622b38 100644 (file)
@@ -208,6 +208,7 @@ class GeneratorImpl {
                 <li>\r
                     augment\r
                     «augment.augmentationInfo(InstanceIdentifier.builder().toInstance())»\r
+                    «augment.childNodes.printChildren(2,InstanceIdentifier.builder().toInstance())»\r
                 </li>\r
             «ENDFOR»\r
             </ul>\r
@@ -353,6 +354,7 @@ class GeneratorImpl {
     val leafNodes = nodes.filter(LeafSchemaNode)\r
     val leafListNodes = nodes.filter(LeafListSchemaNode)\r
     val choices = nodes.filter(ChoiceNode)\r
+    val cases = nodes.filter(ChoiceCaseNode)\r
     val containers = nodes.filter(ContainerSchemaNode)\r
     val lists = nodes.filter(ListSchemaNode)\r
     return '''\r
@@ -383,6 +385,12 @@ class GeneratorImpl {
         «FOR childNode : lists»\r
             «childNode.printInfo(level,path)»\r
         «ENDFOR»\r
+        «FOR childNode : choices»\r
+            «childNode.printInfo(level,path)»\r
+        «ENDFOR»\r
+        «FOR childNode : cases»\r
+            «childNode.printInfo(level,path)»\r
+        «ENDFOR»\r
         \r
     '''\r
     }\r
@@ -466,7 +474,16 @@ class GeneratorImpl {
         </dl>\r
         «node.childNodes.printChildren(level,newPath)»\r
     '''\r
-    \r
+\r
+    private def dispatch CharSequence printInfo(ChoiceNode node, int level, InstanceIdentifier path) '''\r
+        «val Set<DataSchemaNode> choiceCases = new HashSet(node.cases)»\r
+        «choiceCases.printChildren(level,path)»\r
+    '''\r
+\r
+    private def dispatch CharSequence printInfo(ChoiceCaseNode node, int level, InstanceIdentifier path) '''\r
+        «node.childNodes.printChildren(level,path)»\r
+    '''\r
+\r
     def CharSequence printShortInfo(ContainerSchemaNode node, int level, InstanceIdentifier path) {\r
         val newPath = path.append(node);\r
         return '''\r
@@ -492,7 +509,7 @@ class GeneratorImpl {
             <li>«strong((node.QName.localName))» (leaf-list)</li>\r
         '''\r
     }\r
-    \r
+\r
     def CharSequence localLink(InstanceIdentifier identifier, CharSequence text) '''\r
         <a href="#«FOR cmp : identifier.path SEPARATOR "/"»«cmp.nodeType.localName»«ENDFOR»">«text»</a>\r
     '''\r
diff --git a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/WadlRestconfGenerator.xtend b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/WadlRestconfGenerator.xtend
new file mode 100644 (file)
index 0000000..18cd6d8
--- /dev/null
@@ -0,0 +1,256 @@
+package org.opendaylight.yangtools.yang.wadl.generator
+
+import java.io.BufferedWriter
+import java.io.File
+import java.io.OutputStreamWriter
+import java.util.ArrayList
+import java.util.HashSet
+import java.util.List
+import java.util.Set
+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.LeafSchemaNode
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
+import org.opendaylight.yangtools.yang.model.api.Module
+import org.opendaylight.yangtools.yang.model.api.SchemaContext
+import org.sonatype.plexus.build.incremental.BuildContext
+import org.sonatype.plexus.build.incremental.DefaultBuildContext
+
+class WadlRestconfGenerator {
+       
+       File path
+       static val BuildContext CTX = new DefaultBuildContext();
+       var SchemaContext context;
+       var List<DataSchemaNode> configData;
+       var List<DataSchemaNode> operationalData;
+       var Module module;
+       var List<LeafSchemaNode> pathListParams;
+       val PATH_DELIMETER = "/"
+
+       new(File targetPath) {
+               if (!targetPath.exists) targetPath.mkdirs
+               path = targetPath
+       }
+
+       def generate(SchemaContext context, Set<Module> modules) {
+        val result = new HashSet;
+               this.context = context
+               for (module : modules) {
+                       val dataContainers = module.childNodes.filter[it|it instanceof ContainerSchemaNode || it instanceof ListSchemaNode]
+                       if (!dataContainers.empty) {
+                               configData = new ArrayList
+                               operationalData = new ArrayList
+                               
+                               for (data : dataContainers) {
+                                       if (data.configuration) {
+                                               configData.add(data)    
+                                       } else {
+                                               operationalData.add(data)
+                                       }
+                               }
+                               
+                               this.module = module
+                               val destination = new File(path, '''«module.name».wadl''')
+                   val fw = new OutputStreamWriter(CTX.newFileOutputStream(destination))
+                   val bw = new BufferedWriter(fw)
+                   bw.append(application);
+                   bw.close();
+                   fw.close();
+                       result.add(destination)
+                       }
+               }
+               return result
+       }
+       
+       private def application() '''
+               <?xml version="1.0"?>
+               <application xmlns="http://wadl.dev.java.net/2009/02" «module.importsAsNamespaces» xmlns:«module.prefix»="«module.namespace»">
+               
+                       «grammars»
+                       
+                       «resources»
+               </application>
+       '''
+       
+       private def importsAsNamespaces(Module module) '''
+               «FOR imprt : module.imports»
+                       xmlns:«imprt.prefix»="«context.findModuleByName(imprt.moduleName, imprt.revision).namespace»"
+               «ENDFOR»
+       '''
+       
+       private def grammars() '''
+               <grammars>
+                       <include href="«module.name».yang"/>
+                       «FOR imprt : module.imports»
+                               <include href="«imprt.moduleName».yang"/>
+                       «ENDFOR»
+               </grammars>
+       '''
+       
+       private def resources() '''
+               <resources base="http://localhost:9998/restconf">
+                       «resourceOperational»
+                       «resourceConfig»
+                       «resourceOperations»
+               </resources>
+       '''
+       
+       private def resourceOperational() '''
+               «IF !operationalData.nullOrEmpty»
+                       <resource path="operational">
+                               «FOR schemaNode : operationalData»
+                                       «schemaNode.firstResource(false)»
+                               «ENDFOR»
+                       </resource>
+               «ENDIF»
+       '''
+       
+       private def resourceConfig() '''
+               «IF !configData.nullOrEmpty»
+                       <resource path="config">
+                               «FOR schemaNode : configData»
+                                       «schemaNode.firstResource(true)»
+                               «ENDFOR»
+                       </resource>
+               «ENDIF»
+       '''
+       
+       private def resourceOperations() '''
+               «IF !module.rpcs.nullOrEmpty»
+                       <resource path="operations">
+                               «FOR rpc : module.rpcs»
+                                       <resource path="«module.name»:«rpc.QName.localName»">
+                                               «methodPostRpc(rpc.input != null, rpc.output !== null)»
+                                       </resource>
+                               «ENDFOR»
+                       </resource>
+               «ENDIF»
+       '''
+       
+       private def String firstResource(DataSchemaNode schemaNode, boolean config) '''
+               <resource path="«module.name»:«schemaNode.createPath»">
+                       «IF !pathListParams.nullOrEmpty»
+                               «resourceParams»
+                       «ENDIF»
+                       «schemaNode.methodGet»
+                       «IF config»
+                               «schemaNode.mehodPut»
+                               «schemaNode.mehodPost»
+                       «ENDIF»
+                       
+                       «IF schemaNode instanceof DataNodeContainer»
+                               «val children = (schemaNode as DataNodeContainer).childNodes.filter[it|it instanceof ContainerSchemaNode || it instanceof ListSchemaNode]»
+                               «IF !children.empty»
+                                       «FOR child : children»
+                                               «child.resource(config)»
+                                       «ENDFOR»
+                               «ENDIF»
+                       «ENDIF»
+               </resource>
+       '''
+               
+       private def String resource(DataSchemaNode schemaNode, boolean config) '''
+               <resource path="«schemaNode.createPath»">
+                       «IF !pathListParams.nullOrEmpty»
+                               «resourceParams»
+                       «ENDIF»
+                       «schemaNode.methodGet»
+                       «IF config»
+                               «schemaNode.mehodPut»
+                               «schemaNode.mehodPost»
+                       «ENDIF»
+                       
+                       «IF schemaNode instanceof DataNodeContainer»
+                               «val children = (schemaNode as DataNodeContainer).childNodes.filter[it|it instanceof ContainerSchemaNode || it instanceof ListSchemaNode]»
+                               «IF !children.empty»
+                                       «FOR child : children»
+                                               «child.resource(config)»
+                                       «ENDFOR»
+                               «ENDIF»
+                       «ENDIF»
+               </resource>
+       '''
+       
+       private def String createPath(DataSchemaNode schemaNode) {
+               pathListParams = new ArrayList
+               var StringBuilder path = new StringBuilder
+               path.append(schemaNode.QName.localName)
+               if (schemaNode instanceof ListSchemaNode) {
+                       val listKeys = (schemaNode as ListSchemaNode).keyDefinition
+                       for (listKey : listKeys) {
+                               pathListParams.add((schemaNode as DataNodeContainer).getDataChildByName(listKey) as LeafSchemaNode) 
+                               path.append(PATH_DELIMETER + "{" + listKey.localName + "}")
+                       }
+               }
+               return path.toString
+       }
+       
+       private def resourceParams() '''
+               «FOR pathParam : pathListParams»
+                       «val prefix = pathParam.type.QName.prefix»
+                       «val type = if (prefix.nullOrEmpty) pathParam.type.QName.localName else prefix + ":" + pathParam.type.QName.localName»
+                       <param required="true" style="template" name="«pathParam.QName.localName»" type="«type»"/>
+               «ENDFOR»
+       '''
+       
+       private def methodGet(DataSchemaNode schemaNode) '''
+               <method name="GET">
+                       <response>
+                               <representation mediaType="application/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="text/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                       </response>
+               </method>
+       '''
+       
+       private def mehodPut(DataSchemaNode schemaNode) '''
+               <method name="PUT">
+                       <request>
+                               <representation mediaType="application/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="text/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                       </request>
+               </method>
+       '''
+       
+       private def mehodPost(DataSchemaNode schemaNode) '''
+               <method name="POST">
+                       <request>
+                               <representation mediaType="application/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="text/xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+xml" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                               <representation mediaType="application/yang.data+json" element="«schemaNode.QName.prefix»:«schemaNode.QName.localName»"/>
+                       </request>
+               </method>
+       '''
+       
+       private def methodPostRpc(boolean input, boolean output) '''
+               <method name="POST">
+                       «IF input»
+                       <request>
+                               <representation mediaType="application/xml" element="input"/>
+                               <representation mediaType="text/xml" element="input"/>
+                               <representation mediaType="application/json" element="input"/>
+                               <representation mediaType="application/yang.data+xml" element="input"/>
+                               <representation mediaType="application/yang.data+json" element="input"/>
+                       </request>
+                       «ENDIF»
+                       «IF output»
+                       <response>
+                               <representation mediaType="application/xml" element="output"/>
+                               <representation mediaType="text/xml" element="output"/>
+                               <representation mediaType="application/json" element="output"/>
+                               <representation mediaType="application/yang.data+xml" element="output"/>
+                               <representation mediaType="application/yang.data+json" element="output"/>
+                       </response>
+                       «ENDIF»
+               </method>
+       '''
+
+}
diff --git a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenerator.java b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenerator.java
new file mode 100644 (file)
index 0000000..a10c509
--- /dev/null
@@ -0,0 +1,58 @@
+package org.opendaylight.yangtools.yang.wadl.generator.maven;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.wadl.generator.WadlRestconfGenerator;
+import org.opendaylight.yangtools.yang2sources.spi.CodeGenerator;
+
+public class WadlGenerator implements CodeGenerator {
+    
+    @Override
+    public Collection<File> generateSources(SchemaContext context, File outputDir, Set<Module> currentModules)
+            throws IOException {
+        
+        final File outputBaseDir;
+        if (outputDir == null) {
+            outputBaseDir = new File("target" + File.separator + "generated-sources" + File.separator
+                    + "maven-sal-api-gen" + File.separator + "wadl");
+        } else {
+            outputBaseDir = outputDir;
+        }
+
+        final WadlRestconfGenerator generator = new WadlRestconfGenerator(outputBaseDir);
+        return generator.generate(context, currentModules);
+    }
+
+    @Override
+    public void setLog(Log log) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void setAdditionalConfig(Map<String, String> additionalConfiguration) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void setResourceBaseDir(File resourceBaseDir) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void setMavenProject(MavenProject project) {
+        // TODO Auto-generated method stub
+        
+    }
+
+}
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenTest.java b/code-generator/maven-sal-api-gen-plugin/src/test/java/org/opendaylight/yangtools/yang/wadl/generator/maven/WadlGenTest.java
new file mode 100644 (file)
index 0000000..11c5ad7
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opendaylight.yangtools.yang.wadl.generator.maven;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
+import org.opendaylight.yangtools.yang2sources.spi.CodeGenerator;
+
+public class WadlGenTest {
+    public static final String FS = File.separator;
+    private static final String TEST_PATH = "target" + FS + "test" + FS + "site";
+    private static final File GENERATOR_OUTPUT_DIR = new File(TEST_PATH);
+    private YangParserImpl parser;
+
+    @Before
+    public void init() {
+        if (GENERATOR_OUTPUT_DIR.exists()) {
+            deleteTestDir(GENERATOR_OUTPUT_DIR);
+        }
+        assertTrue(GENERATOR_OUTPUT_DIR.mkdirs());
+        parser = new YangParserImpl();
+    }
+
+    @After
+    public void cleanUp() {
+        if (GENERATOR_OUTPUT_DIR.exists()) {
+            deleteTestDir(GENERATOR_OUTPUT_DIR);
+        }
+    }
+
+    @Test
+    public void testListGeneration() throws Exception {
+        final List<File> sourceFiles = getSourceFiles("/wadl-gen");
+        final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
+        final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
+        final CodeGenerator generator = new WadlGenerator();
+        generator.generateSources(context, GENERATOR_OUTPUT_DIR, modulesToBuild);
+    }
+
+    private static List<File> getSourceFiles(String path) throws FileNotFoundException {
+        final String resPath = WadlGenTest.class.getResource(path).getPath();
+        final File sourcesDir = new File(resPath);
+        if (sourcesDir.exists()) {
+            final List<File> sourceFiles = new ArrayList<>();
+            final File[] fileArray = sourcesDir.listFiles();
+            if (fileArray == null) {
+                throw new IllegalArgumentException("Unable to locate files in " + sourcesDir);
+            }
+            sourceFiles.addAll(Arrays.asList(fileArray));
+            return sourceFiles;
+        } else {
+            throw new FileNotFoundException("Testing files were not found(" + sourcesDir.getName() + ")");
+        }
+    }
+
+    private static void deleteTestDir(File file) {
+        if (file.isDirectory()) {
+            File[] filesToDelete = file.listFiles();
+            if (filesToDelete != null) {
+                for (File f : filesToDelete) {
+                    deleteTestDir(f);
+                }
+            }
+        }
+        if (!file.delete()) {
+            throw new RuntimeException("Failed to clean up after test");
+        }
+    }
+
+}
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-network.yang b/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-network.yang
new file mode 100644 (file)
index 0000000..a8693bb
--- /dev/null
@@ -0,0 +1,193 @@
+module controller-network {
+       yang-version 1;
+       namespace "urn:opendaylight:controller:network";
+       prefix "topos";
+       
+       import ietf-inet-types { prefix "inet"; }
+       
+       revision 2013-05-20 {
+          description "Initial demo";
+       }
+       
+
+       
+       
+       typedef topology-id {
+               type string;
+       }
+
+       typedef node-id {
+               type string;
+       }
+
+       typedef link-id {
+               type string;
+       }
+
+       typedef tp-id {
+               type string;
+               description "identifier for termination points on a port";
+       }
+
+       typedef tp-ref {
+               type leafref {
+                       path "/network/topologies/topology/nodes/node/termination-points/termination-point/tp-id";
+               }
+       }
+       typedef topology-ref {
+               type leafref {
+                       path "/network/topologies/topology/topology-id";
+               }
+               description "This type is used for leafs that reference topology identifier instance.";
+               // currently not used
+       }
+
+       typedef node-ref {
+               type leafref {
+                       path "/network/topologies/topology/nodes/node/node-id";
+               }
+               description "This type is used for leafs that reference a node instance.";
+       }
+
+       typedef link-ref {
+               type leafref {
+                       path "/network/topologies/topology/links/link/link-id";
+               }
+               description "This type is used for leafs that reference a link instance.";
+               // currently not used
+       }
+       
+       typedef network-element-ref {
+               type leafref {
+                       path "/network/network-elements/network-element/element-id";
+               }
+       }
+
+
+       typedef element-id {
+               type string;
+       }
+       
+       container network {
+               container topologies {
+                       list topology {
+                               description "
+                                       This is the model of abstract topology which contains only Network
+                                       Nodes and Network Links. Each topology MUST be identified by
+                                       unique topology-id for reason that the store could contain many
+                                       topologies.
+                               ";
+                               key "topology-id";
+                               leaf topology-id {
+                                       type topology-id; 
+                                       description "
+                                               It is presumed that datastore will contain many topologies. To
+                                               distinguish between topologies it is vital to have UNIQUE
+                                               topology identifier.
+                                       ";
+                               }
+
+                               container types {
+                                       description "
+                                               The container for definition of topology types.
+                                               The augmenting modules should add empty optional leaf 
+                                               to this container to signalize topology type.
+                                       ";
+                               }
+
+                               container nodes {
+                                       list node {
+                                               description "The list of network nodes defined for topology.";
+
+                                               key "node-id";
+                                               leaf node-id {
+                                                       type node-id;
+                                                       description "The Topology identifier of network-node.";
+                                               }
+
+                                               leaf supporting-ne {
+                                                       type network-element-ref;
+                                               }
+                                               
+                                               container termination-points {
+                                                       list termination-point {
+                                                               key "tp-id";
+                                                               leaf tp-id {
+                                                                       type tp-id;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+               
+                               container links {
+                                       list link {
+                                               description "
+                                                       The Network Link which is defined by Local (Source) and
+                                                       Remote (Destination) Network Nodes. Every link MUST be
+                                                       defined either by identifier and his local and remote
+                                                       Network Nodes (in real applications it is common that many
+                                                       links are originated from one node and end up in same
+                                                       remote node). To ensure that we would always know to
+                                                       distinguish between links, every link SHOULD have
+                                                       identifier.
+                                               ";
+                                               key "link-id";
+               
+                                               leaf link-id {
+                                                       type link-id;
+                                               }
+                                               container source { 
+                                                       leaf source-node {
+                                                               type node-ref;
+                                                               description "Source node identifier.";
+                                                       }
+                                                       leaf source-tp {
+                                                               type tp-ref;
+                                                       }
+                                               }
+                                               container destination { 
+                                                       leaf dest-node {
+                                                               type node-ref;
+                                                               description "Destination node identifier.";
+                                                       }
+                                                       leaf dest-tp {
+                                                               type tp-ref;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+               container network-elements {
+                       config true;
+                       list network-element {
+                               key "element-id";
+                               leaf element-id {
+                                       type element-id;
+                               }
+                       }
+               }
+       }
+       
+       rpc activate-software-image {
+         input {
+             leaf image-name {
+                 type string;
+             }
+         }
+         output {
+             leaf status {
+                 type string;
+             }
+         }
+     }
+     
+     rpc rock-the-house {
+         input {
+             leaf zip-code {
+                 type string;
+             }
+         }
+     }
+}
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-openflow.yang b/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/controller-openflow.yang
new file mode 100644 (file)
index 0000000..62e937e
--- /dev/null
@@ -0,0 +1,79 @@
+module controller-openflow {
+
+    namespace "urn:opendaylight:controller:openflow";
+    prefix "of";
+    import controller-network {prefix cn;}
+    
+    
+    revision 2013-05-20 {
+       description "Initial demo";
+    }
+
+   
+
+
+
+    typedef datapath-id {
+        type string {
+            length 16;
+        }
+    }
+
+
+    augment "/cn:network/cn:topologies/cn:topology/cn:types" {
+        leaf openflow {type string;}
+    }
+
+    augment "/cn:network/cn:topologies/cn:topology/cn:links/cn:link/cn:source" {
+        when "../../../cn:types/of:openflow";
+
+        leaf logical-port {
+            type int32;
+        }
+    }
+
+    augment "/cn:network/cn:topologies/cn:topology/cn:links/cn:link/cn:destination" {
+        when "../../../cn:types/of:openflow";
+
+        leaf logical-port {
+            type int32;
+        }
+    }
+
+    augment "/cn:network/cn:topologies/cn:topology/cn:nodes/cn:node/" {
+        when "../../../cn:types/of:openflow";
+        leaf datapath-id {
+            type datapath-id;
+        }
+    }
+    
+    augment "/cn:network/cn:network-elements/cn:network-element" {
+        leaf datapath-id {
+            type datapath-id;
+        }
+
+        container ports {
+            list port {
+                key "logical-port-id";
+                
+                leaf logical-port-id {
+                    type int32;
+                }
+
+                // Should be replaced with ref to interface
+                leaf physical-name {
+                    type string;
+                }
+            }
+        }
+        container flow-tables {
+            list flow-table {
+                key "flow-table-id";
+                leaf flow-table-id {
+                    type string;
+                }
+
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/demo-topology.yang b/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/demo-topology.yang
new file mode 100644 (file)
index 0000000..4fef1cd
--- /dev/null
@@ -0,0 +1,121 @@
+module demo-topology {
+       yang-version 1;
+    namespace "urn:model.1demo-275topology.4.5.my";
+    prefix "tp";
+
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    description "
+               This module contains the definitions of elements that creates network 
+               topology i.e. definition of network nodes and links. This module is
+               not designed to be used solely for network representation. This module
+               SHOULD be used as base module in defining the network topology.
+       ";
+
+    revision "2013-02-08"{
+               reference " WILL BE DEFINED LATER";
+       }
+
+       container topology {
+        description "
+                       This is the model of abstract topology which contains only Network
+                       Nodes and Network Links. Each topology MUST be identified by
+                       unique topology-id for reason that the store could contain many
+                       topologies.
+               ";
+
+        leaf topology-id {
+            type string;
+            description "
+                               It is presumed that datastore will contain many topologies. To
+                               distinguish between topologies it is vital to have UNIQUE
+                               topology identifier.
+                       ";
+        }
+
+        container network-nodes {
+               list network-node {
+                   description "The list of network nodes defined for topology.";
+
+                       key "node-id";
+
+                       leaf node-id {
+                               type string;
+                               description "The Topology identifier of network-node.";
+                       }
+                
+                list network-interface {
+                    key "interface-id";
+                    
+                    leaf interface-id {
+                        type uint8;
+                    }
+                    
+                    leaf interface-address {
+                        type string;
+                    }
+                }
+                
+                   container node-attributes {
+                                       description "
+                                               Additional attributes that can Network Node contains.
+                                       ";
+
+                                       leaf geo-latitude {
+                                               type decimal64 {
+                                                       fraction-digits 2;
+                                               }
+                                               config true;
+                                       }
+
+                                       leaf geo-longitude {
+                                               type decimal64 {
+                                                       fraction-digits 2;
+                                               }
+                                               config true;
+                                       }
+                               }
+               }
+        }
+        
+        container network-links {
+               list network-link {
+                   description "
+                                       The Network Link which is defined by Local (Source) and
+                                       Remote (Destination) Network Nodes. Every link MUST be
+                                       defined either by identifier and his local and remote
+                                       Network Nodes (in real applications it is common that many
+                                       links are originated from one node and end up in same
+                                       remote node). To ensure that we would always know to
+                                       distinguish between links, every link SHOULD have
+                                       identifier.
+                               ";
+                       key "link-id";
+
+                       leaf link-id {
+                               type string;
+                               description "";
+                       }
+
+                   container source {
+                                       leaf node-id {
+                                               type string;
+                                               description "Source node identifier.";
+                                       }
+                               }
+
+                               container destination {
+                                       leaf node-id {
+                                               type string;
+                                               description "Destination node identifier.";
+                                       }
+                               }
+
+                               container link-attributes {
+                                       description "Aditional attributes that can Network Link contains.";
+                               }
+                   }
+        }
+    }
+}
\ No newline at end of file
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-inet-types@2010-09-24.yang b/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-inet-types@2010-09-24.yang
new file mode 100644 (file)
index 0000000..de20feb
--- /dev/null
@@ -0,0 +1,418 @@
+ module ietf-inet-types {
+
+   namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+   prefix "inet";
+
+   organization
+    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+   contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: David Partain
+               <mailto:david.partain@ericsson.com>
+
+     WG Chair: David Kessens
+               <mailto:david.kessens@nsn.com>
+
+     Editor:   Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>";
+
+   description
+    "This module contains a collection of generally useful derived
+     YANG data types for Internet addresses and related things.
+
+     Copyright (c) 2010 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or without
+     modification, is permitted pursuant to, and subject to the license
+     terms contained in, the Simplified BSD License set forth in Section
+     4.c of the IETF Trust's Legal Provisions Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6021; see
+     the RFC itself for full legal notices.";
+
+   revision 2010-09-24 {
+     description
+      "Initial revision.";
+     reference
+      "RFC 6021: Common YANG Data Types";
+   }
+
+   /*** collection of protocol field related types ***/
+
+   typedef ip-version {
+     type enumeration {
+       enum unknown {
+         value "0";
+         description
+          "An unknown or unspecified version of the Internet protocol.";
+       }
+       enum ipv4 {
+         value "1";
+         description
+          "The IPv4 protocol as defined in RFC 791.";
+       }
+       enum ipv6 {
+         value "2";
+         description
+          "The IPv6 protocol as defined in RFC 2460.";
+       }
+     }
+     description
+      "This value represents the version of the IP protocol.
+
+       In the value set and its semantics, this type is equivalent
+       to the InetVersion textual convention of the SMIv2.";
+     reference
+      "RFC  791: Internet Protocol
+       RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+       RFC 4001: Textual Conventions for Internet Network Addresses";
+   }
+
+   typedef dscp {
+     type uint8 {
+       range "0..63";
+     }
+     description
+      "The dscp type represents a Differentiated Services Code-Point
+       that may be used for marking packets in a traffic stream.
+
+       In the value set and its semantics, this type is equivalent
+       to the Dscp textual convention of the SMIv2.";
+     reference
+      "RFC 3289: Management Information Base for the Differentiated
+                 Services Architecture
+       RFC 2474: Definition of the Differentiated Services Field
+                 (DS Field) in the IPv4 and IPv6 Headers
+       RFC 2780: IANA Allocation Guidelines For Values In
+                 the Internet Protocol and Related Headers";
+   }
+
+   typedef ipv6-flow-label {
+     type uint32 {
+       range "0..1048575";
+     }
+     description
+      "The flow-label type represents flow identifier or Flow Label
+       in an IPv6 packet header that may be used to discriminate
+       traffic flows.
+
+       In the value set and its semantics, this type is equivalent
+       to the IPv6FlowLabel textual convention of the SMIv2.";
+     reference
+      "RFC 3595: Textual Conventions for IPv6 Flow Label
+       RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+   }
+
+   typedef port-number {
+     type uint16 {
+       range "0..65535";
+     }
+     description
+      "The port-number type represents a 16-bit port number of an
+       Internet transport layer protocol such as UDP, TCP, DCCP, or
+       SCTP.  Port numbers are assigned by IANA.  A current list of
+       all assignments is available from <http://www.iana.org/>.
+
+       Note that the port number value zero is reserved by IANA.  In
+       situations where the value zero does not make sense, it can
+       be excluded by subtyping the port-number type.
+
+       In the value set and its semantics, this type is equivalent
+       to the InetPortNumber textual convention of the SMIv2.";
+     reference
+      "RFC  768: User Datagram Protocol
+       RFC  793: Transmission Control Protocol
+       RFC 4960: Stream Control Transmission Protocol
+       RFC 4340: Datagram Congestion Control Protocol (DCCP)
+       RFC 4001: Textual Conventions for Internet Network Addresses";
+   }
+
+   /*** collection of autonomous system related types ***/
+
+   typedef as-number {
+     type uint32;
+     description
+      "The as-number type represents autonomous system numbers
+       which identify an Autonomous System (AS).  An AS is a set
+       of routers under a single technical administration, using
+       an interior gateway protocol and common metrics to route
+       packets within the AS, and using an exterior gateway
+       protocol to route packets to other ASs'.  IANA maintains
+       the AS number space and has delegated large parts to the
+       regional registries.
+
+       Autonomous system numbers were originally limited to 16
+       bits.  BGP extensions have enlarged the autonomous system
+       number space to 32 bits.  This type therefore uses an uint32
+       base type without a range restriction in order to support
+       a larger autonomous system number space.
+
+       In the value set and its semantics, this type is equivalent
+       to the InetAutonomousSystemNumber textual convention of
+       the SMIv2.";
+     reference
+      "RFC 1930: Guidelines for creation, selection, and registration
+                 of an Autonomous System (AS)
+       RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+       RFC 4893: BGP Support for Four-octet AS Number Space
+       RFC 4001: Textual Conventions for Internet Network Addresses";
+   }
+
+   /*** collection of IP address and hostname related types ***/
+
+   typedef ip-address {
+     type union {
+       type inet:ipv4-address;
+       type inet:ipv6-address;
+     }
+     description
+      "The ip-address type represents an IP address and is IP
+       version neutral.  The format of the textual representations
+       implies the IP version.";
+   }
+
+   typedef ipv4-address {
+     type string {
+       pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '(%[\p{N}\p{L}]+)?';
+     }
+     description
+       "The ipv4-address type represents an IPv4 address in
+        dotted-quad notation.  The IPv4 address may include a zone
+        index, separated by a % sign.
+
+        The zone index is used to disambiguate identical address
+        values.  For link-local addresses, the zone index will
+        typically be the interface index number or the name of an
+        interface.  If the zone index is not present, the default
+        zone of the device will be used.
+
+        The canonical format for the zone index is the numerical
+        format";
+   }
+
+   typedef ipv6-address {
+     type string {
+       pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+             + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+             + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+             + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+             + '(%[\p{N}\p{L}]+)?';
+       pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+             + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+             + '(%.+)?';
+     }
+     description
+      "The ipv6-address type represents an IPv6 address in full,
+       mixed, shortened, and shortened-mixed notation.  The IPv6
+       address may include a zone index, separated by a % sign.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format of IPv6 addresses uses the compressed
+       format described in RFC 4291, Section 2.2, item 2 with the
+       following additional rules: the :: substitution must be
+       applied to the longest sequence of all-zero 16-bit chunks
+       in an IPv6 address.  If there is a tie, the first sequence
+       of all-zero 16-bit chunks is replaced by ::.  Single
+       all-zero 16-bit chunks are not compressed.  The canonical
+       format uses lowercase characters and leading zeros are
+       not allowed.  The canonical format for the zone index is
+       the numerical format as described in RFC 4007, Section
+       11.2.";
+     reference
+      "RFC 4291: IP Version 6 Addressing Architecture
+       RFC 4007: IPv6 Scoped Address Architecture
+       RFC 5952: A Recommendation for IPv6 Address Text Representation";
+   }
+
+   typedef ip-prefix {
+     type union {
+       type inet:ipv4-prefix;
+       type inet:ipv6-prefix;
+     }
+     description
+      "The ip-prefix type represents an IP prefix and is IP
+       version neutral.  The format of the textual representations
+       implies the IP version.";
+   }
+
+   typedef ipv4-prefix {
+     type string {
+       pattern
+          '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+        +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+        + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+     }
+     description
+      "The ipv4-prefix type represents an IPv4 address prefix.
+       The prefix length is given by the number following the
+       slash character and must be less than or equal to 32.
+
+       A prefix length value of n corresponds to an IP address
+       mask that has n contiguous 1-bits from the most
+       significant bit (MSB) and all other bits set to 0.
+
+       The canonical format of an IPv4 prefix has all bits of
+       the IPv4 address set to zero that are not part of the
+       IPv4 prefix.";
+   }
+
+   typedef ipv6-prefix {
+     type string {
+       pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+             + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+             + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+             + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+             + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+       pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+             + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+             + '(/.+)';
+     }
+     description
+      "The ipv6-prefix type represents an IPv6 address prefix.
+       The prefix length is given by the number following the
+       slash character and must be less than or equal 128.
+
+       A prefix length value of n corresponds to an IP address
+       mask that has n contiguous 1-bits from the most
+       significant bit (MSB) and all other bits set to 0.
+
+       The IPv6 address should have all bits that do not belong
+       to the prefix set to zero.
+
+       The canonical format of an IPv6 prefix has all bits of
+       the IPv6 address set to zero that are not part of the
+       IPv6 prefix.  Furthermore, IPv6 address is represented
+       in the compressed format described in RFC 4291, Section
+       2.2, item 2 with the following additional rules: the ::
+       substitution must be applied to the longest sequence of
+       all-zero 16-bit chunks in an IPv6 address.  If there is
+       a tie, the first sequence of all-zero 16-bit chunks is
+       replaced by ::.  Single all-zero 16-bit chunks are not
+       compressed.  The canonical format uses lowercase
+       characters and leading zeros are not allowed.";
+     reference
+      "RFC 4291: IP Version 6 Addressing Architecture";
+   }
+
+   /*** collection of domain name and URI types ***/
+
+   typedef domain-name {
+     type string {
+       pattern '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+            +  '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+            +  '|\.';
+       length "1..253";
+     }
+     description
+      "The domain-name type represents a DNS domain name.  The
+       name SHOULD be fully qualified whenever possible.
+
+       Internet domain names are only loosely specified.  Section
+       3.5 of RFC 1034 recommends a syntax (modified in Section
+       2.1 of RFC 1123).  The pattern above is intended to allow
+       for current practice in domain name use, and some possible
+       future expansion.  It is designed to hold various types of
+       domain names, including names used for A or AAAA records
+       (host names) and other records, such as SRV records.  Note
+       that Internet host names have a stricter syntax (described
+       in RFC 952) than the DNS recommendations in RFCs 1034 and
+       1123, and that systems that want to store host names in
+       schema nodes using the domain-name type are recommended to
+       adhere to this stricter standard to ensure interoperability.
+
+       The encoding of DNS names in the DNS protocol is limited
+       to 255 characters.  Since the encoding consists of labels
+       prefixed by a length bytes and there is a trailing NULL
+       byte, only 253 characters can appear in the textual dotted
+       notation.
+
+       The description clause of schema nodes using the domain-name
+       type MUST describe when and how these names are resolved to
+       IP addresses.  Note that the resolution of a domain-name value
+       may require to query multiple DNS records (e.g., A for IPv4
+       and AAAA for IPv6).  The order of the resolution process and
+       which DNS record takes precedence can either be defined
+       explicitely or it may depend on the configuration of the
+       resolver.
+
+       Domain-name values use the US-ASCII encoding.  Their canonical
+       format uses lowercase US-ASCII characters.  Internationalized
+       domain names MUST be encoded in punycode as described in RFC
+       3492";
+     reference
+      "RFC  952: DoD Internet Host Table Specification
+       RFC 1034: Domain Names - Concepts and Facilities
+       RFC 1123: Requirements for Internet Hosts -- Application
+                 and Support
+       RFC 2782: A DNS RR for specifying the location of services
+                 (DNS SRV)
+       RFC 3492: Punycode: A Bootstring encoding of Unicode for
+                 Internationalized Domain Names in Applications
+                 (IDNA)
+       RFC 5891: Internationalizing Domain Names in Applications
+                 (IDNA): Protocol";
+   }
+
+   typedef host {
+     type union {
+       type inet:ip-address;
+       type inet:domain-name;
+     }
+     description
+      "The host type represents either an IP address or a DNS
+       domain name.";
+   }
+
+   typedef uri {
+     type string;
+     description
+      "The uri type represents a Uniform Resource Identifier
+       (URI) as defined by STD 66.
+
+       Objects using the uri type MUST be in US-ASCII encoding,
+       and MUST be normalized as described by RFC 3986 Sections
+       6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+       percent-encoding is removed, and all case-insensitive
+       characters are set to lowercase except for hexadecimal
+       digits, which are normalized to uppercase as described in
+       Section 6.2.2.1.
+
+       The purpose of this normalization is to help provide
+       unique URIs.  Note that this normalization is not
+       sufficient to provide uniqueness.  Two URIs that are
+       textually distinct after this normalization may still be
+       equivalent.
+
+       Objects using the uri type may restrict the schemes that
+       they permit.  For example, 'data:' and 'urn:' schemes
+       might not be appropriate.
+
+       A zero-length URI is not a valid URI.  This can be used to
+       express 'URI absent' where required.
+
+       In the value set and its semantics, this type is equivalent
+       to the Uri SMIv2 textual convention defined in RFC 5017.";
+     reference
+      "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+       RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+                 Group: Uniform Resource Identifiers (URIs), URLs,
+                 and Uniform Resource Names (URNs): Clarifications
+                 and Recommendations
+       RFC 5017: MIB Textual Conventions for Uniform Resource
+                 Identifiers (URIs)";
+   }
+
+ }
diff --git a/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-yang-types@2010-09-24.yang b/code-generator/maven-sal-api-gen-plugin/src/test/resources/wadl-gen/ietf-yang-types@2010-09-24.yang
new file mode 100644 (file)
index 0000000..51d9f8b
--- /dev/null
@@ -0,0 +1,396 @@
+ module ietf-yang-types {
+
+   namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+   prefix "yang";
+
+   organization
+    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+   contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: David Partain
+               <mailto:david.partain@ericsson.com>
+
+     WG Chair: David Kessens
+               <mailto:david.kessens@nsn.com>
+
+     Editor:   Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>";
+
+   description
+    "This module contains a collection of generally useful derived
+     YANG data types.
+
+     Copyright (c) 2010 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or without
+     modification, is permitted pursuant to, and subject to the license
+     terms contained in, the Simplified BSD License set forth in Section
+     4.c of the IETF Trust's Legal Provisions Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6021; see
+     the RFC itself for full legal notices.";
+
+   revision 2010-09-24 {
+     description
+      "Initial revision.";
+     reference
+      "RFC 6021: Common YANG Data Types";
+   }
+
+   /*** collection of counter and gauge types ***/
+
+   typedef counter32 {
+     type uint32;
+     description
+      "The counter32 type represents a non-negative integer
+       that monotonically increases until it reaches a
+       maximum value of 2^32-1 (4294967295 decimal), when it
+       wraps around and starts increasing again from zero.
+
+       Counters have no defined 'initial' value, and thus, a
+       single value of a counter has (in general) no information
+       content.  Discontinuities in the monotonically increasing
+       value normally occur at re-initialization of the
+       management system, and at other times as specified in the
+       description of a schema node using this type.  If such
+       other times can occur, for example, the creation of
+       a schema node of type counter32 at times other than
+       re-initialization, then a corresponding schema node
+       should be defined, with an appropriate type, to indicate
+       the last discontinuity.
+
+       The counter32 type should not be used for configuration
+       schema nodes.  A default statement SHOULD NOT be used in
+       combination with the type counter32.
+
+       In the value set and its semantics, this type is equivalent
+       to the Counter32 type of the SMIv2.";
+     reference
+      "RFC 2578: Structure of Management Information Version 2 (SMIv2)";
+   }
+
+   typedef zero-based-counter32 {
+     type yang:counter32;
+     default "0";
+     description
+      "The zero-based-counter32 type represents a counter32
+       that has the defined 'initial' value zero.
+
+       A schema node of this type will be set to zero (0) on creation
+       and will thereafter increase monotonically until it reaches
+       a maximum value of 2^32-1 (4294967295 decimal), when it
+       wraps around and starts increasing again from zero.
+
+       Provided that an application discovers a new schema node
+       of this type within the minimum time to wrap, it can use the
+       'initial' value as a delta.  It is important for a management
+       station to be aware of this minimum time and the actual time
+       between polls, and to discard data if the actual time is too
+       long or there is no defined minimum time.
+
+       In the value set and its semantics, this type is equivalent
+       to the ZeroBasedCounter32 textual convention of the SMIv2.";
+     reference
+       "RFC 4502: Remote Network Monitoring Management Information
+                  Base Version 2";
+   }
+
+   typedef counter64 {
+     type uint64;
+     description
+      "The counter64 type represents a non-negative integer
+       that monotonically increases until it reaches a
+       maximum value of 2^64-1 (18446744073709551615 decimal),
+       when it wraps around and starts increasing again from zero.
+
+       Counters have no defined 'initial' value, and thus, a
+       single value of a counter has (in general) no information
+       content.  Discontinuities in the monotonically increasing
+       value normally occur at re-initialization of the
+       management system, and at other times as specified in the
+       description of a schema node using this type.  If such
+       other times can occur, for example, the creation of
+       a schema node of type counter64 at times other than
+       re-initialization, then a corresponding schema node
+       should be defined, with an appropriate type, to indicate
+       the last discontinuity.
+
+       The counter64 type should not be used for configuration
+       schema nodes.  A default statement SHOULD NOT be used in
+       combination with the type counter64.
+
+       In the value set and its semantics, this type is equivalent
+       to the Counter64 type of the SMIv2.";
+     reference
+      "RFC 2578: Structure of Management Information Version 2 (SMIv2)";
+   }
+
+   typedef zero-based-counter64 {
+     type yang:counter64;
+     default "0";
+     description
+      "The zero-based-counter64 type represents a counter64 that
+       has the defined 'initial' value zero.
+
+       A schema node of this type will be set to zero (0) on creation
+       and will thereafter increase monotonically until it reaches
+       a maximum value of 2^64-1 (18446744073709551615 decimal),
+       when it wraps around and starts increasing again from zero.
+
+       Provided that an application discovers a new schema node
+       of this type within the minimum time to wrap, it can use the
+       'initial' value as a delta.  It is important for a management
+       station to be aware of this minimum time and the actual time
+       between polls, and to discard data if the actual time is too
+       long or there is no defined minimum time.
+
+       In the value set and its semantics, this type is equivalent
+       to the ZeroBasedCounter64 textual convention of the SMIv2.";
+     reference
+      "RFC 2856: Textual Conventions for Additional High Capacity
+                 Data Types";
+   }
+
+   typedef gauge32 {
+     type uint32;
+     description
+      "The gauge32 type represents a non-negative integer, which
+       may increase or decrease, but shall never exceed a maximum
+       value, nor fall below a minimum value.  The maximum value
+       cannot be greater than 2^32-1 (4294967295 decimal), and
+       the minimum value cannot be smaller than 0.  The value of
+       a gauge32 has its maximum value whenever the information
+       being modeled is greater than or equal to its maximum
+       value, and has its minimum value whenever the information
+       being modeled is smaller than or equal to its minimum value.
+       If the information being modeled subsequently decreases
+       below (increases above) the maximum (minimum) value, the
+       gauge32 also decreases (increases).
+
+       In the value set and its semantics, this type is equivalent
+       to the Gauge32 type of the SMIv2.";
+     reference
+      "RFC 2578: Structure of Management Information Version 2 (SMIv2)";
+   }
+
+   typedef gauge64 {
+     type uint64;
+     description
+      "The gauge64 type represents a non-negative integer, which
+       may increase or decrease, but shall never exceed a maximum
+       value, nor fall below a minimum value.  The maximum value
+       cannot be greater than 2^64-1 (18446744073709551615), and
+       the minimum value cannot be smaller than 0.  The value of
+       a gauge64 has its maximum value whenever the information
+       being modeled is greater than or equal to its maximum
+       value, and has its minimum value whenever the information
+       being modeled is smaller than or equal to its minimum value.
+       If the information being modeled subsequently decreases
+       below (increases above) the maximum (minimum) value, the
+       gauge64 also decreases (increases).
+
+       In the value set and its semantics, this type is equivalent
+       to the CounterBasedGauge64 SMIv2 textual convention defined
+       in RFC 2856";
+     reference
+      "RFC 2856: Textual Conventions for Additional High Capacity
+                 Data Types";
+   }
+
+   /*** collection of identifier related types ***/
+
+   typedef object-identifier {
+     type string {
+       pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+             + '(\.(0|([1-9]\d*)))*';
+     }
+     description
+      "The object-identifier type represents administratively
+       assigned names in a registration-hierarchical-name tree.
+
+       Values of this type are denoted as a sequence of numerical
+       non-negative sub-identifier values.  Each sub-identifier
+       value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+       are separated by single dots and without any intermediate
+       whitespace.
+
+       The ASN.1 standard restricts the value space of the first
+       sub-identifier to 0, 1, or 2.  Furthermore, the value space
+       of the second sub-identifier is restricted to the range
+       0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+       the ASN.1 standard requires that an object identifier
+       has always at least two sub-identifier.  The pattern
+       captures these restrictions.
+
+       Although the number of sub-identifiers is not limited,
+       module designers should realize that there may be
+       implementations that stick with the SMIv2 limit of 128
+       sub-identifiers.
+
+       This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+       since it is not restricted to 128 sub-identifiers.  Hence,
+       this type SHOULD NOT be used to represent the SMIv2 OBJECT
+       IDENTIFIER type, the object-identifier-128 type SHOULD be
+       used instead.";
+     reference
+      "ISO9834-1: Information technology -- Open Systems
+       Interconnection -- Procedures for the operation of OSI
+       Registration Authorities: General procedures and top
+       arcs of the ASN.1 Object Identifier tree";
+   }
+
+
+
+
+   typedef object-identifier-128 {
+     type object-identifier {
+       pattern '\d*(\.\d*){1,127}';
+     }
+     description
+      "This type represents object-identifiers restricted to 128
+       sub-identifiers.
+
+       In the value set and its semantics, this type is equivalent
+       to the OBJECT IDENTIFIER type of the SMIv2.";
+     reference
+      "RFC 2578: Structure of Management Information Version 2 (SMIv2)";
+   }
+
+   /*** collection of date and time related types ***/
+
+   typedef date-and-time {
+     type string {
+       pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+             + '(Z|[\+\-]\d{2}:\d{2})';
+     }
+     description
+      "The date-and-time type is a profile of the ISO 8601
+       standard for representation of dates and times using the
+       Gregorian calendar.  The profile is defined by the
+       date-time production in Section 5.6 of RFC 3339.
+
+       The date-and-time type is compatible with the dateTime XML
+       schema type with the following notable exceptions:
+
+       (a) The date-and-time type does not allow negative years.
+
+       (b) The date-and-time time-offset -00:00 indicates an unknown
+           time zone (see RFC 3339) while -00:00 and +00:00 and Z all
+           represent the same time zone in dateTime.
+
+       (c) The canonical format (see below) of data-and-time values
+           differs from the canonical format used by the dateTime XML
+           schema type, which requires all times to be in UTC using the
+           time-offset 'Z'.
+
+       This type is not equivalent to the DateAndTime textual
+       convention of the SMIv2 since RFC 3339 uses a different
+       separator between full-date and full-time and provides
+       higher resolution of time-secfrac.
+
+       The canonical format for date-and-time values with a known time
+       zone uses a numeric time zone offset that is calculated using
+       the device's configured known offset to UTC time.  A change of
+       the device's offset to UTC time will cause date-and-time values
+       to change accordingly.  Such changes might happen periodically
+       in case a server follows automatically daylight saving time
+       (DST) time zone offset changes.  The canonical format for
+       date-and-time values with an unknown time zone (usually referring
+       to the notion of local time) uses the time-offset -00:00.";
+     reference
+      "RFC 3339: Date and Time on the Internet: Timestamps
+       RFC 2579: Textual Conventions for SMIv2
+       XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+   }
+
+   typedef timeticks {
+     type uint32;
+     description
+      "The timeticks type represents a non-negative integer that
+       represents the time, modulo 2^32 (4294967296 decimal), in
+       hundredths of a second between two epochs.  When a schema
+       node is defined that uses this type, the description of
+       the schema node identifies both of the reference epochs.
+
+       In the value set and its semantics, this type is equivalent
+       to the TimeTicks type of the SMIv2.";
+     reference
+      "RFC 2578: Structure of Management Information Version 2 (SMIv2)";
+   }
+
+   typedef timestamp {
+     type yang:timeticks;
+     description
+      "The timestamp type represents the value of an associated
+       timeticks schema node at which a specific occurrence happened.
+       The specific occurrence must be defined in the description
+       of any schema node defined using this type.  When the specific
+       occurrence occurred prior to the last time the associated
+       timeticks attribute was zero, then the timestamp value is
+       zero.  Note that this requires all timestamp values to be
+       reset to zero when the value of the associated timeticks
+       attribute reaches 497+ days and wraps around to zero.
+
+       The associated timeticks schema node must be specified
+       in the description of any schema node using this type.
+
+       In the value set and its semantics, this type is equivalent
+       to the TimeStamp textual convention of the SMIv2.";
+     reference
+      "RFC 2579: Textual Conventions for SMIv2";
+   }
+
+   /*** collection of generic address types ***/
+
+   typedef phys-address {
+     type string {
+       pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+     }
+     description
+      "Represents media- or physical-level addresses represented
+       as a sequence octets, each octet represented by two hexadecimal
+       numbers.  Octets are separated by colons.  The canonical
+       representation uses lowercase characters.
+
+       In the value set and its semantics, this type is equivalent
+       to the PhysAddress textual convention of the SMIv2.";
+     reference
+      "RFC 2579: Textual Conventions for SMIv2";
+   }
+
+   typedef mac-address {
+     type string {
+       pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+     }
+     description
+      "The mac-address type represents an IEEE 802 MAC address.
+       The canonical representation uses lowercase characters.
+
+       In the value set and its semantics, this type is equivalent
+       to the MacAddress textual convention of the SMIv2.";
+     reference
+      "IEEE 802: IEEE Standard for Local and Metropolitan Area
+                 Networks: Overview and Architecture
+       RFC 2579: Textual Conventions for SMIv2";
+   }
+
+   /*** collection of XML specific types ***/
+
+   typedef xpath1.0 {
+     type string;
+     description
+      "This type represents an XPATH 1.0 expression.
+
+       When a schema node is defined that uses this type, the
+       description of the schema node MUST specify the XPath
+       context in which the XPath expression is evaluated.";
+     reference
+      "XPATH: XML Path Language (XPath) Version 1.0";
+   }
+
+ }
index db78ba71dd70df6183d5d897f4df7a1321d9e392..24ce16c819b7de6015702fd7b44fc5396e6621a2 100644 (file)
     <build>\r
         <plugins>\r
             <plugin>\r
-                <groupId>org.apache.maven.plugins</groupId>\r
                 <artifactId>maven-jar-plugin</artifactId>\r
-                <version>${maven.jar.version}</version>\r
-                <configuration>\r
-                    <archive>\r
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>\r
-                    </archive>\r
-                </configuration>\r
             </plugin>\r
             <plugin>\r
                 <groupId>org.apache.felix</groupId>\r
                     </instructions>\r
                 </configuration>\r
             </plugin>\r
-            <plugin>\r
-                <groupId>org.opendaylight.yangtools</groupId>\r
-                <artifactId>yang-maven-plugin</artifactId>\r
-                <version>0.5.9-SNAPSHOT</version>\r
-                <executions>\r
-                    <execution>\r
-                        <goals>\r
-                            <goal>generate-sources</goal>\r
-                        </goals>\r
-                        <configuration>\r
-                            <yangFilesRootDir>src/main/yang</yangFilesRootDir>\r
-                            <codeGenerators>\r
-                                <generator>\r
-                                    <codeGeneratorClass>\r
-                                        org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl\r
-                                    </codeGeneratorClass>\r
-                                    <outputBaseDir>\r
-                                        target/generated-sources/sal\r
-                                    </outputBaseDir>\r
-                                </generator>\r
-                            </codeGenerators>\r
-                            <inspectDependencies>true</inspectDependencies>\r
-                        </configuration>\r
-                    </execution>\r
-                </executions>\r
-                <dependencies>\r
-                    <dependency>\r
-                        <groupId>org.opendaylight.yangtools</groupId>\r
-                        <artifactId>maven-sal-api-gen-plugin</artifactId>\r
-                        <version>0.5.8-SNAPSHOT</version>\r
-                        <type>jar</type>\r
-                    </dependency>\r
-                </dependencies>\r
-            </plugin>\r
-            <plugin>\r
-                <groupId>org.codehaus.mojo</groupId>\r
-                <artifactId>build-helper-maven-plugin</artifactId>\r
-                <version>1.7</version>\r
-                <executions>\r
-                    <execution>\r
-                        <phase>generate-sources</phase>\r
-                        <goals>\r
-                            <goal>add-source</goal>\r
-                        </goals>\r
-                        <configuration>\r
-                            <sources>\r
-                                <source>target/generated-sources/sal</source>\r
-                            </sources>\r
-                        </configuration>\r
-                    </execution>\r
-                </executions>\r
-            </plugin>\r
         </plugins>\r
-        <pluginManagement>\r
-            <plugins>\r
-                <!--This plugin's configuration is used to store Eclipse \r
-                    m2e settings only. It has no influence on the Maven build itself. -->\r
-                <plugin>\r
-                    <groupId>org.eclipse.m2e</groupId>\r
-                    <artifactId>lifecycle-mapping</artifactId>\r
-                    <version>1.0.0</version>\r
-                    <configuration>\r
-                        <lifecycleMappingMetadata>\r
-                            <pluginExecutions>\r
-                                <pluginExecution>\r
-                                    <pluginExecutionFilter>\r
-                                        <groupId>\r
-                                            org.opendaylight.yangtools\r
-                                        </groupId>\r
-                                        <artifactId>\r
-                                            yang-maven-plugin\r
-                                        </artifactId>\r
-                                        <versionRange>\r
-                                            [0.5,)\r
-                                        </versionRange>\r
-                                        <goals>\r
-                                            <goal>\r
-                                                generate-sources\r
-                                            </goal>\r
-                                        </goals>\r
-                                    </pluginExecutionFilter>\r
-                                    <action>\r
-                                        <ignore />\r
-                                    </action>\r
-                                </pluginExecution>\r
-                            </pluginExecutions>\r
-                        </lifecycleMappingMetadata>\r
-                    </configuration>\r
-                </plugin>\r
-            </plugins>\r
-        </pluginManagement>\r
     </build>\r
 \r
-    <dependencies>\r
-        <dependency>\r
-            <groupId>org.opendaylight.yangtools</groupId>\r
-            <artifactId>yang-binding</artifactId>\r
-            <version>0.5.9-SNAPSHOT</version>\r
-        </dependency>\r
-        <dependency>\r
-            <groupId>org.opendaylight.yangtools</groupId>\r
-            <artifactId>yang-common</artifactId>\r
-            <version>0.5.9-SNAPSHOT</version>\r
-        </dependency>\r
-    </dependencies>\r
-\r
 </project>\r
index 6b827841af9a8459707f1e632e3cc57005006537..a3c786d5de82016bd81e2e0b6c13f4f56b4c14e9 100644 (file)
@@ -14,7 +14,6 @@ import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.model.api.YangNode;
-import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
 
 /**
@@ -88,25 +87,6 @@ public interface UsesNodeBuilder extends GroupingMember, Builder {
      */
     void setAugmenting(boolean augmenting);
 
-    /**
-     * Get augment under which was this uses node was defined.
-     * <p>
-     * Note: This method may return different object than {@link #getParent()}
-     * if this node is a copy of other uses node. If the uses node is copied,
-     * its parent has changed, but parent augment is always same.
-     * </p>
-     *
-     * @return AugmentationSchemaBuilder under which was this node defined
-     */
-    AugmentationSchemaBuilder getParentAugment();
-
-    /**
-     * Set augment under which was this uses node was defined.
-     *
-     * @param augment
-     */
-    void setParentAugment(AugmentationSchemaBuilder augment);
-
     /**
      * Get augmentations defined in this uses node.
      *
@@ -157,55 +137,6 @@ public interface UsesNodeBuilder extends GroupingMember, Builder {
      */
     UsesNode build(YangNode parent);
 
-    /**
-     * Get child nodes defined in target grouping.
-     *
-     * @return set of DataSchemaNodeBuilder objects
-     */
-    Set<DataSchemaNodeBuilder> getTargetChildren();
-
-    /**
-     * Get groupings defined in target grouping.
-     *
-     * @return set of GroupingBuilder objects
-     */
-    Set<GroupingBuilder> getTargetGroupings();
-
-    /**
-     * Get type definitions defined in target grouping.
-     *
-     * @return set of typedefs defined in target grouping
-     */
-    Set<TypeDefinitionBuilder> getTargetTypedefs();
-
-    /**
-     * Get unknown nodes defined in target grouping.
-     *
-     * @return list of unknown nodes defined in target grouping
-     */
-    List<UnknownSchemaNodeBuilder> getTargetUnknownNodes();
-
-    /**
-     *
-     * @return true, if this object was built based on another UsesNodeBuilder,
-     *         false otherwise
-     */
-    boolean isCopy();
-
-    /**
-     *
-     * @return true, if target grouping objects was loaded already, false
-     *         otherwise
-     */
-    boolean isDataCollected();
-
-    /**
-     * Set if target grouping objects was loaded already.
-     *
-     * @param dataCollected
-     */
-    void setDataCollected(boolean dataCollected);
-
     boolean isResolved();
 
     void setResolved(boolean resolved);
index d14fed577971e503574a483e383e781fafad334e..c248f84bed89e2976b37f322f8d48127370f46b3 100644 (file)
@@ -199,15 +199,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         return instance;
     }
 
-    public boolean isAllUsesDataCollected() {
-        for (UsesNodeBuilder usesNode : allUsesNodes) {
-            if (!usesNode.isDataCollected()) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     public void setParent(Builder parent) {
         throw new YangParseException(name, 0, "Can not set parent to module");
@@ -491,7 +482,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder {
         }
         if(parent instanceof AugmentationSchemaBuilder) {
             usesBuilder.setAugmenting(true);
-            usesBuilder.setParentAugment((AugmentationSchemaBuilder)parent);
         }
 
         allUsesNodes.add(usesBuilder);
index 8d6190678fe33acd5d60539e1f2c6a348e040b56..7ab57c644fb1e57e5b3b31cac3c7cf9f7bda71a6 100644 (file)
@@ -29,7 +29,6 @@ import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuild
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
-import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
@@ -38,67 +37,22 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
     private boolean isBuilt;
     private UsesNodeImpl instance;
     private DataNodeContainerBuilder parentBuilder;
-    private final String groupingName;
+    private final String groupingPathString;
     private SchemaPath groupingPath;
     private GroupingDefinition groupingDefinition;
     private GroupingBuilder groupingBuilder;
     private boolean addedByUses;
     private boolean augmenting;
     private boolean resolved;
-    private AugmentationSchemaBuilder parentAugment;
     private final Set<AugmentationSchema> augments = new HashSet<>();
     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<>();
     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
     private final List<RefineHolder> refines = new ArrayList<>();
 
-    /**
-     * Copies of target grouping child nodes.
-     */
-    private final Set<DataSchemaNodeBuilder> targetChildren = new HashSet<>();
-
-    /**
-     * Copies of target grouping groupings.
-     */
-    private final Set<GroupingBuilder> targetGroupings = new HashSet<>();
-
-    /**
-     * Copies of target grouping typedefs.
-     */
-    private final Set<TypeDefinitionBuilder> targetTypedefs = new HashSet<>();
-
-    /**
-     * Copies of target grouping unknown nodes.
-     */
-    private final List<UnknownSchemaNodeBuilder> targetUnknownNodes = new ArrayList<>();
-
-    private final boolean isCopy;
-    private boolean dataCollected;
-
-    @Override
-    public boolean isCopy() {
-        return isCopy;
-    }
-
-    @Override
-    public boolean isDataCollected() {
-        return dataCollected;
-    }
-
-    @Override
-    public void setDataCollected(boolean dataCollected) {
-        this.dataCollected = dataCollected;
-    }
 
     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {
         super(moduleName, line);
-        this.groupingName = groupingName;
-        isCopy = false;
-    }
-
-    public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) {
-        super(moduleName, line);
-        this.groupingName = groupingName;
-        this.isCopy = isCopy;
+        this.groupingPathString = groupingName;
     }
 
     @Override
@@ -181,7 +135,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     @Override
     public String getGroupingPathAsString() {
-        return groupingName;
+        return groupingPathString;
     }
 
     @Override
@@ -223,16 +177,6 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
         this.resolved = resolved;
     }
 
-    @Override
-    public AugmentationSchemaBuilder getParentAugment() {
-        return parentAugment;
-    }
-
-    @Override
-    public void setParentAugment(AugmentationSchemaBuilder augment) {
-        this.parentAugment = augment;
-    }
-
     @Override
     public List<SchemaNodeBuilder> getRefineNodes() {
         return refineBuilders;
@@ -253,31 +197,11 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
         refines.add(refine);
     }
 
-    @Override
-    public Set<DataSchemaNodeBuilder> getTargetChildren() {
-        return targetChildren;
-    }
-
-    @Override
-    public Set<GroupingBuilder> getTargetGroupings() {
-        return targetGroupings;
-    }
-
-    @Override
-    public Set<TypeDefinitionBuilder> getTargetTypedefs() {
-        return targetTypedefs;
-    }
-
-    @Override
-    public List<UnknownSchemaNodeBuilder> getTargetUnknownNodes() {
-        return targetUnknownNodes;
-    }
-
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
-        result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());
+        result = prime * result + ((groupingPathString == null) ? 0 : groupingPathString.hashCode());
         result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
         return result;
     }
@@ -294,11 +218,11 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
             return false;
         }
         UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;
-        if (groupingName == null) {
-            if (other.groupingName != null) {
+        if (groupingPathString == null) {
+            if (other.groupingPathString != null) {
                 return false;
             }
-        } else if (!groupingName.equals(other.groupingName)) {
+        } else if (!groupingPathString.equals(other.groupingPathString)) {
             return false;
         }
         if (parentBuilder == null) {
@@ -313,7 +237,7 @@ public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNo
 
     @Override
     public String toString() {
-        return "uses '" + groupingName + "'";
+        return "uses '" + groupingPathString + "'";
     }
 
     public final class UsesNodeImpl implements UsesNode {
index f6d4d67cbbe1c3f2b2a53062546106aa6204f8c4..6c22971d7ea3a82073ee325c5d9fba48060cc4ff 100644 (file)
@@ -696,7 +696,7 @@ public final class YangParserImpl implements YangModelParser {
                     "Failed to parse augment: Unresolved parent of augment: " + augmentParent);
         }
 
-        return processAugmentation(augment, firstNodeParent, path);
+        return processAugmentation(augment, firstNodeParent);
     }
 
     /**
@@ -781,7 +781,7 @@ public final class YangParserImpl implements YangModelParser {
         if (currentParent == null) {
             return processAugmentationOnContext(augment, path, module, prefix, context);
         } else {
-            return processAugmentation(augment, currentParent, path);
+            return processAugmentation(augment, currentParent);
         }
     }
 
@@ -948,7 +948,6 @@ public final class YangParserImpl implements YangModelParser {
                 for (AugmentationSchemaBuilder augment : usesNode.getAugmentations()) {
                     processAugmentationOnContext(augment, augment.getTargetPath().getPath(), module, prefix, context);
                 }
-                GroupingUtils.performRefine(usesNode);
             } else {
                 parent.getChildNodeBuilders().addAll(target.instantiateChildNodes(parent));
                 parent.getTypeDefinitionBuilders().addAll(target.instantiateTypedefs(parent));
@@ -957,10 +956,10 @@ public final class YangParserImpl implements YangModelParser {
                 usesNode.setResolved(true);
 
                 for (AugmentationSchemaBuilder augment : usesNode.getAugmentations()) {
-                    processAugmentation(augment, parent, augment.getTargetPath().getPath());
+                    processAugmentation(augment, parent);
                 }
-                GroupingUtils.performRefine(usesNode);
             }
+            GroupingUtils.performRefine(usesNode);
         }
     }
 
index a0101a556df24452ec632e5d1347c6e9a8652b24..9e97fa39f3cf77bfda20e28fe5a63b8901e0c96d 100644 (file)
@@ -415,9 +415,9 @@ public final class CopyUtils {
         return newConstraints;
     }
 
-    static UsesNodeBuilder copyUses(UsesNodeBuilder old, Builder newParent) {
+    private static UsesNodeBuilder copyUses(UsesNodeBuilder old, Builder newParent) {
         UsesNodeBuilder copy = new UsesNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(),
-                old.getGroupingPathAsString(), true);
+                old.getGroupingPathAsString());
         copy.setParent(newParent);
         copy.setGroupingDefinition(old.getGroupingDefinition());
         copy.setGrouping(old.getGroupingBuilder());
@@ -426,7 +426,6 @@ public final class CopyUtils {
         copy.getRefineNodes().addAll(old.getRefineNodes());
         copy.getRefines().addAll(old.getRefines());
         copy.setAugmenting(old.isAugmenting());
-        copy.setParentAugment(old.getParentAugment());
         return copy;
     }
 
index b2e9381b1f779cd228af549f8578ce7b15bed1dc..a25b6279519b2c4227994b3e23b7f5288247b42e 100644 (file)
@@ -743,7 +743,7 @@ public final class ParserListenerUtils {
                 reference = stringFromNode(child);
             }
         }
-        String pattern = patternStringFromNode(ctx);
+        String pattern = parsePatternString(ctx);
         return BaseConstraints.patternConstraint(pattern, description, reference);
     }
 
@@ -754,7 +754,7 @@ public final class ParserListenerUtils {
      *            context to parse
      * @return pattern value as String
      */
-    public static String patternStringFromNode(final Pattern_stmtContext ctx) {
+    private static String parsePatternString(final Pattern_stmtContext ctx) {
         StringBuilder result = new StringBuilder();
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             ParseTree child = ctx.getChild(i);
index e3d3a4898ae78dde32e621a091e1253763a38cf4..9f03e79850f8c14c7ae5e482497eebc0e709ec2e 100644 (file)
@@ -43,7 +43,6 @@ import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.impl.NotificationBuilder.NotificationDefinitionImpl;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget
 import org.opendaylight.yangtools.yang.parser.builder.impl.RpcDefinitionBuilder
-import java.net.URI
 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingMember
 
 public final class ParserUtils {
@@ -64,14 +63,6 @@ public final class ParserUtils {
         return new SchemaPath(path, schemaPath.isAbsolute());
     }
 
-    public static def SchemaPath correctSchemaPath(SchemaPath old, URI ns, Date revision, String prefix) {
-        val List<QName> newPath = new ArrayList();
-        for (name : old.path) {
-            newPath.add(new QName(ns, revision, prefix, name.localName))
-        }
-        return new SchemaPath(newPath, old.absolute) 
-    }
-
     /**
      * Get module import referenced by given prefix.
      *
@@ -297,7 +288,6 @@ public final class ParserUtils {
      *            schema path of node parent
      */
     static def void correctNodePath(SchemaNodeBuilder node, SchemaPath parentSchemaPath) {
-
         // set correct path
         val targetNodePath = new ArrayList<QName>(parentSchemaPath.getPath());
         targetNodePath.add(node.getQName());
@@ -321,7 +311,6 @@ public final class ParserUtils {
     }
 
 
-
     private static def Builder findNode(Builder firstNodeParent, List<QName> path, String moduleName, int line) {
         var currentName = "";
         var currentParent = firstNodeParent;
@@ -343,16 +332,10 @@ public final class ParserUtils {
                 if (nodeFound == null && currentParent instanceof ModuleBuilder) {
                     nodeFound = searchRpcs(currentParent as ModuleBuilder, currentName);
                 }
-                // if not found, search in uses
                 if (nodeFound == null) {
-                    var found = searchUses(dataNodeContainerParent, currentName);
-                    if(found == null) {
-                        return null;
-                    } else {
-                        currentParent = found;
-                    }
+                    return null
                 } else {
-                    currentParent = nodeFound;
+                    currentParent = nodeFound
                 }
             } else if (currentParent instanceof ChoiceBuilder) {
                 val choiceParent = currentParent as ChoiceBuilder;
@@ -396,41 +379,6 @@ public final class ParserUtils {
         return null;
     }
 
-    private static def searchUses(DataNodeContainerBuilder dataNodeContainerParent, String name) {
-        var currentName = name;
-        for (unb : dataNodeContainerParent.usesNodes) {
-            var result = searchInUsesTarget(currentName, unb);
-            if (result != null) {
-                return result;
-            }
-
-            result = findNodeInUses(currentName, unb);
-            if (result != null) {
-                var copy = CopyUtils.copy(result, unb.getParent(), true);
-                unb.getTargetChildren().add(copy);
-                return copy;
-            }
-        }
-        return null;
-    }
-    
-    public static def getRpc(ModuleBuilder module,String name) {
-        for(rpc : module.getRpcs()) {
-            if(name == rpc.QName.localName) {
-                return rpc;
-            }
-        }
-        return null;
-    }
-    
-    public static def getNotification(ModuleBuilder module,String name) {
-        for(notification : module.getNotifications()) {
-            if(name == notification.QName.localName) {
-                return notification;
-            }
-        }
-    }
-    
     private static def nextLevel(List<QName> path){
         return path.subList(1,path.size)
     }
@@ -445,64 +393,30 @@ public final class ParserUtils {
      *            path to augment target
      * @return true if augmentation process succeed, false otherwise
      */
-    public static def boolean processAugmentation(AugmentationSchemaBuilder augment, Builder firstNodeParent,
-        List<QName> path) {
-
-            // traverse augment target path and try to reach target node
-            val targetNode = findNode(firstNodeParent,path,augment.moduleName,augment.line);
-            if (targetNode === null) return false;
-            
-            if ((targetNode instanceof DataNodeContainerBuilder)) {
-               val targetDataNodeContainer = targetNode as DataNodeContainerBuilder;
-               augment.setTargetNodeSchemaPath(targetDataNodeContainer.getPath());
-                fillAugmentTarget(augment, targetDataNodeContainer);
-            } else if (targetNode instanceof ChoiceBuilder) {
-               val targetChoiceBuilder = targetNode as ChoiceBuilder;
-               augment.setTargetNodeSchemaPath(targetChoiceBuilder.getPath());
-                fillAugmentTarget(augment, targetChoiceBuilder);
-            } else {
-                throw new YangParseException(augment.getModuleName(), augment.getLine(),
-                    "Error in augment parsing: The target node MUST be either a container, list, choice, case, input, output, or notification node.");
-            }
-            (targetNode as AugmentationTargetBuilder).addAugmentation(augment);
-            augment.setResolved(true);
-            return true;
-        }
-
-    private static def DataSchemaNodeBuilder searchInUsesTarget(String localName, UsesNodeBuilder uses) {
-        for(child : uses.targetChildren) {
-            if (child.getQName().getLocalName().equals(localName)) {
-                return child;
-            }
-        }
-    } 
-
-        /**
-     * Find node with given name in uses target.
-     *
-     * @param localName
-     *            name of node to find
-     * @param uses
-     *            uses node which target grouping should be searched
-     * @return node with given name if found, null otherwise
-     */
-    private static def DataSchemaNodeBuilder findNodeInUses(String localName, UsesNodeBuilder uses) {
-        val target = uses.groupingBuilder;
-        for (child : target.childNodeBuilders) {
-            if (child.getQName().getLocalName().equals(localName)) {
-                return child;
-            }
-        }
-        for (usesNode : target.usesNodes) {
-            val result = findNodeInUses(localName, usesNode);
-            if (result != null) {
-                return result;
-            }
+    public static def boolean processAugmentation(AugmentationSchemaBuilder augment, Builder firstNodeParent) {
+        val path = augment.targetPath.path
+        // traverse augment target path and try to reach target node
+        val targetNode = findNode(firstNodeParent, path, augment.moduleName, augment.line);
+        if(targetNode === null) return false;
+
+        if ((targetNode instanceof DataNodeContainerBuilder)) {
+            val targetDataNodeContainer = targetNode as DataNodeContainerBuilder;
+            augment.setTargetNodeSchemaPath(targetDataNodeContainer.getPath());
+            fillAugmentTarget(augment, targetDataNodeContainer);
+        } else if (targetNode instanceof ChoiceBuilder) {
+            val targetChoiceBuilder = targetNode as ChoiceBuilder;
+            augment.setTargetNodeSchemaPath(targetChoiceBuilder.getPath());
+            fillAugmentTarget(augment, targetChoiceBuilder);
+        } else {
+            throw new YangParseException(augment.getModuleName(), augment.getLine(),
+                "Error in augment parsing: The target node MUST be either a container, list, choice, case, input, output, or notification node.");
         }
-        return null;
+        (targetNode as AugmentationTargetBuilder).addAugmentation(augment);
+        augment.setResolved(true);
+        return true;
     }
 
-        /**
+    /**
      * Find augment target node in given context and perform augmentation.
      *
      * @param augment
@@ -516,107 +430,107 @@ public final class ParserUtils {
      *            SchemaContext containing already resolved modules
      * @return true if augment process succeed, false otherwise
      */
-        public static def boolean processAugmentationOnContext(AugmentationSchemaBuilder augment, List<QName> path,
-            ModuleBuilder module, String prefix, SchemaContext context) {
-            val int line = augment.getLine();
-            val Module dependentModule = findModuleFromContext(context, module, prefix, line);
-            if (dependentModule === null) {
-                throw new YangParseException(module.getName(), line,
-                    "Error in augment parsing: failed to find module with prefix " + prefix + ".");
-            }
-
-            var currentName = path.get(0).getLocalName();
-            var SchemaNode currentParent = dependentModule.getDataChildByName(currentName);
-            if (currentParent === null) {
-                val notifications = dependentModule.getNotifications();
-                for (NotificationDefinition ntf : notifications) {
-                    if (ntf.getQName().getLocalName().equals(currentName)) {
-                        currentParent = ntf;
-                    }
+    public static def boolean processAugmentationOnContext(AugmentationSchemaBuilder augment, List<QName> path,
+        ModuleBuilder module, String prefix, SchemaContext context) {
+        val int line = augment.getLine();
+        val Module dependentModule = findModuleFromContext(context, module, prefix, line);
+        if (dependentModule === null) {
+            throw new YangParseException(module.getName(), line,
+                "Error in augment parsing: failed to find module with prefix " + prefix + ".");
+        }
+
+        var currentName = path.get(0).getLocalName();
+        var SchemaNode currentParent = dependentModule.getDataChildByName(currentName);
+        if (currentParent === null) {
+            val notifications = dependentModule.getNotifications();
+            for (NotificationDefinition ntf : notifications) {
+                if (ntf.getQName().getLocalName().equals(currentName)) {
+                    currentParent = ntf;
                 }
             }
-            if (currentParent === null) {
-                throw new YangParseException(module.getName(), line,
-                    "Error in augment parsing: failed to find node " + currentName + ".");
-            }
-
-            for (qname : path.nextLevel) {
-                currentName = qname.getLocalName();
-                if (currentParent instanceof DataNodeContainer) {
-                    currentParent = (currentParent as DataNodeContainer).getDataChildByName(currentName);
-                } else if (currentParent instanceof ChoiceNode) {
-                    currentParent = (currentParent as ChoiceNode).getCaseNodeByName(currentName);
-                } else {
-                    throw new YangParseException(augment.getModuleName(), line,
-                        "Error in augment parsing: failed to find node " + currentName);
-                }
+        }
+        if (currentParent === null) {
+            throw new YangParseException(module.getName(), line,
+                "Error in augment parsing: failed to find node " + currentName + ".");
+        }
 
-                // if node in path not found, return false
-                if (currentParent === null) {
-                    throw new YangParseException(module.getName(), line,
-                        "Error in augment parsing: failed to find node " + currentName + ".");
-                }
+        for (qname : path.nextLevel) {
+            currentName = qname.getLocalName();
+            if (currentParent instanceof DataNodeContainer) {
+                currentParent = (currentParent as DataNodeContainer).getDataChildByName(currentName);
+            } else if (currentParent instanceof ChoiceNode) {
+                currentParent = (currentParent as ChoiceNode).getCaseNodeByName(currentName);
+            } else {
+                throw new YangParseException(augment.getModuleName(), line,
+                    "Error in augment parsing: failed to find node " + currentName);
             }
 
-            val oldPath = currentParent.path;
-
-            if (!(currentParent instanceof AugmentationTarget)) {
+            // if node in path not found, return false
+            if (currentParent === null) {
                 throw new YangParseException(module.getName(), line,
-                    "Target of type " + currentParent.class + " cannot be augmented.");
-            }
-
-            switch (currentParent) {
-                case (currentParent instanceof ContainerSchemaNodeImpl): {
-
-                    // includes container, input and output statement
-                    val c = currentParent as ContainerSchemaNodeImpl;
-                    val cb = c.toBuilder();
-                    fillAugmentTarget(augment, cb);
-                    (cb as AugmentationTargetBuilder ).addAugmentation(augment);
-                    cb.rebuild();
-                }
-                case (currentParent instanceof ListSchemaNodeImpl): {
-                    val l = currentParent as ListSchemaNodeImpl;
-                    val lb = l.toBuilder();
-                    fillAugmentTarget(augment, lb);
-                    (lb as AugmentationTargetBuilder ).addAugmentation(augment);
-                    lb.rebuild();
-                    augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-                    augment.setResolved(true);
-                }
-                case (currentParent instanceof ChoiceNodeImpl): {
-                    val ch = currentParent as ChoiceNodeImpl;
-                    val chb = ch.toBuilder();
-                    fillAugmentTarget(augment, chb);
-                    (chb as AugmentationTargetBuilder ).addAugmentation(augment);
-                    chb.rebuild();
-                    augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-                    augment.setResolved(true);
-                }
-                case (currentParent instanceof ChoiceCaseNodeImpl): {
-                    val chc = currentParent as ChoiceCaseNodeImpl;
-                    val chcb = chc.toBuilder();
-                    fillAugmentTarget(augment, chcb);
-                    (chcb as AugmentationTargetBuilder ).addAugmentation(augment);
-                    chcb.rebuild();
-                    augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-                    augment.setResolved(true);
-                }
-                case (currentParent instanceof NotificationDefinitionImpl): {
-                    val nd = currentParent as NotificationDefinitionImpl;
-                    val nb = nd.toBuilder();
-                    fillAugmentTarget(augment, nb);
-                    (nb as AugmentationTargetBuilder ).addAugmentation(augment);
-                    nb.rebuild();
-                    augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-                    augment.setResolved(true);
-                }
+                    "Error in augment parsing: failed to find node " + currentName + ".");
             }
-            augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
-            augment.setResolved(true);
-            return true;
         }
 
+        val oldPath = currentParent.path;
+
+        if (!(currentParent instanceof AugmentationTarget)) {
+            throw new YangParseException(module.getName(), line,
+                "Target of type " + currentParent.class + " cannot be augmented.");
+        }
+
+        switch (currentParent) {
+            case (currentParent instanceof ContainerSchemaNodeImpl): {
+
+                // includes container, input and output statement
+                val c = currentParent as ContainerSchemaNodeImpl;
+                val cb = c.toBuilder();
+                fillAugmentTarget(augment, cb);
+                (cb as AugmentationTargetBuilder ).addAugmentation(augment);
+                cb.rebuild();
+            }
+            case (currentParent instanceof ListSchemaNodeImpl): {
+                val l = currentParent as ListSchemaNodeImpl;
+                val lb = l.toBuilder();
+                fillAugmentTarget(augment, lb);
+                (lb as AugmentationTargetBuilder ).addAugmentation(augment);
+                lb.rebuild();
+                augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                augment.setResolved(true);
+            }
+            case (currentParent instanceof ChoiceNodeImpl): {
+                val ch = currentParent as ChoiceNodeImpl;
+                val chb = ch.toBuilder();
+                fillAugmentTarget(augment, chb);
+                (chb as AugmentationTargetBuilder ).addAugmentation(augment);
+                chb.rebuild();
+                augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                augment.setResolved(true);
+            }
+            case (currentParent instanceof ChoiceCaseNodeImpl): {
+                val chc = currentParent as ChoiceCaseNodeImpl;
+                val chcb = chc.toBuilder();
+                fillAugmentTarget(augment, chcb);
+                (chcb as AugmentationTargetBuilder ).addAugmentation(augment);
+                chcb.rebuild();
+                augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                augment.setResolved(true);
+            }
+            case (currentParent instanceof NotificationDefinitionImpl): {
+                val nd = currentParent as NotificationDefinitionImpl;
+                val nb = nd.toBuilder();
+                fillAugmentTarget(augment, nb);
+                (nb as AugmentationTargetBuilder ).addAugmentation(augment);
+                nb.rebuild();
+                augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+                augment.setResolved(true);
+            }
+        }
+        augment.setTargetNodeSchemaPath(new SchemaPath(oldPath.getPath(), oldPath.isAbsolute()));
+        augment.setResolved(true);
+        return true;
+    }
+
     public static def IdentitySchemaNodeBuilder findBaseIdentity(Map<String, TreeMap<Date, ModuleBuilder>> modules,
         ModuleBuilder module, String baseString, int line) {
         var IdentitySchemaNodeBuilder result = null;
@@ -675,22 +589,22 @@ public final class ParserUtils {
         return null;
     }
 
-        /**
+    /**
      * Get module in which this node is defined.
      *
      * @param node
      * @return builder of module where this node is defined
      */
-        public static def ModuleBuilder getParentModule(Builder node) {
-            if (node instanceof ModuleBuilder) {
-                return node as ModuleBuilder;
-            }
-            var parent = node.getParent();
-            while (!(parent instanceof ModuleBuilder)) {
-                parent = parent.getParent();
-            }
-            return parent as ModuleBuilder;
+    public static def ModuleBuilder getParentModule(Builder node) {
+        if (node instanceof ModuleBuilder) {
+            return node as ModuleBuilder;
         }
+        var parent = node.getParent();
+        while (!(parent instanceof ModuleBuilder)) {
+            parent = parent.getParent();
+        }
+        return parent as ModuleBuilder;
+    }
 
 }
 
index f3f2def8fe01437925638503e1e2de349134ee98..f5f5b46478c89c7adbab5345b5a51b0871186370 100644 (file)
@@ -167,7 +167,7 @@ public final class RefineUtils {
      * @param refine
      *            refine object containing information about refine process
      */
-    public static void checkRefine(SchemaNodeBuilder node, RefineHolder refine) {
+    private static void checkRefine(SchemaNodeBuilder node, RefineHolder refine) {
         String moduleName = refine.getModuleName();
         int line = refine.getLine();
         String name = node.getQName().getLocalName();
@@ -259,7 +259,7 @@ public final class RefineUtils {
      * @param refine
      *            refine object containing information about refine process
      */
-    public static void refineDefault(final Builder node, final RefineHolder refine) {
+    private static void refineDefault(final Builder node, final RefineHolder refine) {
         final String moduleName = refine.getModuleName();
         final int line = refine.getLine();
         Class<? extends Builder> cls = node.getClass();
@@ -303,7 +303,7 @@ public final class RefineUtils {
      * @param refine
      *            refine object containing information about refine process
      */
-    public static void performRefine(SchemaNodeBuilder nodeToRefine, RefineHolder refine) {
+    static void performRefine(SchemaNodeBuilder nodeToRefine, RefineHolder refine) {
         checkRefine(nodeToRefine, refine);
         refineDefault(nodeToRefine, refine);
         if (nodeToRefine instanceof LeafSchemaNodeBuilder) {
index dfa7bc4830b850f3d93d8742f54b2c7d0060e5e8..c362a2179c4f7045ff813bea058a74643e90e0ee 100644 (file)
@@ -37,8 +37,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.util.BaseTypes;
 
 public class AugmentTest {
-    private static final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
     private static final URI fooNS = URI.create("urn:opendaylight.foo");
     private static final URI barNS = URI.create("urn:opendaylight.bar");
     private static final URI bazNS = URI.create("urn:opendaylight.baz");
@@ -56,6 +54,7 @@ public class AugmentTest {
 
     @BeforeClass
     public static void init() throws FileNotFoundException, ParseException {
+        DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
         fooRev = simpleDateFormat.parse("2013-10-13");
         barRev = simpleDateFormat.parse("2013-10-14");
         bazRev = simpleDateFormat.parse("2013-10-15");
@@ -342,7 +341,7 @@ public class AugmentTest {
         modules = TestUtils.loadModules(getClass().getResource("/augment-test/rpc").getPath());
         final URI NS_BAR = URI.create("urn:opendaylight:bar");
         final URI NS_FOO = URI.create("urn:opendaylight:foo");
-        final Date revision = simpleDateFormat.parse("2013-10-11");
+        final Date revision = new SimpleDateFormat("yyyy-MM-dd").parse("2013-10-11");
 
         Module bar = TestUtils.findModule(modules, "bar");
         Set<RpcDefinition> rpcs = bar.getRpcs();
index 44cb0d635d976cbff7f9c96a258ad036b1502b77..2adb544f5a49884b9b2b1b31ad409396ebf7cf7c 100644 (file)
@@ -13,6 +13,7 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.net.URI;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -390,7 +391,7 @@ public class GroupingTest {
         assertNotNull(gzz);
 
         URI expectedNS = URI.create("urn:grouping:cascade-uses");
-        Date expectedRev = TestUtils.simpleDateFormat.parse("2013-07-18");
+        Date expectedRev = new SimpleDateFormat("yyyy-MM-dd").parse("2013-07-18");
         String expectedPref = "cu";
         SchemaPath expectedPath;
 
index fe438c928d53dcaa5756ca515e394ac72c4b6384..4d77c2506c4e4e1d848092be863f5707270fe4d5 100644 (file)
@@ -39,8 +39,6 @@ import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
 
 final class TestUtils {
 
-    static final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
     private TestUtils() {
     }
 
@@ -151,7 +149,7 @@ final class TestUtils {
     /**
      * Test if node has augmenting flag set to expected value. In case this is
      * DataNodeContainer/ChoiceNode, check its child nodes/case nodes too.
-     * 
+     *
      * @param node
      *            node to check
      * @param expected
@@ -173,7 +171,7 @@ final class TestUtils {
     /**
      * Check if node has addedByUses flag set to expected value. In case this is
      * DataNodeContainer/ChoiceNode, check its child nodes/case nodes too.
-     * 
+     *
      * @param node
      *            node to check
      * @param expected
index 9b69af60e69e9bdf6c01182dcd46457cbb6c5f38..1d760b870cce686cb0f87e272a796cd74ff10834 100644 (file)
@@ -11,7 +11,9 @@ import static org.junit.Assert.*;
 
 import java.io.FileNotFoundException;
 import java.net.URI;
+import java.text.DateFormat;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
@@ -50,8 +52,9 @@ public class UsesAugmentTest {
 
     @Before
     public void init() throws FileNotFoundException, ParseException {
-        UG_REV = TestUtils.simpleDateFormat.parse("2013-07-30");
-        GD_REV = TestUtils.simpleDateFormat.parse("2013-09-04");
+        DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        UG_REV = simpleDateFormat.parse("2013-07-30");
+        GD_REV = simpleDateFormat.parse("2013-09-04");
     }
 
     /**
index c3cdc27fb8b77be0176e85fc1220bcdf21f4be05..7eced3191ba1f877b67e5c2fa5cb952328cc3bd0 100644 (file)
@@ -214,7 +214,7 @@ public class YangParserSimpleTest {
 
     private SchemaPath createPath(String... names) {
         try {
-            rev = TestUtils.simpleDateFormat.parse("2013-07-30");
+            rev = new SimpleDateFormat("yyyy-MM-dd").parse("2013-07-30");
         } catch (ParseException e) {
             e.printStackTrace();
         }
index ad720994abf65c659b7927a4ce51b239ad54bd04..3c55d4d9d6cf0cca5b377bf521349810fb09543f 100644 (file)
@@ -12,7 +12,9 @@ import static org.junit.Assert.*;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.net.URI;
+import java.text.DateFormat;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -67,9 +69,10 @@ public class YangParserTest {
 
     @Before
     public void init() throws FileNotFoundException, ParseException {
-        fooRev = TestUtils.simpleDateFormat.parse("2013-02-27");
-        barRev = TestUtils.simpleDateFormat.parse("2013-07-03");
-        bazRev = TestUtils.simpleDateFormat.parse("2013-02-27");
+        DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        fooRev = simpleDateFormat.parse("2013-02-27");
+        barRev = simpleDateFormat.parse("2013-07-03");
+        bazRev = simpleDateFormat.parse("2013-02-27");
 
         modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
         assertEquals(3, modules.size());