Merge "Added annotations to Latency for northbound usage."
authorAlessandro Boch <aboch@cisco.com>
Tue, 2 Jul 2013 14:34:50 +0000 (14:34 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 2 Jul 2013 14:34:50 +0000 (14:34 +0000)
67 files changed:
opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java
opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/pom.xml
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/TypeProviderImpl.java
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GenEnumResolvingTest.java
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesBitsTest.java [moved from opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneretedTypesBitsTest.java with 66% similarity]
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesStringTest.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesTest.java
opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/resources/simple-string-demo.yang [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java
opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/TypeConstants.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/AbstractGeneratedType.java
opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/ClassCodeGenerator.java
opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/Constants.java
opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java
opendaylight/sal/yang-prototype/code-generator/samples/maven-code-gen-sample/src/main/yang/simple-string-demo.yang [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AugmentationSchemaBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/ConfigNode.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataNodeContainerBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingMember.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/TypeDefinitionBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangModelBuilderUtil.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/GroupingTest.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserWithContextTest.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile1.yang
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/DataSchemaNode.java
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/GroupingDefinition.java
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UnknownSchemaNode.java
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UsesNode.java
opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/ExtendedType.java
opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/InstanceIdentifier.java
opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java

index 8a77825d7943c12e8be971687cb4f3e8ac187b72..2b9696ddb9cdf058640caa671735757556fb1a5a 100644 (file)
@@ -730,8 +730,8 @@ public class FlowConfig implements Serializable {
                 Short port = Short.decode(ingressPort);
                 if (isPortValid(sw, port) == false) {
                     String msg = String.format("Ingress port %d is not valid for the Switch", port);
-                    if ((container != null) && !container.getName().equals(GlobalConstants.DEFAULT.toString())) {
-                        msg += " in Container " + container.getName();
+                    if (!containerName.equals(GlobalConstants.DEFAULT.toString())) {
+                        msg += " in Container " + containerName;
                     }
                     return new Status(StatusCode.BADREQUEST, msg);
                 }
@@ -841,9 +841,8 @@ public class FlowConfig implements Serializable {
                                     Short port = Short.parseShort(n.group(1));
                                     if (isPortValid(sw, port) == false) {
                                         String msg = String.format("Output port %d is not valid for this switch", port);
-                                        if ((container != null)
-                                                && !container.getName().equals(GlobalConstants.DEFAULT.toString())) {
-                                            msg += " in Container " + container.getName();
+                                        if (!containerName.equals(GlobalConstants.DEFAULT.toString())) {
+                                            msg += " in Container " + containerName;
                                         }
                                         return new Status(StatusCode.BADREQUEST, msg);
                                     }
@@ -855,9 +854,9 @@ public class FlowConfig implements Serializable {
                     // Check src IP
                     sstr = Pattern.compile(ActionType.FLOOD.toString()).matcher(actiongrp);
                     if (sstr.matches()) {
-                        if (container != null) {
+                        if (!containerName.equals(GlobalConstants.DEFAULT.toString())) {
                             return new Status(StatusCode.BADREQUEST, String.format(
-                                    "flood is not allowed in container %s", container.getName()));
+                                    "flood is not allowed in container %s", containerName));
                         }
                         continue;
                     }
@@ -955,7 +954,7 @@ public class FlowConfig implements Serializable {
             }
             // Check against the container flow
             Status status;
-            if ((container != null) && !(status = conflictWithContainerFlow(container)).isSuccess()) {
+            if (!containerName.equals(GlobalConstants.DEFAULT.toString()) && !(status = conflictWithContainerFlow(container)).isSuccess()) {
                 return status;
             }
         } catch (NumberFormatException e) {
index e9c0edc3bde98fb75bbc27663d2c2d24c215756b..2c5144f284b908f46d2a114da4acf2f2c3a14a58 100644 (file)
@@ -1444,7 +1444,7 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager, Port
         }
 
         // Program the network node
-        Status status = this.removeEntry(config.getFlowEntry(), false);
+        Status status = this.uninstallFlowEntry(config.getFlowEntry());
 
         // Update configuration database if programming was successful
         if (status.isSuccess()) {
@@ -1543,7 +1543,7 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager, Port
         // If flow is installed, program the network node
         status = new Status(StatusCode.SUCCESS, "Saved in config");
         if (oldFlowConfig.installInHw()) {
-            status = this.modifyEntry(oldFlowConfig.getFlowEntry(), newFlowConfig.getFlowEntry(), false);
+            status = this.modifyFlowEntry(oldFlowConfig.getFlowEntry(), newFlowConfig.getFlowEntry());
         }
 
         // Update configuration database if programming was successful
@@ -1588,16 +1588,14 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager, Port
         }
         if (target != null) {
             // Program the network node
-            Status status;
-            if (target.installInHw()) {
-                status = this.removeEntry(target.getFlowEntry(), false);
-            } else {
-                status = this.addEntry(target.getFlowEntry(), false);
+            Status status = (target.installInHw()) ? this.uninstallFlowEntry(target.getFlowEntry()) : this
+                    .installFlowEntry(target.getFlowEntry());
+            if (status.isSuccess()) {
+                // Update Configuration database
+                target.setStatus(SUCCESS);
+                target.toggleInstallation();
+                staticFlows.put(key, target);
             }
-            // Update Configuration database
-            target.setStatus(SUCCESS);
-            target.toggleInstallation();
-            staticFlows.put(key, target);
             return status;
         }
 
@@ -2191,11 +2189,10 @@ public class ForwardingRulesManagerImpl implements IForwardingRulesManager, Port
      * Function called by the dependency manager before the services exported by
      * the component are unregistered, this will be followed by a "destroy ()"
      * calls
-     *
      */
     void stop() {
-        // Set graceful stop flag
         stopping = true;
+        uninstallAllFlowEntries();
     }
 
     public void setFlowProgrammerService(IFlowProgrammerService service) {
index 18f29ed416f5cb7326f862c3927bee0b5774e85b..57fbd2c67bce9220d80d66b35d0695598f9e3a34 100644 (file)
        <groupId>junit</groupId>\r
        <artifactId>junit</artifactId>\r
       </dependency>\r
+      <dependency>\r
+       <groupId>commons-lang</groupId>\r
+       <artifactId>commons-lang</artifactId>\r
+       <version>2.1</version>\r
+      </dependency>\r
   </dependencies>\r
 </project>
\ No newline at end of file
index 9410ffe1de5dc9825325bfc97b076aa32f079a94..6bb7907a74ab50be2720c4c37fb75ec4f1cd794d 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.controller.sal.binding.yang.types;
 
+import org.apache.commons.lang.StringEscapeUtils;
 import org.opendaylight.controller.binding.generator.util.ReferencedTypeImpl;
+import org.opendaylight.controller.binding.generator.util.TypeConstants;
 import org.opendaylight.controller.binding.generator.util.Types;
 import org.opendaylight.controller.binding.generator.util.generated.type.builder.EnumerationBuilderImpl;
 import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
@@ -26,6 +28,7 @@ import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition.Bit;
 import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair;
 import org.opendaylight.controller.yang.model.util.ExtendedType;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -456,6 +459,23 @@ public final class TypeProviderImpl implements TypeProvider {
             genTOBuilder.addEqualsIdentity(genPropBuilder);
             genTOBuilder.addHashIdentity(genPropBuilder);
             genTOBuilder.addToStringProperty(genPropBuilder);
+            if (javaType == BaseYangTypes.STRING_TYPE) {
+                if (typedef instanceof ExtendedType) {
+                    List<PatternConstraint> patternConstraints = ((ExtendedType) typedef).getPatterns();
+                    List<String> regularExpressions = new ArrayList<String>();
+                    String regEx;
+                    String modifiedRegEx;
+                    for (PatternConstraint ptrnCons : patternConstraints) {
+                        regEx = ptrnCons.getRegularExpression();
+                        modifiedRegEx = StringEscapeUtils.escapeJava(regEx);
+                        regularExpressions.add(modifiedRegEx);
+                    }                   
+                    
+                    genTOBuilder.addConstant(Types.listTypeFor(BaseYangTypes.STRING_TYPE),
+                            TypeConstants.PATTERN_CONSTANT_NAME, regularExpressions);
+                }
+            }            
+            
             return genTOBuilder.toInstance();
         }
         return null;
@@ -596,4 +616,5 @@ public final class TypeProviderImpl implements TypeProvider {
         }
         return genTOBuilder.toInstance();
     }
+    
 }
index 10ea9fae1f7ebb7a62ce9e8b1e13b4f54159ed22..f8cf951c17a55af6e122474c815e88c89db1b9d0 100644 (file)
@@ -7,6 +7,13 @@
  */
 package org.opendaylight.controller.sal.binding.generator.impl;
 
+import static org.junit.Assert.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
 import org.junit.Test;
 import org.opendaylight.controller.binding.generator.util.ReferencedTypeImpl;
 import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;
@@ -19,15 +26,6 @@ import org.opendaylight.controller.yang.model.api.SchemaContext;
 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
 import org.opendaylight.controller.yang.parser.impl.YangParserImpl;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 public class GenEnumResolvingTest {
 
     private SchemaContext resolveSchemaContextFromFiles(
@@ -108,8 +106,8 @@ public class GenEnumResolvingTest {
         assertNotNull("Generated Interface cannot contain NULL reference for " +
                 "Method Signature Definitions!", methods);
 
-        assertEquals("Expected count of method signature definitions is 26",
-                26, methods.size());
+        assertEquals("Expected count of method signature definitions is 21",
+                21, methods.size());
         Enumeration ianaIfType = null;
         for (final MethodSignature method : methods) {
             if (method.getName().equals("getType")) {
@@ -186,8 +184,8 @@ public class GenEnumResolvingTest {
         final List<MethodSignature> methods = genInterface.getMethodDefinitions();
         assertNotNull("Generated Type Interface cannot contain NULL reference" +
                 " to Enumeration types!", methods);
-        assertEquals("Generated Type Interface MUST contain 7 Methods ",
-                7, methods.size());
+        assertEquals("Generated Type Interface MUST contain 4 Methods ",
+                4, methods.size());
         for (final MethodSignature method : methods) {
             if (method.getName().equals("getLinkUpDownTrapEnable")) {
                 linkUpDownTrapEnable = method.getReturnType();
@@ -1,6 +1,6 @@
 package org.opendaylight.controller.sal.binding.generator.impl;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -20,10 +20,9 @@ import org.opendaylight.controller.yang.model.api.SchemaContext;
 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
 import org.opendaylight.controller.yang.parser.impl.YangParserImpl;
 
-public class GeneretedTypesBitsTest {
+public class GeneratedTypesBitsTest {
 
-    private SchemaContext resolveSchemaContextFromFiles(
-            final String... yangFiles) {
+    private SchemaContext resolveSchemaContextFromFiles(final String... yangFiles) {
         final YangModelParser parser = new YangParserImpl();
 
         final List<File> inputFiles = new ArrayList<File>();
@@ -37,8 +36,7 @@ public class GeneretedTypesBitsTest {
 
     @Test
     public void testGeneretedTypesBitsTest() {
-        final String yangTypesPath = getClass().getResource(
-                "/simple-bits-demo.yang").getPath();
+        final String yangTypesPath = getClass().getResource("/simple-bits-demo.yang").getPath();
 
         final SchemaContext context = resolveSchemaContextFromFiles(yangTypesPath);
         assertTrue(context != null);
@@ -65,12 +63,11 @@ public class GeneretedTypesBitsTest {
 
         for (final Type type : genTypes) {
             if (type instanceof GeneratedTransferObject) { // searching for
-                                                            // ByteType
+                                                           // ByteType
                 final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
                 if (genTO.getName().equals("ByteType")) {
                     byteTypeFound = true;
-                    List<GeneratedProperty> genProperties = genTO
-                            .getProperties();
+                    List<GeneratedProperty> genProperties = genTO.getProperties();
                     classPropertiesNumb = genProperties.size();
 
                     genProperties = null;
@@ -90,31 +87,26 @@ public class GeneretedTypesBitsTest {
                                                         // interface
                                                         // LeafParameterContainer
                 final GeneratedType genType = (GeneratedType) type;
-                if (genType.getName().compareTo("LeafParentContainer") == 0) {
+                if (genType.getName().equals("LeafParentContainer")) {
                     leafParentFound = true;
                     // check of methods
                     methodSignaturesList = genType.getMethodDefinitions();
                     if (methodSignaturesList != null) {
                         for (MethodSignature methodSignature : methodSignaturesList) { // loop
-                                                                                        // through
-                                                                                        // all
-                                                                                        // methods
-                            if (methodSignature.getName().compareTo(
-                                    "getByteLeaf") == 0) {
+                                                                                       // through
+                                                                                       // all
+                                                                                       // methods
+                            if (methodSignature.getName().equals("getByteLeaf")) {
                                 getByteLeafMethodFound = true;
 
-                                nameReturnParamType = methodSignature
-                                        .getReturnType().getName();
-                            } else if (methodSignature.getName().compareTo(
-                                    "setByteLeaf") == 0) {
+                                nameReturnParamType = methodSignature.getReturnType().getName();
+                            } else if (methodSignature.getName().equals("setByteLeaf")) {
                                 setByteLeafMethodFound = true;
 
-                                List<Parameter> parameters = methodSignature
-                                        .getParameters();
+                                List<Parameter> parameters = methodSignature.getParameters();
                                 setByteLeafMethodParamNum = parameters.size();
                                 for (Parameter parameter : parameters) {
-                                    nameMethodeParamType = parameter.getType()
-                                            .getName();
+                                    nameMethodeParamType = parameter.getType().getName();
                                 }
 
                             }
@@ -126,34 +118,22 @@ public class GeneretedTypesBitsTest {
 
         }
 
-        assertTrue("type >ByteType< wasn't in YANG file", byteTypeFound == true);
+        assertTrue(byteTypeFound);
 
-        assertTrue("Incorrect number of bit properties in class",
-                classPropertiesNumb == 8);
+        assertEquals(classPropertiesNumb,8);
 
-        assertTrue("Incorrect number of properties in toString method",
-                toStringPropertiesNum == 8);
-        assertTrue("Incorrect number of properties in equals method",
-                equalPropertiesNum == 8);
-        assertTrue("Incorrect number of properties in hash method",
-                hashPropertiesNum == 8);
-        assertTrue("LeafParameterContainer container wasn't found",
-                leafParentFound == true);
+        assertEquals(toStringPropertiesNum,8);
+        assertEquals(equalPropertiesNum,8);
+        assertEquals(hashPropertiesNum,8);
+        assertTrue(leafParentFound);
 
-        assertTrue("No methods were generated", methodSignaturesList != null);
+        assertNotNull(methodSignaturesList);
 
-        assertTrue("Method getByteLeaf wasn't generated.",
-                getByteLeafMethodFound == true);
-        assertTrue("Wrong returning parameter type of method getByteLeaf",
-                nameReturnParamType.compareTo("ByteType") == 0);
-
-        assertTrue("Method setByteLeaf wasn't generated.",
-                setByteLeafMethodFound == true);
-        assertTrue("Incorrect number of input parameters for setByteLeaf",
-                setByteLeafMethodParamNum == 1);
-        assertTrue("Wrong input parameter type",
-                nameMethodeParamType.compareTo("ByteType") == 0);
+        assertTrue(getByteLeafMethodFound);
+        assertEquals(nameReturnParamType,"ByteType");
 
+        assertFalse(setByteLeafMethodFound);
+        assertEquals(0, setByteLeafMethodParamNum);
     }
 
 }
\ No newline at end of file
diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesStringTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesStringTest.java
new file mode 100644 (file)
index 0000000..ab290f7
--- /dev/null
@@ -0,0 +1,116 @@
+package org.opendaylight.controller.sal.binding.generator.impl;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator;
+import org.opendaylight.controller.sal.binding.generator.impl.BindingGeneratorImpl;
+import org.opendaylight.controller.sal.binding.model.api.Constant;
+import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;
+import org.opendaylight.controller.sal.binding.model.api.ParameterizedType;
+import org.opendaylight.controller.sal.binding.model.api.Type;
+import org.opendaylight.controller.yang.model.api.Module;
+import org.opendaylight.controller.yang.model.api.SchemaContext;
+import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
+import org.opendaylight.controller.yang.parser.impl.YangParserImpl;
+
+public class GeneratedTypesStringTest {
+
+    private final static List<File> testModels = new ArrayList<File>();
+
+    @BeforeClass
+    public static void loadTestResources() {
+        final File listModelFile = new File(GeneratedTypesStringTest.class.getResource("/simple-string-demo.yang")
+                .getPath());
+        testModels.add(listModelFile);
+    }
+
+    @Test
+    public void constantGenerationTest() {
+        final YangModelParser parser = new YangParserImpl();
+        final Set<Module> modules = parser.parseYangModels(testModels);
+        final SchemaContext context = parser.resolveSchemaContext(modules);
+
+        assertNotNull(context);
+        final BindingGenerator bindingGen = new BindingGeneratorImpl();
+        final List<Type> genTypes = bindingGen.generateTypes(context);
+
+        boolean typedefStringFound = false;
+        boolean constantRegExListFound = false;
+        boolean constantRegExListTypeGeneric = false;
+        boolean constantRegExListTypeContainer = false;
+        boolean noStringInReqExListFound = false;
+        boolean constantRegExListValueOK = false;
+        boolean constantRegExListTypeOneGeneric = false;
+        for (final Type type : genTypes) {
+            if (type instanceof GeneratedTransferObject) {
+                final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
+
+                if (genTO.getName().equals("TypedefString")) {
+                    typedefStringFound = true;
+
+                    List<Constant> constants = genTO.getConstantDefinitions();
+                    for (Constant con : constants) {
+                        if (con.getName().equals("PATTERN_CONSTANTS")) {
+                            constantRegExListFound = true;
+                        } else
+                            break;
+                        ParameterizedType pType;
+                        if (con.getType() instanceof ParameterizedType) {
+                            pType = (ParameterizedType) con.getType();
+                        } else
+                            break;
+
+                        Type[] types;
+                        if (pType.getName().equals("List")) {
+                            constantRegExListTypeContainer = true;
+                            types = pType.getActualTypeArguments();
+                        } else
+                            break;
+
+                        if (types.length == 1) {
+                            constantRegExListTypeOneGeneric = true;
+                        } else
+                            break;
+
+                        if (types[0].getName().equals("String")) {
+                            constantRegExListTypeGeneric = true;
+                        } else
+                            break;
+
+                        if (con.getValue() instanceof List) {
+                            constantRegExListValueOK = true;
+                        } else
+                            break;
+
+                        for (Object obj : (List<?>) con.getValue()) {
+                            if (!(obj instanceof String)) {
+                                noStringInReqExListFound = true;
+                                break;
+                            }
+                        }
+
+                    }
+                }
+            }
+
+        }
+
+        assertTrue("Typedef >>TypedefString<< wasn't found", typedefStringFound);
+        assertTrue("Constant PATTERN_CONSTANTS is missing in TO", constantRegExListFound);
+        assertTrue("Constant PATTERN_CONSTANTS doesn't have correct container type", constantRegExListTypeContainer);
+        assertTrue("Constant PATTERN_CONSTANTS has more than one generic type", constantRegExListTypeOneGeneric);
+        assertTrue("Constant PATTERN_CONSTANTS doesn't have correct generic type", constantRegExListTypeGeneric);
+        assertTrue("Constant PATTERN_CONSTANTS doesn't contain List object", constantRegExListValueOK);
+        assertTrue("In list found other type than String", !noStringInReqExListFound);
+
+    }
+
+}
index cfa74a005f31f12ca157fb0b736f9a0983ca8001..ce9f131b754eb1ce724a09539a40ba62e8a5f116 100644 (file)
@@ -28,8 +28,7 @@ import org.opendaylight.controller.yang.parser.impl.YangParserImpl;
 
 public class GeneratedTypesTest {
 
-    private SchemaContext resolveSchemaContextFromFiles(
-            final String... yangFiles) {
+    private SchemaContext resolveSchemaContextFromFiles(final String... yangFiles) {
         final YangModelParser parser = new YangParserImpl();
 
         final List<File> inputFiles = new ArrayList<File>();
@@ -43,57 +42,50 @@ public class GeneratedTypesTest {
 
     @Test
     public void testMultipleModulesResolving() {
-        final String topologyPath = getClass().getResource(
-                "/abstract-topology.yang").getPath();
-        final String typesPath = getClass().getResource(
-                "/ietf-inet-types@2010-09-24.yang").getPath();
-        final SchemaContext context = resolveSchemaContextFromFiles(
-                topologyPath, typesPath);
-        assertTrue(context != null);
+        final String topologyPath = getClass().getResource("/abstract-topology.yang").getPath();
+        final String typesPath = getClass().getResource("/ietf-inet-types@2010-09-24.yang").getPath();
+        final SchemaContext context = resolveSchemaContextFromFiles(topologyPath, typesPath);
+        assertNotNull(context);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(29, genTypes.size());
     }
 
     @Test
     public void testLeafrefResolving() {
-        final String topologyPath = getClass().getResource(
-                "/leafref-test-models/abstract-topology@2013-02-08.yang")
+        final String topologyPath = getClass().getResource("/leafref-test-models/abstract-topology@2013-02-08.yang")
                 .getPath();
-        final String interfacesPath = getClass().getResource(
-                "/leafref-test-models/ietf-interfaces@2012-11-15.yang")
+        final String interfacesPath = getClass().getResource("/leafref-test-models/ietf-interfaces@2012-11-15.yang")
                 .getPath();
         // final String ifTypePath = getClass().getResource(
         // "/leafref-test-models/iana-if-type@2012-06-05.yang").getPath();
-        final String inetTypesPath = getClass().getResource(
-                "/leafref-test-models/ietf-inet-types@2010-09-24.yang")
+        final String inetTypesPath = getClass().getResource("/leafref-test-models/ietf-inet-types@2010-09-24.yang")
                 .getPath();
-        final String yangTypesPath = getClass().getResource(
-                "/leafref-test-models/ietf-yang-types@2010-09-24.yang")
+        final String yangTypesPath = getClass().getResource("/leafref-test-models/ietf-yang-types@2010-09-24.yang")
                 .getPath();
 
-        assertTrue(topologyPath != null);
-        assertTrue(interfacesPath != null);
+        assertNotNull(topologyPath);
+        assertNotNull(interfacesPath);
         // assertTrue(ifTypePath != null);
-        assertTrue(inetTypesPath != null);
-        assertTrue(yangTypesPath != null);
+        assertNotNull(inetTypesPath);
+        assertNotNull(yangTypesPath);
 
         // final SchemaContext context = resolveSchemaContextFromFiles(
         // topologyPath, interfacesPath, ifTypePath, inetTypesPath,
         // yangTypesPath);
-        final SchemaContext context = resolveSchemaContextFromFiles(
-                topologyPath, interfacesPath, inetTypesPath, yangTypesPath);
-        assertTrue(context != null);
+        final SchemaContext context = resolveSchemaContextFromFiles(topologyPath, interfacesPath, inetTypesPath,
+                yangTypesPath);
+        assertNotNull(context);
         assertEquals(4, context.getModules().size());
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
         assertEquals(57, genTypes.size());
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
 
         GeneratedTransferObject gtIfcKey = null;
         GeneratedType gtIfc = null;
@@ -142,7 +134,7 @@ public class GeneratedTypesTest {
         Type ifcIdPropType = ifcIdProp.getReturnType();
         assertNotNull(ifcIdPropType);
         assertFalse(ifcIdPropType.equals("java.lang.Void"));
-        assertTrue(ifcIdPropType.getName().equals("String"));
+        assertEquals(ifcIdPropType.getName(), "String");
 
         // Interface
         final List<MethodSignature> gtIfcMethods = gtIfc.getMethodDefinitions();
@@ -160,17 +152,16 @@ public class GeneratedTypesTest {
         Type getIfcKeyType = getIfcKey.getReturnType();
         assertNotNull(getIfcKeyType);
         assertFalse(getIfcKeyType.equals("java.lang.Void"));
-        assertTrue(getIfcKeyType.getName().equals("InterfaceKey"));
+        assertEquals(getIfcKeyType.getName(), "InterfaceKey");
 
         assertNotNull(getHigherLayerIf);
         Type getHigherLayerIfType = getHigherLayerIf.getReturnType();
         assertNotNull(getHigherLayerIfType);
         assertFalse(getHigherLayerIfType.equals("java.lang.Void"));
-        assertTrue(getHigherLayerIfType.getName().equals("List"));
+        assertEquals(getHigherLayerIfType.getName(), "List");
 
         // NetworkLink
-        final List<MethodSignature> gtNetworkLinkMethods = gtNetworkLink
-                .getMethodDefinitions();
+        final List<MethodSignature> gtNetworkLinkMethods = gtNetworkLink.getMethodDefinitions();
         assertNotNull(gtNetworkLinkMethods);
         MethodSignature getIfc = null;
         for (MethodSignature method : gtNetworkLinkMethods) {
@@ -182,11 +173,10 @@ public class GeneratedTypesTest {
         Type getIfcType = getIfc.getReturnType();
         assertNotNull(getIfcType);
         assertFalse(getIfcType.equals("java.lang.Void"));
-        assertTrue(getIfcType.getName().equals("String"));
+        assertEquals(getIfcType.getName(), "String");
 
         // SourceNode
-        final List<MethodSignature> gtSourceMethods = gtSource
-                .getMethodDefinitions();
+        final List<MethodSignature> gtSourceMethods = gtSource.getMethodDefinitions();
         assertNotNull(gtSourceMethods);
         MethodSignature getIdSource = null;
         for (MethodSignature method : gtSourceMethods) {
@@ -198,11 +188,10 @@ public class GeneratedTypesTest {
         Type getIdType = getIdSource.getReturnType();
         assertNotNull(getIdType);
         assertFalse(getIdType.equals("java.lang.Void"));
-        assertTrue(getIdType.getName().equals("Uri"));
+        assertEquals(getIdType.getName(), "Uri");
 
         // DestinationNode
-        final List<MethodSignature> gtDestMethods = gtDest
-                .getMethodDefinitions();
+        final List<MethodSignature> gtDestMethods = gtDest.getMethodDefinitions();
         assertNotNull(gtDestMethods);
         MethodSignature getIdDest = null;
         for (MethodSignature method : gtDestMethods) {
@@ -214,11 +203,10 @@ public class GeneratedTypesTest {
         Type getIdDestType = getIdDest.getReturnType();
         assertNotNull(getIdDestType);
         assertFalse(getIdDestType.equals("java.lang.Void"));
-        assertTrue(getIdDestType.getName().equals("Uri"));
+        assertEquals(getIdDestType.getName(), "Uri");
 
         // Tunnel
-        final List<MethodSignature> gtTunnelMethods = gtTunnel
-                .getMethodDefinitions();
+        final List<MethodSignature> gtTunnelMethods = gtTunnel.getMethodDefinitions();
         assertNotNull(gtTunnelMethods);
         MethodSignature getTunnelKey = null;
         for (MethodSignature method : gtTunnelMethods) {
@@ -230,11 +218,10 @@ public class GeneratedTypesTest {
         Type getTunnelKeyType = getTunnelKey.getReturnType();
         assertNotNull(getTunnelKeyType);
         assertFalse(getTunnelKeyType.equals("java.lang.Void"));
-        assertTrue(getTunnelKeyType.getName().equals("TunnelKey"));
+        assertEquals(getTunnelKeyType.getName(), "TunnelKey");
 
         // TunnelKey
-        final List<GeneratedProperty> gtTunnelKeyProps = gtTunnelKey
-                .getProperties();
+        final List<GeneratedProperty> gtTunnelKeyProps = gtTunnelKey.getProperties();
         assertNotNull(gtTunnelKeyProps);
         GeneratedProperty tunnelId = null;
         for (final GeneratedProperty property : gtTunnelKeyProps) {
@@ -246,20 +233,19 @@ public class GeneratedTypesTest {
         Type tunnelIdType = tunnelId.getReturnType();
         assertNotNull(tunnelIdType);
         assertFalse(tunnelIdType.equals("java.lang.Void"));
-        assertTrue(tunnelIdType.getName().equals("Uri"));
+        assertEquals(tunnelIdType.getName(), "Uri");
     }
 
     @Test
     public void testContainerResolving() {
-        final String filePath = getClass().getResource(
-                "/simple-container-demo.yang").getPath();
+        final String filePath = getClass().getResource("/simple-container-demo.yang").getPath();
         final SchemaContext context = resolveSchemaContextFromFiles(filePath);
-        assertTrue(context != null);
+        assert (context != null);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(4, genTypes.size());
 
         final GeneratedType simpleContainer = (GeneratedType) genTypes.get(1);
@@ -267,77 +253,123 @@ public class GeneratedTypesTest {
 
         assertEquals("SimpleContainer", simpleContainer.getName());
         assertEquals("NestedContainer", nestedContainer.getName());
-        assertEquals(5, simpleContainer.getMethodDefinitions().size());
-        assertEquals(4, nestedContainer.getMethodDefinitions().size());
-
-        int methodsCount = 0;
-        for (final MethodSignature method : simpleContainer
-                .getMethodDefinitions()) {
+        assertEquals(3, simpleContainer.getMethodDefinitions().size());
+        assertEquals(2, nestedContainer.getMethodDefinitions().size());
+
+        int setFooMethodCounter = 0;
+        int getFooMethodCounter = 0;
+        int getBarMethodCounter = 0;
+        int getNestedContainerCounter = 0;
+
+        String getFooMethodReturnTypeName = "";
+        String setFooMethodInputParamName = "";
+        String setFooMethodInputParamTypeName = "";
+        String getBarMethodReturnTypeName = "";
+        String getNestedContainerReturnTypeName = "";
+        for (final MethodSignature method : simpleContainer.getMethodDefinitions()) {
             if (method.getName().equals("getFoo")) {
-                method.getReturnType().getName().equals("Integer");
-                methodsCount++;
+                getFooMethodCounter++;
+                getFooMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("setFoo")) {
-                methodsCount++;
-                final MethodSignature.Parameter param = method.getParameters()
-                        .get(0);
-                assertEquals("foo", param.getName());
-                assertEquals("Integer", param.getType().getName());
+                setFooMethodCounter++;
+                final MethodSignature.Parameter param = method.getParameters().get(0);
+                setFooMethodInputParamName = param.getName();
+                setFooMethodInputParamTypeName = param.getType().getName();
             }
 
             if (method.getName().equals("getBar")) {
-                method.getReturnType().getName().equals("String");
-                methodsCount++;
+                getBarMethodCounter++;
+                getBarMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("getNestedContainer")) {
-                method.getReturnType().getName().equals("NestedContainer");
-                methodsCount++;
+                getNestedContainerCounter++;
+                getNestedContainerReturnTypeName = method.getReturnType().getName();
             }
         }
-        assertEquals(4, methodsCount);
 
-        methodsCount = 0;
-        for (final MethodSignature method : nestedContainer
-                .getMethodDefinitions()) {
+        assertEquals(getFooMethodCounter, 1);
+        assertEquals(getFooMethodReturnTypeName, "Integer");
+
+        // TODO no setter methods, because 'config' is default true
+        // assertEquals(setFooMethodCounter, 1);
+        // assertEquals(setFooMethodInputParamName, "foo");
+        // assertEquals(setFooMethodInputParamTypeName, "Integer");
+
+        assertEquals(getBarMethodCounter, 1);
+        assertEquals(getBarMethodReturnTypeName, "String");
+
+        assertEquals(getNestedContainerCounter, 1);
+        assertEquals(getNestedContainerReturnTypeName, "NestedContainer");
+
+        setFooMethodCounter = 0;
+        getFooMethodCounter = 0;
+        getBarMethodCounter = 0;
+        int setBarMethodCounter = 0;
+
+        getFooMethodReturnTypeName = "";
+        setFooMethodInputParamName = "";
+        setFooMethodInputParamTypeName = "";
+        getBarMethodReturnTypeName = "";
+        String setBarMethodInputParamName = "";
+        String setBarMethodInputParamTypeName = "";
+
+        for (final MethodSignature method : nestedContainer.getMethodDefinitions()) {
+
             if (method.getName().equals("getFoo")) {
-                method.getReturnType().getName().equals("Short");
-                methodsCount++;
+                getFooMethodCounter++;
+                getFooMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("setFoo")) {
-                methodsCount++;
-                final MethodSignature.Parameter param = method.getParameters()
-                        .get(0);
-                assertEquals("foo", param.getName());
-                assertEquals("Short", param.getType().getName());
+                setFooMethodCounter++;
+                final MethodSignature.Parameter param = method.getParameters().get(0);
+                setFooMethodInputParamName = param.getName();
+                setFooMethodInputParamTypeName = param.getType().getName();
             }
 
             if (method.getName().equals("getBar")) {
-                method.getReturnType().getName().equals("String");
-                methodsCount++;
+                getBarMethodCounter++;
+                getBarMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("setBar")) {
-                method.getReturnType().getName().equals("String");
-                methodsCount++;
+                setBarMethodCounter++;
+                final MethodSignature.Parameter param = method.getParameters().get(0);
+                setBarMethodInputParamName = param.getName();
+                setBarMethodInputParamTypeName = param.getType().getName();
             }
         }
-        assertEquals(4, methodsCount);
+
+        assertEquals(1, getFooMethodCounter);
+        assertEquals(getFooMethodReturnTypeName, "Short");
+
+        // TODO no setter methods, because 'config' is default true
+        // assertEquals(1, setFooMethodCounter);
+        // assertEquals(setFooMethodInputParamName, "foo");
+        // assertEquals(setFooMethodInputParamTypeName, "Short");
+
+        assertEquals(1, getBarMethodCounter);
+        assertEquals(getBarMethodReturnTypeName, "String");
+
+        // TODO no setter methods, because 'config' is default true
+        // assertEquals(1, setBarMethodCounter);
+        // assertEquals(setBarMethodInputParamName, "bar");
+        // assertEquals(setBarMethodInputParamTypeName, "String");
     }
 
     @Test
     public void testLeafListResolving() {
-        final String filePath = getClass().getResource(
-                "/simple-leaf-list-demo.yang").getPath();
+        final String filePath = getClass().getResource("/simple-leaf-list-demo.yang").getPath();
         final SchemaContext context = resolveSchemaContextFromFiles(filePath);
-        assertTrue(context != null);
+        assertNotNull(context);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(4, genTypes.size());
 
         final GeneratedType simpleContainer = (GeneratedType) genTypes.get(1);
@@ -345,188 +377,275 @@ public class GeneratedTypesTest {
 
         assertEquals("SimpleContainer", simpleContainer.getName());
         assertEquals("NestedContainer", nestedContainer.getName());
-        assertEquals(5, simpleContainer.getMethodDefinitions().size());
-        assertEquals(3, nestedContainer.getMethodDefinitions().size());
-
-        int methodsCount = 0;
-        for (final MethodSignature method : simpleContainer
-                .getMethodDefinitions()) {
+        assertEquals(3, simpleContainer.getMethodDefinitions().size());
+        assertEquals(2, nestedContainer.getMethodDefinitions().size());
+
+        int setFooMethodCounter = 0;
+        int getFooMethodCounter = 0;
+        int getBarMethodCounter = 0;
+        int getNestedContainerCounter = 0;
+
+        String getFooMethodReturnTypeName = "";
+        String setFooMethodInputParamName = "";
+        String setFooMethodInputParamTypeName = "";
+        String getBarMethodReturnTypeName = "";
+        String getNestedContainerReturnTypeName = "";
+        for (final MethodSignature method : simpleContainer.getMethodDefinitions()) {
             if (method.getName().equals("getFoo")) {
-                method.getReturnType().getName().equals("List");
-                methodsCount++;
+                getFooMethodCounter++;
+                getFooMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("setFoo")) {
-                methodsCount++;
-                final MethodSignature.Parameter param = method.getParameters()
-                        .get(0);
-                assertEquals("foo", param.getName());
-                assertEquals("List", param.getType().getName());
+                setFooMethodCounter++;
+                final MethodSignature.Parameter param = method.getParameters().get(0);
+                setFooMethodInputParamName = param.getName();
+                setFooMethodInputParamTypeName = param.getType().getName();
             }
 
             if (method.getName().equals("getBar")) {
-                method.getReturnType().getName().equals("String");
-                methodsCount++;
+                getBarMethodCounter++;
+                getBarMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("getNestedContainer")) {
-                method.getReturnType().getName().equals("NestedContainer");
-                methodsCount++;
+                getNestedContainerCounter++;
+                getNestedContainerReturnTypeName = method.getReturnType().getName();
             }
         }
-        assertEquals(4, methodsCount);
 
-        methodsCount = 0;
-        for (final MethodSignature method : nestedContainer
-                .getMethodDefinitions()) {
+        assertEquals(1, getFooMethodCounter);
+        assertEquals(getFooMethodReturnTypeName, "List");
+
+        // TODO no setter methods, because 'config' is default true
+        // assertEquals(1, setFooMethodCounter);
+        // assertEquals(setFooMethodInputParamName, "foo");
+        // assertEquals(setFooMethodInputParamTypeName, "List");
+
+        assertEquals(1, getBarMethodCounter);
+        assertEquals(getBarMethodReturnTypeName, "String");
+
+        assertEquals(1, getNestedContainerCounter);
+        assertEquals(getNestedContainerReturnTypeName, "NestedContainer");
+
+        setFooMethodCounter = 0;
+        getFooMethodCounter = 0;
+        getBarMethodCounter = 0;
+
+        getFooMethodReturnTypeName = "";
+        setFooMethodInputParamName = "";
+        setFooMethodInputParamTypeName = "";
+        getBarMethodReturnTypeName = "";
+
+        for (final MethodSignature method : nestedContainer.getMethodDefinitions()) {
             if (method.getName().equals("getFoo")) {
-                method.getReturnType().getName().equals("Short");
-                methodsCount++;
+                getFooMethodCounter++;
+                getFooMethodReturnTypeName = method.getReturnType().getName();
             }
 
             if (method.getName().equals("setFoo")) {
-                methodsCount++;
-                final MethodSignature.Parameter param = method.getParameters()
-                        .get(0);
-                assertEquals("foo", param.getName());
-                assertEquals("Short", param.getType().getName());
+                setFooMethodCounter++;
+                final MethodSignature.Parameter param = method.getParameters().get(0);
+                setFooMethodInputParamName = param.getName();
+                setFooMethodInputParamTypeName = param.getType().getName();
             }
 
             if (method.getName().equals("getBar")) {
-                method.getReturnType().getName().equals("List");
-                methodsCount++;
+                getBarMethodCounter++;
+                getBarMethodReturnTypeName = method.getReturnType().getName();
             }
         }
-        assertEquals(3, methodsCount);
+
+        assertEquals(1, getFooMethodCounter);
+        assertEquals(getFooMethodReturnTypeName, "Short");
+
+        // TODO no setter methods, because 'config' is default true
+        // assertEquals(1, setFooMethodCounter);
+        // assertEquals(setFooMethodInputParamName, "foo");
+        // assertEquals(setFooMethodInputParamTypeName, "Short");
+
+        assertEquals(1, getBarMethodCounter);
+        assertEquals(getBarMethodReturnTypeName, "List");
     }
 
     @Test
     public void testListResolving() {
-        final String filePath = getClass()
-                .getResource("/simple-list-demo.yang").getPath();
+        final String filePath = getClass().getResource("/simple-list-demo.yang").getPath();
         final SchemaContext context = resolveSchemaContextFromFiles(filePath);
-        assertTrue(context != null);
+        assertNotNull(context);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(6, genTypes.size());
 
         int genTypesCount = 0;
         int genTOsCount = 0;
+
+        int listParentContainerMethodsCount = 0;
+        int simpleListMethodsCount = 0;
+        int listChildContainerMethodsCount = 0;
+        int listKeyClassCount = 0;
+
+        int getSimpleListKeyMethodCount = 0;
+        int getListChildContainerMethodCount = 0;
+        int getFooMethodCount = 0;
+        int setFooMethodCount = 0;
+        int getSimpleLeafListMethodCount = 0;
+        int setSimpleLeafListMethodCount = 0;
+        int getBarMethodCount = 0;
+
+        String getSimpleListKeyMethodReturnTypeName = "";
+        String getListChildContainerMethodReturnTypeName = "";
+
+        int listKeyClassPropertyCount = 0;
+        String listKeyClassPropertyName = "";
+        String listKeyClassPropertyTypeName = "";
+        boolean listKeyClassPropertyReadOnly = false;
+
+        int hashMethodParameterCount = 0;
+        String hashMethodParameterName = "";
+        String hashMethodParameterReturnTypeName = "";
+
+        int equalMethodParameterCount = 0;
+        String equalMethodParameterName = "";
+        String equalMethodParameterReturnTypeName = "";
+
         for (final Type type : genTypes) {
-            if (type instanceof GeneratedType
-                    && !(type instanceof GeneratedTransferObject)) {
+            if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {
                 final GeneratedType genType = (GeneratedType) type;
                 if (genType.getName().equals("ListParentContainer")) {
-                    assertEquals(2, genType.getMethodDefinitions().size());
+                    listParentContainerMethodsCount = genType.getMethodDefinitions().size();
                     genTypesCount++;
                 } else if (genType.getName().equals("SimpleList")) {
-                    assertEquals(8, genType.getMethodDefinitions().size());
-                    final List<MethodSignature> methods = genType
-                            .getMethodDefinitions();
-                    int methodsCount = 0;
+                    simpleListMethodsCount = genType.getMethodDefinitions().size();
+                    final List<MethodSignature> methods = genType.getMethodDefinitions();
                     for (final MethodSignature method : methods) {
                         if (method.getName().equals("getSimpleListKey")) {
-                            assertEquals("SimpleListKey", method
-                                    .getReturnType().getName());
-                            methodsCount++;
-                        } else if (method.getName().equals(
-                                "getListChildContainer")) {
-                            assertEquals("ListChildContainer", method
-                                    .getReturnType().getName());
-                            methodsCount++;
+                            getSimpleListKeyMethodCount++;
+                            getSimpleListKeyMethodReturnTypeName = method.getReturnType().getName();
+                        } else if (method.getName().equals("getListChildContainer")) {
+                            getListChildContainerMethodCount++;
+                            getListChildContainerMethodReturnTypeName = method.getReturnType().getName();
                         } else if (method.getName().equals("getFoo")) {
-                            methodsCount++;
+                            getFooMethodCount++;
                         } else if (method.getName().equals("setFoo")) {
-                            methodsCount++;
+                            setFooMethodCount++;
                         } else if (method.getName().equals("getSimpleLeafList")) {
-                            methodsCount++;
+                            getSimpleLeafListMethodCount++;
                         } else if (method.getName().equals("setSimpleLeafList")) {
-                            methodsCount++;
+                            setSimpleLeafListMethodCount++;
                         } else if (method.getName().equals("getBar")) {
-                            methodsCount++;
+                            getBarMethodCount++;
                         }
                     }
-                    assertEquals(7, methodsCount);
                     genTypesCount++;
                 } else if (genType.getName().equals("ListChildContainer")) {
-                    assertEquals(2, genType.getMethodDefinitions().size());
+                    listChildContainerMethodsCount = genType.getMethodDefinitions().size();
                     genTypesCount++;
                 }
             } else if (type instanceof GeneratedTransferObject) {
                 genTOsCount++;
                 final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
-                final List<GeneratedProperty> properties = genTO
-                        .getProperties();
-                final List<GeneratedProperty> hashProps = genTO
-                        .getHashCodeIdentifiers();
-                final List<GeneratedProperty> equalProps = genTO
-                        .getEqualsIdentifiers();
-
-                assertEquals(1, properties.size());
-                assertEquals("ListKey", properties.get(0).getName());
-                assertEquals("Byte", properties.get(0).getReturnType()
-                        .getName());
-                assertEquals(true, properties.get(0).isReadOnly());
-                assertEquals(1, hashProps.size());
-                assertEquals("ListKey", hashProps.get(0).getName());
-                assertEquals("Byte", hashProps.get(0).getReturnType().getName());
-                assertEquals(1, equalProps.size());
-                assertEquals("ListKey", equalProps.get(0).getName());
-                assertEquals("Byte", equalProps.get(0).getReturnType()
-                        .getName());
+                final List<GeneratedProperty> properties = genTO.getProperties();
+                final List<GeneratedProperty> hashProps = genTO.getHashCodeIdentifiers();
+                final List<GeneratedProperty> equalProps = genTO.getEqualsIdentifiers();
+
+                listKeyClassCount++;
+                listKeyClassPropertyCount = properties.size();
+                listKeyClassPropertyName = properties.get(0).getName();
+                listKeyClassPropertyTypeName = properties.get(0).getReturnType().getName();
+                listKeyClassPropertyReadOnly = properties.get(0).isReadOnly();
+
+                hashMethodParameterCount = hashProps.size();
+                hashMethodParameterName = hashProps.get(0).getName();
+                hashMethodParameterReturnTypeName = hashProps.get(0).getReturnType().getName();
+
+                equalMethodParameterCount = equalProps.size();
+                equalMethodParameterName = equalProps.get(0).getName();
+                equalMethodParameterReturnTypeName = equalProps.get(0).getReturnType().getName();
+
             }
         }
-        assertEquals(3, genTypesCount);
-        assertEquals(1, genTOsCount);
+
+        assertEquals(1, listParentContainerMethodsCount);
+        assertEquals(1, listChildContainerMethodsCount);
+        assertEquals(1, getSimpleListKeyMethodCount);
+        assertEquals(1, listKeyClassCount);
+
+        assertEquals(1, listKeyClassPropertyCount);
+        assertEquals("ListKey", listKeyClassPropertyName);
+        assertEquals("Byte", listKeyClassPropertyTypeName);
+        assertEquals(true, listKeyClassPropertyReadOnly);
+        assertEquals(1, hashMethodParameterCount);
+        assertEquals("ListKey", hashMethodParameterName);
+        assertEquals("Byte", hashMethodParameterReturnTypeName);
+        assertEquals(1, equalMethodParameterCount);
+        assertEquals("ListKey", equalMethodParameterName);
+        assertEquals("Byte", equalMethodParameterReturnTypeName);
+
+        assertEquals("SimpleListKey", getSimpleListKeyMethodReturnTypeName);
+
+        assertEquals(1, getListChildContainerMethodCount);
+        assertEquals("ListChildContainer", getListChildContainerMethodReturnTypeName);
+        assertEquals(1, getFooMethodCount);
+        assertEquals(0, setFooMethodCount);
+        assertEquals(1, getSimpleLeafListMethodCount);
+        assertEquals(0, setSimpleLeafListMethodCount);
+        assertEquals(1, getBarMethodCount);
+
+        assertEquals(5, simpleListMethodsCount);
     }
 
     @Test
     public void testListCompositeKeyResolving() {
-        final String filePath = getClass().getResource(
-                "/list-composite-key.yang").getPath();
+        final String filePath = getClass().getResource("/list-composite-key.yang").getPath();
         final SchemaContext context = resolveSchemaContextFromFiles(filePath);
 
-        assertTrue(context != null);
+        assertNotNull(context);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(8, genTypes.size());
 
         int genTypesCount = 0;
         int genTOsCount = 0;
+
+        int compositeKeyListKeyPropertyCount = 0;
+        int compositeKeyListKeyCount = 0;
+        int innerListKeyPropertyCount = 0;
+
         for (final Type type : genTypes) {
-            if (type instanceof GeneratedType
-                    && !(type instanceof GeneratedTransferObject)) {
+            if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {
                 genTypesCount++;
             } else if (type instanceof GeneratedTransferObject) {
                 final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
 
                 if (genTO.getName().equals("CompositeKeyListKey")) {
-                    final List<GeneratedProperty> properties = genTO
-                            .getProperties();
-                    int propertyCount = 0;
+                    compositeKeyListKeyCount++;
+                    final List<GeneratedProperty> properties = genTO.getProperties();
                     for (final GeneratedProperty prop : properties) {
                         if (prop.getName().equals("Key1")) {
-                            propertyCount++;
+                            compositeKeyListKeyPropertyCount++;
                         } else if (prop.getName().equals("Key2")) {
-                            propertyCount++;
+                            compositeKeyListKeyPropertyCount++;
                         }
                     }
-                    assertEquals(2, propertyCount);
                     genTOsCount++;
                 } else if (genTO.getName().equals("InnerListKey")) {
-                    final List<GeneratedProperty> properties = genTO
-                            .getProperties();
-                    assertEquals(1, properties.size());
+                    final List<GeneratedProperty> properties = genTO.getProperties();
+                    innerListKeyPropertyCount = properties.size();
                     genTOsCount++;
                 }
             }
         }
+        assertEquals(1, compositeKeyListKeyCount);
+        assertEquals(2, compositeKeyListKeyPropertyCount);
+
+        assertEquals(1, innerListKeyPropertyCount);
 
         assertEquals(6, genTypesCount);
         assertEquals(2, genTOsCount);
@@ -534,22 +653,20 @@ public class GeneratedTypesTest {
 
     @Test
     public void testGeneratedTypes() {
-        final String filePath = getClass().getResource("/demo-topology.yang")
-                .getPath();
+        final String filePath = getClass().getResource("/demo-topology.yang").getPath();
         final SchemaContext context = resolveSchemaContextFromFiles(filePath);
-        assertTrue(context != null);
+        assertNotNull(context);
 
         final BindingGenerator bindingGen = new BindingGeneratorImpl();
         final List<Type> genTypes = bindingGen.generateTypes(context);
 
-        assertTrue(genTypes != null);
+        assertNotNull(genTypes);
         assertEquals(15, genTypes.size());
 
         int genTypesCount = 0;
         int genTOsCount = 0;
         for (final Type type : genTypes) {
-            if (type instanceof GeneratedType
-                    && !(type instanceof GeneratedTransferObject)) {
+            if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {
                 genTypesCount++;
             } else if (type instanceof GeneratedTransferObject) {
                 genTOsCount++;
diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/resources/simple-string-demo.yang b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/resources/simple-string-demo.yang
new file mode 100644 (file)
index 0000000..687d2a1
--- /dev/null
@@ -0,0 +1,23 @@
+module simple-string-demo {
+
+    namespace "urn:simple:string:demo";
+    prefix "sbd";
+
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    revision 2013-06-18 {
+        
+    }
+
+
+    typedef typedef-string {
+        type string {
+            length "40";
+            pattern "[0-9A-F]*";
+            pattern "[B-D]*";
+            pattern "[4-7]*";
+        }
+    }
+
+}
index b37f91fe4474acd8e4d6c5fd8697c80dda753121..a394edd906bc50de5f71d8a09eb54b393b3c42d4 100644 (file)
@@ -159,6 +159,13 @@ public final class BindingGeneratorUtil {
         return validateParameterName(correctStr);
     }
 
+    public static String convertToCapitalLetters(final String token) {
+        String convertedStr = token.replace(" ", "_");
+        convertedStr = convertedStr.replace(".", "_");
+        convertedStr = convertedStr.toUpperCase();
+        return convertedStr;
+    }
+
     private static String parseToCamelCase(String token) {
         if (token == null) {
             throw new NullPointerException("Name can not be null");
diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/TypeConstants.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/TypeConstants.java
new file mode 100644 (file)
index 0000000..69443aa
--- /dev/null
@@ -0,0 +1,9 @@
+package org.opendaylight.controller.binding.generator.util;
+
+public final class TypeConstants {
+
+    public static final String PATTERN_CONSTANT_NAME = "PATTERN_CONSTANTS";
+
+    private TypeConstants() {
+    }
+}
index 8c7ee353442d7c2fb6ec221c08100bf3b26fb7c7..214459777292afa44d02ea67c34de9ae363d7317 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.binding.generator.util.generated.type.builder;
 
-
 import org.opendaylight.controller.binding.generator.util.AbstractBaseType;
 import org.opendaylight.controller.sal.binding.model.api.*;
 import org.opendaylight.controller.sal.binding.model.api.type.builder.*;
@@ -28,16 +27,11 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
     private final List<GeneratedType> enclosedTypes;
     private final boolean isAbstract;
 
-    public AbstractGeneratedType(final Type parent, final String packageName,
-                             final String name, final String comment,
-                             final List<AnnotationTypeBuilder> annotationBuilders,
-                             final boolean isAbstract,
-                             final List<Type> implementsTypes,
-                             final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
-                             final List<GeneratedTOBuilder> enclosedGenTOBuilders,
-                             final List<EnumBuilder> enumBuilders,
-                             final List<Constant> constants,
-                             final List<MethodSignatureBuilder> methodBuilders) {
+    public AbstractGeneratedType(final Type parent, final String packageName, final String name, final String comment,
+            final List<AnnotationTypeBuilder> annotationBuilders, final boolean isAbstract,
+            final List<Type> implementsTypes, final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
+            final List<GeneratedTOBuilder> enclosedGenTOBuilders, final List<EnumBuilder> enumBuilders,
+            final List<Constant> constants, final List<MethodSignatureBuilder> methodBuilders) {
         super(packageName, name);
         this.parent = parent;
         this.comment = comment;
@@ -51,7 +45,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
     }
 
     private List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
-                                                            final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
+            final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
         final List<GeneratedType> enclosedTypes = new ArrayList<>();
         for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
             if (builder != null) {
@@ -67,8 +61,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
         return enclosedTypes;
     }
 
-    protected List<AnnotationType> toUnmodifiableAnnotations(
-            final List<AnnotationTypeBuilder> annotationBuilders) {
+    protected List<AnnotationType> toUnmodifiableAnnotations(final List<AnnotationTypeBuilder> annotationBuilders) {
         final List<AnnotationType> annotations = new ArrayList<>();
         for (final AnnotationTypeBuilder builder : annotationBuilders) {
             annotations.add(builder.toInstance());
@@ -76,8 +69,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
         return Collections.unmodifiableList(annotations);
     }
 
-    protected List<MethodSignature> toUnmodifiableMethods(
-            List<MethodSignatureBuilder> methodBuilders) {
+    protected List<MethodSignature> toUnmodifiableMethods(List<MethodSignatureBuilder> methodBuilders) {
         final List<MethodSignature> methods = new ArrayList<>();
         for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
             methods.add(methodBuilder.toInstance(this));
@@ -85,8 +77,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
         return Collections.unmodifiableList(methods);
     }
 
-    protected List<Enumeration> toUnmodifiableEnumerations(
-            List<EnumBuilder> enumBuilders) {
+    protected List<Enumeration> toUnmodifiableEnumerations(List<EnumBuilder> enumBuilders) {
         final List<Enumeration> enums = new ArrayList<>();
         for (final EnumBuilder enumBuilder : enumBuilders) {
             enums.add(enumBuilder.toInstance(this));
@@ -111,10 +102,10 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat
 
     @Override
     public boolean isAbstract() {
-       return isAbstract;
+        return isAbstract;
     }
 
-     @Override
+    @Override
     public List<Type> getImplements() {
         return implementsTypes;
     }
index 877bcfce630113940aadbc238fd2b7700f02911c..b95ac48928b20d410de55ba5093046dd9de08abb 100644 (file)
@@ -16,7 +16,9 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.opendaylight.controller.binding.generator.util.TypeConstants;
 import org.opendaylight.controller.sal.binding.model.api.CodeGenerator;
+import org.opendaylight.controller.sal.binding.model.api.Constant;
 import org.opendaylight.controller.sal.binding.model.api.Enumeration;
 import org.opendaylight.controller.sal.binding.model.api.GeneratedProperty;
 import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferIdentityObject;
@@ -32,12 +34,13 @@ public final class ClassCodeGenerator implements CodeGenerator {
         final Writer writer = new StringWriter();
 
         if (type instanceof GeneratedTransferObject) {
-            GeneratedTransferObject genTO = (GeneratedTransferObject) type;            
+            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
             imports = GeneratorUtil.createImports(genTO);
-            
+
             final String currentPkg = genTO.getPackageName();
             final List<GeneratedProperty> fields = genTO.getProperties();
             final List<Enumeration> enums = genTO.getEnumerations();
+            final List<Constant> consts = genTO.getConstantDefinitions();
 
             writer.write(GeneratorUtil.createPackageDeclaration(currentPkg));
             writer.write(NL);
@@ -48,54 +51,61 @@ public final class ClassCodeGenerator implements CodeGenerator {
             }
             writer.write(NL);
 
-            writer.write(GeneratorUtil.createClassDeclaration(genTO, "",
-                    imports, genTO.isAbstract()));
+            writer.write(GeneratorUtil.createClassDeclaration(genTO, "", imports, genTO.isAbstract()));
             writer.write(NL);
             writer.write(NL);
-            
-            if (enums != null) {           
-                       EnumGenerator enumGenerator = new EnumGenerator();
-               for ( Enumeration e : enums ) {                         
-                       writer.write(enumGenerator.generateInnerEnumeration(e, TAB).toString());
-                       writer.write(NL);
-               }
+
+            if (consts != null) {
+                for (Constant con : consts) {
+                    writer.write(GeneratorUtil.createConstant(con, TAB, imports, currentPkg));
+                    writer.write(NL);
+                }
             }
 
-            if (fields != null) {
-                for (GeneratedProperty field : fields) {
-                    writer.write(GeneratorUtil.createField(field, TAB, imports,
-                            currentPkg) + NL);
+            if (enums != null) {
+                EnumGenerator enumGenerator = new EnumGenerator();
+                for (Enumeration e : enums) {
+                    writer.write(enumGenerator.generateInnerEnumeration(e, TAB).toString());
+                    writer.write(NL);
+                }
+            }
+
+            boolean memberPatternListCodeRequired = false;
+            memberPatternListCodeRequired = (GeneratorUtil.isConstantInTO(TypeConstants.PATTERN_CONSTANT_NAME, genTO));
+            if (fields != null || memberPatternListCodeRequired) {
+                if (fields != null) {
+                    for (GeneratedProperty field : fields) {
+                        writer.write(GeneratorUtil.createField(field, TAB, imports, currentPkg) + NL);
+                    }
+                }
+                if (memberPatternListCodeRequired) {
+                    writer.write(TAB + PRIVATE + GAP + "List<Pattern>" + GAP + MEMBER_PATTERN_LIST + GAP + ASSIGN + GAP
+                            + "new ArrayList<Pattern>()" + GAP + SC + NL);
+
                 }
                 writer.write(NL);
-                writer.write(GeneratorUtil.createConstructor(genTO, TAB,
-                        imports, genTO.isAbstract()) + NL);
+                writer.write(GeneratorUtil.createConstructor(genTO, TAB, imports, genTO.isAbstract()) + NL);
                 writer.write(NL);
-                for (GeneratedProperty field : fields) {
-                    writer.write(GeneratorUtil.createGetter(field, TAB,
-                            imports, currentPkg) + NL);
-                    if (!field.isReadOnly()) {
-                        writer.write(GeneratorUtil.createSetter(field, TAB,
-                                imports, currentPkg) + NL);
+                if (fields != null) {
+                    for (GeneratedProperty field : fields) {
+                        writer.write(GeneratorUtil.createGetter(field, TAB, imports, currentPkg) + NL);
+                        if (!field.isReadOnly()) {
+                            writer.write(GeneratorUtil.createSetter(field, TAB, imports, currentPkg) + NL);
+                        }
                     }
                 }
                 writer.write(NL);
 
                 if (!genTO.getHashCodeIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createHashCode(
-                            genTO.getHashCodeIdentifiers(), TAB)
-                            + NL);
+                    writer.write(GeneratorUtil.createHashCode(genTO.getHashCodeIdentifiers(), TAB) + NL);
                 }
 
                 if (!genTO.getEqualsIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createEquals(genTO,
-                            genTO.getEqualsIdentifiers(), TAB)
-                            + NL);
+                    writer.write(GeneratorUtil.createEquals(genTO, genTO.getEqualsIdentifiers(), TAB) + NL);
                 }
 
                 if (!genTO.getToStringIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createToString(genTO,
-                            genTO.getToStringIdentifiers(), TAB)
-                            + NL);
+                    writer.write(GeneratorUtil.createToString(genTO, genTO.getToStringIdentifiers(), TAB) + NL);
 
                 }
 
index e5cb97f1a6e4fb7181a875f5342a40f06a7d7e87..f200538138272a6570babe1b5d4e0c8a2f69c163 100644 (file)
@@ -19,11 +19,16 @@ final class Constants {
     public static final String LB = "(";
     public static final String RB = ")";
 
+    public static final String LSB = "[";
+    public static final String RSB = "]";
+
     public static final String GAP = " ";
     public static final String COMMA = ",";
     public static final String NL = "\n";
     public static final String SC = ";";
     public static final String TAB = "    ";
+    public static final String ASSIGN = "=";
+    public static final String DOUBLE_QUOTE = "\"";
 
     public static final String PUBLIC = "public";
     public static final String PRIVATE = "private";
@@ -33,9 +38,13 @@ final class Constants {
     public static final String FINAL = "final";
     public static final String EXTENDS = "extends";
     public static final String IMPLEMENTS = "implements";
-    
+
     public static final String ENUMERATION_NAME = "value";
-    public static final String ENUMERATION_TYPE = "int";       
-    
-    private Constants() {}
+    public static final String ENUMERATION_TYPE = "int";
+
+    public static final String STRING_PATTERN_LIST = "STRING_PATTERNS";
+    public static final String MEMBER_PATTERN_LIST = "patterns";
+
+    private Constants() {
+    }
 }
index 804ac99ff26138d1e36d18c6dbbd99755fc1b946..16074c7e98ba0b1fac549c2c1fa6c42c67abe71c 100644 (file)
@@ -15,6 +15,8 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.opendaylight.controller.binding.generator.util.TypeConstants;
+import org.opendaylight.controller.binding.generator.util.Types;
 import org.opendaylight.controller.sal.binding.model.api.AnnotationType;
 import org.opendaylight.controller.sal.binding.model.api.Constant;
 import org.opendaylight.controller.sal.binding.model.api.Enumeration;
@@ -33,30 +35,22 @@ public final class GeneratorUtil {
     private GeneratorUtil() {
     }
 
-    public static String createIfcDeclaration(final GeneratedType genType,
-            final String indent,
+    public static String createIfcDeclaration(final GeneratedType genType, final String indent,
             final Map<String, LinkedHashMap<String, Integer>> availableImports) {
-        return createFileDeclaration(IFC, genType, indent, availableImports,
-                false);
+        return createFileDeclaration(IFC, genType, indent, availableImports, false);
     }
 
-    public static String createClassDeclaration(
-            final GeneratedTransferObject genTransferObject,
-            final String indent,
-            final Map<String, LinkedHashMap<String, Integer>> availableImports,
-            boolean isIdentity) {
-        return createFileDeclaration(CLASS, genTransferObject, indent,
-                availableImports, isIdentity);
+    public static String createClassDeclaration(final GeneratedTransferObject genTransferObject, final String indent,
+            final Map<String, LinkedHashMap<String, Integer>> availableImports, boolean isIdentity) {
+        return createFileDeclaration(CLASS, genTransferObject, indent, availableImports, isIdentity);
     }
 
     public static String createPackageDeclaration(final String packageName) {
         return PKG + GAP + packageName + SC;
     }
 
-    private static String createFileDeclaration(final String type,
-            final GeneratedType genType, final String indent,
-            final Map<String, LinkedHashMap<String, Integer>> availableImports,
-            boolean isIdentity) {
+    private static String createFileDeclaration(final String type, final GeneratedType genType, final String indent,
+            final Map<String, LinkedHashMap<String, Integer>> availableImports, boolean isIdentity) {
         final StringBuilder builder = new StringBuilder();
         final String currentPkg = genType.getPackageName();
 
@@ -70,11 +64,9 @@ public final class GeneratorUtil {
 
         if (isIdentity) {
             if (!(CLASS.equals(type))) {
-                throw new IllegalArgumentException(
-                        "'identity' has to be generated as a class");
+                throw new IllegalArgumentException("'identity' has to be generated as a class");
             }
-            builder.append(PUBLIC + GAP + ABSTRACT + GAP + type + GAP
-                    + genType.getName() + GAP);
+            builder.append(PUBLIC + GAP + ABSTRACT + GAP + type + GAP + genType.getName() + GAP);
         } else {
             builder.append(PUBLIC + GAP + type + GAP + genType.getName() + GAP);
         }
@@ -96,13 +88,11 @@ public final class GeneratorUtil {
             } else {
                 builder.append(EXTENDS + GAP);
             }
-            builder.append(getExplicitType(genImplements.get(0),
-                    availableImports, currentPkg));
+            builder.append(getExplicitType(genImplements.get(0), availableImports, currentPkg));
 
             for (int i = 1; i < genImplements.size(); ++i) {
                 builder.append(", ");
-                builder.append(getExplicitType(genImplements.get(i),
-                        availableImports, currentPkg));
+                builder.append(getExplicitType(genImplements.get(i), availableImports, currentPkg));
             }
         }
 
@@ -110,8 +100,7 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    private static StringBuilder appendAnnotations(final StringBuilder builder,
-            final List<AnnotationType> annotations) {
+    private static StringBuilder appendAnnotations(final StringBuilder builder, final List<AnnotationType> annotations) {
         if ((builder != null) && (annotations != null)) {
             for (final AnnotationType annotation : annotations) {
                 builder.append("@");
@@ -121,8 +110,7 @@ public final class GeneratorUtil {
 
                 if (annotation.containsParameters()) {
                     builder.append("(");
-                    final List<AnnotationType.Parameter> parameters = annotation
-                            .getParameters();
+                    final List<AnnotationType.Parameter> parameters = annotation.getParameters();
                     appendAnnotationParams(builder, parameters);
                     builder.append(")");
                 }
@@ -131,8 +119,7 @@ public final class GeneratorUtil {
         return builder;
     }
 
-    private static StringBuilder appendAnnotationParams(
-            final StringBuilder builder,
+    private static StringBuilder appendAnnotationParams(final StringBuilder builder,
             final List<AnnotationType.Parameter> parameters) {
         if (parameters != null) {
             int i = 0;
@@ -165,23 +152,44 @@ public final class GeneratorUtil {
         return builder;
     }
 
-    public static String createConstant(final Constant constant,
-            final String indent,
-            final Map<String, LinkedHashMap<String, Integer>> availableImports,
-            final String currentPkg) {
+    public static String createConstant(final Constant constant, final String indent,
+            final Map<String, LinkedHashMap<String, Integer>> availableImports, final String currentPkg) {
         final StringBuilder builder = new StringBuilder();
+        if (constant == null)
+            throw new IllegalArgumentException();
         builder.append(indent + PUBLIC + GAP + STATIC + GAP + FINAL + GAP);
-        builder.append(getExplicitType(constant.getType(), availableImports,
-                currentPkg) + GAP + constant.getName());
+        builder.append(getExplicitType(constant.getType(), availableImports, currentPkg) + GAP + constant.getName());
         builder.append(GAP + "=" + GAP);
-        builder.append(constant.getValue() + SC);
+        final Object constValue = constant.getValue();
+
+        if (constant.getName().equals(TypeConstants.PATTERN_CONSTANT_NAME)) {
+            if (constant.getName() == null || constant.getType() == null || constant.getValue() == null)
+                throw new IllegalArgumentException();
+            if (constValue instanceof List) {
+                builder.append("Arrays.asList" + LB);
+                final List<?> constantValues = (List<?>) constValue;
+                int stringsCount = 0;
+                for (Object value : constantValues) {
+                    if (value instanceof String) {
+                        if (stringsCount > 0) {
+                            builder.append(COMMA);
+                        }
+                        stringsCount++;
+                        builder.append(DOUBLE_QUOTE + (String) value + DOUBLE_QUOTE);
+                    }
+                }
+                builder.append(RB);
+            }
+        } else {
+            builder.append(constant.getValue());
+        }
+        builder.append(SC);
+
         return builder.toString();
     }
 
-    public static String createField(final GeneratedProperty property,
-            final String indent,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            final String currentPkg) {
+    public static String createField(final GeneratedProperty property, final String indent,
+            Map<String, LinkedHashMap<String, Integer>> availableImports, final String currentPkg) {
         final StringBuilder builder = new StringBuilder();
         if (!property.getAnnotations().isEmpty()) {
             final List<AnnotationType> annotations = property.getAnnotations();
@@ -189,8 +197,8 @@ public final class GeneratorUtil {
             builder.append(NL);
         }
         builder.append(indent + PRIVATE + GAP);
-        builder.append(getExplicitType(property.getReturnType(),
-                availableImports, currentPkg) + GAP + property.getName());
+        builder.append(getExplicitType(property.getReturnType(), availableImports, currentPkg) + GAP
+                + property.getName());
         builder.append(SC);
         return builder.toString();
     }
@@ -202,15 +210,12 @@ public final class GeneratorUtil {
      * @param indent
      * @return
      */
-    public static String createMethodDeclaration(final MethodSignature method,
-            final String indent,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            final String currentPkg) {
+    public static String createMethodDeclaration(final MethodSignature method, final String indent,
+            Map<String, LinkedHashMap<String, Integer>> availableImports, final String currentPkg) {
         final StringBuilder builder = new StringBuilder();
 
         if (method == null) {
-            throw new IllegalArgumentException(
-                    "Method Signature parameter MUST be specified and cannot be NULL!");
+            throw new IllegalArgumentException("Method Signature parameter MUST be specified and cannot be NULL!");
         }
 
         final String comment = method.getComment();
@@ -221,8 +226,7 @@ public final class GeneratorUtil {
 
         final Type type = method.getReturnType();
         if (type == null) {
-            throw new IllegalStateException(
-                    "Method Return type cannot be NULL!");
+            throw new IllegalStateException("Method Return type cannot be NULL!");
         }
 
         final List<Parameter> parameters = method.getParameters();
@@ -237,9 +241,7 @@ public final class GeneratorUtil {
             builder.append(NL);
         }
 
-        builder.append(indent
-                + getExplicitType(type, availableImports, currentPkg) + GAP
-                + name);
+        builder.append(indent + getExplicitType(type, availableImports, currentPkg) + GAP + name);
         builder.append(LB);
         for (int i = 0; i < parameters.size(); i++) {
             Parameter p = parameters.get(i);
@@ -247,8 +249,7 @@ public final class GeneratorUtil {
             if (i + 1 == parameters.size()) {
                 separator = "";
             }
-            builder.append(getExplicitType(p.getType(), availableImports,
-                    currentPkg) + GAP + p.getName() + separator);
+            builder.append(getExplicitType(p.getType(), availableImports, currentPkg) + GAP + p.getName() + separator);
         }
         builder.append(RB);
         builder.append(SC);
@@ -256,19 +257,18 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    public static String createConstructor(
-            GeneratedTransferObject genTransferObject, final String indent,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            boolean isIdentity) {
+    public static String createConstructor(GeneratedTransferObject genTransferObject, final String indent,
+            Map<String, LinkedHashMap<String, Integer>> availableImports, boolean isIdentity) {
         final StringBuilder builder = new StringBuilder();
 
         final String currentPkg = genTransferObject.getPackageName();
-        final List<GeneratedProperty> properties = genTransferObject
-                .getProperties();
+        final List<GeneratedProperty> properties = genTransferObject.getProperties();
         final List<GeneratedProperty> ctorParams = new ArrayList<GeneratedProperty>();
-        for (final GeneratedProperty property : properties) {
-            if (property.isReadOnly()) {
-                ctorParams.add(property);
+        if (properties != null) {
+            for (final GeneratedProperty property : properties) {
+                if (property.isReadOnly()) {
+                    ctorParams.add(property);
+                }
             }
         }
 
@@ -279,15 +279,13 @@ public final class GeneratorUtil {
         builder.append(LB);
 
         if (!ctorParams.isEmpty()) {
-            builder.append(getExplicitType(ctorParams.get(0).getReturnType(),
-                    availableImports, currentPkg));
+            builder.append(getExplicitType(ctorParams.get(0).getReturnType(), availableImports, currentPkg));
             builder.append(" ");
             builder.append(ctorParams.get(0).getName());
             for (int i = 1; i < ctorParams.size(); ++i) {
                 final GeneratedProperty param = ctorParams.get(i);
                 builder.append(", ");
-                builder.append(getExplicitType(param.getReturnType(),
-                        availableImports, currentPkg));
+                builder.append(getExplicitType(param.getReturnType(), availableImports, currentPkg));
                 builder.append(GAP);
                 builder.append(param.getName());
             }
@@ -305,15 +303,37 @@ public final class GeneratorUtil {
                 builder.append(NL);
             }
         }
+        List<Constant> consts = genTransferObject.getConstantDefinitions();
+        for (Constant con : consts) {
+            if (con.getName() == null || con.getType() == null || con.getValue() == null)
+                continue;
+            if (con.getName().equals(TypeConstants.PATTERN_CONSTANT_NAME)) {
+                Object values = con.getValue();
+                if (values instanceof List) {
+                    for (Object regEx : (List<?>) values) {
+                        if (regEx instanceof String) {
+                            builder.append(indent + TAB + "for (String regEx : " + TypeConstants.PATTERN_CONSTANT_NAME
+                                    + ") {" + NL);
+                            builder.append(indent + TAB + TAB + "this." + MEMBER_PATTERN_LIST
+                                    + ".add(Pattern.compile(regEx))" + SC + NL);
+                            builder.append(indent + TAB + RCB + NL);
+
+                            break;
+                        }
+                    }
+
+                }
+            }
+
+        }
+
         builder.append(indent);
         builder.append(RCB);
         return builder.toString();
     }
 
-    public static String createGetter(final GeneratedProperty property,
-            final String indent,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            final String currentPkg) {
+    public static String createGetter(final GeneratedProperty property, final String indent,
+            Map<String, LinkedHashMap<String, Integer>> availableImports, final String currentPkg) {
         final StringBuilder builder = new StringBuilder();
 
         final Type type = property.getReturnType();
@@ -321,9 +341,7 @@ public final class GeneratorUtil {
         final char first = Character.toUpperCase(varName.charAt(0));
         final String methodName = "get" + first + varName.substring(1);
 
-        builder.append(indent + PUBLIC + GAP
-                + getExplicitType(type, availableImports, currentPkg) + GAP
-                + methodName);
+        builder.append(indent + PUBLIC + GAP + getExplicitType(type, availableImports, currentPkg) + GAP + methodName);
         builder.append(LB + RB + LCB + NL);
 
         String currentIndent = indent + TAB;
@@ -334,10 +352,8 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    public static String createSetter(final GeneratedProperty property,
-            final String indent,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            String currentPkg) {
+    public static String createSetter(final GeneratedProperty property, final String indent,
+            Map<String, LinkedHashMap<String, Integer>> availableImports, String currentPkg) {
         final StringBuilder builder = new StringBuilder();
 
         final Type type = property.getReturnType();
@@ -346,17 +362,14 @@ public final class GeneratorUtil {
         final String methodName = "set" + first + varName.substring(1);
 
         builder.append(indent + PUBLIC + GAP + "void" + GAP + methodName);
-        builder.append(LB + getExplicitType(type, availableImports, currentPkg)
-                + GAP + varName + RB + LCB + NL);
+        builder.append(LB + getExplicitType(type, availableImports, currentPkg) + GAP + varName + RB + LCB + NL);
         String currentIndent = indent + TAB;
-        builder.append(currentIndent + "this." + varName + " = " + varName + SC
-                + NL);
+        builder.append(currentIndent + "this." + varName + " = " + varName + SC + NL);
         builder.append(indent + RCB);
         return builder.toString();
     }
 
-    public static String createHashCode(
-            final List<GeneratedProperty> properties, final String indent) {
+    public static String createHashCode(final List<GeneratedProperty> properties, final String indent) {
         StringBuilder builder = new StringBuilder();
         builder.append(indent + "public int hashCode() {" + NL);
         builder.append(indent + TAB + "final int prime = 31;" + NL);
@@ -364,8 +377,7 @@ public final class GeneratorUtil {
 
         for (GeneratedProperty property : properties) {
             String fieldName = property.getName();
-            builder.append(indent + TAB + "result = prime * result + (("
-                    + fieldName + " == null) ? 0 : " + fieldName
+            builder.append(indent + TAB + "result = prime * result + ((" + fieldName + " == null) ? 0 : " + fieldName
                     + ".hashCode());" + NL);
         }
 
@@ -374,8 +386,8 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    public static String createEquals(final GeneratedTransferObject type,
-            final List<GeneratedProperty> properties, final String indent) {
+    public static String createEquals(final GeneratedTransferObject type, final List<GeneratedProperty> properties,
+            final String indent) {
         StringBuilder builder = new StringBuilder();
         final String indent1 = indent + TAB;
         final String indent2 = indent1 + TAB;
@@ -393,18 +405,15 @@ public final class GeneratorUtil {
         builder.append(indent1 + "}" + NL);
 
         String typeStr = type.getName();
-        builder.append(indent1 + typeStr + " other = (" + typeStr + ") obj;"
-                + NL);
+        builder.append(indent1 + typeStr + " other = (" + typeStr + ") obj;" + NL);
 
         for (GeneratedProperty property : properties) {
             String fieldName = property.getName();
             builder.append(indent1 + "if (" + fieldName + " == null) {" + NL);
-            builder.append(indent2 + "if (other." + fieldName + " != null) {"
-                    + NL);
+            builder.append(indent2 + "if (other." + fieldName + " != null) {" + NL);
             builder.append(indent3 + "return false;" + NL);
             builder.append(indent2 + "}" + NL);
-            builder.append(indent1 + "} else if (!" + fieldName
-                    + ".equals(other." + fieldName + ")) {" + NL);
+            builder.append(indent1 + "} else if (!" + fieldName + ".equals(other." + fieldName + ")) {" + NL);
             builder.append(indent2 + "return false;" + NL);
             builder.append(indent1 + "}" + NL);
         }
@@ -415,8 +424,8 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    public static String createToString(final GeneratedTransferObject type,
-            final List<GeneratedProperty> properties, final String indent) {
+    public static String createToString(final GeneratedTransferObject type, final List<GeneratedProperty> properties,
+            final String indent) {
         StringBuilder builder = new StringBuilder();
         builder.append(indent);
         builder.append("public String toString() {");
@@ -474,12 +483,11 @@ public final class GeneratorUtil {
         return builder.toString();
     }
 
-    public static String createEnum(final Enumeration enumeration,
-            final String indent) {
+    public static String createEnum(final Enumeration enumeration, final String indent) {
         if (enumeration == null || indent == null)
             throw new IllegalArgumentException();
-        final StringBuilder builder = new StringBuilder(indent + PUBLIC + GAP
-                + ENUM + GAP + enumeration.getName() + GAP + LCB + NL);
+        final StringBuilder builder = new StringBuilder(indent + PUBLIC + GAP + ENUM + GAP + enumeration.getName()
+                + GAP + LCB + NL);
 
         String separator = COMMA + NL;
         final List<Pair> values = enumeration.getValues();
@@ -488,21 +496,17 @@ public final class GeneratorUtil {
             if (i + 1 == values.size()) {
                 separator = SC;
             }
-            builder.append(indent + TAB + values.get(i).getName() + LB
-                    + values.get(i).getValue() + RB + separator);
+            builder.append(indent + TAB + values.get(i).getName() + LB + values.get(i).getValue() + RB + separator);
         }
         builder.append(NL);
         builder.append(NL);
         final String ENUMERATION_NAME = "value";
         final String ENUMERATION_TYPE = "int";
-        builder.append(indent + TAB + ENUMERATION_TYPE + GAP + ENUMERATION_NAME
-                + SC);
+        builder.append(indent + TAB + ENUMERATION_TYPE + GAP + ENUMERATION_NAME + SC);
         builder.append(NL);
-        builder.append(indent + TAB + PRIVATE + GAP + enumeration.getName()
-                + LB + ENUMERATION_TYPE + GAP + ENUMERATION_NAME + RB + GAP
-                + LCB + NL);
-        builder.append(indent + TAB + TAB + "this." + ENUMERATION_NAME + GAP
-                + "=" + GAP + ENUMERATION_NAME + SC + NL);
+        builder.append(indent + TAB + PRIVATE + GAP + enumeration.getName() + LB + ENUMERATION_TYPE + GAP
+                + ENUMERATION_NAME + RB + GAP + LCB + NL);
+        builder.append(indent + TAB + TAB + "this." + ENUMERATION_NAME + GAP + "=" + GAP + ENUMERATION_NAME + SC + NL);
         builder.append(indent + TAB + RCB + NL);
 
         builder.append(indent + RCB);
@@ -511,27 +515,21 @@ public final class GeneratorUtil {
     }
 
     private static String getExplicitType(final Type type,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            final String currentPkg) {
+            Map<String, LinkedHashMap<String, Integer>> availableImports, final String currentPkg) {
         if (type == null) {
-            throw new IllegalArgumentException(
-                    "Type parameter MUST be specified and cannot be NULL!");
+            throw new IllegalArgumentException("Type parameter MUST be specified and cannot be NULL!");
         }
         String packageName = type.getPackageName();
 
-        LinkedHashMap<String, Integer> imports = availableImports.get(type
-                .getName());
+        LinkedHashMap<String, Integer> imports = availableImports.get(type.getName());
 
-        if ((imports != null && packageName
-                .equals(findMaxValue(imports).get(0)))
-                || packageName.equals(currentPkg)) {
+        if ((imports != null && packageName.equals(findMaxValue(imports).get(0))) || packageName.equals(currentPkg)) {
             final StringBuilder builder = new StringBuilder(type.getName());
             if (type instanceof ParameterizedType) {
                 ParameterizedType pType = (ParameterizedType) type;
                 Type[] pTypes = pType.getActualTypeArguments();
                 builder.append("<");
-                builder.append(getParameters(pTypes, availableImports,
-                        currentPkg));
+                builder.append(getParameters(pTypes, availableImports, currentPkg));
                 builder.append(">");
             }
             if (builder.toString().equals("Void")) {
@@ -554,8 +552,7 @@ public final class GeneratorUtil {
                 ParameterizedType pType = (ParameterizedType) type;
                 Type[] pTypes = pType.getActualTypeArguments();
                 builder.append("<");
-                builder.append(getParameters(pTypes, availableImports,
-                        currentPkg));
+                builder.append(getParameters(pTypes, availableImports, currentPkg));
                 builder.append(">");
             }
             if (builder.toString().equals("Void")) {
@@ -566,8 +563,7 @@ public final class GeneratorUtil {
     }
 
     private static String getParameters(final Type[] pTypes,
-            Map<String, LinkedHashMap<String, Integer>> availableImports,
-            String currentPkg) {
+            Map<String, LinkedHashMap<String, Integer>> availableImports, String currentPkg) {
         final StringBuilder builder = new StringBuilder();
         for (int i = 0; i < pTypes.length; i++) {
             Type t = pTypes[i];
@@ -576,20 +572,18 @@ public final class GeneratorUtil {
             if (i + 1 == pTypes.length) {
                 separator = "";
             }
-            
+
             String wildcardParam = "";
-            if(t instanceof WildcardType) {
+            if (t instanceof WildcardType) {
                 wildcardParam = "? extends ";
             }
-            
-            builder.append(wildcardParam + getExplicitType(t, availableImports, currentPkg)
-                    + separator);
+
+            builder.append(wildcardParam + getExplicitType(t, availableImports, currentPkg) + separator);
         }
         return builder.toString();
     }
 
-    private static List<String> findMaxValue(
-            LinkedHashMap<String, Integer> imports) {
+    private static List<String> findMaxValue(LinkedHashMap<String, Integer> imports) {
         final List<String> result = new ArrayList<String>();
 
         int maxValue = 0;
@@ -607,8 +601,7 @@ public final class GeneratorUtil {
         return result;
     }
 
-    private static void createComment(final StringBuilder builder,
-            final String comment, final String indent) {
+    private static void createComment(final StringBuilder builder, final String comment, final String indent) {
         if (comment != null && comment.length() > 0) {
             builder.append(indent + "/*" + NL);
             builder.append(indent + comment + NL);
@@ -616,13 +609,12 @@ public final class GeneratorUtil {
         }
     }
 
-    public static Map<String, LinkedHashMap<String, Integer>> createImports(
-            GeneratedType genType) {
+    public static Map<String, LinkedHashMap<String, Integer>> createImports(GeneratedType genType) {
         final Map<String, LinkedHashMap<String, Integer>> imports = new HashMap<String, LinkedHashMap<String, Integer>>();
         final String genTypePkg = genType.getPackageName();
 
         final List<Constant> constants = genType.getConstantDefinitions();
-               final List<MethodSignature> methods = genType.getMethodDefinitions();
+        final List<MethodSignature> methods = genType.getMethodDefinitions();
         List<Type> impl = genType.getImplements();
 
         // IMPLEMENTATIONS
@@ -664,16 +656,23 @@ public final class GeneratorUtil {
             }
         }
 
+        // REGULAR EXPRESSION
+        if (genType instanceof GeneratedTransferObject) {
+            if (isConstantInTO(TypeConstants.PATTERN_CONSTANT_NAME, (GeneratedTransferObject) genType)) {
+                addTypeToImports(Types.typeForClass(java.util.regex.Pattern.class), imports, genTypePkg);
+                addTypeToImports(Types.typeForClass(java.util.Arrays.class), imports, genTypePkg);
+                addTypeToImports(Types.typeForClass(java.util.ArrayList.class), imports, genTypePkg);
+            }
+        }
+
         return imports;
     }
 
-    private static void addTypeToImports(Type type,
-            Map<String, LinkedHashMap<String, Integer>> importedTypes,
+    private static void addTypeToImports(Type type, Map<String, LinkedHashMap<String, Integer>> importedTypes,
             String genTypePkg) {
         String typeName = type.getName();
         String typePkg = type.getPackageName();
-               if (typePkg.startsWith("java.lang") || typePkg.equals(genTypePkg) ||
-                typePkg.isEmpty()) {
+        if (typePkg.startsWith("java.lang") || typePkg.equals(genTypePkg) || typePkg.isEmpty()) {
             return;
         }
         LinkedHashMap<String, Integer> packages = importedTypes.get(typeName);
@@ -700,12 +699,10 @@ public final class GeneratorUtil {
         }
     }
 
-    public static List<String> createImportLines(
-            Map<String, LinkedHashMap<String, Integer>> imports) {
+    public static List<String> createImportLines(Map<String, LinkedHashMap<String, Integer>> imports) {
         List<String> importLines = new ArrayList<String>();
 
-        for (Map.Entry<String, LinkedHashMap<String, Integer>> entry : imports
-                .entrySet()) {
+        for (Map.Entry<String, LinkedHashMap<String, Integer>> entry : imports.entrySet()) {
             String typeName = entry.getKey();
             LinkedHashMap<String, Integer> typePkgMap = entry.getValue();
             String typePkg = typePkgMap.keySet().iterator().next();
@@ -714,4 +711,17 @@ public final class GeneratorUtil {
         return importLines;
     }
 
+    public static boolean isConstantInTO(String constName, GeneratedTransferObject genTO) {
+        if (constName == null || genTO == null)
+            throw new IllegalArgumentException();
+        List<Constant> consts = genTO.getConstantDefinitions();
+        for (Constant cons : consts) {
+            if (cons.getName().equals(constName)) {
+                return true;
+            }
+
+        }
+        return false;
+    }
+
 }
diff --git a/opendaylight/sal/yang-prototype/code-generator/samples/maven-code-gen-sample/src/main/yang/simple-string-demo.yang b/opendaylight/sal/yang-prototype/code-generator/samples/maven-code-gen-sample/src/main/yang/simple-string-demo.yang
new file mode 100644 (file)
index 0000000..c0f87dd
--- /dev/null
@@ -0,0 +1,22 @@
+module simple-string-demo {
+
+    namespace "urn:simple:string:demo";
+    prefix "sbd";
+
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    revision 2013-06-18 {
+        
+    }
+
+    typedef typedef-string {
+        type string {
+            length "40";
+            pattern "[0-9A-F]\.*";
+            pattern "[B-D]*";
+            pattern "[4-7]*";
+        }
+    }
+
+}
index 8ca88d8d6110aa6807da562ff3c2543c10faeb57..d6722be51a359ccf0e72b363100514f4bfdc6512 100644 (file)
@@ -15,7 +15,6 @@ import org.opendaylight.controller.yang.model.api.DataSchemaNode;
 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
 
 public abstract class AbstractDataNodeContainerBuilder implements DataNodeContainerBuilder {
-
     private final QName qname;
 
     protected Set<DataSchemaNode> childNodes;
@@ -34,7 +33,12 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai
     }
 
     @Override
-    public Set<DataSchemaNodeBuilder> getChildNodes() {
+    public Set<DataSchemaNode> getChildNodes() {
+        return childNodes;
+    }
+
+    @Override
+    public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
         return addedChildNodes;
     }
 
@@ -47,7 +51,12 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai
         this.childNodes = childNodes;
     }
 
-    public Set<GroupingBuilder> getGroupings() {
+    @Override
+    public Set<GroupingDefinition> getGroupings() {
+        return groupings;
+    }
+
+    public Set<GroupingBuilder> getGroupingBuilders() {
         return addedGroupings;
     }
 
diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java
new file mode 100644 (file)
index 0000000..c8e6968
--- /dev/null
@@ -0,0 +1,83 @@
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.yang.parser.builder.api;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.SchemaPath;\r
+import org.opendaylight.controller.yang.model.api.Status;\r
+import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;\r
+\r
+/**\r
+ * Basic implementation of SchemaNodeBuilder.\r
+ */\r
+public abstract class AbstractSchemaNodeBuilder implements SchemaNodeBuilder {\r
+    protected final int line;\r
+    protected final QName qname;\r
+    protected SchemaPath path;\r
+    protected String description;\r
+    protected String reference;\r
+    protected Status status = Status.CURRENT;\r
+    protected final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();\r
+\r
+    protected AbstractSchemaNodeBuilder(final QName qname, final int line) {\r
+        this.qname = qname;\r
+        this.line = line;\r
+    }\r
+\r
+    @Override\r
+    public int getLine() {\r
+        return line;\r
+    }\r
+\r
+    public QName getQName() {\r
+        return qname;\r
+    }\r
+\r
+    public SchemaPath getPath() {\r
+        return path;\r
+    }\r
+\r
+    public void setPath(SchemaPath schemaPath) {\r
+        this.path = schemaPath;\r
+    }\r
+\r
+    public String getDescription() {\r
+        return description;\r
+    }\r
+\r
+    public void setDescription(String description) {\r
+        this.description = description;\r
+    }\r
+\r
+    public String getReference() {\r
+        return reference;\r
+    }\r
+\r
+    public void setReference(String reference) {\r
+        this.reference = reference;\r
+    }\r
+\r
+    public Status getStatus() {\r
+        return status;\r
+    }\r
+\r
+    public void setStatus(Status status) {\r
+        if (status != null) {\r
+            this.status = status;\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {\r
+        addedUnknownNodes.add(unknownNode);\r
+    }\r
+\r
+}\r
index f99179846c160b9965dd35e0739862b3e0cbd1aa..76fe19f79413e180aa1b25d6bd1d0c71eb13fd61 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.controller.yang.parser.builder.api;
 
-import java.util.Set;
-
 import org.opendaylight.controller.yang.model.api.AugmentationSchema;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
@@ -18,6 +16,8 @@ import org.opendaylight.controller.yang.model.api.Status;
  */
 public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder {
 
+    Builder getParent();
+
     String getWhenCondition();
 
     void addWhenCondition(String whenCondition);
@@ -34,8 +34,6 @@ public interface AugmentationSchemaBuilder extends DataNodeContainerBuilder {
 
     void setTargetPath(SchemaPath path);
 
-    Set<DataSchemaNodeBuilder> getChildNodes();
-
     AugmentationSchema build();
 
     boolean isResolved();
index ee50d2ad02cc3b422ee5eebd227abffd2aa48bd9..1d199c2c64147ce6345723605807b296dcadb824 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.controller.yang.parser.builder.api;
 
+import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
+
 /**
  * Parent interface for all builder interfaces.
  */
@@ -25,4 +27,6 @@ public interface Builder {
 
     int getLine();
 
+    void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode);
+
 }
diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/ConfigNode.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/ConfigNode.java
new file mode 100644 (file)
index 0000000..85f6b07
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.yang.parser.builder.api;
+
+/**
+ * Interface for all nodes which can have 'config' statement.
+ * [container, leaf, leaf-list, list, choice, anyxml, deviate]
+ *
+ */
+public interface ConfigNode {
+
+    Boolean isConfiguration();
+
+    void setConfiguration(Boolean config);
+
+}
index e64bb02c6daf57cb1e46d8fd35031108a0d24e1f..13b7e4874e533b0290b09592950b86a3d19e4c59 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.controller.yang.parser.builder.api;
 import java.util.Set;
 
 import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.model.api.DataSchemaNode;
+import org.opendaylight.controller.yang.model.api.GroupingDefinition;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 
 /**
@@ -20,20 +22,24 @@ public interface DataNodeContainerBuilder extends Builder {
 
     QName getQName();
 
-    Set<DataSchemaNodeBuilder> getChildNodes();
+    SchemaPath getPath();
+
+    Set<DataSchemaNode> getChildNodes();
+
+    Set<DataSchemaNodeBuilder> getChildNodeBuilders();
 
     void addChildNode(DataSchemaNodeBuilder childNode);
 
-    Set<GroupingBuilder> getGroupings();
+    Set<GroupingDefinition> getGroupings();
+
+    Set<GroupingBuilder> getGroupingBuilders();
 
     void addGrouping(GroupingBuilder groupingBuilder);
 
     void addUsesNode(UsesNodeBuilder usesBuilder);
 
-    Set<TypeDefinitionBuilder> getTypeDefinitions();
+    Set<TypeDefinitionBuilder> getTypeDefinitionBuilders();
 
     void addTypedef(TypeDefinitionBuilder typedefBuilder);
 
-    SchemaPath getPath();
-
 }
index e4088a84a699e7de66d0d5385bfdbe84bb60c6bb..20d9417f9d5d57768ff13ddf81f2853fe29d89af 100644 (file)
@@ -11,20 +11,12 @@ import java.util.List;
 import java.util.Set;
 
 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
-import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 
 /**
  * Interface for builders of 'grouping' statement.
  */
-public interface GroupingBuilder extends DataNodeContainerBuilder, SchemaNodeBuilder,
-        TypeDefinitionAwareBuilder {
-
-    String getDescription();
-
-    String getReference();
-
-    Status getStatus();
+public interface GroupingBuilder extends DataNodeContainerBuilder, SchemaNodeBuilder, TypeDefinitionAwareBuilder, GroupingMember {
 
     GroupingDefinition build();
 
@@ -32,8 +24,6 @@ public interface GroupingBuilder extends DataNodeContainerBuilder, SchemaNodeBui
 
     List<UnknownSchemaNodeBuilder> getUnknownNodes();
 
-    Set<GroupingBuilder> getGroupings();
-
     Set<UsesNodeBuilder> getUses();
 
 }
diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingMember.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingMember.java
new file mode 100644 (file)
index 0000000..bcdc077
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.yang.parser.builder.api;
+
+/**
+ * Marker interface for nodes which can be defined in grouping statement.
+ * [anyxml, choice, container, grouping, leaf, leaf-list, list, typedef, uses]
+ */
+public interface GroupingMember extends Builder {
+
+    boolean isAddedByUses();
+
+    void setAddedByUses(boolean addedByUses);
+
+}
index db3ac36d69124dd6d4830c5294ec8bd49af482fa..289dcfe9881ab0950a210914bd0b730245245da4 100644 (file)
@@ -9,8 +9,8 @@ package org.opendaylight.controller.yang.parser.builder.api;
 \r
 import java.util.List;\r
 \r
-import org.opendaylight.controller.yang.model.api.Status;\r
 import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;\r
 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;\r
 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;\r
 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;\r
@@ -19,17 +19,10 @@ import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBui
 /**\r
  * Interface for builders of 'typedef' statement.\r
  */\r
-public interface TypeDefinitionBuilder extends TypeAwareBuilder,\r
-        SchemaNodeBuilder {\r
+public interface TypeDefinitionBuilder extends TypeAwareBuilder, SchemaNodeBuilder, GroupingMember {\r
 \r
     TypeDefinition<?> build();\r
 \r
-    String getDescription();\r
-\r
-    String getReference();\r
-\r
-    Status getStatus();\r
-\r
     List<RangeConstraint> getRanges();\r
 \r
     void setRanges(List<RangeConstraint> ranges);\r
@@ -46,7 +39,9 @@ public interface TypeDefinitionBuilder extends TypeAwareBuilder,
 \r
     void setFractionDigits(Integer fractionDigits);\r
 \r
-    List<UnknownSchemaNodeBuilder> getUnknownNodes();\r
+    List<UnknownSchemaNode> getUnknownNodes();\r
+\r
+    List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders();\r
 \r
     Object getDefaultValue();\r
 \r
index c295c0eafdc824f68b04249f463cbc4630a42c10..626f0f460748d57d8958366171eff5289b51e4a7 100644 (file)
@@ -17,15 +17,15 @@ import org.opendaylight.controller.yang.parser.util.RefineHolder;
 /**
  * Interface for builders of 'uses' statement.
  */
-public interface UsesNodeBuilder extends Builder {
+public interface UsesNodeBuilder extends GroupingMember, Builder {
 
-    String getGroupingName();
+    DataNodeContainerBuilder getParent();
 
-    void setGroupingPath(SchemaPath groupingPath);
+    String getGroupingName();
 
-    SchemaPath getPath();
+    SchemaPath getGroupingPath();
 
-    void setPath(SchemaPath path);
+    void setGroupingPath(SchemaPath groupingPath);
 
     Set<AugmentationSchemaBuilder> getAugmentations();
 
index 78284c142e108cf9d70d92cac2ba809be2a29266..d5f3c52497bf593880c6c46ee9f4672f1605f8bb 100644 (file)
@@ -17,32 +17,47 @@ import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 
-public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
+public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder, GroupingMember,
+        ConfigNode {
     private boolean built;
-    private final int line;
-    private final QName qname;
-    private SchemaPath path;
     private final AnyXmlSchemaNodeImpl instance;
     private final ConstraintsBuilder constraints;
 
     private List<UnknownSchemaNode> unknownNodes;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
-    private boolean configuration;
+    private Boolean configuration;
     private boolean augmenting;
+    private boolean addedByUses;
 
-    public AnyXmlBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+    public AnyXmlBuilder(final QName qname, final SchemaPath schemaPath, final int line) {
+        super(qname, line);
+        this.path = schemaPath;
         instance = new AnyXmlSchemaNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public AnyXmlBuilder(final AnyXmlBuilder builder) {
+        super(builder.qname, builder.line);
+        instance = new AnyXmlSchemaNodeImpl(qname);
+        constraints = builder.constraints;
+        path = builder.path;
+        unknownNodes = builder.unknownNodes;
+        for (UnknownSchemaNodeBuilder un : builder.addedUnknownNodes) {
+            addedUnknownNodes.add(un);
+        }
+        description = builder.description;
+        reference = builder.reference;
+        status = builder.status;
+        configuration = builder.configuration;
+        augmenting = builder.augmenting;
+        addedByUses = builder.addedByUses;
+    }
+
     @Override
     public AnyXmlSchemaNode build() {
         if (!built) {
@@ -53,9 +68,10 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
             instance.setStatus(status);
             instance.setConfiguration(configuration);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
 
             // UNKNOWN NODES
-            if(unknownNodes == null) {
+            if (unknownNodes == null) {
                 unknownNodes = new ArrayList<UnknownSchemaNode>();
                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
                     unknownNodes.add(b.build());
@@ -68,35 +84,11 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    public SchemaPath getPath() {
-        return path;
-    }
-
-    @Override
-    public void setPath(final SchemaPath path) {
-        this.path = path;
-    }
-
     @Override
     public ConstraintsBuilder getConstraints() {
         return constraints;
     }
 
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
-
     public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
         return addedUnknownNodes;
     }
@@ -105,52 +97,34 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
         this.unknownNodes = unknownNodes;
     }
 
-    public String getDescription() {
-        return description;
-    }
-
     @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    public String getReference() {
-        return reference;
+    public boolean isAugmenting() {
+        return augmenting;
     }
 
     @Override
-    public void setReference(final String reference) {
-        this.reference = reference;
-    }
-
-    public Status getStatus() {
-        return status;
+    public void setAugmenting(final boolean augmenting) {
+        this.augmenting = augmenting;
     }
 
     @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            this.status = status;
-        }
+    public boolean isAddedByUses() {
+        return addedByUses;
     }
 
     @Override
-    public boolean isAugmenting() {
-        return augmenting;
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
     }
 
     @Override
-    public void setAugmenting(final boolean augmenting) {
-        this.augmenting = augmenting;
-    }
-
-    public boolean isConfiguration() {
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(final boolean configuration) {
-        instance.setConfiguration(configuration);
+    public void setConfiguration(final Boolean configuration) {
+        this.configuration = configuration;
     }
 
     private final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode {
@@ -162,6 +136,7 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private boolean augmenting;
+        private boolean addedByUses;
         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
 
         private AnyXmlSchemaNodeImpl(final QName qname) {
@@ -220,6 +195,15 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -289,8 +273,7 @@ public final class AnyXmlBuilder implements DataSchemaNodeBuilder {
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    AnyXmlSchemaNodeImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(AnyXmlSchemaNodeImpl.class.getSimpleName());
             sb.append("[");
             sb.append("qname=" + qname);
             sb.append(", path=" + path);
index 775751a166ef7d2c58a9565d3cd9bb1bef5692c4..b18f2558f74e6f559c023693c480708c7d3d6668 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.controller.yang.parser.builder.impl;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -21,9 +23,11 @@ import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.Builder;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
@@ -35,21 +39,30 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
     private boolean built;
     private final AugmentationSchemaImpl instance;
     private final int line;
+    private final Builder parent;
+
+    private String whenCondition;
+    private String description;
+    private String reference;
+    private Status status = Status.CURRENT;
+
     private final String augmentTargetStr;
-    private SchemaPath augmentTarget;
+    private SchemaPath dirtyAugmentTarget;
     private SchemaPath finalAugmentTarget;
-    private String whenCondition;
+
     private final Set<DataSchemaNodeBuilder> childNodes = new HashSet<DataSchemaNodeBuilder>();
     private final Set<GroupingBuilder> groupings = new HashSet<GroupingBuilder>();
     private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     private boolean resolved;
 
-    AugmentationSchemaBuilderImpl(final String augmentTargetStr, final int line) {
+    AugmentationSchemaBuilderImpl(final String augmentTargetStr, final int line, final Builder parent) {
         this.augmentTargetStr = augmentTargetStr;
         this.line = line;
+        this.parent = parent;
         final SchemaPath targetPath = YangModelBuilderUtil
                 .parseAugmentPath(augmentTargetStr);
-        augmentTarget = targetPath;
+        dirtyAugmentTarget = targetPath;
         instance = new AugmentationSchemaImpl(targetPath);
     }
 
@@ -58,18 +71,34 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
         return line;
     }
 
+    @Override
+    public Builder getParent() {
+        return parent;
+    }
+
+
     @Override
     public void addChildNode(DataSchemaNodeBuilder childNode) {
         childNodes.add(childNode);
     }
 
     @Override
-    public Set<DataSchemaNodeBuilder> getChildNodes() {
+    public Set<DataSchemaNode> getChildNodes() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
         return childNodes;
     }
 
     @Override
-    public Set<GroupingBuilder> getGroupings() {
+    public Set<GroupingDefinition> getGroupings() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<GroupingBuilder> getGroupingBuilders() {
         return groupings;
     }
 
@@ -102,6 +131,9 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
     @Override
     public AugmentationSchema build() {
         if (!built) {
+            instance.setDescription(description);
+            instance.setReference(reference);
+            instance.setStatus(status);
             instance.setTargetPath(finalAugmentTarget);
 
             RevisionAwareXPath whenStmt;
@@ -133,6 +165,13 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
             }
             instance.setUses(usesNodeDefinitions);
 
+            // UNKNOWN NODES
+            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build());
+            }
+            instance.setUnknownSchemaNodes(unknownNodes);
+
             built = true;
         }
         return instance;
@@ -157,34 +196,36 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return Collections.emptySet();
     }
 
     @Override
     public void addTypedef(TypeDefinitionBuilder type) {
         throw new YangParseException(line,
-                "Augmentation can not contains type definitions");
+                "Augmentation can not contains typedef statement.");
     }
 
     @Override
     public void setDescription(String description) {
-        instance.setDescription(description);
+        this.description = description;
     }
 
     @Override
     public void setReference(String reference) {
-        instance.setReference(reference);
+        this.reference = reference;
     }
 
     @Override
     public void setStatus(Status status) {
-        instance.setStatus(status);
+        if(status != null) {
+            this.status = status;
+        }
     }
 
     @Override
     public SchemaPath getTargetPath() {
-        return augmentTarget;
+        return dirtyAugmentTarget;
     }
 
     @Override
@@ -197,6 +238,15 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
         return augmentTargetStr;
     }
 
+    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+        return addedUnknownNodes;
+    }
+
+    @Override
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
+        addedUnknownNodes.add(unknownNode);
+    }
+
     @Override
     public int hashCode() {
         final int prime = 17;
@@ -253,10 +303,10 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
         private Set<GroupingDefinition> groupings = Collections.emptySet();
         private Set<UsesNode> uses = Collections.emptySet();
-
         private String description;
         private String reference;
         private Status status;
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
 
         private AugmentationSchemaImpl(SchemaPath targetPath) {
             this.targetPath = targetPath;
@@ -349,6 +399,17 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
             this.status = status;
         }
 
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return unknownNodes;
+        }
+
+        private void setUnknownSchemaNodes(
+                List<UnknownSchemaNode> unknownSchemaNodes) {
+            if (unknownSchemaNodes != null) {
+                this.unknownNodes = unknownSchemaNodes;
+            }
+        }
+
         @Override
         public DataSchemaNode getDataChildByName(QName name) {
             return childNodes.get(name);
@@ -421,9 +482,7 @@ public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBu
                     AugmentationSchemaImpl.class.getSimpleName());
             sb.append("[");
             sb.append("targetPath=" + targetPath);
-            sb.append(", childNodes=" + childNodes.values());
-            sb.append(", groupings=" + groupings);
-            sb.append(", uses=" + uses);
+            sb.append(", when=" + whenCondition);
             sb.append("]");
             return sb.toString();
         }
index 1ba1a2dfdcb3dd1224710da31cdf4ba7ff50813b..0761618b06093bebfa60f1520722034fe3126513 100644 (file)
@@ -21,25 +21,24 @@ import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
+import org.opendaylight.controller.yang.parser.util.ParserUtils;
 
-public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationTargetBuilder {
+public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder,
+        AugmentationTargetBuilder, GroupingMember, ConfigNode {
     private boolean isBuilt;
     private final ChoiceNodeImpl instance;
-    private final int line;
     // SchemaNode args
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     private List<UnknownSchemaNode> unknownNodes;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     // DataSchemaNode args
     private boolean augmenting;
-    private boolean configuration;
+    private boolean addedByUses;
+    private Boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
     private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
@@ -49,26 +48,45 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
     private String defaultCase;
 
     public ChoiceBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+        super(qname, line);
         instance = new ChoiceNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public ChoiceBuilder(ChoiceBuilder b) {
+        super(b.getQName(), b.getLine());
+        instance = new ChoiceNodeImpl(qname);
+        constraints = b.constraints;
+        path = b.getPath();
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.getUnknownNodes());
+        augmenting = b.isAugmenting();
+        addedByUses = b.isAddedByUses();
+        configuration = b.isConfiguration();
+        addedAugmentations.addAll(b.getAugmentations());
+        cases = b.cases;
+        addedCases.addAll(b.getCases());
+        defaultCase = b.getDefaultCase();
+    }
+
     @Override
     public ChoiceNode build() {
         if (!isBuilt) {
-            instance.setPath(schemaPath);
+            instance.setPath(path);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
             instance.setConfiguration(configuration);
             instance.setConstraints(constraints.build());
             instance.setDefaultCase(defaultCase);
 
             // CASES
-            if(cases == null) {
+            if (cases == null) {
                 cases = new HashSet<ChoiceCaseNode>();
                 for (ChoiceCaseBuilder caseBuilder : addedCases) {
                     cases.add(caseBuilder.build());
@@ -84,7 +102,7 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
             instance.setAvailableAugmentations(augmentations);
 
             // UNKNOWN NODES
-            if(unknownNodes == null) {
+            if (unknownNodes == null) {
                 unknownNodes = new ArrayList<UnknownSchemaNode>();
                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
                     unknownNodes.add(b.build());
@@ -103,18 +121,16 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
         build();
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
     public Set<ChoiceCaseBuilder> getCases() {
         return addedCases;
     }
 
     public void addChildNode(DataSchemaNodeBuilder childNode) {
         if (!(childNode instanceof ChoiceCaseBuilder)) {
-            ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(childNode.getQName(), childNode.getLine());
+            ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(this, childNode.getQName(), childNode.getLine());
+            caseBuilder.setPath(childNode.getPath());
+            SchemaPath newPath = ParserUtils.createSchemaPath(childNode.getPath(), childNode.getQName().getLocalName());
+            childNode.setPath(newPath);
             caseBuilder.addChildNode(childNode);
             addedCases.add(caseBuilder);
         } else {
@@ -126,64 +142,31 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
         this.cases = cases;
     }
 
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(final SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    public String getReference() {
-        return reference;
+    public boolean isAugmenting() {
+        return augmenting;
     }
 
     @Override
-    public void setReference(String reference) {
-        this.reference = reference;
-    }
-
-    public Status getStatus() {
-        return status;
+    public void setAugmenting(boolean augmenting) {
+        this.augmenting = augmenting;
     }
 
     @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            this.status = status;
-        }
-    }
-
-    public boolean isAugmenting() {
-        return augmenting;
+    public boolean isAddedByUses() {
+        return addedByUses;
     }
 
     @Override
-    public void setAugmenting(boolean augmenting) {
-        this.augmenting = augmenting;
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
     }
 
-    public boolean isConfiguration() {
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(boolean configuration) {
+    public void setConfiguration(Boolean configuration) {
         this.configuration = configuration;
     }
 
@@ -205,11 +188,6 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
         return addedUnknownNodes;
     }
 
-    @Override
-    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
-
     public void setUnknownNodes(List<UnknownSchemaNode> unknownNodes) {
         this.unknownNodes = unknownNodes;
     }
@@ -229,6 +207,7 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
         private String reference;
         private Status status = Status.CURRENT;
         private boolean augmenting;
+        private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
         private Set<ChoiceCaseNode> cases = Collections.emptySet();
@@ -292,6 +271,15 @@ public final class ChoiceBuilder implements DataSchemaNodeBuilder, AugmentationT
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index d54cd22ec8615e5fa2652656e614e4305cd5557b..cfd3866841129178cd242ce9ea7bd97a03e817e8 100644 (file)
@@ -27,23 +27,29 @@ import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.controller.yang.parser.util.YangParseException;
 
-public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements
-        DataSchemaNodeBuilder, AugmentationTargetBuilder {
+public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
+        AugmentationTargetBuilder {
     private boolean isBuilt;
     private final ChoiceCaseNodeImpl instance;
+    private final ChoiceBuilder parent;
     private final int line;
+    // SchemaNode args
     private SchemaPath schemaPath;
     private String description;
     private String reference;
     private Status status = Status.CURRENT;
     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
+    // DataSchemaNode args
     private boolean augmenting;
     private final ConstraintsBuilder constraints;
+    // DataNodeContainer args
     private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
+    // AugmentationTarget args
     private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
 
-    ChoiceCaseBuilder(final QName qname, final int line) {
+    ChoiceCaseBuilder(final ChoiceBuilder parent, final QName qname, final int line) {
         super(qname);
+        this.parent = parent;
         this.line = line;
         instance = new ChoiceCaseNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
@@ -51,7 +57,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
     @Override
     public ChoiceCaseNode build() {
-        if(!isBuilt) {
+        if (!isBuilt) {
             instance.setConstraints(constraints.build());
             instance.setPath(schemaPath);
             instance.setDescription(description);
@@ -104,6 +110,10 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
         return line;
     }
 
+    public ChoiceBuilder getParent() {
+        return parent;
+    }
+
     public SchemaPath getPath() {
         return schemaPath;
     }
@@ -170,25 +180,13 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return Collections.emptySet();
     }
 
     @Override
     public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
-        throw new YangParseException(line,
-                "Can not add type definition to choice case.");
-    }
-
-    @Override
-    public boolean isConfiguration() {
-        return false;
-    }
-
-    @Override
-    public void setConfiguration(boolean configuration) {
-        throw new YangParseException(line,
-                "Can not add config definition to choice case.");
+        throw new YangParseException(line, "Can not add type definition to choice case.");
     }
 
     @Override
@@ -284,6 +282,11 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return false;
+        }
+
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
             return unknownNodes;
@@ -353,8 +356,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
             return augmentations;
         }
 
-        private void setAvailableAugmentations(
-                Set<AugmentationSchema> augmentations) {
+        private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
             if (augmentations != null) {
                 this.augmentations = augmentations;
             }
@@ -404,8 +406,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    ChoiceCaseNodeImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(ChoiceCaseNodeImpl.class.getSimpleName());
             sb.append("[");
             sb.append("qname=" + qname);
             sb.append("]");
index b1aa7de06a58fddcfad9884abeba13d651f47761..ebfe520c3978344570bbc6e83674c214f78a4f84 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.controller.yang.model.api.MustDefinition;
 import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.controller.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.controller.yang.parser.builder.api.Builder;
+import org.opendaylight.controller.yang.parser.util.YangParseException;
 
 public final class ConstraintsBuilder implements Builder {
     private final ConstraintDefinitionImpl instance;
@@ -53,6 +54,11 @@ public final class ConstraintsBuilder implements Builder {
         return line;
     }
 
+    @Override
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
+        throw new YangParseException(line, "Can not add unknown node to constraints.");
+    }
+
     public Integer getMinElements() {
         return min;
     }
@@ -93,8 +99,7 @@ public final class ConstraintsBuilder implements Builder {
         this.mandatory = mandatory;
     }
 
-    private final class ConstraintDefinitionImpl implements
-            ConstraintDefinition {
+    private final class ConstraintDefinitionImpl implements ConstraintDefinition {
         private RevisionAwareXPath whenCondition;
         private Set<MustDefinition> mustConstraints;
         private boolean mandatory;
@@ -156,16 +161,10 @@ public final class ConstraintsBuilder implements Builder {
         public int hashCode() {
             final int prime = 31;
             int result = 1;
-            result = prime * result
-                    + ((whenCondition == null) ? 0 : whenCondition.hashCode());
-            result = prime
-                    * result
-                    + ((mustConstraints == null) ? 0 : mustConstraints
-                            .hashCode());
-            result = prime * result
-                    + ((minElements == null) ? 0 : minElements.hashCode());
-            result = prime * result
-                    + ((maxElements == null) ? 0 : maxElements.hashCode());
+            result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode());
+            result = prime * result + ((mustConstraints == null) ? 0 : mustConstraints.hashCode());
+            result = prime * result + ((minElements == null) ? 0 : minElements.hashCode());
+            result = prime * result + ((maxElements == null) ? 0 : maxElements.hashCode());
             result = prime * result + (mandatory ? 1231 : 1237);
             return result;
         }
@@ -218,8 +217,7 @@ public final class ConstraintsBuilder implements Builder {
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    ConstraintDefinitionImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(ConstraintDefinitionImpl.class.getSimpleName());
             sb.append("[");
             sb.append("whenCondition=" + whenCondition);
             sb.append(", mustConstraints=" + mustConstraints);
index e677d3c7a5c2d9412ec533b474e60e984febba2a..a194dea927a0e9097f5c8143f5bdddb7c6c5ad4e 100644 (file)
@@ -29,42 +29,78 @@ import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionAwareBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 
-public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder
-        implements TypeDefinitionAwareBuilder, AugmentationTargetBuilder,
-        DataSchemaNodeBuilder {
+public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements
+        TypeDefinitionAwareBuilder, AugmentationTargetBuilder, DataSchemaNodeBuilder, GroupingMember, ConfigNode {
     private boolean isBuilt;
     private final ContainerSchemaNodeImpl instance;
     private final int line;
-    private final ConstraintsBuilder constraints;
+
+    // SchemaNode args
     private SchemaPath schemaPath;
     private String description;
     private String reference;
     private Status status = Status.CURRENT;
-    private boolean presence;
+    private List<UnknownSchemaNode> unknownNodes;
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
+    // DataSchemaNode args
     private boolean augmenting;
-    private boolean configuration;
+    private boolean addedByUses;
+    private Boolean configuration;
+    private final ConstraintsBuilder constraints;
+    // DataNodeContainer args
     private Set<TypeDefinition<?>> typedefs;
     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
     private Set<UsesNode> usesNodes;
     private final Set<UsesNodeBuilder> addedUsesNodes = new HashSet<UsesNodeBuilder>();
+    // AugmentationTarget args
     private Set<AugmentationSchema> augmentations;
     private final Set<AugmentationSchemaBuilder> addedAugmentations = new HashSet<AugmentationSchemaBuilder>();
-    private List<UnknownSchemaNode> unknownNodes;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
+    // ContainerSchemaNode args
+    private boolean presence;
 
-    public ContainerSchemaNodeBuilder(final QName qname, final int line) {
+    public ContainerSchemaNodeBuilder(final QName qname, final SchemaPath schemaPath, final int line) {
         super(qname);
+        this.schemaPath = schemaPath;
         this.line = line;
         instance = new ContainerSchemaNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public ContainerSchemaNodeBuilder(final ContainerSchemaNodeBuilder b) {
+        super(b.getQName());
+        line = b.getLine();
+        instance = new ContainerSchemaNodeImpl(b.getQName());
+        constraints = b.getConstraints();
+        schemaPath = b.getPath();
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        presence = b.isPresence();
+        augmenting = b.isAugmenting();
+        addedByUses = b.isAddedByUses();
+        configuration = b.isConfiguration();
+        childNodes = b.getChildNodes();
+        addedChildNodes.addAll(b.getChildNodeBuilders());
+        groupings = b.getGroupings();
+        addedGroupings.addAll(b.getGroupingBuilders());
+        typedefs = b.typedefs;
+        addedTypedefs.addAll(b.getTypeDefinitionBuilders());
+        usesNodes = b.usesNodes;
+        addedUsesNodes.addAll(b.getUsesNodes());
+        augmentations = b.augmentations;
+        addedAugmentations.addAll(b.getAugmentations());
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.getUnknownNodes());
+    }
+
     @Override
     public ContainerSchemaNode build() {
         if (!isBuilt) {
@@ -74,23 +110,29 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setStatus(status);
             instance.setPresenceContainer(presence);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
+
+            // if this builder represents rpc input or output, it can has configuration value set to null
+            if(configuration == null) {
+                configuration = false;
+            }
             instance.setConfiguration(configuration);
 
             // CHILD NODES
             final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
-            if(childNodes == null) {
+            if (childNodes == null) {
                 for (DataSchemaNodeBuilder node : addedChildNodes) {
                     childs.put(node.getQName(), node.build());
                 }
             } else {
-                for(DataSchemaNode node : childNodes) {
+                for (DataSchemaNode node : childNodes) {
                     childs.put(node.getQName(), node);
                 }
             }
             instance.setChildNodes(childs);
 
             // GROUPINGS
-            if(groupings == null) {
+            if (groupings == null) {
                 groupings = new HashSet<GroupingDefinition>();
                 for (GroupingBuilder builder : addedGroupings) {
                     groupings.add(builder.build());
@@ -99,7 +141,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setGroupings(groupings);
 
             // TYPEDEFS
-            if(typedefs == null) {
+            if (typedefs == null) {
                 typedefs = new HashSet<TypeDefinition<?>>();
                 for (TypeDefinitionBuilder entry : addedTypedefs) {
                     typedefs.add(entry.build());
@@ -108,7 +150,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setTypeDefinitions(typedefs);
 
             // USES
-            if(usesNodes == null) {
+            if (usesNodes == null) {
                 usesNodes = new HashSet<UsesNode>();
                 for (UsesNodeBuilder builder : addedUsesNodes) {
                     usesNodes.add(builder.build());
@@ -117,7 +159,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setUses(usesNodes);
 
             // AUGMENTATIONS
-            if(augmentations == null) {
+            if (augmentations == null) {
                 augmentations = new HashSet<AugmentationSchema>();
                 for (AugmentationSchemaBuilder builder : addedAugmentations) {
                     augmentations.add(builder.build());
@@ -126,7 +168,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             instance.setAvailableAugmentations(augmentations);
 
             // UNKNOWN NODES
-            if(unknownNodes == null) {
+            if (unknownNodes == null) {
                 unknownNodes = new ArrayList<UnknownSchemaNode>();
                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
                     unknownNodes.add(b.build());
@@ -154,7 +196,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return addedTypedefs;
     }
 
@@ -232,12 +274,22 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
     }
 
     @Override
-    public boolean isConfiguration() {
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
+    @Override
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(boolean configuration) {
+    public void setConfiguration(Boolean configuration) {
         this.configuration = configuration;
     }
 
@@ -292,6 +344,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
         private String reference;
         private Status status = Status.CURRENT;
         private boolean augmenting;
+        private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
         private Set<AugmentationSchema> augmentations = Collections.emptySet();
@@ -358,6 +411,15 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -381,8 +443,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             return augmentations;
         }
 
-        private void setAvailableAugmentations(
-                Set<AugmentationSchema> augmentations) {
+        private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
             if (augmentations != null) {
                 this.augmentations = augmentations;
             }
@@ -463,8 +524,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
             return unknownNodes;
         }
 
-        private void setUnknownSchemaNodes(
-                List<UnknownSchemaNode> unknownSchemaNodes) {
+        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
             if (unknownSchemaNodes != null) {
                 this.unknownNodes = unknownSchemaNodes;
             }
@@ -514,8 +574,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    ContainerSchemaNodeImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(ContainerSchemaNodeImpl.class.getSimpleName());
             sb.append("[");
             sb.append("qname=" + qname);
             sb.append("]");
index 239c0a5ed9a8da6c3a1682975f7a8b8258941e17..790275cff404a11c551ff96edfbe0623946a448b 100644 (file)
@@ -7,9 +7,14 @@
  */
 package org.opendaylight.controller.yang.parser.builder.impl;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.opendaylight.controller.yang.model.api.Deviation;
 import org.opendaylight.controller.yang.model.api.Deviation.Deviate;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.parser.builder.api.Builder;
 import org.opendaylight.controller.yang.parser.util.YangModelBuilderUtil;
 import org.opendaylight.controller.yang.parser.util.YangParseException;
@@ -17,6 +22,7 @@ import org.opendaylight.controller.yang.parser.util.YangParseException;
 public final class DeviationBuilder implements Builder {
     private final DeviationImpl instance;
     private final int line;
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     DeviationBuilder(final String targetPathStr, final int line) {
         this.line = line;
@@ -27,6 +33,13 @@ public final class DeviationBuilder implements Builder {
 
     @Override
     public Deviation build() {
+        // UNKNOWN NODES
+        List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
+        for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+            unknownNodes.add(b.build());
+        }
+        instance.setUnknownSchemaNodes(unknownNodes);
+
         return instance;
     }
 
@@ -35,6 +48,11 @@ public final class DeviationBuilder implements Builder {
         return line;
     }
 
+    @Override
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
+        addedUnknownNodes.add(unknownNode);
+    }
+
     public void setDeviate(final String deviate) {
         if ("not-supported".equals(deviate)) {
             instance.setDeviate(Deviate.NOT_SUPPORTED);
@@ -58,6 +76,7 @@ public final class DeviationBuilder implements Builder {
         private final SchemaPath targetPath;
         private Deviate deviate;
         private String reference;
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
 
         private DeviationImpl(final SchemaPath targetPath) {
             this.targetPath = targetPath;
@@ -86,6 +105,16 @@ public final class DeviationBuilder implements Builder {
             this.reference = reference;
         }
 
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return unknownNodes;
+        }
+
+        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
+            if (unknownSchemaNodes != null) {
+                this.unknownNodes = unknownSchemaNodes;
+            }
+        }
+
         @Override
         public int hashCode() {
             final int prime = 31;
index 0558b91cd0c0ed97140c99eef9600a30dd893848..65fd1c49d93873f5c022c2625b296ea2e2000304 100644 (file)
@@ -16,30 +16,22 @@ import org.opendaylight.controller.yang.model.api.ExtensionDefinition;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 
-public final class ExtensionBuilder implements SchemaNodeBuilder {
+public final class ExtensionBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
     private final ExtensionDefinitionImpl instance;
-    private final int line;
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     private final List<UnknownSchemaNodeBuilder> addedExtensions = new ArrayList<UnknownSchemaNodeBuilder>();
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     ExtensionBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+        super(qname, line);
         instance = new ExtensionDefinitionImpl(qname);
     }
 
     @Override
     public ExtensionDefinition build() {
         if(!isBuilt) {
-            instance.setPath(schemaPath);
+            instance.setPath(path);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
@@ -57,10 +49,6 @@ public final class ExtensionBuilder implements SchemaNodeBuilder {
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
 
     public void addExtension(UnknownSchemaNodeBuilder extension) {
         addedExtensions.add(extension);
@@ -74,55 +62,6 @@ public final class ExtensionBuilder implements SchemaNodeBuilder {
         instance.setArgument(argument);
     }
 
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        this.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(final Status status) {
-        instance.setStatus(status);
-    }
-
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
 
     private final class ExtensionDefinitionImpl implements ExtensionDefinition {
         private final QName qname;
index 0681cf6b155211b6b017c2e66f493f41fabb5cda..758478ba8cea169de30586f4b68d9b02d5ffbc98 100644 (file)
@@ -16,29 +16,21 @@ import org.opendaylight.controller.yang.model.api.FeatureDefinition;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 
-public final class FeatureBuilder implements SchemaNodeBuilder {
+public final class FeatureBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
     private final FeatureDefinitionImpl instance;
-    private final int line;
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     FeatureBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+        super(qname, line);
         instance = new FeatureDefinitionImpl(qname);
     }
 
     @Override
     public FeatureDefinitionImpl build() {
-        if(!isBuilt) {
-            instance.setPath(schemaPath);
+        if (!isBuilt) {
+            instance.setPath(path);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
@@ -55,61 +47,6 @@ public final class FeatureBuilder implements SchemaNodeBuilder {
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        this.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(final Status status) {
-        this.status = status;
-    }
-
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
-
     private final class FeatureDefinitionImpl implements FeatureDefinition {
         private final QName qname;
         private SchemaPath path;
@@ -170,8 +107,7 @@ public final class FeatureBuilder implements SchemaNodeBuilder {
             return unknownNodes;
         }
 
-        private void setUnknownSchemaNodes(
-                final List<UnknownSchemaNode> unknownNodes) {
+        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
             if (unknownNodes != null) {
                 this.unknownNodes = unknownNodes;
             }
@@ -217,8 +153,7 @@ public final class FeatureBuilder implements SchemaNodeBuilder {
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    FeatureDefinitionImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(FeatureDefinitionImpl.class.getSimpleName());
             sb.append("[name=" + qname + "]");
             return sb.toString();
         }
index 5428259324a700a5c65ed9ac8378d0dd4df4e7ef..1cfba2517f434a84266576c674cc8ba60f886b83 100644 (file)
@@ -37,6 +37,7 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
     private String description;
     private String reference;
     private Status status = Status.CURRENT;
+    private boolean addedByUses;
 
     private Set<DataSchemaNode> childNodes;
     private final Set<DataSchemaNodeBuilder> addedChildNodes = new HashSet<DataSchemaNodeBuilder>();
@@ -55,10 +56,27 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
 
     public GroupingBuilderImpl(final QName qname, final int line) {
         this.qname = qname;
-        this.instance = new GroupingDefinitionImpl(qname);
+        instance = new GroupingDefinitionImpl(qname);
         this.line = line;
     }
 
+    public GroupingBuilderImpl(GroupingBuilder builder) {
+        qname = builder.getQName();
+        instance = new GroupingDefinitionImpl(qname);
+        line = builder.getLine();
+        schemaPath = builder.getPath();
+        description = builder.getDescription();
+        reference = builder.getReference();
+        status = builder.getStatus();
+        addedByUses = builder.isAddedByUses();
+        childNodes = builder.getChildNodes();
+        addedChildNodes.addAll(builder.getChildNodeBuilders());
+        groupings = builder.getGroupings();
+        addedGroupings.addAll(builder.getGroupingBuilders());
+        addedUsesNodes.addAll(builder.getUses());
+        addedUnknownNodes.addAll(builder.getUnknownNodes());
+    }
+
     @Override
     public GroupingDefinition build() {
         if (!isBuilt) {
@@ -66,15 +84,16 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
+            instance.setAddedByUses(addedByUses);
 
             // CHILD NODES
             final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
-            if(childNodes == null) {
+            if (childNodes == null) {
                 for (DataSchemaNodeBuilder node : addedChildNodes) {
                     childs.put(node.getQName(), node.build());
                 }
             } else {
-                for(DataSchemaNode node : childNodes) {
+                for (DataSchemaNode node : childNodes) {
                     childs.put(node.getQName(), node);
                 }
             }
@@ -133,7 +152,7 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return addedTypedefs;
     }
 
@@ -186,6 +205,16 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
         this.status = status;
     }
 
+    @Override
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
     @Override
     public DataSchemaNodeBuilder getChildNode(String name) {
         DataSchemaNodeBuilder result = null;
@@ -198,13 +227,18 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
         return result;
     }
 
+    @Override
+    public Set<DataSchemaNode> getChildNodes() {
+        return childNodes;
+    }
+
     @Override
     public void addChildNode(final DataSchemaNodeBuilder childNode) {
         addedChildNodes.add(childNode);
     }
 
     @Override
-    public Set<DataSchemaNodeBuilder> getChildNodes() {
+    public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
         return addedChildNodes;
     }
 
@@ -213,7 +247,12 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
     }
 
     @Override
-    public Set<GroupingBuilder> getGroupings() {
+    public Set<GroupingDefinition> getGroupings() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<GroupingBuilder> getGroupingBuilders() {
         return addedGroupings;
     }
 
@@ -261,6 +300,7 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
         private String description;
         private String reference;
         private Status status;
+        private boolean addedByUses;
         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
         private Set<GroupingDefinition> groupings = Collections.emptySet();
         private Set<TypeDefinition<?>> typeDefinitions = Collections.emptySet();
@@ -312,6 +352,15 @@ public final class GroupingBuilderImpl implements GroupingBuilder {
             this.status = status;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public Set<DataSchemaNode> getChildNodes() {
             return new HashSet<DataSchemaNode>(childNodes.values());
index 6b76314e5cd5163c950a84ca88bc94a1664006ef..9cce264e60b131679b3ce52460ec8cda373a3a4c 100644 (file)
@@ -16,32 +16,24 @@ import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 
-public final class IdentitySchemaNodeBuilder implements SchemaNodeBuilder {
+public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
     private final IdentitySchemaNodeImpl instance;
-    private final int line;
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     private IdentitySchemaNodeBuilder baseIdentityBuilder;
     private IdentitySchemaNode baseIdentity;
     private String baseIdentityName;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     IdentitySchemaNodeBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+        super(qname, line);
         instance = new IdentitySchemaNodeImpl(qname);
     }
 
     @Override
     public IdentitySchemaNode build() {
-        if(!isBuilt) {
-            instance.setPath(schemaPath);
+        if (!isBuilt) {
+            instance.setPath(path);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
@@ -67,63 +59,6 @@ public final class IdentitySchemaNodeBuilder implements SchemaNodeBuilder {
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    @Override
-    public void setReference(final String reference) {
-        this.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            this.status = status;
-        }
-    }
-
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
-
     public String getBaseIdentityName() {
         return baseIdentityName;
     }
index 175910d9135b2087dd9d8e6d27c00f5314f5d236..ea504afae15293c9b5b9ca48fe8439f8fbd1c111 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.controller.yang.common.QName;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
@@ -28,8 +29,7 @@ import org.opendaylight.controller.yang.parser.util.YangParseException;
  * When build is called, types in builder form will be built and add to resolved
  * types.
  */
-public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
-        implements TypeDefinitionBuilder {
+public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder implements TypeDefinitionBuilder {
     private static final String NAME = "identityref";
 
     private final int line;
@@ -37,8 +37,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
     private final SchemaPath schemaPath;
     private QName baseQName;
 
-    IdentityrefTypeBuilder(final String baseString,
-            final SchemaPath schemaPath, final int line) {
+    IdentityrefTypeBuilder(final String baseString, final SchemaPath schemaPath, final int line) {
         this.line = line;
         this.baseString = baseString;
         this.schemaPath = schemaPath;
@@ -102,10 +101,24 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
         throw new YangParseException(line, "Can not set status to " + NAME);
     }
 
+    @Override
+    public boolean isAddedByUses() {
+        return false;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        throw new YangParseException(line, "Identityref type can not be added by uses.");
+    }
+
+    @Override
+    public List<UnknownSchemaNode> getUnknownNodes() {
+        return Collections.emptyList();
+    }
+
     @Override
     public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        throw new YangParseException(line, "Can not add unknown node to "
-                + NAME);
+        throw new YangParseException(line, "Can not add unknown node to " + NAME);
     }
 
     @Override
@@ -170,12 +183,11 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
 
     @Override
     public void setFractionDigits(Integer fractionDigits) {
-        throw new YangParseException(line, "Can not set fraction digits to "
-                + NAME);
+        throw new YangParseException(line, "Can not set fraction digits to " + NAME);
     }
 
     @Override
-    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+    public List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders() {
         return Collections.emptyList();
     }
 
@@ -186,8 +198,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
 
     @Override
     public void setDefaultValue(Object defaultValue) {
-        throw new YangParseException(line, "Can not set default value to "
-                + NAME);
+        throw new YangParseException(line, "Can not set default value to " + NAME);
     }
 
     @Override
@@ -202,8 +213,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder
 
     @Override
     public String toString() {
-        final StringBuilder result = new StringBuilder(
-                IdentityrefTypeBuilder.class.getSimpleName() + "[");
+        final StringBuilder result = new StringBuilder(IdentityrefTypeBuilder.class.getSimpleName() + "[");
         result.append(", base=" + baseQName);
         result.append("]");
         return result.toString();
index fdc8cd72dd6f576a2538e876e46a7e3ce7200690..9bbe5e9bd05d7225e9836ec2a932986ba0c64488 100644 (file)
@@ -19,9 +19,12 @@ import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.parser.builder.api.AbstractTypeAwareBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 
-public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
+public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder,
+        GroupingMember, ConfigNode {
     private boolean isBuilt;
     private final LeafListSchemaNodeImpl instance;
     private final int line;
@@ -35,18 +38,41 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     // DataSchemaNode args
     private boolean augmenting;
-    private boolean configuration;
+    private boolean addedByUses;
+    private Boolean configuration;
     private final ConstraintsBuilder constraints;
     // LeafListSchemaNode args
     private boolean userOrdered;
 
-    public LeafListSchemaNodeBuilder(final QName qname, final int line) {
+    public LeafListSchemaNodeBuilder(final QName qname, final SchemaPath schemaPath, final int line) {
         this.qname = qname;
+        this.schemaPath = schemaPath;
         this.line = line;
         instance = new LeafListSchemaNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public LeafListSchemaNodeBuilder(final LeafListSchemaNodeBuilder b) {
+        qname = b.getQName();
+        line = b.getLine();
+        instance = new LeafListSchemaNodeImpl(qname);
+
+        type = b.getType();
+        typedef = b.getTypedef();
+
+        constraints = b.getConstraints();
+        schemaPath = b.getPath();
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        augmenting = b.isAugmenting();
+        addedByUses = b.isAddedByUses();
+        configuration = b.isConfiguration();
+        userOrdered = b.isUserOrdered();
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.getUnknownNodes());
+    }
+
     @Override
     public LeafListSchemaNode build() {
         if (!isBuilt) {
@@ -56,6 +82,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             instance.setReference(reference);
             instance.setStatus(status);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
             instance.setConfiguration(configuration);
             instance.setUserOrdered(userOrdered);
 
@@ -136,12 +163,22 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         this.augmenting = augmenting;
     }
 
-    public boolean isConfiguration() {
+    @Override
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(boolean configuration) {
+    public void setConfiguration(Boolean configuration) {
         this.configuration = configuration;
     }
 
@@ -178,6 +215,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         private String reference;
         private Status status = Status.CURRENT;
         private boolean augmenting;
+        private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
@@ -238,6 +276,15 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index 786f08de49551957a2a43bc514450faebdd632f7..54720b44e1afac2706ad5265cf8d98b9db8ce1a6 100644 (file)
@@ -19,9 +19,12 @@ import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.parser.builder.api.AbstractTypeAwareBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 
-public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
+public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder,
+        GroupingMember, ConfigNode {
     private boolean isBuilt;
     private final LeafSchemaNodeImpl instance;
     private final int line;
@@ -35,19 +38,44 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     // DataSchemaNode args
     private boolean augmenting;
-    private boolean configuration;
+    private boolean addedByUses;
+    private Boolean configuration;
     private final ConstraintsBuilder constraints;
     // leaf args
     private String defaultStr;
     private String unitsStr;
 
-    public LeafSchemaNodeBuilder(final QName qname, final int line) {
+    public LeafSchemaNodeBuilder(final QName qname, final SchemaPath schemaPath, final int line) {
         this.qname = qname;
+        this.path = schemaPath;
         this.line = line;
         instance = new LeafSchemaNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public LeafSchemaNodeBuilder(final LeafSchemaNodeBuilder b) {
+        qname = b.getQName();
+        line = b.getLine();
+        instance = new LeafSchemaNodeImpl(qname);
+        constraints = b.getConstraints();
+        path = b.getPath();
+
+        type = b.getType();
+        typedef = b.getTypedef();
+
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        augmenting = b.isAugmenting();
+        addedByUses = b.isAddedByUses();
+        configuration = b.isConfiguration();
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.getUnknownNodes());
+
+        defaultStr = b.getDefaultStr();
+        unitsStr = b.getUnits();
+    }
+
     @Override
     public LeafSchemaNode build() {
         if (!isBuilt) {
@@ -57,6 +85,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             instance.setReference(reference);
             instance.setStatus(status);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
             instance.setConfiguration(configuration);
             instance.setDefault(defaultStr);
             instance.setUnits(unitsStr);
@@ -157,13 +186,23 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         this.augmenting = augmenting;
     }
 
-    public boolean isConfiguration() {
+    @Override
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(final boolean configuration) {
-        instance.setConfiguration(configuration);
+    public void setConfiguration(final Boolean configuration) {
+        this.configuration = configuration;
     }
 
     public String getDefaultStr() {
@@ -194,6 +233,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         private String reference;
         private Status status = Status.CURRENT;
         private boolean augmenting;
+        private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
@@ -257,6 +297,15 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index 63a66e0892425e2f3698cc2358aabcbb74a7cb6f..ce87e3bb99fac9ec4dfa24aa56780d10043ca8f7 100644 (file)
@@ -29,15 +29,16 @@ import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationTargetBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionAwareBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 
-public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilder
-        implements DataSchemaNodeBuilder, AugmentationTargetBuilder,
-        TypeDefinitionAwareBuilder {
+public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder,
+        AugmentationTargetBuilder, TypeDefinitionAwareBuilder, GroupingMember, ConfigNode {
     private boolean isBuilt;
     private final ListSchemaNodeImpl instance;
     private final int line;
@@ -50,7 +51,8 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     // DataSchemaNode args
     private boolean augmenting;
-    private boolean configuration;
+    private boolean addedByUses;
+    private Boolean configuration;
     private final ConstraintsBuilder constraints;
     // DataNodeContainer args
     private Set<TypeDefinition<?>> typedefs;
@@ -64,13 +66,42 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     private List<QName> keyDefinition = Collections.emptyList();
     private boolean userOrdered;
 
-    public ListSchemaNodeBuilder(final QName qname, final int line) {
+    public ListSchemaNodeBuilder(final QName qname, final SchemaPath schemaPath, final int line) {
         super(qname);
+        this.schemaPath = schemaPath;
         this.line = line;
         instance = new ListSchemaNodeImpl(qname);
         constraints = new ConstraintsBuilder(line);
     }
 
+    public ListSchemaNodeBuilder(final ListSchemaNodeBuilder b) {
+        super(b.getQName());
+        line = b.getLine();
+        instance = new ListSchemaNodeImpl(b.getQName());
+        constraints = b.getConstraints();
+        schemaPath = b.getPath();
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        augmenting = b.isAugmenting();
+        addedByUses = b.isAddedByUses();
+        configuration = b.isConfiguration();
+        keyDefinition = b.getKeyDefinition();
+        userOrdered = b.isUserOrdered();
+        childNodes = b.getChildNodes();
+        addedChildNodes.addAll(b.getChildNodeBuilders());
+        groupings = b.getGroupings();
+        addedGroupings.addAll(b.getGroupingBuilders());
+        typedefs = b.typedefs;
+        addedTypedefs.addAll(b.getTypeDefinitionBuilders());
+        usesNodes = b.usesNodes;
+        addedUsesNodes.addAll(b.getUsesNodes());
+        augmentations = b.augmentations;
+        addedAugmentations.addAll(b.getAugmentations());
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.getUnknownNodes());
+    }
+
     @Override
     public ListSchemaNode build() {
         if (!isBuilt) {
@@ -80,24 +111,25 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setReference(reference);
             instance.setStatus(status);
             instance.setAugmenting(augmenting);
+            instance.setAddedByUses(addedByUses);
             instance.setConfiguration(configuration);
             instance.setUserOrdered(userOrdered);
 
             // CHILD NODES
             final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
-            if(childNodes == null) {
+            if (childNodes == null) {
                 for (DataSchemaNodeBuilder node : addedChildNodes) {
                     childs.put(node.getQName(), node.build());
                 }
             } else {
-                for(DataSchemaNode node : childNodes) {
+                for (DataSchemaNode node : childNodes) {
                     childs.put(node.getQName(), node);
                 }
             }
             instance.setChildNodes(childs);
 
             // TYPEDEFS
-            if(typedefs == null) {
+            if (typedefs == null) {
                 typedefs = new HashSet<TypeDefinition<?>>();
                 for (TypeDefinitionBuilder entry : addedTypedefs) {
                     typedefs.add(entry.build());
@@ -106,7 +138,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setTypeDefinitions(typedefs);
 
             // USES
-            if(usesNodes == null) {
+            if (usesNodes == null) {
                 usesNodes = new HashSet<UsesNode>();
                 for (UsesNodeBuilder builder : addedUsesNodes) {
                     usesNodes.add(builder.build());
@@ -115,7 +147,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setUses(usesNodes);
 
             // GROUPINGS
-            if(groupings == null) {
+            if (groupings == null) {
                 groupings = new HashSet<GroupingDefinition>();
                 for (GroupingBuilder builder : addedGroupings) {
                     groupings.add(builder.build());
@@ -124,7 +156,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setGroupings(groupings);
 
             // AUGMENTATIONS
-            if(augmentations == null) {
+            if (augmentations == null) {
                 augmentations = new HashSet<AugmentationSchema>();
                 for (AugmentationSchemaBuilder builder : addedAugmentations) {
                     augmentations.add(builder.build());
@@ -133,7 +165,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             instance.setAvailableAugmentations(augmentations);
 
             // UNKNOWN NODES
-            if(unknownNodes == null) {
+            if (unknownNodes == null) {
                 unknownNodes = new ArrayList<UnknownSchemaNode>();
                 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
                     unknownNodes.add(b.build());
@@ -161,7 +193,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return addedTypedefs;
     }
 
@@ -257,12 +289,22 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         this.augmenting = augmenting;
     }
 
-    public boolean isConfiguration() {
+    @Override
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
+    public Boolean isConfiguration() {
         return configuration;
     }
 
     @Override
-    public void setConfiguration(boolean configuration) {
+    public void setConfiguration(Boolean configuration) {
         this.configuration = configuration;
     }
 
@@ -292,7 +334,6 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         this.unknownNodes = unknownNodes;
     }
 
-
     public final class ListSchemaNodeImpl implements ListSchemaNode {
         private final QName qname;
         private SchemaPath path;
@@ -301,6 +342,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
         private Status status = Status.CURRENT;
         private List<QName> keyDefinition = Collections.emptyList();
         private boolean augmenting;
+        private boolean addedByUses;
         private boolean configuration;
         private ConstraintDefinition constraints;
         private Set<AugmentationSchema> augmentations = Collections.emptySet();
@@ -376,6 +418,15 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             this.augmenting = augmenting;
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -399,8 +450,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
             return augmentations;
         }
 
-        private void setAvailableAugmentations(
-                Set<AugmentationSchema> augmentations) {
+        private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
             if (augmentations != null) {
                 this.augmentations = augmentations;
             }
@@ -531,8 +581,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    ListSchemaNodeImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(ListSchemaNodeImpl.class.getSimpleName());
             sb.append("[");
             sb.append("qname=" + qname);
             sb.append(", path=" + path);
index efa3849e90db4423f5ffee79d1d59ca2b1fec80a..0a9b6ddf373355736e4da8247c828ef155fc37b8 100644 (file)
@@ -52,7 +52,7 @@ import org.opendaylight.controller.yang.parser.util.YangParseException;
  * module/modules, these dependencies must be resolved before module is built,
  * otherwise result may not be valid.
  */
-public class ModuleBuilder implements Builder {
+public class ModuleBuilder implements DataNodeContainerBuilder {
     private final ModuleImpl instance;
     private final String name;
     private URI namespace;
@@ -80,7 +80,7 @@ public class ModuleBuilder implements Builder {
     private final Map<List<String>, TypeDefinitionBuilder> addedTypedefs = new HashMap<List<String>, TypeDefinitionBuilder>();
     private final Map<List<String>, UnionTypeBuilder> addedUnionTypes = new HashMap<List<String>, UnionTypeBuilder>();
     private final List<ExtensionBuilder> addedExtensions = new ArrayList<ExtensionBuilder>();
-    private final Map<List<String>, UnknownSchemaNodeBuilder> addedUnknownNodes = new HashMap<List<String>, UnknownSchemaNodeBuilder>();
+    private final Map<List<String>, List<UnknownSchemaNodeBuilder>> addedUnknownNodes = new HashMap<List<String>, List<UnknownSchemaNodeBuilder>>();
 
     private final Map<List<String>, TypeAwareBuilder> dirtyNodes = new HashMap<List<String>, TypeAwareBuilder>();
 
@@ -172,6 +172,30 @@ public class ModuleBuilder implements Builder {
         return 0;
     }
 
+    @Override
+    public QName getQName() {
+        return new QName(namespace, revision, prefix, name);
+    }
+
+    @Override
+    public SchemaPath getPath() {
+        return null;
+    }
+
+    @Override
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
+        final Set<TypeDefinitionBuilder> typeDefinitions = new HashSet<TypeDefinitionBuilder>();
+        for (final Map.Entry<List<String>, TypeDefinitionBuilder> entry : addedTypedefs.entrySet()) {
+            final List<String> key = entry.getKey();
+            final TypeDefinitionBuilder typedefBuilder = entry.getValue();
+            if (key.size() == 2) {
+                typeDefinitions.add(typedefBuilder);
+
+            }
+        }
+        return typeDefinitions;
+    }
+
     public void enterNode(final Builder node) {
         actualPath.push(node);
     }
@@ -188,6 +212,14 @@ public class ModuleBuilder implements Builder {
         }
     }
 
+    public Builder getActualParent() {
+        if (actualPath.size() < 2) {
+            return null;
+        } else {
+            return actualPath.get(1);
+        }
+    }
+
     public Builder getModuleNode(final List<String> path) {
         return childNodes.get(path);
     }
@@ -196,11 +228,32 @@ public class ModuleBuilder implements Builder {
         return addedGroupings.get(path);
     }
 
+    @Override
+    public Set<GroupingDefinition> getGroupings() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<GroupingBuilder> getGroupingBuilders() {
+        final Set<GroupingBuilder> result = new HashSet<GroupingBuilder>();
+        for (Map.Entry<List<String>, GroupingBuilder> entry : addedGroupings.entrySet()) {
+            if (entry.getKey().size() == 2) {
+                result.add(entry.getValue());
+            }
+        }
+        return result;
+    }
+
     public Builder getModuleTypedef(final List<String> path) {
         return addedTypedefs.get(path);
     }
 
-    public Set<DataSchemaNodeBuilder> getChildNodes() {
+    @Override
+    public Set<DataSchemaNode> getChildNodes() {
+        return Collections.emptySet();
+    }
+
+    public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
         final Set<DataSchemaNodeBuilder> children = new HashSet<DataSchemaNodeBuilder>();
         for (Map.Entry<List<String>, DataSchemaNodeBuilder> entry : childNodes.entrySet()) {
             final List<String> path = entry.getKey();
@@ -228,8 +281,12 @@ public class ModuleBuilder implements Builder {
         return addedUsesNodes;
     }
 
-    public Set<UnknownSchemaNodeBuilder> getUnknownNodes() {
-        return new HashSet<UnknownSchemaNodeBuilder>(addedUnknownNodes.values());
+    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+        List<UnknownSchemaNodeBuilder> result = new ArrayList<UnknownSchemaNodeBuilder>();
+        for (List<UnknownSchemaNodeBuilder> entry : addedUnknownNodes.values()) {
+            result.addAll(entry);
+        }
+        return result;
     }
 
     public Set<TypeDefinitionBuilder> getModuleTypedefs() {
@@ -329,10 +386,23 @@ public class ModuleBuilder implements Builder {
         return builder;
     }
 
-    public ContainerSchemaNodeBuilder addContainerNode(final QName containerName, final List<String> parentPath,
-            final int line) {
+    @Override
+    public void addChildNode(DataSchemaNodeBuilder child) {
+        final List<String> pathToChild = new ArrayList<String>();
+        for (QName qname : child.getPath().getPath()) {
+            pathToChild.add(qname.getLocalName());
+        }
+        if (childNodes.containsKey(pathToChild)) {
+            throw new YangParseException(this.name, child.getLine(), "Failed to add child node "
+                    + child.getQName().getLocalName() + ": node already exists in context.");
+        }
+        childNodes.put(pathToChild, child);
+    }
+
+    public ContainerSchemaNodeBuilder addContainerNode(final SchemaPath schemaPath, final QName containerName,
+            final List<String> parentPath, final int line) {
         final List<String> pathToNode = new ArrayList<String>(parentPath);
-        final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder(containerName, line);
+        final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder(containerName, schemaPath, line);
         updateParent(containerBuilder, line, "container");
 
         pathToNode.add(containerName.getLocalName());
@@ -341,9 +411,9 @@ public class ModuleBuilder implements Builder {
         return containerBuilder;
     }
 
-    public ListSchemaNodeBuilder addListNode(final QName listName, final List<String> parentPath, final int line) {
+    public ListSchemaNodeBuilder addListNode(final SchemaPath schemaPath, final QName listName, final List<String> parentPath, final int line) {
         final List<String> pathToNode = new ArrayList<String>(parentPath);
-        final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder(listName, line);
+        final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder(listName, schemaPath, line);
         updateParent(listBuilder, line, "list");
 
         pathToNode.add(listName.getLocalName());
@@ -352,9 +422,9 @@ public class ModuleBuilder implements Builder {
         return listBuilder;
     }
 
-    public LeafSchemaNodeBuilder addLeafNode(final QName leafName, final List<String> parentPath, final int line) {
+    public LeafSchemaNodeBuilder addLeafNode(final SchemaPath schemaPath, final QName leafName, final List<String> parentPath, final int line) {
         final List<String> pathToNode = new ArrayList<String>(parentPath);
-        final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(leafName, line);
+        final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(leafName, schemaPath, line);
         updateParent(leafBuilder, line, "leaf");
 
         pathToNode.add(leafName.getLocalName());
@@ -363,9 +433,9 @@ public class ModuleBuilder implements Builder {
         return leafBuilder;
     }
 
-    public LeafListSchemaNodeBuilder addLeafListNode(final QName qname, final List<String> parentPath, final int line) {
+    public LeafListSchemaNodeBuilder addLeafListNode(final SchemaPath schemaPath, final QName qname, final List<String> parentPath, final int line) {
         final List<String> pathToNode = new ArrayList<String>(parentPath);
-        final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(qname, line);
+        final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(qname, schemaPath, line);
         updateParent(leafListBuilder, line, "leaf-list");
 
         pathToNode.add(qname.getLocalName());
@@ -374,6 +444,19 @@ public class ModuleBuilder implements Builder {
         return leafListBuilder;
     }
 
+    @Override
+    public void addGrouping(GroupingBuilder groupingBuilder) {
+        final List<String> pathToGroup = new ArrayList<String>();
+        for (QName qname : groupingBuilder.getPath().getPath()) {
+            pathToGroup.add(qname.getLocalName());
+        }
+        if (addedGroupings.containsKey(pathToGroup)) {
+            throw new YangParseException(this.name, groupingBuilder.getLine(), "Failed to add grouping "
+                    + groupingBuilder.getQName().getLocalName() + ": grouping already exists in context.");
+        }
+        addedGroupings.put(pathToGroup, groupingBuilder);
+    }
+
     public GroupingBuilder addGrouping(final QName qname, final List<String> parentPath, final int line) {
         final List<String> pathToGroup = new ArrayList<String>(parentPath);
         final GroupingBuilder builder = new GroupingBuilderImpl(qname, line);
@@ -395,11 +478,14 @@ public class ModuleBuilder implements Builder {
 
     public AugmentationSchemaBuilder addAugment(final String name, final List<String> parentPath, final int line) {
         final List<String> pathToAugment = new ArrayList<String>(parentPath);
-        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line);
+        Builder parent = null;
+        if (!(actualPath.isEmpty())) {
+            parent = actualPath.getFirst();
+        }
+        final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, parent);
 
         // augment can only be in 'module' or 'uses' statement
-        if (!(actualPath.isEmpty())) {
-            final Builder parent = actualPath.getFirst();
+        if (parent != null) {
             if (parent instanceof UsesNodeBuilder) {
                 ((UsesNodeBuilder) parent).addAugment(builder);
             } else {
@@ -413,20 +499,37 @@ public class ModuleBuilder implements Builder {
         return builder;
     }
 
+    @Override
+    public void addUsesNode(UsesNodeBuilder usesBuilder) {
+        final List<String> pathToTypedef = new ArrayList<String>();
+        for (QName qname : usesBuilder.getParent().getPath().getPath()) {
+            pathToTypedef.add(qname.getLocalName());
+        }
+        if (addedUsesNodes.containsKey(pathToTypedef)) {
+            throw new YangParseException(this.name, usesBuilder.getLine(), "Failed to add uses node "
+                    + usesBuilder.getGroupingName() + ": uses already exists in context.");
+        }
+        addedUsesNodes.put(pathToTypedef, usesBuilder);
+    }
+
     public UsesNodeBuilder addUsesNode(final String groupingPathStr, final List<String> parentPath, final int line) {
         final List<String> pathToUses = new ArrayList<String>(parentPath);
-        final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(groupingPathStr, line);
-
-        if (!(actualPath.isEmpty())) {
-            final Builder parent = actualPath.getFirst();
-            if (parent instanceof DataNodeContainerBuilder) {
-                if (parent instanceof AugmentationSchemaBuilder) {
-                    usesBuilder.setAugmenting(true);
-                }
-                ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder);
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of uses " + groupingPathStr);
+        Builder parent = null;
+        if (!actualPath.isEmpty()) {
+            parent = actualPath.getFirst();
+        }
+        if (parent != null && !(parent instanceof DataNodeContainerBuilder)) {
+            throw new YangParseException(name, line, "Unresolved parent of uses " + groupingPathStr);
+        }
+        final UsesNodeBuilder usesBuilder;
+        if (parent == null) {
+            usesBuilder = new UsesNodeBuilderImpl(groupingPathStr, line, this);
+        } else {
+            usesBuilder = new UsesNodeBuilderImpl(groupingPathStr, line, (DataNodeContainerBuilder) parent);
+            if (parent instanceof AugmentationSchemaBuilder) {
+                usesBuilder.setAugmenting(true);
             }
+            ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder);
         }
 
         pathToUses.add(groupingPathStr);
@@ -466,26 +569,26 @@ public class ModuleBuilder implements Builder {
         return rpcBuilder;
     }
 
-    public ContainerSchemaNodeBuilder addRpcInput(final QName inputQName, final int line) {
+    public ContainerSchemaNodeBuilder addRpcInput(final SchemaPath schemaPath, final QName inputQName, final int line) {
         final Builder parent = actualPath.getFirst();
         if (!(parent instanceof RpcDefinitionBuilder)) {
             throw new YangParseException(name, line, "input can be defined only in rpc statement");
         }
         final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;
 
-        final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(inputQName, line);
+        final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(inputQName, schemaPath, line);
         rpc.setInput(inputBuilder);
         return inputBuilder;
     }
 
-    public ContainerSchemaNodeBuilder addRpcOutput(final QName outputQName, final int line) {
+    public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName outputQName, final int line) {
         final Builder parent = actualPath.getFirst();
         if (!(parent instanceof RpcDefinitionBuilder)) {
             throw new YangParseException(name, line, "output can be defined only in rpc statement");
         }
         final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent;
 
-        final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(outputQName, line);
+        final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(outputQName, schemaPath, line);
         rpc.setOutput(outputBuilder);
         return outputBuilder;
     }
@@ -540,13 +643,19 @@ public class ModuleBuilder implements Builder {
     }
 
     public ChoiceCaseBuilder addCase(final QName caseName, final List<String> parentPath, final int line) {
+        Builder parent = getActualNode();
+
         final List<String> pathToCase = new ArrayList<String>(parentPath);
-        final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(caseName, line);
+        ChoiceCaseBuilder builder = null;
+        if (parent instanceof ChoiceBuilder) {
+            builder = new ChoiceCaseBuilder((ChoiceBuilder) parent, caseName, line);
+        } else {
+            builder = new ChoiceCaseBuilder(null, caseName, line);
+        }
 
         if (actualPath.isEmpty()) {
             throw new YangParseException(name, line, "'case' parent not found");
         } else {
-            final Builder parent = actualPath.getFirst();
             if (parent instanceof ChoiceBuilder) {
                 ((ChoiceBuilder) parent).addChildNode(builder);
             } else if (parent instanceof AugmentationSchemaBuilder) {
@@ -563,9 +672,9 @@ public class ModuleBuilder implements Builder {
         return builder;
     }
 
-    public AnyXmlBuilder addAnyXml(final QName anyXmlName, final List<String> parentPath, final int line) {
+    public AnyXmlBuilder addAnyXml(final SchemaPath schemaPath, final QName anyXmlName, final List<String> parentPath, final int line) {
         final List<String> pathToAnyXml = new ArrayList<String>(parentPath);
-        final AnyXmlBuilder builder = new AnyXmlBuilder(anyXmlName, line);
+        final AnyXmlBuilder builder = new AnyXmlBuilder(anyXmlName, schemaPath, line);
         updateParent(builder, line, "anyxml");
 
         pathToAnyXml.add(anyXmlName.getLocalName());
@@ -574,6 +683,19 @@ public class ModuleBuilder implements Builder {
         return builder;
     }
 
+    @Override
+    public void addTypedef(TypeDefinitionBuilder typedefBuilder) {
+        final List<String> pathToTypedef = new ArrayList<String>();
+        for (QName qname : typedefBuilder.getPath().getPath()) {
+            pathToTypedef.add(qname.getLocalName());
+        }
+        if (addedTypedefs.containsKey(pathToTypedef)) {
+            throw new YangParseException(this.name, typedefBuilder.getLine(), "Failed to add typedef "
+                    + typedefBuilder.getQName().getLocalName() + ": typedef already exists in context.");
+        }
+        addedTypedefs.put(pathToTypedef, typedefBuilder);
+    }
+
     public TypeDefinitionBuilderImpl addTypedef(final QName typeDefName, final List<String> parentPath, final int line) {
         final List<String> pathToType = new ArrayList<String>(parentPath);
         final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(typeDefName, line);
@@ -671,22 +793,19 @@ public class ModuleBuilder implements Builder {
         return builder;
     }
 
-    public void addConfiguration(final boolean configuration, final List<String> parentPath, final int line) {
-        if (actualPath.isEmpty()) {
-            throw new YangParseException(name, line, "Parent node of config statement not found.");
+    @Override
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
+        final List<String> unPath = new ArrayList<String>();
+        for (QName qname : unknownNode.getPath().getPath()) {
+            unPath.add(qname.getLocalName());
+        }
+
+        if (addedUnknownNodes.containsKey(unPath)) {
+            addedUnknownNodes.get(unPath).add(unknownNode);
         } else {
-            final Builder parent = actualPath.getFirst();
-            if (parent instanceof DataSchemaNodeBuilder) {
-                ((DataSchemaNodeBuilder) parent).setConfiguration(configuration);
-            } else if (parent instanceof RefineHolder) {
-                ((RefineHolder) parent).setConfig(configuration);
-            } else if (parent instanceof DeviationBuilder) {
-                // skip: set config to deviation (deviate stmt) not supported by
-                // current api
-                return;
-            } else {
-                throw new YangParseException(name, line, "Unresolved parent of config statement.");
-            }
+            List<UnknownSchemaNodeBuilder> nodes = new ArrayList<UnknownSchemaNodeBuilder>();
+            nodes.add(unknownNode);
+            addedUnknownNodes.put(unPath, nodes);
         }
     }
 
@@ -707,7 +826,14 @@ public class ModuleBuilder implements Builder {
         }
         final List<String> unPath = new ArrayList<String>(parentPath);
         unPath.add(qname.getLocalName());
-        addedUnknownNodes.put(unPath, builder);
+
+        if (addedUnknownNodes.containsKey(unPath)) {
+            addedUnknownNodes.get(unPath).add(builder);
+        } else {
+            List<UnknownSchemaNodeBuilder> nodes = new ArrayList<UnknownSchemaNodeBuilder>();
+            nodes.add(builder);
+            addedUnknownNodes.put(unPath, nodes);
+        }
         return builder;
     }
 
@@ -1259,14 +1385,16 @@ public class ModuleBuilder implements Builder {
     }
 
     private List<UnknownSchemaNode> buildModuleUnknownNodes(
-            final Map<List<String>, UnknownSchemaNodeBuilder> addedUnknownNodes) {
+            final Map<List<String>, List<UnknownSchemaNodeBuilder>> addedUnknownNodes) {
         final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
-        for (Map.Entry<List<String>, UnknownSchemaNodeBuilder> entry : addedUnknownNodes.entrySet()) {
+        for (Map.Entry<List<String>, List<UnknownSchemaNodeBuilder>> entry : addedUnknownNodes.entrySet()) {
             final List<String> path = entry.getKey();
-            final UnknownSchemaNodeBuilder child = entry.getValue();
-            if (path.size() == 2) {
-                final UnknownSchemaNode node = child.build();
-                unknownNodes.add(node);
+            final List<UnknownSchemaNodeBuilder> child = entry.getValue();
+            for (UnknownSchemaNodeBuilder un : child) {
+                if (path.size() == 2) {
+                    final UnknownSchemaNode node = un.build();
+                    unknownNodes.add(node);
+                }
             }
         }
         return unknownNodes;
index 956d8fe449e9d9301dd020a7b6a1c628da7111c5..534ba2c841e5171c579cd3446fdd8625404cf2a8 100644 (file)
@@ -35,8 +35,8 @@ import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionAwareBu
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 
-public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
-        implements TypeDefinitionAwareBuilder, SchemaNodeBuilder, AugmentationTargetBuilder {
+public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements TypeDefinitionAwareBuilder,
+        SchemaNodeBuilder, AugmentationTargetBuilder {
     private boolean isBuilt;
     private final NotificationDefinitionImpl instance;
     private final int line;
@@ -93,7 +93,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
             instance.setUses(uses);
 
             // AUGMENTATIONS
-            if(augmentations == null) {
+            if (augmentations == null) {
                 augmentations = new HashSet<AugmentationSchema>();
                 for (AugmentationSchemaBuilder builder : addedAugmentations) {
                     augmentations.add(builder.build());
@@ -126,7 +126,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
     }
 
     @Override
-    public Set<TypeDefinitionBuilder> getTypeDefinitions() {
+    public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
         return addedTypedefs;
     }
 
@@ -177,7 +177,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
 
     @Override
     public void setStatus(final Status status) {
-        if(status != null) {
+        if (status != null) {
             this.status = status;
         }
     }
@@ -303,8 +303,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
             return typeDefinitions;
         }
 
-        private void setTypeDefinitions(
-                final Set<TypeDefinition<?>> typeDefinitions) {
+        private void setTypeDefinitions(final Set<TypeDefinition<?>> typeDefinitions) {
             if (typeDefinitions != null) {
                 this.typeDefinitions = typeDefinitions;
             }
@@ -315,8 +314,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
             return augmentations;
         }
 
-        private void setAvailableAugmentations(
-                Set<AugmentationSchema> augmentations) {
+        private void setAvailableAugmentations(Set<AugmentationSchema> augmentations) {
             if (augmentations != null) {
                 this.augmentations = augmentations;
             }
@@ -327,8 +325,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
             return unknownNodes;
         }
 
-        private void setUnknownSchemaNodes(
-                final List<UnknownSchemaNode> unknownNodes) {
+        private void setUnknownSchemaNodes(final List<UnknownSchemaNode> unknownNodes) {
             if (unknownNodes != null) {
                 this.unknownNodes = unknownNodes;
             }
@@ -395,8 +392,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder
 
         @Override
         public String toString() {
-            StringBuilder sb = new StringBuilder(
-                    NotificationDefinitionImpl.class.getSimpleName());
+            StringBuilder sb = new StringBuilder(NotificationDefinitionImpl.class.getSimpleName());
             sb.append("[qname=" + qname + ", path=" + path + "]");
             return sb.toString();
         }
index e36adbdeb2850f09102f244ef2fc2422377a1946..8cb4a6e56cb46b7d903e8e0d4a3ec9a482b03666 100644 (file)
@@ -21,29 +21,21 @@ import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
-import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionAwareBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 
-public final class RpcDefinitionBuilder implements SchemaNodeBuilder, TypeDefinitionAwareBuilder {
+public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder implements TypeDefinitionAwareBuilder {
     private boolean isBuilt;
     private final RpcDefinitionImpl instance;
-    private final int line;
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     private ContainerSchemaNodeBuilder inputBuilder;
     private ContainerSchemaNodeBuilder outputBuilder;
     private final Set<TypeDefinitionBuilder> addedTypedefs = new HashSet<TypeDefinitionBuilder>();
     private final Set<GroupingBuilder> addedGroupings = new HashSet<GroupingBuilder>();
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
 
     RpcDefinitionBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+        super(qname, line);
         this.instance = new RpcDefinitionImpl(qname);
     }
 
@@ -59,7 +51,7 @@ public final class RpcDefinitionBuilder implements SchemaNodeBuilder, TypeDefini
             instance.setInput(input);
             instance.setOutput(output);
 
-            instance.setPath(schemaPath);
+            instance.setPath(path);
 
             // TYPEDEFS
             final Set<TypeDefinition<?>> typedefs = new HashSet<TypeDefinition<?>>();
@@ -87,11 +79,6 @@ public final class RpcDefinitionBuilder implements SchemaNodeBuilder, TypeDefini
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
     void setInput(final ContainerSchemaNodeBuilder inputBuilder) {
         this.inputBuilder = inputBuilder;
     }
@@ -117,64 +104,12 @@ public final class RpcDefinitionBuilder implements SchemaNodeBuilder, TypeDefini
         addedGroupings.add(grouping);
     }
 
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    @Override
-    public void setReference(String reference) {
-        this.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(final Status status) {
-        if (status != null) {
-            this.status = status;
-        }
-    }
-
-    @Override
-    public QName getQName() {
-        return null;
-    }
-
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
-    }
-
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((qname == null) ? 0 : qname.hashCode());
-        result = prime * result + ((schemaPath == null) ? 0 : schemaPath.hashCode());
+        result = prime * result + ((path == null) ? 0 : path.hashCode());
         return result;
     }
 
@@ -194,11 +129,11 @@ public final class RpcDefinitionBuilder implements SchemaNodeBuilder, TypeDefini
         } else if (!other.qname.equals(this.qname)) {
             return false;
         }
-        if (other.schemaPath == null) {
-            if (this.schemaPath != null) {
+        if (other.path == null) {
+            if (this.path != null) {
                 return false;
             }
-        } else if (!other.schemaPath.equals(this.schemaPath)) {
+        } else if (!other.path.equals(this.path)) {
             return false;
         }
         return true;
index a8628eae72dab5e38af177b8a0942f50e867e8a9..6ca07bc87fd3e925010819497bcb1c77d39fd0e0 100644 (file)
@@ -25,14 +25,13 @@ import org.opendaylight.controller.yang.parser.builder.api.AbstractTypeAwareBuil
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.util.YangParseException;
 
-public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder
-        implements TypeDefinitionBuilder {
+public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder implements TypeDefinitionBuilder {
     private final int line;
     private final QName qname;
     private SchemaPath schemaPath;
 
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     private List<UnknownSchemaNode> unknownNodes;
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
     private List<RangeConstraint> ranges = Collections.emptyList();
     private List<LengthConstraint> lengths = Collections.emptyList();
     private List<PatternConstraint> patterns = Collections.emptyList();
@@ -43,30 +42,55 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder
     private Status status = Status.CURRENT;
     private String units;
     private Object defaultValue;
+    private boolean addedByUses;
 
     public TypeDefinitionBuilderImpl(final QName qname, final int line) {
         this.qname = qname;
         this.line = line;
     }
 
+    public TypeDefinitionBuilderImpl(TypeDefinitionBuilder tdb) {
+        qname = tdb.getQName();
+        line = tdb.getLine();
+        schemaPath = tdb.getPath();
+
+        type = tdb.getType();
+        typedef = tdb.getTypedef();
+
+        unknownNodes = tdb.getUnknownNodes();
+        for (UnknownSchemaNodeBuilder usnb : tdb.getUnknownNodeBuilders()) {
+            addedUnknownNodes.add(usnb);
+        }
+        ranges = tdb.getRanges();
+        lengths = tdb.getLengths();
+        patterns = tdb.getPatterns();
+        fractionDigits = tdb.getFractionDigits();
+
+        description = tdb.getDescription();
+        reference = tdb.getReference();
+        status = tdb.getStatus();
+        units = tdb.getUnits();
+        defaultValue = tdb.getDefaultValue();
+        addedByUses = tdb.isAddedByUses();
+    }
+
     @Override
     public TypeDefinition<? extends TypeDefinition<?>> build() {
         TypeDefinition<?> result = null;
         ExtendedType.Builder typeBuilder = null;
         if ((type == null || type instanceof UnknownType) && typedef == null) {
-            throw new YangParseException("Unresolved type: '"
-                    + qname.getLocalName() + "'.");
+            throw new YangParseException("Unresolved type: '" + qname.getLocalName() + "'.");
         }
         if (type == null || type instanceof UnknownType) {
             type = typedef.build();
         }
 
-        typeBuilder = new ExtendedType.Builder(qname, type, description,
-                reference, schemaPath);
+        typeBuilder = new ExtendedType.Builder(qname, type, description, reference, schemaPath);
 
         typeBuilder.status(status);
         typeBuilder.units(units);
         typeBuilder.defaultValue(defaultValue);
+        typeBuilder.addedByUses(addedByUses);
 
         typeBuilder.ranges(ranges);
         typeBuilder.lengths(lengths);
@@ -137,6 +161,16 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder
         }
     }
 
+    @Override
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
+    }
+
     @Override
     public String getUnits() {
         return units;
@@ -158,7 +192,12 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder
     }
 
     @Override
-    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+    public List<UnknownSchemaNode> getUnknownNodes() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders() {
         return addedUnknownNodes;
     }
 
@@ -219,8 +258,7 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder
 
     @Override
     public String toString() {
-        final StringBuilder result = new StringBuilder("TypedefBuilder["
-                + qname.getLocalName());
+        final StringBuilder result = new StringBuilder("TypedefBuilder[" + qname.getLocalName());
         result.append(", type=");
         if (type == null) {
             result.append(typedef);
index 07db69901fe485a4eb1066a4882e150c2d79c089..433ae962e030ce71493b594a10afea5453a4d886 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.controller.yang.common.QName;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
@@ -29,8 +30,7 @@ import org.opendaylight.controller.yang.parser.util.YangParseException;
  * When build is called, types in builder form will be built and add to resolved
  * types.
  */
-public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
-        TypeDefinitionBuilder {
+public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements TypeDefinitionBuilder {
     private final static String NAME = "union";
 
     private final int line;
@@ -112,10 +112,24 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
         throw new YangParseException(line, "Can not set status to " + NAME);
     }
 
+    @Override
+    public boolean isAddedByUses() {
+        return false;
+    }
+
+    @Override
+    public void setAddedByUses(final boolean addedByUses) {
+        throw new YangParseException(line, "Union type can not be added by uses.");
+    }
+
+    @Override
+    public List<UnknownSchemaNode> getUnknownNodes() {
+        return Collections.emptyList();
+    }
+
     @Override
     public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        throw new YangParseException(line, "Can not add unknown node to "
-                + NAME);
+        // not supported
     }
 
     @Override
@@ -180,12 +194,11 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
 
     @Override
     public void setFractionDigits(Integer fractionDigits) {
-        throw new YangParseException(line, "Can not set fraction digits to "
-                + NAME);
+        throw new YangParseException(line, "Can not set fraction digits to " + NAME);
     }
 
     @Override
-    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
+    public List<UnknownSchemaNodeBuilder> getUnknownNodeBuilders() {
         return Collections.emptyList();
     }
 
@@ -196,8 +209,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
 
     @Override
     public void setDefaultValue(Object defaultValue) {
-        throw new YangParseException(line, "Can not set default value to "
-                + NAME);
+        throw new YangParseException(line, "Can not set default value to " + NAME);
     }
 
     @Override
@@ -212,8 +224,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements
 
     @Override
     public String toString() {
-        final StringBuilder result = new StringBuilder(
-                UnionTypeBuilder.class.getSimpleName() + "[");
+        final StringBuilder result = new StringBuilder(UnionTypeBuilder.class.getSimpleName() + "[");
         result.append(", types=" + types);
         result.append(", typedefs=" + typedefs);
         result.append("]");
index 3d3ad28891b92eba2ae222582afd905f252262a1..14cf3a9b34a0cda5fcf3024b695dd7c5b540d964 100644 (file)
@@ -15,41 +15,52 @@ import org.opendaylight.controller.yang.common.QName;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 
-public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder {
+public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
     private final UnknownSchemaNodeImpl instance;
-    private final int line;
-    private final QName qname;
-    private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
-    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
+    private boolean addedByUses;
+    private List<UnknownSchemaNode> unknownNodes;
     private QName nodeType;
     private String nodeParameter;
 
-    UnknownSchemaNodeBuilder(final QName qname, final int line) {
-        this.qname = qname;
-        this.line = line;
+    public UnknownSchemaNodeBuilder(final QName qname, final int line) {
+        super(qname, line);
         instance = new UnknownSchemaNodeImpl(qname);
     }
 
+    public UnknownSchemaNodeBuilder(UnknownSchemaNodeBuilder b) {
+        super(b.getQName(), b.getLine());
+        instance = new UnknownSchemaNodeImpl(qname);
+        path = b.getPath();
+        description = b.getDescription();
+        reference = b.getReference();
+        status = b.getStatus();
+        addedByUses = b.isAddedByUses();
+        unknownNodes = b.unknownNodes;
+        addedUnknownNodes.addAll(b.addedUnknownNodes);
+        nodeType = b.getNodeType();
+        nodeParameter = b.getNodeParameter();
+    }
+
     @Override
     public UnknownSchemaNode build() {
         if (!isBuilt) {
-            instance.setPath(schemaPath);
+            instance.setPath(path);
             instance.setNodeType(nodeType);
             instance.setNodeParameter(nodeParameter);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
+            instance.setAddedByUses(addedByUses);
 
             // UNKNOWN NODES
-            final List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
-            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                unknownNodes.add(b.build());
+            if (unknownNodes == null) {
+                unknownNodes = new ArrayList<UnknownSchemaNode>();
+                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                    unknownNodes.add(b.build());
+                }
             }
             instance.setUnknownSchemaNodes(unknownNodes);
 
@@ -59,61 +70,16 @@ public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder {
         return instance;
     }
 
-    @Override
-    public int getLine() {
-        return line;
-    }
-
-    @Override
-    public QName getQName() {
-        return qname;
-    }
-
-    @Override
-    public SchemaPath getPath() {
-        return schemaPath;
-    }
-
-    @Override
-    public void setPath(SchemaPath schemaPath) {
-        this.schemaPath = schemaPath;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
+    public boolean isAddedByUses() {
+        return addedByUses;
     }
 
-    @Override
-    public void setDescription(final String description) {
-        this.description = description;
+    public void setAddedByUses(final boolean addedByUses) {
+        this.addedByUses = addedByUses;
     }
 
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    @Override
-    public void setReference(String reference) {
-        this.reference = reference;
-    }
-
-    @Override
-    public Status getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(Status status) {
-        if (status != null) {
-            this.status = status;
-        }
-    }
-
-    @Override
-    public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) {
-        addedUnknownNodes.add(unknownNode);
+    public void setUnknownNodes(final List<UnknownSchemaNode> unknownNodes) {
+        this.unknownNodes = unknownNodes;
     }
 
     public QName getNodeType() {
@@ -141,6 +107,7 @@ public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder {
         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
         private QName nodeType;
         private String nodeParameter;
+        private boolean addedByUses;
 
         private UnknownSchemaNodeImpl(final QName qname) {
             this.qname = qname;
@@ -189,6 +156,15 @@ public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder {
             }
         }
 
+        @Override
+        public boolean isAddedByUses() {
+            return addedByUses;
+        }
+
+        private void setAddedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+        }
+
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
             return unknownNodes;
@@ -217,6 +193,15 @@ public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder {
         private void setNodeParameter(final String nodeParameter) {
             this.nodeParameter = nodeParameter;
         }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(UnknownSchemaNodeImpl.class.getSimpleName());
+            sb.append("[");
+            sb.append(qname);
+            sb.append("]");
+            return sb.toString();
+        }
     }
 
 }
index 850938161bf4c25cc30fd5d7e7270d0056d9f596..77a465d5fd3346ab41657c84421f5cd35c1c6e98 100644 (file)
@@ -18,8 +18,10 @@ import java.util.Set;
 import org.opendaylight.controller.yang.model.api.AugmentationSchema;\r
 import org.opendaylight.controller.yang.model.api.SchemaNode;\r
 import org.opendaylight.controller.yang.model.api.SchemaPath;\r
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;\r
 import org.opendaylight.controller.yang.model.api.UsesNode;\r
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;\r
+import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder;\r
 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;\r
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;\r
 import org.opendaylight.controller.yang.parser.util.RefineHolder;\r
@@ -28,17 +30,32 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
     private boolean isBuilt;\r
     private UsesNodeImpl instance;\r
     private final int line;\r
-    private SchemaPath schemaPath;\r
+    private final DataNodeContainerBuilder parent;\r
     private final String groupingName;\r
     private SchemaPath groupingPath;\r
     private boolean augmenting;\r
+    private boolean addedByUses;\r
     private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();\r
-    private List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
-    private List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
+    private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();\r
+    private final List<RefineHolder> refines = new ArrayList<RefineHolder>();\r
+    private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();\r
 \r
-    public UsesNodeBuilderImpl(final String groupingName, final int line) {\r
+    public UsesNodeBuilderImpl(final String groupingName, final int line, final DataNodeContainerBuilder parent) {\r
         this.groupingName = groupingName;\r
         this.line = line;\r
+        this.parent = parent;\r
+    }\r
+\r
+    public UsesNodeBuilderImpl(UsesNodeBuilder b) {\r
+        groupingName = b.getGroupingName();\r
+        line = b.getLine();\r
+        parent = b.getParent();\r
+        groupingPath = b.getGroupingPath();\r
+        augmenting = b.isAugmenting();\r
+        addedByUses = b.isAddedByUses();\r
+        addedAugments.addAll(b.getAugmentations());\r
+        refineBuilders.addAll(b.getRefineNodes());\r
+        refines.addAll(b.getRefines());\r
     }\r
 \r
     @Override\r
@@ -46,6 +63,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         if (!isBuilt) {\r
             instance = new UsesNodeImpl(groupingPath);\r
             instance.setAugmenting(augmenting);\r
+            instance.setAddedByUses(addedByUses);\r
 \r
             // AUGMENTATIONS\r
             final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();\r
@@ -62,6 +80,13 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             }\r
             instance.setRefines(refineNodes);\r
 \r
+            // UNKNOWN NODES\r
+            List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();\r
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {\r
+                unknownNodes.add(b.build());\r
+            }\r
+            instance.setUnknownSchemaNodes(unknownNodes);\r
+\r
             isBuilt = true;\r
         }\r
         return instance;\r
@@ -73,18 +98,18 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
     }\r
 \r
     @Override\r
-    public void setGroupingPath(SchemaPath groupingPath) {\r
-        this.groupingPath = groupingPath;\r
+    public DataNodeContainerBuilder getParent() {\r
+        return parent;\r
     }\r
 \r
     @Override\r
-    public SchemaPath getPath() {\r
-        return schemaPath;\r
+    public SchemaPath getGroupingPath() {\r
+        return groupingPath;\r
     }\r
 \r
     @Override\r
-    public void setPath(SchemaPath path) {\r
-        this.schemaPath = path;\r
+    public void setGroupingPath(SchemaPath groupingPath) {\r
+        this.groupingPath = groupingPath;\r
     }\r
 \r
     @Override\r
@@ -112,6 +137,16 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         this.augmenting = augmenting;\r
     }\r
 \r
+    @Override\r
+    public boolean isAddedByUses() {\r
+        return addedByUses;\r
+    }\r
+\r
+    @Override\r
+    public void setAddedByUses(final boolean addedByUses) {\r
+        this.addedByUses = addedByUses;\r
+    }\r
+\r
     @Override\r
     public List<SchemaNodeBuilder> getRefineNodes() {\r
         return refineBuilders;\r
@@ -132,12 +167,22 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
         refines.add(refine);\r
     }\r
 \r
+    public List<UnknownSchemaNodeBuilder> getUnknownNodes() {\r
+        return addedUnknownNodes;\r
+    }\r
+\r
+    @Override\r
+    public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {\r
+        addedUnknownNodes.add(unknownNode);\r
+    }\r
 \r
-    private final class UsesNodeImpl implements UsesNode {\r
+    public final class UsesNodeImpl implements UsesNode {\r
         private final SchemaPath groupingPath;\r
         private Set<AugmentationSchema> augmentations = Collections.emptySet();\r
         private boolean augmenting;\r
+        private boolean addedByUses;\r
         private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();\r
+        private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();\r
 \r
         private UsesNodeImpl(final SchemaPath groupingPath) {\r
             this.groupingPath = groupingPath;\r
@@ -153,8 +198,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             return augmentations;\r
         }\r
 \r
-        private void setAugmentations(\r
-                final Set<AugmentationSchema> augmentations) {\r
+        private void setAugmentations(final Set<AugmentationSchema> augmentations) {\r
             if (augmentations != null) {\r
                 this.augmentations = augmentations;\r
             }\r
@@ -169,6 +213,15 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             this.augmenting = augmenting;\r
         }\r
 \r
+        @Override\r
+        public boolean isAddedByUses() {\r
+            return addedByUses;\r
+        }\r
+\r
+        private void setAddedByUses(final boolean addedByUses) {\r
+            this.addedByUses = addedByUses;\r
+        }\r
+\r
         @Override\r
         public Map<SchemaPath, SchemaNode> getRefines() {\r
             return refines;\r
@@ -180,14 +233,26 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
             }\r
         }\r
 \r
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
+            return unknownNodes;\r
+        }\r
+\r
+        private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {\r
+            if (unknownSchemaNodes != null) {\r
+                this.unknownNodes = unknownSchemaNodes;\r
+            }\r
+        }\r
+\r
+        public UsesNodeBuilder toBuilder() {\r
+            return UsesNodeBuilderImpl.this;\r
+        }\r
+\r
         @Override\r
         public int hashCode() {\r
             final int prime = 31;\r
             int result = 1;\r
-            result = prime * result\r
-                    + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
-            result = prime * result\r
-                    + ((augmentations == null) ? 0 : augmentations.hashCode());\r
+            result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());\r
+            result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());\r
             result = prime * result + (augmenting ? 1231 : 1237);\r
             return result;\r
         }\r
@@ -226,8 +291,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder {
 \r
         @Override\r
         public String toString() {\r
-            StringBuilder sb = new StringBuilder(\r
-                    UsesNodeImpl.class.getSimpleName());\r
+            StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());\r
             sb.append("[groupingPath=" + groupingPath + "]");\r
             return sb.toString();\r
         }\r
index e74029b424750b2b318f04df447fb7292a26c6cd..5dedd3c0270a3776ee7a1400951784619c1cb683 100644 (file)
@@ -36,12 +36,21 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker;
 import org.opendaylight.controller.antlrv4.code.gen.YangLexer;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser;
 import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.model.api.AnyXmlSchemaNode;
+import org.opendaylight.controller.yang.model.api.ChoiceNode;
+import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.controller.yang.model.api.DataSchemaNode;
 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
 import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;
+import org.opendaylight.controller.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
+import org.opendaylight.controller.yang.model.api.ListSchemaNode;
 import org.opendaylight.controller.yang.model.api.Module;
 import org.opendaylight.controller.yang.model.api.SchemaContext;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
 import org.opendaylight.controller.yang.model.util.ExtendedType;
 import org.opendaylight.controller.yang.model.util.IdentityrefType;
@@ -49,17 +58,29 @@ import org.opendaylight.controller.yang.model.util.UnknownType;
 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.Builder;
 import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeAwareBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.AnyXmlBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.ChoiceBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.GroupingBuilderImpl;
 import org.opendaylight.controller.yang.parser.builder.impl.IdentitySchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.IdentityrefTypeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.LeafListSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.LeafSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.ListSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.RpcDefinitionBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.TypeDefinitionBuilderImpl;
 import org.opendaylight.controller.yang.parser.builder.impl.UnionTypeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.UsesNodeBuilderImpl;
+import org.opendaylight.controller.yang.parser.builder.impl.UsesNodeBuilderImpl.UsesNodeImpl;
 import org.opendaylight.controller.yang.parser.util.ModuleDependencySort;
 import org.opendaylight.controller.yang.parser.util.RefineHolder;
 import org.opendaylight.controller.yang.parser.util.RefineUtils;
@@ -74,7 +95,6 @@ import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
 public final class YangParserImpl implements YangModelParser {
-
     private static final Logger logger = LoggerFactory.getLogger(YangParserImpl.class);
 
     @Override
@@ -471,9 +491,10 @@ public final class YangParserImpl implements YangModelParser {
 
                 nodeToResolve.setTypedef(newType);
             } else {
-                if(nodeToResolve instanceof TypeDefinitionBuilder) {
-                    TypeDefinitionBuilder tdb = (TypeDefinitionBuilder)nodeToResolve;
-                    TypeConstraints tc = findConstraintsFromTypeBuilder(nodeToResolve, new TypeConstraints(module.getName(), nodeToResolve.getLine()), modules, module, context);
+                if (nodeToResolve instanceof TypeDefinitionBuilder) {
+                    TypeDefinitionBuilder tdb = (TypeDefinitionBuilder) nodeToResolve;
+                    TypeConstraints tc = findConstraintsFromTypeBuilder(nodeToResolve,
+                            new TypeConstraints(module.getName(), nodeToResolve.getLine()), modules, module, context);
                     tdb.setLengths(tc.getLength());
                     tdb.setPatterns(tc.getPatterns());
                     tdb.setRanges(tc.getRange());
@@ -673,8 +694,8 @@ public final class YangParserImpl implements YangModelParser {
 
     /**
      * Go through all augment definitions and resolve them. This method works in
-     * same way as {@link #resolveAugments(Map)} except that if target node is not
-     * found in loaded modules, it search for target node in given context.
+     * same way as {@link #resolveAugments(Map)} except that if target node is
+     * not found in loaded modules, it search for target node in given context.
      *
      * @param modules
      *            all loaded modules
@@ -804,7 +825,7 @@ public final class YangParserImpl implements YangModelParser {
      *            SchemaContext containing already resolved modules
      */
     private void resolveIdentitiesWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, SchemaContext context) {
+            final ModuleBuilder module, final SchemaContext context) {
         final Set<IdentitySchemaNodeBuilder> identities = module.getIdentities();
         for (IdentitySchemaNodeBuilder identity : identities) {
             final String baseIdentityName = identity.getBaseIdentityName();
@@ -856,6 +877,7 @@ public final class YangParserImpl implements YangModelParser {
     private void resolveUsesRefine(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module) {
         final Map<List<String>, UsesNodeBuilder> moduleUses = module.getUsesNodes();
         for (Map.Entry<List<String>, UsesNodeBuilder> entry : moduleUses.entrySet()) {
+            // refine
             final UsesNodeBuilder usesNode = entry.getValue();
             final int line = usesNode.getLine();
             final GroupingBuilder targetGrouping = getTargetGroupingFromModules(usesNode, modules, module);
@@ -863,9 +885,15 @@ public final class YangParserImpl implements YangModelParser {
             for (RefineHolder refine : usesNode.getRefines()) {
                 final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingBuilder(targetGrouping,
                         refine, module.getName());
+                if(nodeToRefine instanceof GroupingMember) {
+                    ((GroupingMember)nodeToRefine).setAddedByUses(true);
+                }
                 RefineUtils.performRefine(nodeToRefine, refine, line);
                 usesNode.addRefineNode(nodeToRefine);
             }
+
+            // child nodes
+            processUsesNode(usesNode, targetGrouping);
         }
     }
 
@@ -882,7 +910,7 @@ public final class YangParserImpl implements YangModelParser {
      *            SchemaContext containing already resolved modules
      */
     private void resolveUsesRefineWithContext(final Map<String, TreeMap<Date, ModuleBuilder>> modules,
-            final ModuleBuilder module, SchemaContext context) {
+            final ModuleBuilder module, final SchemaContext context) {
         final Map<List<String>, UsesNodeBuilder> moduleUses = module.getUsesNodes();
         for (Map.Entry<List<String>, UsesNodeBuilder> entry : moduleUses.entrySet()) {
             final UsesNodeBuilder usesNode = entry.getValue();
@@ -895,17 +923,27 @@ public final class YangParserImpl implements YangModelParser {
                 for (RefineHolder refine : usesNode.getRefines()) {
                     final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingDefinition(
                             targetGrouping, refine, module.getName());
+                    if(nodeToRefine instanceof GroupingMember) {
+                        ((GroupingMember)nodeToRefine).setAddedByUses(true);
+                    }
                     RefineUtils.performRefine(nodeToRefine, refine, line);
                     usesNode.addRefineNode(nodeToRefine);
                 }
+
+                processUsesNode(usesNode, targetGrouping);
             } else {
                 usesNode.setGroupingPath(targetGroupingBuilder.getPath());
                 for (RefineHolder refine : usesNode.getRefines()) {
                     final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingBuilder(
                             targetGroupingBuilder, refine, module.getName());
+                    if(nodeToRefine instanceof GroupingMember) {
+                        ((GroupingMember)nodeToRefine).setAddedByUses(true);
+                    }
                     RefineUtils.performRefine(nodeToRefine, refine, line);
                     usesNode.addRefineNode(nodeToRefine);
                 }
+
+                processUsesNode(usesNode, targetGroupingBuilder);
             }
         }
     }
@@ -951,7 +989,7 @@ public final class YangParserImpl implements YangModelParser {
             return null;
         }
 
-        List<QName> path = usesBuilder.getPath().getPath();
+        List<QName> path = usesBuilder.getParent().getPath().getPath();
         GroupingBuilder result = null;
         Set<GroupingBuilder> groupings = dependentModule.getModuleGroupings();
         result = findGroupingBuilder(groupings, groupingName);
@@ -969,7 +1007,7 @@ public final class YangParserImpl implements YangModelParser {
                 if (currentNode instanceof RpcDefinitionBuilder) {
                     groupings = ((RpcDefinitionBuilder) currentNode).getGroupings();
                 } else if (currentNode instanceof DataNodeContainerBuilder) {
-                    groupings = ((DataNodeContainerBuilder) currentNode).getGroupings();
+                    groupings = ((DataNodeContainerBuilder) currentNode).getGroupingBuilders();
                 } else {
                     groupings = Collections.emptySet();
                 }
@@ -996,7 +1034,7 @@ public final class YangParserImpl implements YangModelParser {
      * @return grouping with given name if found, null otherwise
      */
     private GroupingDefinition getTargetGroupingFromContext(final UsesNodeBuilder usesBuilder,
-            final ModuleBuilder module, SchemaContext context) {
+            final ModuleBuilder module, final SchemaContext context) {
         final int line = usesBuilder.getLine();
         String groupingString = usesBuilder.getGroupingName();
         String groupingPrefix;
@@ -1018,6 +1056,135 @@ public final class YangParserImpl implements YangModelParser {
         return findGroupingDefinition(dependentModule.getGroupings(), groupingName);
     }
 
+    /**
+     * Add nodes defined in target grouping to current context.
+     *
+     * @param usesNode
+     * @param targetGrouping
+     */
+    private void processUsesNode(final UsesNodeBuilder usesNode, final GroupingBuilder targetGrouping) {
+        List<SchemaNodeBuilder> refineNodes = usesNode.getRefineNodes();
+        DataNodeContainerBuilder parent = usesNode.getParent();
+        SchemaPath parentPath = parent.getPath();
+        for (DataSchemaNodeBuilder child : targetGrouping.getChildNodeBuilders()) {
+            // if node is refined, take it from refined nodes and continue
+            SchemaNodeBuilder refined = getRefined(child.getQName(), refineNodes);
+            if(refined != null) {
+                refined.setPath(createSchemaPath(parentPath, refined.getQName().getLocalName()));
+                parent.addChildNode((DataSchemaNodeBuilder)refined);
+                continue;
+            }
+
+            DataSchemaNodeBuilder newChild = null;
+            if (child instanceof AnyXmlBuilder) {
+                newChild = new AnyXmlBuilder((AnyXmlBuilder) child);
+            } else if (child instanceof ChoiceBuilder) {
+                newChild = new ChoiceBuilder((ChoiceBuilder) child);
+            } else if (child instanceof ContainerSchemaNodeBuilder) {
+                newChild = new ContainerSchemaNodeBuilder((ContainerSchemaNodeBuilder) child);
+            } else if (child instanceof LeafListSchemaNodeBuilder) {
+                newChild = new LeafListSchemaNodeBuilder((LeafListSchemaNodeBuilder) child);
+            } else if (child instanceof LeafSchemaNodeBuilder) {
+                newChild = new LeafSchemaNodeBuilder((LeafSchemaNodeBuilder) child);
+            } else if (child instanceof ListSchemaNodeBuilder) {
+                newChild = new ListSchemaNodeBuilder((ListSchemaNodeBuilder) child);
+            }
+
+            if (newChild instanceof GroupingMember) {
+                ((GroupingMember) newChild).setAddedByUses(true);
+            }
+            newChild.setPath(createSchemaPath(parentPath, newChild.getQName().getLocalName()));
+            parent.addChildNode(newChild);
+        }
+        for (GroupingBuilder g : targetGrouping.getGroupingBuilders()) {
+            GroupingBuilder newGrouping = new GroupingBuilderImpl(g);
+            newGrouping.setAddedByUses(true);
+            newGrouping.setPath(createSchemaPath(parentPath, newGrouping.getQName().getLocalName()));
+            parent.addGrouping(newGrouping);
+        }
+        for (TypeDefinitionBuilder td : targetGrouping.getTypeDefinitionBuilders()) {
+            TypeDefinitionBuilder newType = new TypeDefinitionBuilderImpl(td);
+            newType.setAddedByUses(true);
+            newType.setPath(createSchemaPath(parentPath, newType.getQName().getLocalName()));
+            parent.addTypedef(newType);
+        }
+        for (UsesNodeBuilder un : targetGrouping.getUses()) {
+            UsesNodeBuilder newUses = new UsesNodeBuilderImpl(un);
+            newUses.setAddedByUses(true);
+            // uses has not path
+            parent.addUsesNode(newUses);
+        }
+        for (UnknownSchemaNodeBuilder un : targetGrouping.getUnknownNodes()) {
+            UnknownSchemaNodeBuilder newUn = new UnknownSchemaNodeBuilder(un);
+            newUn.setAddedByUses(true);
+            newUn.setPath(createSchemaPath(parentPath, un.getQName().getLocalName()));
+            parent.addUnknownSchemaNode(newUn);
+        }
+    }
+
+    private void processUsesNode(final UsesNodeBuilder usesNode, final GroupingDefinition targetGrouping) {
+        final int line = usesNode.getLine();
+        List<SchemaNodeBuilder> refineNodes = usesNode.getRefineNodes();
+        DataNodeContainerBuilder parent = usesNode.getParent();
+        SchemaPath parentPath = parent.getPath();
+        for (DataSchemaNode child : targetGrouping.getChildNodes()) {
+            // if node is refined, take it from refined nodes and continue
+            SchemaNodeBuilder refined = getRefined(child.getQName(), refineNodes);
+            if(refined != null) {
+                refined.setPath(createSchemaPath(parentPath, refined.getQName().getLocalName()));
+                parent.addChildNode((DataSchemaNodeBuilder)refined);
+                continue;
+            }
+
+            DataSchemaNodeBuilder newChild = null;
+            if (child instanceof AnyXmlSchemaNode) {
+                newChild = createAnyXml((AnyXmlSchemaNode) child, line);
+            } else if (child instanceof ChoiceNode) {
+                newChild = createChoice((ChoiceNode) child, line);
+            } else if (child instanceof ContainerSchemaNode) {
+                newChild = createContainer((ContainerSchemaNode) child, line);
+            } else if (child instanceof LeafListSchemaNode) {
+                newChild = createLeafList((LeafListSchemaNode) child, line);
+            } else if (child instanceof LeafSchemaNode) {
+                newChild = createLeafBuilder((LeafSchemaNode) child, line);
+            } else if (child instanceof ListSchemaNode) {
+                newChild = createList((ListSchemaNode) child, line);
+            }
+
+            if (newChild instanceof GroupingMember) {
+                ((GroupingMember) newChild).setAddedByUses(true);
+            }
+            newChild.setPath(createSchemaPath(parentPath, newChild.getQName().getLocalName()));
+            parent.addChildNode(newChild);
+        }
+        for (GroupingDefinition g : targetGrouping.getGroupings()) {
+            GroupingBuilder newGrouping = createGrouping(g, line);
+            newGrouping.setAddedByUses(true);
+            newGrouping.setPath(createSchemaPath(parentPath, newGrouping.getQName().getLocalName()));
+            parent.addGrouping(newGrouping);
+        }
+        for (TypeDefinition<?> td : targetGrouping.getTypeDefinitions()) {
+            TypeDefinitionBuilder newType = createTypedef((ExtendedType) td, line);
+            newType.setAddedByUses(true);
+            newType.setPath(createSchemaPath(parentPath, newType.getQName().getLocalName()));
+            parent.addTypedef(newType);
+        }
+        for (UsesNode un : targetGrouping.getUses()) {
+            if (un instanceof UsesNodeImpl) {
+                UsesNodeBuilder newUses = new UsesNodeBuilderImpl(((UsesNodeImpl) un).toBuilder());
+                newUses.setAddedByUses(true);
+                // uses has not path
+                parent.addUsesNode(newUses);
+            }
+        }
+        for (UnknownSchemaNode un : targetGrouping.getUnknownSchemaNodes()) {
+            UnknownSchemaNodeBuilder newNode = createUnknownSchemaNode(un, line);
+            newNode.setAddedByUses(true);
+            newNode.setPath(createSchemaPath(parentPath, un.getQName().getLocalName()));
+            parent.addUnknownSchemaNode(newNode);
+        }
+    }
+
     private QName findFullQName(final Map<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module,
             final IdentityrefTypeBuilder idref) {
         QName result = null;
index 5bd46d1231aaa8f3bacad6b67efec62c7a6c87c5..28095b5ef75331bd5c128f82692da619b396272b 100644 (file)
@@ -19,7 +19,7 @@ import java.util.List;
 import java.util.Stack;
 
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser;
+import org.opendaylight.controller.antlrv4.code.gen.*;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Argument_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Base_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Contact_stmtContext;
@@ -50,7 +50,6 @@ import org.opendaylight.controller.antlrv4.code.gen.YangParser.Type_body_stmtsCo
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Units_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.When_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParserBaseListener;
 import org.opendaylight.controller.yang.common.QName;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
@@ -337,15 +336,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
                     SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix);
                     moduleBuilder.addIdentityrefType(getIdentityrefBase(typeBody), actualPath, path, line);
                 } else {
-                    type = parseTypeBody(moduleName, typeName, typeBody, actualPath, namespace, revision,
+                    type = parseTypeWithBody(moduleName, typeName, typeBody, actualPath, namespace, revision,
                             yangModelPrefix, moduleBuilder.getActualNode());
                     moduleBuilder.setType(type, actualPath);
                 }
             }
         } else {
-            type = parseUnknownTypeBody(typeQName, typeBody, actualPath, namespace, revision, yangModelPrefix,
-                    moduleBuilder.getActualNode(), moduleBuilder);
-            // mark parent node of this type statement as dirty
+            type = parseUnknownTypeWithBody(typeQName, typeBody, actualPath, namespace, revision, yangModelPrefix,
+                    moduleBuilder.getActualNode());
+            // add parent node of this type statement to dirty nodes
             moduleBuilder.addDirtyNode(actualPath);
             moduleBuilder.setType(type, actualPath);
         }
@@ -401,16 +400,19 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
 
     @Override
     public void enterContainer_stmt(Container_stmtContext ctx) {
+        final int line = ctx.getStart().getLine();
         final String containerName = stringFromNode(ctx);
         QName containerQName = new QName(namespace, revision, yangModelPrefix, containerName);
-        ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(containerQName, actualPath, ctx.getStart()
-                .getLine());
+
+        SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, containerName);
+
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addContainerNode(path, containerQName, actualPath, line);
         moduleBuilder.enterNode(builder);
         updatePath(containerName);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, line));
 
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             final ParseTree childNode = ctx.getChild(i);
@@ -432,13 +434,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void enterLeaf_stmt(Leaf_stmtContext ctx) {
         final String leafName = stringFromNode(ctx);
         QName leafQName = new QName(namespace, revision, yangModelPrefix, leafName);
-        LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(leafQName, actualPath, ctx.getStart().getLine());
+        SchemaPath schemaPath = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, leafName);
+
+        LeafSchemaNodeBuilder builder = moduleBuilder.addLeafNode(schemaPath, leafQName, actualPath, ctx.getStart().getLine());
         moduleBuilder.enterNode(builder);
         updatePath(leafName);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
 
         String defaultStr = null;
         String unitsStr = null;
@@ -468,7 +472,6 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
 
         moduleBuilder.enterNode(builder);
         updatePath(groupingPathStr);
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
     }
 
     @Override
@@ -498,14 +501,16 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void enterLeaf_list_stmt(Leaf_list_stmtContext ctx) {
         final String leafListName = stringFromNode(ctx);
         QName leafListQName = new QName(namespace, revision, yangModelPrefix, leafListName);
-        LeafListSchemaNodeBuilder builder = moduleBuilder.addLeafListNode(leafListQName, actualPath, ctx.getStart()
+        SchemaPath schemaPath = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, leafListName);
+
+        LeafListSchemaNodeBuilder builder = moduleBuilder.addLeafListNode(schemaPath, leafListQName, actualPath, ctx.getStart()
                 .getLine());
         moduleBuilder.enterNode(builder);
         updatePath(leafListName);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
 
         for (int i = 0; i < ctx.getChildCount(); ++i) {
             final ParseTree childNode = ctx.getChild(i);
@@ -527,15 +532,17 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
 
     @Override
     public void enterList_stmt(List_stmtContext ctx) {
-        final String containerName = stringFromNode(ctx);
-        QName containerQName = new QName(namespace, revision, yangModelPrefix, containerName);
-        ListSchemaNodeBuilder builder = moduleBuilder.addListNode(containerQName, actualPath, ctx.getStart().getLine());
+        final String listName = stringFromNode(ctx);
+        QName listQName = new QName(namespace, revision, yangModelPrefix, listName);
+        SchemaPath schemaPath = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, listName);
+
+        ListSchemaNodeBuilder builder = moduleBuilder.addListNode(schemaPath, listQName, actualPath, ctx.getStart().getLine());
         moduleBuilder.enterNode(builder);
-        updatePath(containerName);
+        updatePath(listName);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
 
         String keyDefinition = "";
         for (int i = 0; i < ctx.getChildCount(); ++i) {
@@ -563,13 +570,15 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void enterAnyxml_stmt(YangParser.Anyxml_stmtContext ctx) {
         final String anyXmlName = stringFromNode(ctx);
         QName anyXmlQName = new QName(namespace, revision, yangModelPrefix, anyXmlName);
-        AnyXmlBuilder builder = moduleBuilder.addAnyXml(anyXmlQName, actualPath, ctx.getStart().getLine());
+        SchemaPath schemaPath = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, anyXmlName);
+
+        AnyXmlBuilder builder = moduleBuilder.addAnyXml(schemaPath, anyXmlQName, actualPath, ctx.getStart().getLine());
         moduleBuilder.enterNode(builder);
         updatePath(anyXmlName);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
     }
 
     @Override
@@ -590,6 +599,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
+        builder.setConfiguration(getConfig(ctx, moduleBuilder.getActualParent(), moduleName, ctx.getStart().getLine()));
 
         // set 'default' case
         for (int i = 0; i < ctx.getChildCount(); i++) {
@@ -715,11 +725,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void enterInput_stmt(YangParser.Input_stmtContext ctx) {
         final String input = "input";
         QName rpcQName = new QName(namespace, revision, yangModelPrefix, input);
-        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(rpcQName, ctx.getStart().getLine());
+        SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, input);
+
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(path, rpcQName, ctx.getStart().getLine());
         moduleBuilder.enterNode(builder);
         updatePath(input);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
     }
@@ -735,11 +746,12 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
     public void enterOutput_stmt(YangParser.Output_stmtContext ctx) {
         final String output = "output";
         QName rpcQName = new QName(namespace, revision, yangModelPrefix, output);
-        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(rpcQName, ctx.getStart().getLine());
+        SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, output);
+
+        ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcOutput(path, rpcQName, ctx.getStart().getLine());
         moduleBuilder.enterNode(builder);
         updatePath(output);
 
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
         parseSchemaNodeArgs(ctx, builder);
         parseConstraints(ctx, builder.getConstraints());
     }
@@ -804,12 +816,6 @@ public final class YangParserListenerImpl extends YangParserBaseListener {
         moduleBuilder.exitNode();
     }
 
-    @Override
-    public void enterConfig_stmt(YangParser.Config_stmtContext ctx) {
-        boolean configuration = parseConfig(ctx);
-        moduleBuilder.addConfiguration(configuration, actualPath, ctx.getStart().getLine());
-    }
-
     @Override
     public void enterIdentity_stmt(YangParser.Identity_stmtContext ctx) {
         final String identityName = stringFromNode(ctx);
index ba3599ca97b8f86378162845684f3cb83da79c55..554866712f8bdec1db7f75a11f6668943b3dd393 100644 (file)
@@ -17,7 +17,6 @@ import java.util.TreeMap;
 
 import org.opendaylight.controller.yang.common.QName;
 import org.opendaylight.controller.yang.model.api.AnyXmlSchemaNode;
-import org.opendaylight.controller.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.controller.yang.model.api.ChoiceNode;
 import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
 import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
@@ -36,6 +35,7 @@ import org.opendaylight.controller.yang.model.api.SchemaContext;
 import org.opendaylight.controller.yang.model.api.SchemaNode;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.BooleanTypeDefinition;
@@ -80,6 +80,7 @@ import org.opendaylight.controller.yang.parser.builder.api.Builder;
 import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
+import org.opendaylight.controller.yang.parser.builder.api.GroupingMember;
 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeAwareBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
@@ -104,13 +105,31 @@ import org.opendaylight.controller.yang.parser.builder.impl.RpcDefinitionBuilder
 import org.opendaylight.controller.yang.parser.builder.impl.TypeDefinitionBuilderImpl;
 import org.opendaylight.controller.yang.parser.builder.impl.UnionTypeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
-import org.opendaylight.controller.yang.parser.builder.impl.UsesNodeBuilderImpl;
 
 public final class ParserUtils {
 
     private ParserUtils() {
     }
 
+    /**
+     * Create new SchemaPath from given path and name.
+     *
+     * Append new qname to schema path created from name argument. New QName
+     * gets namespace, revision and prefix same as last qname in current schema
+     * path.
+     *
+     * @param schemaPath
+     * @param name
+     * @return
+     */
+    public static SchemaPath createSchemaPath(SchemaPath schemaPath, String name) {
+        List<QName> path = new ArrayList<QName>(schemaPath.getPath());
+        QName last = path.get(path.size() - 1);
+        QName newQName = new QName(last.getNamespace(), last.getRevision(), last.getPrefix(), name);
+        path.add(newQName);
+        return new SchemaPath(path, schemaPath.isAbsolute());
+    }
+
     /**
      * Get module import referenced by given prefix.
      *
@@ -318,6 +337,24 @@ public final class ParserUtils {
         return new SchemaPath(path, absolute);
     }
 
+    /**
+     * Check if node is present in refine nodes.
+     *
+     * @param nodeQName
+     *            qname of node
+     * @param refineNodes
+     *            collections of refined nodes
+     * @return true, if node with given qname was found, false otherwise
+     */
+    public static SchemaNodeBuilder getRefined(QName nodeQName, List<SchemaNodeBuilder> refineNodes) {
+        for (SchemaNodeBuilder rn : refineNodes) {
+            if (rn.getQName().equals(nodeQName)) {
+                return rn;
+            }
+        }
+        return null;
+    }
+
     /**
      * Pull restriction from type and add them to constraints.
      *
@@ -353,7 +390,7 @@ public final class ParserUtils {
         Builder result = grouping.getChildNode(refineNodeName);
         // search groupings
         if (result == null) {
-            Set<GroupingBuilder> grps = grouping.getGroupings();
+            Set<GroupingBuilder> grps = grouping.getGroupingBuilders();
             for (GroupingBuilder gr : grps) {
                 if (gr.getQName().getLocalName().equals(refineNodeName)) {
                     result = gr;
@@ -363,7 +400,7 @@ public final class ParserUtils {
         }
         // search typedefs
         if (result == null) {
-            Set<TypeDefinitionBuilder> typedefs = grouping.getTypeDefinitions();
+            Set<TypeDefinitionBuilder> typedefs = grouping.getTypeDefinitionBuilders();
             for (TypeDefinitionBuilder typedef : typedefs) {
                 if (typedef.getQName().getLocalName().equals(refineNodeName)) {
                     result = typedef;
@@ -415,8 +452,14 @@ public final class ParserUtils {
      *            augmentation target node
      */
     public static void fillAugmentTarget(final AugmentationSchemaBuilder augment, final DataNodeContainerBuilder target) {
-        for (DataSchemaNodeBuilder builder : augment.getChildNodes()) {
+        boolean usesAugment = augment.getParent() instanceof UsesNodeBuilder;
+        for (DataSchemaNodeBuilder builder : augment.getChildNodeBuilders()) {
             builder.setAugmenting(true);
+            if (usesAugment) {
+                if (builder instanceof GroupingMember) {
+                    ((GroupingMember) builder).setAddedByUses(true);
+                }
+            }
             correctAugmentChildPath(builder, target.getPath());
             target.addChildNode(builder);
         }
@@ -431,8 +474,14 @@ public final class ParserUtils {
      *            augmentation target choice node
      */
     public static void fillAugmentTarget(final AugmentationSchemaBuilder augment, final ChoiceBuilder target) {
-        for (DataSchemaNodeBuilder builder : augment.getChildNodes()) {
+        boolean usesAugment = augment.getParent() instanceof UsesNodeBuilder;
+        for (DataSchemaNodeBuilder builder : augment.getChildNodeBuilders()) {
             builder.setAugmenting(true);
+            if (usesAugment) {
+                if (builder instanceof GroupingMember) {
+                    ((GroupingMember) builder).setAddedByUses(true);
+                }
+            }
             correctAugmentChildPath(builder, target.getPath());
             target.addChildNode(builder);
         }
@@ -447,7 +496,7 @@ public final class ParserUtils {
         // set correct path for all child nodes
         if (childNode instanceof DataNodeContainerBuilder) {
             DataNodeContainerBuilder dataNodeContainer = (DataNodeContainerBuilder) childNode;
-            for (DataSchemaNodeBuilder child : dataNodeContainer.getChildNodes()) {
+            for (DataSchemaNodeBuilder child : dataNodeContainer.getChildNodeBuilders()) {
                 correctAugmentChildPath(child, childNode.getPath());
             }
         }
@@ -684,211 +733,6 @@ public final class ParserUtils {
         return new SchemaPath(newPath, schemaPath.isAbsolute());
     }
 
-    public static LeafSchemaNodeBuilder copyLeafBuilder(final LeafSchemaNodeBuilder old) {
-        final LeafSchemaNodeBuilder copy = new LeafSchemaNodeBuilder(old.getQName(), old.getLine());
-        final TypeDefinition<?> type = old.getType();
-        if (type == null) {
-            copy.setTypedef(old.getTypedef());
-        } else {
-            copy.setType(type);
-        }
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        copy.setDefaultStr(old.getDefaultStr());
-        copy.setUnits(old.getUnits());
-        return copy;
-    }
-
-    public static ContainerSchemaNodeBuilder copyContainerBuilder(final ContainerSchemaNodeBuilder old) {
-        final ContainerSchemaNodeBuilder copy = new ContainerSchemaNodeBuilder(old.getQName(), old.getLine());
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        for (DataSchemaNodeBuilder child : old.getChildNodes()) {
-            copy.addChildNode(child);
-        }
-        for (GroupingBuilder grouping : old.getGroupings()) {
-            copy.addGrouping(grouping);
-        }
-        for (TypeDefinitionBuilder typedef : old.getTypeDefinitions()) {
-            copy.addTypedef(typedef);
-        }
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
-            copy.addAugmentation(augment);
-        }
-        for (UsesNodeBuilder use : old.getUsesNodes()) {
-            copy.addUsesNode(use);
-        }
-        copy.setPresence(old.isPresence());
-        return copy;
-    }
-
-    public static ListSchemaNodeBuilder copyListBuilder(final ListSchemaNodeBuilder old) {
-        final ListSchemaNodeBuilder copy = new ListSchemaNodeBuilder(old.getQName(), old.getLine());
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        for (DataSchemaNodeBuilder child : old.getChildNodes()) {
-            copy.addChildNode(child);
-        }
-        for (GroupingBuilder grouping : old.getGroupings()) {
-            copy.addGrouping(grouping);
-        }
-        for (TypeDefinitionBuilder typedef : old.getTypeDefinitions()) {
-            copy.addTypedef(typedef);
-        }
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
-            copy.addAugmentation(augment);
-        }
-        for (UsesNodeBuilder use : old.getUsesNodes()) {
-            copy.addUsesNode(use);
-        }
-        copy.setUserOrdered(old.isUserOrdered());
-        return copy;
-    }
-
-    public static LeafListSchemaNodeBuilder copyLeafListBuilder(final LeafListSchemaNodeBuilder old) {
-        final LeafListSchemaNodeBuilder copy = new LeafListSchemaNodeBuilder(old.getQName(), old.getLine());
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        final TypeDefinition<?> type = old.getType();
-        if (type == null) {
-            copy.setTypedef(old.getTypedef());
-        } else {
-            copy.setType(type);
-        }
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        copy.setUserOrdered(old.isUserOrdered());
-        return copy;
-    }
-
-    public static ChoiceBuilder copyChoiceBuilder(final ChoiceBuilder old) {
-        final ChoiceBuilder copy = new ChoiceBuilder(old.getQName(), old.getLine());
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        for (ChoiceCaseBuilder caseBuilder : old.getCases()) {
-            copy.addChildNode(caseBuilder);
-        }
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        copy.setDefaultCase(old.getDefaultCase());
-        return copy;
-    }
-
-    public static AnyXmlBuilder copyAnyXmlBuilder(final AnyXmlBuilder old) {
-        final AnyXmlBuilder copy = new AnyXmlBuilder(old.getQName(), old.getLine());
-        copyDataSchemaNodeArgs(old, copy);
-        copyConstraintsFromBuilder(old, copy);
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        return copy;
-    }
-
-    public static GroupingBuilder copyGroupingBuilder(final GroupingBuilder old) {
-        final GroupingBuilder copy = new GroupingBuilderImpl(old.getQName(), old.getLine());
-        copy.setPath(old.getPath());
-        for (DataSchemaNodeBuilder child : old.getChildNodes()) {
-            copy.addChildNode(child);
-        }
-        for (GroupingBuilder grouping : old.getGroupings()) {
-            copy.addGrouping(grouping);
-        }
-        for (TypeDefinitionBuilder typedef : old.getTypeDefinitions()) {
-            copy.addTypedef(typedef);
-        }
-        for (UsesNodeBuilder use : old.getUses()) {
-            copy.addUsesNode(use);
-        }
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        copy.setDescription(old.getDescription());
-        copy.setReference(old.getReference());
-        copy.setStatus(old.getStatus());
-        return copy;
-    }
-
-    public static TypeDefinitionBuilderImpl copyTypedefBuilder(final TypeDefinitionBuilderImpl old) {
-        final TypeDefinitionBuilderImpl copy = new TypeDefinitionBuilderImpl(old.getQName(), old.getLine());
-        copy.setPath(old.getPath());
-        copy.setDefaultValue(old.getDefaultValue());
-        copy.setUnits(old.getUnits());
-        copy.setDescription(old.getDescription());
-        copy.setReference(old.getReference());
-        copy.setStatus(old.getStatus());
-
-        copy.setRanges(old.getRanges());
-        copy.setLengths(old.getLengths());
-        copy.setPatterns(old.getPatterns());
-        copy.setFractionDigits(old.getFractionDigits());
-
-        TypeDefinition<?> type = old.getType();
-        if (type == null) {
-            copy.setTypedef(old.getTypedef());
-        } else {
-            copy.setType(old.getType());
-        }
-        copy.setUnits(old.getUnits());
-        for (UnknownSchemaNodeBuilder unknown : old.getUnknownNodes()) {
-            copy.addUnknownSchemaNode(unknown);
-        }
-        return copy;
-    }
-
-    public static UsesNodeBuilder copyUsesNodeBuilder(final UsesNodeBuilder old) {
-        final UsesNodeBuilder copy = new UsesNodeBuilderImpl(old.getGroupingName(), old.getLine());
-        for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
-            copy.addAugment(augment);
-        }
-        copy.setAugmenting(old.isAugmenting());
-        for (SchemaNodeBuilder refineNode : old.getRefineNodes()) {
-            copy.addRefineNode(refineNode);
-        }
-        return copy;
-    }
-
-    private static void copyDataSchemaNodeArgs(final DataSchemaNodeBuilder oldBuilder,
-            final DataSchemaNodeBuilder newBuilder) {
-        newBuilder.setPath(oldBuilder.getPath());
-        newBuilder.setDescription(oldBuilder.getDescription());
-        newBuilder.setReference(oldBuilder.getReference());
-        newBuilder.setStatus(oldBuilder.getStatus());
-        newBuilder.setAugmenting(oldBuilder.isAugmenting());
-        if (!(oldBuilder instanceof ChoiceCaseNode)) {
-            newBuilder.setConfiguration(oldBuilder.isConfiguration());
-        }
-    }
-
-    /**
-     * Copy constraints from old builder to new builder.
-     *
-     * @param oldBuilder
-     * @param newBuilder
-     */
-    private static void copyConstraintsFromBuilder(final DataSchemaNodeBuilder oldBuilder,
-            final DataSchemaNodeBuilder newBuilder) {
-        final ConstraintsBuilder oldConstraints = oldBuilder.getConstraints();
-        final ConstraintsBuilder newConstraints = newBuilder.getConstraints();
-        newConstraints.addWhenCondition(oldConstraints.getWhenCondition());
-        for (MustDefinition must : oldConstraints.getMustDefinitions()) {
-            newConstraints.addMustDefinition(must);
-        }
-        newConstraints.setMandatory(oldConstraints.isMandatory());
-        newConstraints.setMinElements(oldConstraints.getMinElements());
-        newConstraints.setMaxElements(oldConstraints.getMaxElements());
-    }
-
     /**
      * Create LeafSchemaNodeBuilder from given LeafSchemaNode.
      *
@@ -899,8 +743,9 @@ public final class ParserUtils {
      * @return builder object from leaf
      */
     public static LeafSchemaNodeBuilder createLeafBuilder(LeafSchemaNode leaf, int line) {
-        final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(leaf.getQName(), line);
+        final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(leaf.getQName(), leaf.getPath(), line);
         convertDataSchemaNode(leaf, builder);
+        builder.setConfiguration(leaf.isConfiguration());
         final TypeDefinition<?> type = leaf.getType();
         builder.setType(type);
         builder.setPath(leaf.getPath());
@@ -911,8 +756,10 @@ public final class ParserUtils {
     }
 
     public static ContainerSchemaNodeBuilder createContainer(ContainerSchemaNode container, int line) {
-        final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(container.getQName(), line);
+        final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(container.getQName(),
+                container.getPath(), line);
         convertDataSchemaNode(container, builder);
+        builder.setConfiguration(container.isConfiguration());
         builder.setUnknownNodes(container.getUnknownSchemaNodes());
         builder.setChildNodes(container.getChildNodes());
         builder.setGroupings(container.getGroupings());
@@ -924,8 +771,9 @@ public final class ParserUtils {
     }
 
     public static ListSchemaNodeBuilder createList(ListSchemaNode list, int line) {
-        ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(list.getQName(), line);
+        ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(list.getQName(), list.getPath(), line);
         convertDataSchemaNode(list, builder);
+        builder.setConfiguration(list.isConfiguration());
         builder.setUnknownNodes(list.getUnknownSchemaNodes());
         builder.setTypedefs(list.getTypeDefinitions());
         builder.setChildNodes(list.getChildNodes());
@@ -937,8 +785,10 @@ public final class ParserUtils {
     }
 
     public static LeafListSchemaNodeBuilder createLeafList(LeafListSchemaNode leafList, int line) {
-        final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(leafList.getQName(), line);
+        final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(leafList.getQName(),
+                leafList.getPath(), line);
         convertDataSchemaNode(leafList, builder);
+        builder.setConfiguration(leafList.isConfiguration());
         builder.setType(leafList.getType());
         builder.setUnknownNodes(leafList.getUnknownSchemaNodes());
         builder.setUserOrdered(leafList.isUserOrdered());
@@ -948,6 +798,7 @@ public final class ParserUtils {
     public static ChoiceBuilder createChoice(ChoiceNode choice, int line) {
         final ChoiceBuilder builder = new ChoiceBuilder(choice.getQName(), line);
         convertDataSchemaNode(choice, builder);
+        builder.setConfiguration(choice.isConfiguration());
         builder.setCases(choice.getCases());
         builder.setUnknownNodes(choice.getUnknownSchemaNodes());
         builder.setDefaultCase(choice.getDefaultCase());
@@ -955,8 +806,9 @@ public final class ParserUtils {
     }
 
     public static AnyXmlBuilder createAnyXml(AnyXmlSchemaNode anyxml, int line) {
-        final AnyXmlBuilder builder = new AnyXmlBuilder(anyxml.getQName(), line);
+        final AnyXmlBuilder builder = new AnyXmlBuilder(anyxml.getQName(), anyxml.getPath(), line);
         convertDataSchemaNode(anyxml, builder);
+        builder.setConfiguration(anyxml.isConfiguration());
         builder.setUnknownNodes(anyxml.getUnknownSchemaNodes());
         return builder;
     }
@@ -994,6 +846,19 @@ public final class ParserUtils {
         return builder;
     }
 
+    public static UnknownSchemaNodeBuilder createUnknownSchemaNode(UnknownSchemaNode grouping, int line) {
+        final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(grouping.getQName(), line);
+        builder.setPath(grouping.getPath());
+        builder.setUnknownNodes(grouping.getUnknownSchemaNodes());
+        builder.setDescription(grouping.getDescription());
+        builder.setReference(grouping.getReference());
+        builder.setStatus(grouping.getStatus());
+        builder.setAddedByUses(grouping.isAddedByUses());
+        builder.setNodeType(grouping.getNodeType());
+        builder.setNodeParameter(grouping.getNodeParameter());
+        return builder;
+    }
+
     /**
      * Set DataSchemaNode arguments to builder object
      *
@@ -1008,9 +873,6 @@ public final class ParserUtils {
         builder.setReference(node.getReference());
         builder.setStatus(node.getStatus());
         builder.setAugmenting(node.isAugmenting());
-        if (!(node instanceof ChoiceCaseNode)) {
-            builder.setConfiguration(node.isConfiguration());
-        }
         copyConstraintsFromDefinition(node.getConstraints(), builder.getConstraints());
     }
 
@@ -1132,7 +994,7 @@ public final class ParserUtils {
     public static void processAugmentation(final AugmentationSchemaBuilder augmentBuilder, final List<QName> path,
             final ModuleBuilder module, final QName qname, final ModuleBuilder dependentModuleBuilder) {
         DataSchemaNodeBuilder currentParent = null;
-        for (DataSchemaNodeBuilder child : dependentModuleBuilder.getChildNodes()) {
+        for (DataSchemaNodeBuilder child : dependentModuleBuilder.getChildNodeBuilders()) {
             final QName childQName = child.getQName();
             if (childQName.getLocalName().equals(qname.getLocalName())) {
                 currentParent = child;
@@ -1147,7 +1009,7 @@ public final class ParserUtils {
         for (int i = 1; i < path.size(); i++) {
             final QName currentQName = path.get(i);
             DataSchemaNodeBuilder newParent = null;
-            for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder) currentParent).getChildNodes()) {
+            for (DataSchemaNodeBuilder child : ((DataNodeContainerBuilder) currentParent).getChildNodeBuilders()) {
                 final QName childQName = child.getQName();
                 if (childQName.getLocalName().equals(currentQName.getLocalName())) {
                     newParent = child;
@@ -1395,7 +1257,7 @@ public final class ParserUtils {
                 if (currentNode instanceof RpcDefinitionBuilder) {
                     typedefs = ((RpcDefinitionBuilder) currentNode).getTypeDefinitions();
                 } else if (currentNode instanceof DataNodeContainerBuilder) {
-                    typedefs = ((DataNodeContainerBuilder) currentNode).getTypeDefinitions();
+                    typedefs = ((DataNodeContainerBuilder) currentNode).getTypeDefinitionBuilders();
                 } else {
                     typedefs = Collections.emptySet();
                 }
index 4dd46769d8578469352eec15b07a102ddeaaffca..7d228919010e14b90ecd0969941f522ee9754678 100644 (file)
@@ -12,9 +12,10 @@ import java.util.List;
 
 import org.opendaylight.controller.yang.model.api.MustDefinition;
 import org.opendaylight.controller.yang.parser.builder.api.Builder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
 
-public final class RefineHolder implements Builder {
+public final class RefineHolder implements Builder, ConfigNode {
     private final String name;
     private final int line;
     private String defaultStr;
@@ -62,11 +63,13 @@ public final class RefineHolder implements Builder {
         this.reference = reference;
     }
 
-    public Boolean isConfig() {
+    @Override
+    public Boolean isConfiguration() {
         return config;
     }
 
-    public void setConfig(final Boolean config) {
+    @Override
+    public void setConfiguration(final Boolean config) {
         this.config = config;
     }
 
index 8db4e8e6fd56e8656679926ff38433696740ee27..73acebf71798ce1fb5fb858b21c17bf1093c6915 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.AnyXmlBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ChoiceBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.GroupingBuilderImpl;
 import org.opendaylight.controller.yang.parser.builder.impl.LeafListSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.LeafSchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ListSchemaNodeBuilder;
@@ -66,21 +67,21 @@ public class RefineUtils {
         Builder result = null;
         final Builder lookedUpBuilder = findRefineTargetBuilder(targetGrouping, refine.getName());
         if (lookedUpBuilder instanceof LeafSchemaNodeBuilder) {
-            result = copyLeafBuilder((LeafSchemaNodeBuilder) lookedUpBuilder);
+            result = new LeafSchemaNodeBuilder((LeafSchemaNodeBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof ContainerSchemaNodeBuilder) {
-            result = copyContainerBuilder((ContainerSchemaNodeBuilder) lookedUpBuilder);
+            result = new ContainerSchemaNodeBuilder((ContainerSchemaNodeBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof ListSchemaNodeBuilder) {
-            result = copyListBuilder((ListSchemaNodeBuilder) lookedUpBuilder);
+            result = new ListSchemaNodeBuilder((ListSchemaNodeBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof LeafListSchemaNodeBuilder) {
-            result = copyLeafListBuilder((LeafListSchemaNodeBuilder) lookedUpBuilder);
+            result = new LeafListSchemaNodeBuilder((LeafListSchemaNodeBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof ChoiceBuilder) {
-            result = copyChoiceBuilder((ChoiceBuilder) lookedUpBuilder);
+            result = new ChoiceBuilder((ChoiceBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof AnyXmlBuilder) {
-            result = copyAnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder);
+            result = new AnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof GroupingBuilder) {
-            result = copyGroupingBuilder((GroupingBuilder) lookedUpBuilder);
+            result = new GroupingBuilderImpl((GroupingBuilder) lookedUpBuilder);
         } else if (lookedUpBuilder instanceof TypeDefinitionBuilder) {
-            result = copyTypedefBuilder((TypeDefinitionBuilderImpl) lookedUpBuilder);
+            result = new TypeDefinitionBuilderImpl((TypeDefinitionBuilder) lookedUpBuilder);
         } else {
             throw new YangParseException(moduleName, refine.getLine(), "Target '" + refine.getName()
                     + "' can not be refined");
@@ -368,10 +369,10 @@ public class RefineUtils {
             }
         }
 
-        Boolean config = refine.isConfig();
+        Boolean config = refine.isConfiguration();
         if (config != null) {
             try {
-                Method method = cls.getDeclaredMethod("setConfiguration", Boolean.TYPE);
+                Method method = cls.getDeclaredMethod("setConfiguration", Boolean.class);
                 method.invoke(node, config);
             } catch (Exception e) {
                 throw new YangParseException(line, "Cannot refine config in " + cls.getName(), e);
index 5423e486db13a9101eff84d9f849fb40ad5ec054..856f8e2ba711c4d09c7d9447cd38ad453868c588 100644 (file)
@@ -15,7 +15,7 @@ import java.util.List;
 import java.util.Stack;
 
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser;
+import org.opendaylight.controller.antlrv4.code.gen.*;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Argument_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Base_stmtContext;
 import org.opendaylight.controller.antlrv4.code.gen.YangParser.Bit_stmtContext;
@@ -108,16 +108,17 @@ import org.opendaylight.controller.yang.model.util.Uint64;
 import org.opendaylight.controller.yang.model.util.Uint8;
 import org.opendaylight.controller.yang.model.util.UnknownType;
 import org.opendaylight.controller.yang.parser.builder.api.Builder;
+import org.opendaylight.controller.yang.parser.builder.api.ConfigNode;
 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.ChoiceBuilder;
+import org.opendaylight.controller.yang.parser.builder.impl.ChoiceCaseBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.ConstraintsBuilder;
-import org.opendaylight.controller.yang.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.controller.yang.parser.builder.impl.UnionTypeBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class YangModelBuilderUtil {
-
     private static final Logger logger = LoggerFactory.getLogger(YangModelBuilderUtil.class);
 
     private YangModelBuilderUtil() {
@@ -216,18 +217,18 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Create SchemaPath object from given path list with namespace, revision
-     * and prefix based on given values.
+     * Create SchemaPath from actualPath and names.
      *
      * @param actualPath
      *            current position in model
      * @param namespace
      * @param revision
      * @param prefix
+     * @param names
      * @return SchemaPath object.
      */
     public static SchemaPath createActualSchemaPath(final List<String> actualPath, final URI namespace,
-            final Date revision, final String prefix) {
+            final Date revision, final String prefix, final String... names) {
         final List<QName> path = new ArrayList<QName>();
         QName qname;
         // start from index 1 - module name omited
@@ -235,6 +236,10 @@ public final class YangModelBuilderUtil {
             qname = new QName(namespace, revision, prefix, actualPath.get(i));
             path.add(qname);
         }
+        for (String name : names) {
+            qname = new QName(namespace, revision, prefix, name);
+            path.add(qname);
+        }
         return new SchemaPath(path, true);
     }
 
@@ -867,11 +872,15 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Parse orderedby statement.
+     * Parse 'ordered-by' statement.
+     *
+     * The 'ordered-by' statement defines whether the order of entries within a
+     * list are determined by the user or the system. The argument is one of the
+     * strings "system" or "user". If not present, order defaults to "system".
      *
      * @param childNode
      *            Ordered_by_stmtContext
-     * @return true, if orderedby contains value 'user' or false otherwise
+     * @return true, if ordered-by contains value 'user', false otherwise
      */
     public static boolean parseUserOrdered(Ordered_by_stmtContext childNode) {
         boolean result = false;
@@ -891,16 +900,66 @@ public final class YangModelBuilderUtil {
         return result;
     }
 
+    public static Boolean getConfig(final ParseTree ctx, final Builder parent, final String moduleName, final int line) {
+        Boolean result = null;
+        // parse configuration statement
+        Boolean configuration = null;
+        for (int i = 0; i < ctx.getChildCount(); i++) {
+            ParseTree child = ctx.getChild(i);
+            if (child instanceof Config_stmtContext) {
+                configuration = parseConfig((Config_stmtContext) child);
+                break;
+            }
+        }
+
+        // If 'config' is not specified, the default is the same as the parent
+        // schema node's 'config' value
+        if (configuration == null) {
+            if (parent instanceof ConfigNode) {
+                Boolean parentConfig = ((ConfigNode) parent).isConfiguration();
+                // If the parent node is a rpc input or output, it can has
+                // config set to null
+                result = parentConfig == null ? true : parentConfig;
+            } else if (parent instanceof ChoiceCaseBuilder) {
+                // If the parent node is a 'case' node, the value is the same as
+                // the 'case' node's parent 'choice' node
+                ChoiceCaseBuilder choiceCase = (ChoiceCaseBuilder) parent;
+                ChoiceBuilder choice = choiceCase.getParent();
+                Boolean parentConfig = null;
+                if (choice == null) {
+                    parentConfig = true;
+                } else {
+                    parentConfig = choice.isConfiguration();
+                }
+                result = parentConfig;
+            } else {
+                result = true;
+            }
+        } else {
+            // Check first: if a node has 'config' set to 'false', no node
+            // underneath it can have 'config' set to 'true'
+            if (parent instanceof ConfigNode) {
+                Boolean parentConfig = ((ConfigNode) parent).isConfiguration();
+                if (parentConfig == false && configuration == true) {
+                    throw new YangParseException(moduleName, line,
+                            "Can not set 'config' to 'true' if parent node has 'config' set to 'false'");
+                }
+            }
+            result = configuration;
+        }
+
+        return result;
+    }
+
     /**
-     * Parse given config context and return true if it contains string 'true',
-     * false otherwise.
+     * Parse config statement.
      *
      * @param ctx
      *            config context to parse.
      * @return true if given context contains string 'true', false otherwise
      */
-    public static boolean parseConfig(final Config_stmtContext ctx) {
-        boolean result = false;
+    private static Boolean parseConfig(final Config_stmtContext ctx) {
+        Boolean result = null;
         if (ctx != null) {
             for (int i = 0; i < ctx.getChildCount(); ++i) {
                 final ParseTree configContext = ctx.getChild(i);
@@ -909,6 +968,12 @@ public final class YangModelBuilderUtil {
                     if ("true".equals(value)) {
                         result = true;
                         break;
+                    } else if ("false".equals(value)) {
+                        result = false;
+                        break;
+                    } else {
+                        throw new YangParseException(ctx.getStart().getLine(),
+                                "Failed to parse 'config' statement value: '" + value + "'.");
                     }
                 }
             }
@@ -917,17 +982,22 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Parse given type body and creates UnknownType definition.
+     * Parse type body and create UnknownType definition.
      *
      * @param typedefQName
      *            qname of current type
      * @param ctx
      *            type body
+     * @param actualPath
+     * @param namespace
+     * @param revision
+     * @param prefix
+     * @param parent
      * @return UnknownType object with constraints from parsed type body
      */
-    public static TypeDefinition<?> parseUnknownTypeBody(QName typedefQName, Type_body_stmtsContext ctx,
-            final List<String> actualPath, final URI namespace, final Date revision, final String prefix,
-            Builder parent, ModuleBuilder moduleBuilder) {
+    public static TypeDefinition<?> parseUnknownTypeWithBody(final QName typedefQName,
+            final Type_body_stmtsContext ctx, final List<String> actualPath, final URI namespace, final Date revision,
+            final String prefix, final Builder parent) {
         String typeName = typedefQName.getLocalName();
 
         UnknownType.Builder unknownType = new UnknownType.Builder(typedefQName);
@@ -972,10 +1042,12 @@ public final class YangModelBuilderUtil {
     /**
      * Create TypeDefinition object based on given type name and type body.
      *
+     * @param moduleName
+     *            current module name
      * @param typeName
      *            name of type
      * @param typeBody
-     *            type body
+     *            type body context
      * @param actualPath
      *            current path in schema
      * @param namespace
@@ -984,19 +1056,19 @@ public final class YangModelBuilderUtil {
      *            current revision
      * @param prefix
      *            current prefix
+     * @param parent
+     *            parent builder
      * @return TypeDefinition object based on parsed values.
      */
-    public static TypeDefinition<?> parseTypeBody(final String moduleName, final String typeName,
+    public static TypeDefinition<?> parseTypeWithBody(final String moduleName, final String typeName,
             final Type_body_stmtsContext typeBody, final List<String> actualPath, final URI namespace,
-            final Date revision, final String prefix, Builder parent) {
+            final Date revision, final String prefix, final Builder parent) {
         TypeDefinition<?> baseType = null;
 
-        List<RangeConstraint> rangeStatements = getRangeConstraints(typeBody);
         Integer fractionDigits = getFractionDigits(typeBody);
         List<LengthConstraint> lengthStatements = getLengthConstraints(typeBody);
         List<PatternConstraint> patternStatements = getPatternConstraint(typeBody);
-        List<EnumTypeDefinition.EnumPair> enumConstants = getEnumConstants(typeBody, actualPath, namespace, revision,
-                prefix);
+        List<RangeConstraint> rangeStatements = getRangeConstraints(typeBody);
 
         TypeConstraints constraints = new TypeConstraints(moduleName, typeBody.getStart().getLine());
         constraints.addFractionDigits(fractionDigits);
@@ -1042,6 +1114,8 @@ public final class YangModelBuilderUtil {
             constraints.addRanges(uintType.getRangeStatements());
             baseType = uintType;
         } else if ("enumeration".equals(typeName)) {
+            List<EnumTypeDefinition.EnumPair> enumConstants = getEnumConstants(typeBody, actualPath, namespace,
+                    revision, prefix);
             return new EnumerationType(baseTypePathFinal, enumConstants);
         } else if ("string".equals(typeName)) {
             StringTypeDefinition stringType = new StringType(baseTypePath);
@@ -1154,10 +1228,10 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Parse given context and find require-instance value.
+     * Parse type body statement and find require-instance value.
      *
      * @param ctx
-     *            type body
+     *            type body context
      * @return require-instance value
      */
     private static boolean isRequireInstance(Type_body_stmtsContext ctx) {
@@ -1176,10 +1250,10 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Parse given context and find leafref path.
+     * Parse type body statement and find leafref path.
      *
      * @param ctx
-     *            type body
+     *            type body context
      * @return leafref path as String
      */
     private static String parseLeafrefPath(Type_body_stmtsContext ctx) {
@@ -1198,7 +1272,7 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Internal helper method for parsing Must_stmtContext.
+     * Internal helper method for parsing must statement.
      *
      * @param ctx
      *            Must_stmtContext
@@ -1247,10 +1321,10 @@ public final class YangModelBuilderUtil {
     }
 
     /**
-     * Parse given tree and set constraints to given builder.
+     * Parse given context and set constraints to constraints builder.
      *
      * @param ctx
-     *            context to search
+     *            context to parse
      * @param constraints
      *            ConstraintsBuilder to fill
      */
@@ -1423,8 +1497,8 @@ public final class YangModelBuilderUtil {
                 String reference = stringFromNode(refineArg);
                 refine.setReference(reference);
             } else if (refineArg instanceof Config_stmtContext) {
-                boolean config = parseConfig((Config_stmtContext) refineArg);
-                refine.setConfig(config);
+                Boolean config = parseConfig((Config_stmtContext) refineArg);
+                refine.setConfiguration(config);
             }
         }
     }
diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/GroupingTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/GroupingTest.java
new file mode 100644 (file)
index 0000000..2442f51
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.yang.parser.impl;
+
+import static org.junit.Assert.*;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.yang.model.api.AnyXmlSchemaNode;
+import org.opendaylight.controller.yang.model.api.ChoiceNode;
+import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.controller.yang.model.api.DataSchemaNode;
+import org.opendaylight.controller.yang.model.api.GroupingDefinition;
+import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
+import org.opendaylight.controller.yang.model.api.ListSchemaNode;
+import org.opendaylight.controller.yang.model.api.Module;
+import org.opendaylight.controller.yang.model.api.MustDefinition;
+import org.opendaylight.controller.yang.model.api.SchemaNode;
+import org.opendaylight.controller.yang.model.api.SchemaPath;
+import org.opendaylight.controller.yang.model.api.TypeDefinition;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.model.api.UsesNode;
+import org.opendaylight.controller.yang.model.util.ExtendedType;
+
+public class GroupingTest {
+    private Set<Module> modules;
+
+    @Before
+    public void init() throws FileNotFoundException {
+        modules = TestUtils.loadModules(getClass().getResource("/model").getPath());
+        assertEquals(3, modules.size());
+    }
+
+    @Test
+    public void testRefine() {
+        Module testModule = TestUtils.findModule(modules, "types2");
+
+        ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
+        ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
+        Set<UsesNode> usesNodes = destination.getUses();
+        assertEquals(1, usesNodes.size());
+        UsesNode usesNode = usesNodes.iterator().next();
+        Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
+        assertEquals(5, refines.size());
+
+        LeafSchemaNode refineLeaf = null;
+        ContainerSchemaNode refineContainer = null;
+        ListSchemaNode refineList = null;
+        GroupingDefinition refineGrouping = null;
+        TypeDefinition<?> typedef = null;
+        for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
+            SchemaNode value = entry.getValue();
+            if (value instanceof LeafSchemaNode) {
+                refineLeaf = (LeafSchemaNode) value;
+            } else if (value instanceof ContainerSchemaNode) {
+                refineContainer = (ContainerSchemaNode) value;
+            } else if (value instanceof ListSchemaNode) {
+                refineList = (ListSchemaNode) value;
+            } else if (value instanceof GroupingDefinition) {
+                refineGrouping = (GroupingDefinition) value;
+            } else if (value instanceof TypeDefinition<?>) {
+                typedef = (TypeDefinition<?>) value;
+            }
+        }
+
+        // leaf address
+        assertNotNull(refineLeaf);
+        assertEquals("address", refineLeaf.getQName().getLocalName());
+        assertEquals("IP address of target node", refineLeaf.getDescription());
+        assertEquals("address reference added by refine", refineLeaf.getReference());
+        assertFalse(refineLeaf.isConfiguration());
+        assertTrue(refineLeaf.getConstraints().isMandatory());
+        Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
+        assertEquals(1, leafMustConstraints.size());
+        MustDefinition leafMust = leafMustConstraints.iterator().next();
+        assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString());
+
+        // container port
+        assertNotNull(refineContainer);
+        Set<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
+        assertTrue(mustConstraints.isEmpty());
+        assertEquals("description of port defined by refine", refineContainer.getDescription());
+        assertEquals("port reference added by refine", refineContainer.getReference());
+        assertFalse(refineContainer.isConfiguration());
+        assertTrue(refineContainer.isPresenceContainer());
+
+        // list addresses
+        assertNotNull(refineList);
+        assertEquals("description of addresses defined by refine", refineList.getDescription());
+        assertEquals("addresses reference added by refine", refineList.getReference());
+        assertFalse(refineList.isConfiguration());
+        assertEquals(2, (int) refineList.getConstraints().getMinElements());
+        assertEquals(12, (int) refineList.getConstraints().getMaxElements());
+
+        // grouping target-inner
+        assertNotNull(refineGrouping);
+        Set<DataSchemaNode> refineGroupingChildren = refineGrouping.getChildNodes();
+        assertEquals(1, refineGroupingChildren.size());
+        LeafSchemaNode refineGroupingLeaf = (LeafSchemaNode) refineGroupingChildren.iterator().next();
+        assertEquals("inner-grouping-id", refineGroupingLeaf.getQName().getLocalName());
+        assertEquals("new target-inner grouping description", refineGrouping.getDescription());
+
+        // typedef group-type
+        assertNotNull(typedef);
+        assertEquals("new group-type description", typedef.getDescription());
+        assertEquals("new group-type reference", typedef.getReference());
+        assertTrue(typedef.getBaseType() instanceof ExtendedType);
+    }
+
+    @Test
+    public void testGrouping() {
+        Module testModule = TestUtils.findModule(modules, "types2");
+        Set<GroupingDefinition> groupings = testModule.getGroupings();
+        assertEquals(1, groupings.size());
+        GroupingDefinition grouping = groupings.iterator().next();
+        Set<DataSchemaNode> children = grouping.getChildNodes();
+        assertEquals(5, children.size());
+    }
+
+    @Test
+    public void testUses() {
+        // suffix _u = added by uses
+        // suffix _g = defined in grouping
+
+        Module testModule = TestUtils.findModule(modules, "types2");
+
+        // get grouping
+        Set<GroupingDefinition> groupings = testModule.getGroupings();
+        assertEquals(1, groupings.size());
+        GroupingDefinition grouping = groupings.iterator().next();
+
+        // get node containing uses
+        ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
+        ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
+
+        // check uses
+        Set<UsesNode> uses = destination.getUses();
+        assertEquals(1, uses.size());
+
+        // check uses process
+        AnyXmlSchemaNode data_u = (AnyXmlSchemaNode) destination.getDataChildByName("data");
+        assertNotNull(data_u);
+        assertTrue(data_u.isAddedByUses());
+
+        AnyXmlSchemaNode data_g = (AnyXmlSchemaNode) grouping.getDataChildByName("data");
+        assertNotNull(data_g);
+        assertFalse(data_g.isAddedByUses());
+        assertFalse(data_u.equals(data_g));
+
+        ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
+        assertNotNull(how_u);
+        assertTrue(how_u.isAddedByUses());
+
+        ChoiceNode how_g = (ChoiceNode) grouping.getDataChildByName("how");
+        assertNotNull(how_g);
+        assertFalse(how_g.isAddedByUses());
+        assertFalse(how_u.equals(how_g));
+
+        LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
+        assertNotNull(address_u);
+        assertEquals("1.2.3.4", address_u.getDefault());
+        assertEquals("IP address of target node", address_u.getDescription());
+        assertEquals("address reference added by refine", address_u.getReference());
+        assertFalse(address_u.isConfiguration());
+        assertTrue(address_u.isAddedByUses());
+
+        LeafSchemaNode address_g = (LeafSchemaNode) grouping.getDataChildByName("address");
+        assertNotNull(address_g);
+        assertFalse(address_g.isAddedByUses());
+        assertNull(address_g.getDefault());
+        assertEquals("Target IP address", address_g.getDescription());
+        assertNull(address_g.getReference());
+        assertTrue(address_g.isConfiguration());
+        assertFalse(address_u.equals(address_g));
+
+        ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
+        assertNotNull(port_u);
+        assertTrue(port_u.isAddedByUses());
+
+        ContainerSchemaNode port_g = (ContainerSchemaNode) grouping.getDataChildByName("port");
+        assertNotNull(port_g);
+        assertFalse(port_g.isAddedByUses());
+        assertFalse(port_u.equals(port_g));
+
+        ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
+        assertNotNull(addresses_u);
+        assertTrue(addresses_u.isAddedByUses());
+
+        ListSchemaNode addresses_g = (ListSchemaNode) grouping.getDataChildByName("addresses");
+        assertNotNull(addresses_g);
+        assertFalse(addresses_g.isAddedByUses());
+        assertFalse(addresses_u.equals(addresses_g));
+
+        // grouping defined by 'uses'
+        Set<GroupingDefinition> groupings_u = destination.getGroupings();
+        assertEquals(1, groupings_u.size());
+        GroupingDefinition grouping_u = groupings_u.iterator().next();
+        assertTrue(grouping_u.isAddedByUses());
+
+        // grouping defined in 'grouping' node
+        Set<GroupingDefinition> groupings_g = grouping.getGroupings();
+        assertEquals(1, groupings_g.size());
+        GroupingDefinition grouping_g = groupings_g.iterator().next();
+        assertFalse(grouping_g.isAddedByUses());
+        assertFalse(grouping_u.equals(grouping_g));
+
+        List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
+        assertEquals(1, nodes_u.size());
+        UnknownSchemaNode node_u = nodes_u.get(0);
+        assertTrue(node_u.isAddedByUses());
+
+        List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
+        assertEquals(1, nodes_g.size());
+        UnknownSchemaNode node_g = nodes_g.get(0);
+        assertFalse(node_g.isAddedByUses());
+        assertFalse(node_u.equals(node_g));
+    }
+
+}
index 9006f93c61bfbd3741c50911bb5f03ff1234e413..d331cff18d29b5231498f7cacad2e023aa265341 100644 (file)
@@ -17,7 +17,6 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.junit.Before;
@@ -29,26 +28,21 @@ import org.opendaylight.controller.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.controller.yang.model.api.ChoiceNode;
 import org.opendaylight.controller.yang.model.api.ConstraintDefinition;
 import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.controller.yang.model.api.DataSchemaNode;
 import org.opendaylight.controller.yang.model.api.Deviation;
 import org.opendaylight.controller.yang.model.api.Deviation.Deviate;
 import org.opendaylight.controller.yang.model.api.ExtensionDefinition;
 import org.opendaylight.controller.yang.model.api.FeatureDefinition;
-import org.opendaylight.controller.yang.model.api.GroupingDefinition;
 import org.opendaylight.controller.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
 import org.opendaylight.controller.yang.model.api.ListSchemaNode;
 import org.opendaylight.controller.yang.model.api.Module;
 import org.opendaylight.controller.yang.model.api.ModuleImport;
-import org.opendaylight.controller.yang.model.api.MustDefinition;
 import org.opendaylight.controller.yang.model.api.NotificationDefinition;
 import org.opendaylight.controller.yang.model.api.RpcDefinition;
-import org.opendaylight.controller.yang.model.api.SchemaNode;
 import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.Status;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.model.api.UsesNode;
 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
@@ -64,7 +58,6 @@ import org.opendaylight.controller.yang.model.util.UnionType;
 
 public class YangParserTest {
     private final DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-
     private Set<Module> modules;
 
     @Before
@@ -121,7 +114,7 @@ public class YangParserTest {
         assertEquals(0, interfaces.getUnknownSchemaNodes().size());
         // test DataSchemaNode args
         assertFalse(interfaces.isAugmenting());
-        assertFalse(interfaces.isConfiguration());
+        assertTrue(interfaces.isConfiguration());
         ConstraintDefinition constraints = interfaces.getConstraints();
         assertNull(constraints.getWhenCondition());
         assertEquals(0, constraints.getMustConstraints().size());
@@ -164,7 +157,7 @@ public class YangParserTest {
         assertEquals(0, ifEntry.getUnknownSchemaNodes().size());
         // test DataSchemaNode args
         assertFalse(ifEntry.isAugmenting());
-        assertFalse(ifEntry.isConfiguration());
+        assertTrue(ifEntry.isConfiguration());
         ConstraintDefinition constraints = ifEntry.getConstraints();
         assertNull(constraints.getWhenCondition());
         assertEquals(0, constraints.getMustConstraints().size());
@@ -565,89 +558,26 @@ public class YangParserTest {
         assertEquals(100L, range.getMax());
     }
 
-    @Test
-    public void testRefine() {
-        Module testModule = TestUtils.findModule(modules, "types2");
-
-        ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("peer");
-        ContainerSchemaNode destination = (ContainerSchemaNode) peer.getDataChildByName("destination");
-        Set<UsesNode> usesNodes = destination.getUses();
-        assertEquals(1, usesNodes.size());
-        UsesNode usesNode = usesNodes.iterator().next();
-        Map<SchemaPath, SchemaNode> refines = usesNode.getRefines();
-        assertEquals(5, refines.size());
-
-        LeafSchemaNode refineLeaf = null;
-        ContainerSchemaNode refineContainer = null;
-        ListSchemaNode refineList = null;
-        GroupingDefinition refineGrouping = null;
-        TypeDefinition<?> typedef = null;
-        for (Map.Entry<SchemaPath, SchemaNode> entry : refines.entrySet()) {
-            SchemaNode value = entry.getValue();
-            if (value instanceof LeafSchemaNode) {
-                refineLeaf = (LeafSchemaNode) value;
-            } else if (value instanceof ContainerSchemaNode) {
-                refineContainer = (ContainerSchemaNode) value;
-            } else if (value instanceof ListSchemaNode) {
-                refineList = (ListSchemaNode) value;
-            } else if (value instanceof GroupingDefinition) {
-                refineGrouping = (GroupingDefinition) value;
-            } else if (value instanceof TypeDefinition<?>) {
-                typedef = (TypeDefinition<?>) value;
-            }
-        }
-
-        // leaf address
-        assertNotNull(refineLeaf);
-        assertEquals("address", refineLeaf.getQName().getLocalName());
-        assertEquals("description of address defined by refine", refineLeaf.getDescription());
-        assertEquals("address reference added by refine", refineLeaf.getReference());
-        assertFalse(refineLeaf.isConfiguration());
-        assertTrue(refineLeaf.getConstraints().isMandatory());
-        Set<MustDefinition> leafMustConstraints = refineLeaf.getConstraints().getMustConstraints();
-        assertEquals(1, leafMustConstraints.size());
-        MustDefinition leafMust = leafMustConstraints.iterator().next();
-        assertEquals("\"ifType != 'ethernet' or (ifType = 'ethernet' and ifMTU = 1500)\"", leafMust.toString());
-
-        // container port
-        assertNotNull(refineContainer);
-        Set<MustDefinition> mustConstraints = refineContainer.getConstraints().getMustConstraints();
-        assertTrue(mustConstraints.isEmpty());
-        assertEquals("description of port defined by refine", refineContainer.getDescription());
-        assertEquals("port reference added by refine", refineContainer.getReference());
-        assertFalse(refineContainer.isConfiguration());
-        assertTrue(refineContainer.isPresenceContainer());
-
-        // list addresses
-        assertNotNull(refineList);
-        assertEquals("description of addresses defined by refine", refineList.getDescription());
-        assertEquals("addresses reference added by refine", refineList.getReference());
-        assertFalse(refineList.isConfiguration());
-        assertEquals(2, (int) refineList.getConstraints().getMinElements());
-        assertEquals(12, (int) refineList.getConstraints().getMaxElements());
-
-        // grouping target-inner
-        assertNotNull(refineGrouping);
-        Set<DataSchemaNode> refineGroupingChildren = refineGrouping.getChildNodes();
-        assertEquals(1, refineGroupingChildren.size());
-        LeafSchemaNode refineGroupingLeaf = (LeafSchemaNode) refineGroupingChildren.iterator().next();
-        assertEquals("inner-grouping-id", refineGroupingLeaf.getQName().getLocalName());
-        assertEquals("new target-inner grouping description", refineGrouping.getDescription());
-
-        // typedef group-type
-        assertNotNull(typedef);
-        assertEquals("new group-type description", typedef.getDescription());
-        assertEquals("new group-type reference", typedef.getReference());
-        assertTrue(typedef.getBaseType() instanceof ExtendedType);
-    }
-
     @Test
     public void testChoice() {
         Module testModule = TestUtils.findModule(modules, "types1");
         ContainerSchemaNode peer = (ContainerSchemaNode) testModule.getDataChildByName("transfer");
         ChoiceNode how = (ChoiceNode) peer.getDataChildByName("how");
         Set<ChoiceCaseNode> cases = how.getCases();
-        assertEquals(3, cases.size());
+        assertEquals(5, cases.size());
+        ChoiceCaseNode input = null;
+        ChoiceCaseNode output = null;
+        for(ChoiceCaseNode caseNode : cases) {
+            if("input".equals(caseNode.getQName().getLocalName())) {
+                input = caseNode;
+            } else if("output".equals(caseNode.getQName().getLocalName())) {
+                output = caseNode;
+            }
+        }
+        assertNotNull(input);
+        assertNotNull(input.getPath());
+        assertNotNull(output);
+        assertNotNull(output.getPath());
     }
 
     @Test
@@ -750,16 +680,6 @@ public class YangParserTest {
         assertNotNull(output.getDataChildByName("data"));
     }
 
-    @Test
-    public void testGrouping() {
-        Module testModule = TestUtils.findModule(modules, "types2");
-        Set<GroupingDefinition> groupings = testModule.getGroupings();
-        assertEquals(1, groupings.size());
-        GroupingDefinition grouping = groupings.iterator().next();
-        Set<DataSchemaNode> children = grouping.getChildNodes();
-        assertEquals(5, children.size());
-    }
-
     @Test
     public void testAugmentNodesTypesSchemaPath() throws Exception {
         Module testModule = TestUtils.findModule(modules, "types1");
index ff32ee1fa8dae80042c30026a22b4167acabe732..be7b7ef7aa6974864cbad524fd97760ed36c55ec 100644 (file)
@@ -21,6 +21,8 @@ import java.util.Set;
 
 import org.junit.Test;
 import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.model.api.AnyXmlSchemaNode;
+import org.opendaylight.controller.yang.model.api.ChoiceNode;
 import org.opendaylight.controller.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.controller.yang.model.api.DataSchemaNode;
 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
@@ -81,11 +83,111 @@ public class YangParserWithContextTest {
         RangeConstraint range = ranges.get(0);
         assertEquals(0L, range.getMin());
         assertEquals(63L, range.getMax());
+    }
 
+    @Test
+    public void testUsesFromContext() throws Exception {
+        SchemaContext context = null;
+        try (InputStream stream = new FileInputStream(getClass().getResource("/model/testfile2.yang").getPath())) {
+            context = parser.resolveSchemaContext(TestUtils.loadModules(Lists.newArrayList(stream)));
+        }
+        Module testModule = null;
+        try (InputStream stream = new FileInputStream(getClass().getResource("/context-test/test2.yang").getPath())) {
+            testModule = TestUtils.loadModuleWithContext(stream, context);
+        }
+        assertNotNull(testModule);
+
+        // suffix _u = added by uses
+        // suffix _g = defined in grouping from context
+
+        // get grouping
+        Module contextModule = context.findModuleByNamespace(URI.create("urn:simple.types.data.demo"));
+        assertNotNull(contextModule);
+        Set<GroupingDefinition> groupings = contextModule.getGroupings();
+        assertEquals(1, groupings.size());
+        GroupingDefinition grouping = groupings.iterator().next();
+
+        // get node containing uses
+        ContainerSchemaNode peer = (ContainerSchemaNode)testModule.getDataChildByName("peer");
+        ContainerSchemaNode destination = (ContainerSchemaNode)peer.getDataChildByName("destination");
+
+        // check uses
+        Set<UsesNode> uses = destination.getUses();
+        assertEquals(1, uses.size());
+
+        // check uses process
+        AnyXmlSchemaNode data_u = (AnyXmlSchemaNode)destination.getDataChildByName("data");
+        assertNotNull(data_u);
+        assertTrue(data_u.isAddedByUses());
+
+        AnyXmlSchemaNode data_g = (AnyXmlSchemaNode)grouping.getDataChildByName("data");
+        assertNotNull(data_g);
+        assertFalse(data_g.isAddedByUses());
+        assertFalse(data_u.equals(data_g));
+
+        ChoiceNode how_u = (ChoiceNode)destination.getDataChildByName("how");
+        assertNotNull(how_u);
+        assertTrue(how_u.isAddedByUses());
+
+        ChoiceNode how_g = (ChoiceNode)grouping.getDataChildByName("how");
+        assertNotNull(how_g);
+        assertFalse(how_g.isAddedByUses());
+        assertFalse(how_u.equals(how_g));
+
+        LeafSchemaNode address_u = (LeafSchemaNode)destination.getDataChildByName("address");
+        assertNotNull(address_u);
+        assertTrue(address_u.isAddedByUses());
+
+        LeafSchemaNode address_g = (LeafSchemaNode)grouping.getDataChildByName("address");
+        assertNotNull(address_g);
+        assertFalse(address_g.isAddedByUses());
+        assertFalse(address_u.equals(address_g));
+
+        ContainerSchemaNode port_u = (ContainerSchemaNode)destination.getDataChildByName("port");
+        assertNotNull(port_u);
+        assertTrue(port_u.isAddedByUses());
+
+        ContainerSchemaNode port_g = (ContainerSchemaNode)grouping.getDataChildByName("port");
+        assertNotNull(port_g);
+        assertFalse(port_g.isAddedByUses());
+        assertFalse(port_u.equals(port_g));
+
+        ListSchemaNode addresses_u = (ListSchemaNode)destination.getDataChildByName("addresses");
+        assertNotNull(addresses_u);
+        assertTrue(addresses_u.isAddedByUses());
+
+        ListSchemaNode addresses_g = (ListSchemaNode)grouping.getDataChildByName("addresses");
+        assertNotNull(addresses_g);
+        assertFalse(addresses_g.isAddedByUses());
+        assertFalse(addresses_u.equals(addresses_g));
+
+        // grouping defined by 'uses'
+        Set<GroupingDefinition> groupings_u = destination.getGroupings();
+        assertEquals(1, groupings_u.size());
+        GroupingDefinition grouping_u = groupings_u.iterator().next();
+        assertTrue(grouping_u.isAddedByUses());
+
+        // grouping defined in 'grouping' node
+        Set<GroupingDefinition> groupings_g = grouping.getGroupings();
+        assertEquals(1, groupings_g.size());
+        GroupingDefinition grouping_g = groupings_g.iterator().next();
+        assertFalse(grouping_g.isAddedByUses());
+        assertFalse(grouping_u.equals(grouping_g));
+
+        List<UnknownSchemaNode> nodes_u = destination.getUnknownSchemaNodes();
+        assertEquals(1, nodes_u.size());
+        UnknownSchemaNode node_u = nodes_u.get(0);
+        assertTrue(node_u.isAddedByUses());
+
+        List<UnknownSchemaNode> nodes_g = grouping.getUnknownSchemaNodes();
+        assertEquals(1, nodes_g.size());
+        UnknownSchemaNode node_g = nodes_g.get(0);
+        assertFalse(node_g.isAddedByUses());
+        assertFalse(node_u.equals(node_g));
     }
 
     @Test
-    public void testUsesGroupingFromContext() throws Exception {
+    public void testUsesRefineFromContext() throws Exception {
         SchemaContext context = null;
         try (InputStream stream = new FileInputStream(getClass().getResource("/model/testfile2.yang").getPath())) {
             context = parser.resolveSchemaContext(TestUtils.loadModules(Lists.newArrayList(stream)));
index f6bc34d1b609eea9c9616d7f3e2585a0b757a098..bd8f378ee17b392bb8c7d32764ff992880c6511e 100644 (file)
@@ -76,6 +76,13 @@ module types1 {
     container transfer {
         choice how {
             default interval;
+            container input {
+            }
+            list output {
+                leaf id {
+                    type string;
+                }
+            }
             case interval {
                 leaf interval {
                     type uint16;
index e594749508eade661824f002191d1287fd1c2ba8..b25f65e4a45705d1ff6326987303cc2bf562c3b8 100644 (file)
@@ -11,7 +11,7 @@ module types2 {
     revision "2013-02-27" {
         reference " WILL BE DEFINED LATER";
     }
-    
+
     typedef my-base-int32-type {
         type int32 {
             range "2..20";
@@ -25,14 +25,14 @@ module types2 {
         units "mile";
         default "11";
     }
-    
+
     typedef my-custom-string {
         type string {
             pattern "[a-k]*";
             length "5..11";
         }
     }
-    
+
     typedef my-string-type {
         type my-custom-string {
             length "6..10";
@@ -56,25 +56,25 @@ module types2 {
             range "10..20";
         }
     }
-    
+
     typedef my-int-type2 {
         type my-int-type {
             range "12..18";
         }
     }
-    
+
     typedef my-int-type-ext {
         type my-int-type2 {
             range "14..16";
         }
     }
-    
+
     typedef my-decimal-type {
         type decimal64 {
             fraction-digits 6;
         }
     }
-    
+
     typedef my-decimal-type-ext {
         type decimal64 {
             fraction-digits 5;
@@ -110,21 +110,21 @@ module types2 {
             path "/interface/name";
         }
     }
-     
+
     leaf name {
         type string;
     }
-    
+
     leaf count {
         type int8 {
             range "1..10";
         }
     }
-     
+
     leaf nested-type-leaf {
         type my-type1;
     }
-    
+
     extension c-define {
         description
         "Takes as argument a name string.
@@ -134,13 +134,13 @@ module types2 {
             yin-element "true";
         }
     }
-    
+
     container system {
         leaf user {
             type string;
         }
     }
-    
+
     grouping target {
         anyxml data {
             config true;
@@ -194,6 +194,8 @@ module types2 {
         typedef group-type {
             type my-decimal-type;
         }
+
+        opendaylight;
     }
 
     container peer {
@@ -201,7 +203,7 @@ module types2 {
             uses target {
                 refine address {
                     default "1.2.3.4";
-                    description "description of address defined by refine";
+                    description "IP address of target node";
                     reference "address reference added by refine";
                     config false;
                     mandatory true;
@@ -233,7 +235,7 @@ module types2 {
             }
         }
     }
-    
+
     container interfaces {
          list ifEntry {
              key "ifIndex";
@@ -242,11 +244,11 @@ module types2 {
                  type uint32;
                  units minutes;
              }
-             
+
              leaf ifMtu {
                  type int32;
              }
-             
+
              min-elements 1;
              max-elements 11;
          }
index 25208aaab68b2af31cb325b34ab6d53121229405..87cdbfd0a6ae6b47c28f502e66d26669e475b693 100644 (file)
@@ -12,16 +12,25 @@ public interface DataSchemaNode extends SchemaNode {
     /**\r
      * Returns <code>true</code> if the data node was added by augmentation,\r
      * otherwise returns <code>false</code>\r
-     * \r
+     *\r
      * @return <code>true</code> if the data node was added by augmentation,\r
      *         otherwise returns <code>false</code>\r
      */\r
     boolean isAugmenting();\r
 \r
+    /**\r
+     * Returns <code>true</code> if the data node was added by uses statement,\r
+     * otherwise returns <code>false</code>\r
+     *\r
+     * @return <code>true</code> if the data node was added by uses statement,\r
+     *         otherwise returns <code>false</code>\r
+     */\r
+    boolean isAddedByUses();\r
+\r
     /**\r
      * Returns <code>true</code> if the data represents configuration data,\r
      * otherwise returns <code>false</code>\r
-     * \r
+     *\r
      * @return <code>true</code> if the data represents configuration data,\r
      *         otherwise returns <code>false</code>\r
      */\r
@@ -29,7 +38,7 @@ public interface DataSchemaNode extends SchemaNode {
 \r
     /**\r
      * Returns the constraints associated with Data Schema Node\r
-     * \r
+     *\r
      * @return the constraints associated with Data Schema Node\r
      */\r
     ConstraintDefinition getConstraints();\r
index 0430b7ab453e58ebe842632957d5b61f72ed30c9..8e03113a599389f1f329f3a6e5488a851a34505f 100644 (file)
@@ -12,6 +12,9 @@ import org.opendaylight.controller.yang.common.QName;
 public interface UnknownSchemaNode extends SchemaNode {
 
     QName getNodeType();
+
     String getNodeParameter();
 
+    boolean isAddedByUses();
+
 }
index e76f5e81318120f0af134446b1982ef3e1eef226..0fc8a0e49d2fb02d3438d0824dcd6c012a8b72e5 100644 (file)
@@ -31,6 +31,8 @@ public interface UsesNode {
      */\r
     boolean isAugmenting();\r
 \r
+    boolean isAddedByUses();\r
+\r
     /**\r
      * Some of the properties of each node in the grouping can be refined with\r
      * the "refine" statement.\r
index e5ef2026f17e9bb200dec87cecad2d70baeed396..b9729102c90b3b8d05a15f1380e5567d6663d802 100644 (file)
@@ -38,6 +38,7 @@ public class ExtendedType implements TypeDefinition<TypeDefinition<?>> {
     private Status status;
     private String units;
     private Object defaultValue;
+    private boolean addedByUses;
 
     public static class Builder {
         private final QName typeName;
@@ -52,6 +53,7 @@ public class ExtendedType implements TypeDefinition<TypeDefinition<?>> {
         private Status status = Status.CURRENT;
         private String units = "";
         private Object defaultValue = null;
+        private boolean addedByUses;
 
         private List<RangeConstraint> ranges = Collections.emptyList();
         private List<LengthConstraint> lengths = Collections.emptyList();
@@ -94,6 +96,11 @@ public class ExtendedType implements TypeDefinition<TypeDefinition<?>> {
             return this;
         }
 
+        public Builder addedByUses(final boolean addedByUses) {
+            this.addedByUses = addedByUses;
+            return this;
+        }
+
         public Builder unknownSchemaNodes(
                 final List<UnknownSchemaNode> unknownSchemaNodes) {
             this.unknownSchemaNodes = unknownSchemaNodes;
@@ -141,6 +148,7 @@ public class ExtendedType implements TypeDefinition<TypeDefinition<?>> {
         this.status = builder.status;
         this.units = builder.units;
         this.defaultValue = builder.defaultValue;
+        this.addedByUses = builder.addedByUses;
 
         this.ranges = builder.ranges;
         this.lengths = builder.lengths;
@@ -163,6 +171,10 @@ public class ExtendedType implements TypeDefinition<TypeDefinition<?>> {
         return defaultValue;
     }
 
+    public boolean isAddedByUses() {
+        return addedByUses;
+    }
+
     @Override
     public QName getQName() {
         return typeName;
index 8139d5b50b50bb302d1e5802b5a01ac74c8545b8..05dffc62d132c6c987d8b2d7fab2c65f68477f63 100644 (file)
@@ -1,10 +1,10 @@
 /*
 * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.controller.yang.model.util;
 
 import java.util.Collections;
@@ -18,24 +18,31 @@ import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.controller.yang.model.api.type.InstanceIdentifierTypeDefinition;
 
 /**
- * The <code>default</code> implementation of Instance Identifier Type Definition interface.
+ * The <code>default</code> implementation of Instance Identifier Type
+ * Definition interface.
  *
  * @see InstanceIdentifierTypeDefinition
  */
 public final class InstanceIdentifier implements InstanceIdentifierTypeDefinition {
-    private static final QName name = BaseTypes
-            .constructQName("instance-identifier");
-    private static final String description = "The instance-identifier built-in type is used to " +
-               "uniquely identify a particular instance node in the data tree.";
+    private static final QName name = BaseTypes.constructQName("instance-identifier");
+    private static final String description = "The instance-identifier built-in type is used to "
+            + "uniquely identify a particular instance node in the data tree.";
     private static final String reference = "https://tools.ietf.org/html/rfc6020#section-9.13";
 
     private final transient SchemaPath path;
     private final RevisionAwareXPath xpath;
     private final String units = "";
     private final InstanceIdentifierTypeDefinition baseType;
-    private final boolean requireInstance;
+    private boolean requireInstance = true;
+
+    public InstanceIdentifier(final SchemaPath path, final RevisionAwareXPath xpath) {
+        super();
+        this.path = path;
+        this.xpath = xpath;
+        this.baseType = this;
+    }
 
-    public InstanceIdentifier(final SchemaPath path, RevisionAwareXPath xpath, boolean requireInstance) {
+    public InstanceIdentifier(final SchemaPath path, final RevisionAwareXPath xpath, final boolean requireInstance) {
         super();
         this.path = path;
         this.xpath = xpath;
@@ -46,7 +53,8 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.TypeDefinition#getBaseType()
+     * @see
+     * org.opendaylight.controller.yang.model.api.TypeDefinition#getBaseType()
      */
     @Override
     public InstanceIdentifierTypeDefinition getBaseType() {
@@ -66,7 +74,9 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.TypeDefinition#getDefaultValue()
+     * @see
+     * org.opendaylight.controller.yang.model.api.TypeDefinition#getDefaultValue
+     * ()
      */
     @Override
     public Object getDefaultValue() {
@@ -96,7 +106,8 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getDescription()
+     * @see
+     * org.opendaylight.controller.yang.model.api.SchemaNode#getDescription()
      */
     @Override
     public String getDescription() {
@@ -126,7 +137,9 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getExtensionSchemaNodes()
+     * @see
+     * org.opendaylight.controller.yang.model.api.SchemaNode#getExtensionSchemaNodes
+     * ()
      */
     @Override
     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
@@ -136,8 +149,8 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.type.InstanceIdentifierTypeDefinition#
-     * getPathStatement()
+     * @see org.opendaylight.controller.yang.model.api.type.
+     * InstanceIdentifierTypeDefinition# getPathStatement()
      */
     @Override
     public RevisionAwareXPath getPathStatement() {
@@ -147,8 +160,8 @@ public final class InstanceIdentifier implements InstanceIdentifierTypeDefinitio
     /*
      * (non-Javadoc)
      *
-     * @see org.opendaylight.controller.yang.model.api.type.InstanceIdentifierTypeDefinition#
-     * requireInstance()
+     * @see org.opendaylight.controller.yang.model.api.type.
+     * InstanceIdentifierTypeDefinition# requireInstance()
      */
     @Override
     public boolean requireInstance() {
index 443c7a42ab7da517fbb8df65082c36d1a220a79e..ab3149610309b08f314b9cee1ca85a6998063a5c 100644 (file)
@@ -863,7 +863,6 @@ CommandProvider {
                 addNodeProps(node, null);
             }
 
-            // check if span is configed
             addSpanPort(nodeConnector);
             break;
         case REMOVED:
@@ -1670,10 +1669,10 @@ CommandProvider {
     /*
      * Add span configuration to local cache and notify clients
      */
-    private void addSpanPorts(Node node, List<NodeConnector> nodeConncetors) {
+    private void addSpanPorts(Node node, List<NodeConnector> nodeConnectors) {
         List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
 
-        for (NodeConnector nodeConnector : nodeConncetors) {
+        for (NodeConnector nodeConnector : nodeConnectors) {
             if (!spanNodeConnectors.contains(nodeConnector)) {
                 ncLists.add(nodeConnector);
             }
@@ -1691,19 +1690,25 @@ CommandProvider {
         }
     }
 
-    private void addSpanPort(NodeConnector nodeConncetor) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-        ncLists.add(nodeConncetor);
-        addSpanPorts(nodeConncetor.getNode(), ncLists);
+    private void addSpanPort(NodeConnector nodeConnector) {
+        // only add if span is configured on this nodeConnector
+        for (SpanConfig conf : getSpanConfigList(nodeConnector.getNode())) {
+            if (conf.getPortArrayList().contains(nodeConnector)) {
+                List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
+                ncLists.add(nodeConnector);
+                addSpanPorts(nodeConnector.getNode(), ncLists);
+                return;
+            }
+        }
     }
 
     /*
      * Remove span configuration to local cache and notify clients
      */
-    private void removeSpanPorts(Node node, List<NodeConnector> nodeConncetors) {
+    private void removeSpanPorts(Node node, List<NodeConnector> nodeConnectors) {
         List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
 
-        for (NodeConnector nodeConnector : nodeConncetors) {
+        for (NodeConnector nodeConnector : nodeConnectors) {
             if (spanNodeConnectors.contains(nodeConnector)) {
                 ncLists.add(nodeConnector);
             }
@@ -1721,10 +1726,12 @@ CommandProvider {
         }
     }
 
-    private void removeSpanPort(NodeConnector nodeConncetor) {
-        List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
-        ncLists.add(nodeConncetor);
-        removeSpanPorts(nodeConncetor.getNode(), ncLists);
+    private void removeSpanPort(NodeConnector nodeConnector) {
+        if (spanNodeConnectors.contains(nodeConnector)) {
+            List<NodeConnector> ncLists = new ArrayList<NodeConnector>();
+            ncLists.add(nodeConnector);
+            removeSpanPorts(nodeConnector.getNode(), ncLists);
+        }
     }
 
     private void addNodeProps(Node node, Map<String, Property> propMap) {