From: Alessandro Boch Date: Tue, 2 Jul 2013 14:34:50 +0000 (+0000) Subject: Merge "Added annotations to Latency for northbound usage." X-Git-Tag: releasepom-0.1.0~321 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=b36cea2d468e8f572f0159332b0668fc35c95912;hp=5f3ba805a8e70fdcae6c49621a3c3c5282acad9f;p=controller.git Merge "Added annotations to Latency for northbound usage." --- diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java index 8a77825d79..2b9696ddb9 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowConfig.java @@ -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) { diff --git a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java index e9c0edc3bd..2c5144f284 100644 --- a/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java +++ b/opendaylight/forwardingrulesmanager/implementation/src/main/java/org/opendaylight/controller/forwardingrulesmanager/internal/ForwardingRulesManagerImpl.java @@ -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) { diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/pom.xml b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/pom.xml index 18f29ed416..57fbd2c67b 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/pom.xml @@ -27,5 +27,10 @@ junit junit + + commons-lang + commons-lang + 2.1 + \ No newline at end of file diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/TypeProviderImpl.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/TypeProviderImpl.java index 9410ffe1de..6bb7907a74 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/TypeProviderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/yang/types/TypeProviderImpl.java @@ -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 patternConstraints = ((ExtendedType) typedef).getPatterns(); + List regularExpressions = new ArrayList(); + 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(); } + } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GenEnumResolvingTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GenEnumResolvingTest.java index 10ea9fae1f..f8cf951c17 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GenEnumResolvingTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GenEnumResolvingTest.java @@ -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 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(); diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneretedTypesBitsTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesBitsTest.java similarity index 66% rename from opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneretedTypesBitsTest.java rename to opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesBitsTest.java index 646efd1a78..c98f8bfeae 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneretedTypesBitsTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesBitsTest.java @@ -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 inputFiles = new ArrayList(); @@ -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 genProperties = genTO - .getProperties(); + List 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 parameters = methodSignature - .getParameters(); + List 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 index 0000000000..ab290f7708 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesStringTest.java @@ -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 testModels = new ArrayList(); + + @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 modules = parser.parseYangModels(testModels); + final SchemaContext context = parser.resolveSchemaContext(modules); + + assertNotNull(context); + final BindingGenerator bindingGen = new BindingGeneratorImpl(); + final List 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 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); + + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesTest.java index cfa74a005f..ce9f131b75 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/java/org/opendaylight/controller/sal/binding/generator/impl/GeneratedTypesTest.java @@ -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 inputFiles = new ArrayList(); @@ -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 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 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 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 gtNetworkLinkMethods = gtNetworkLink - .getMethodDefinitions(); + final List 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 gtSourceMethods = gtSource - .getMethodDefinitions(); + final List 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 gtDestMethods = gtDest - .getMethodDefinitions(); + final List 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 gtTunnelMethods = gtTunnel - .getMethodDefinitions(); + final List 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 gtTunnelKeyProps = gtTunnelKey - .getProperties(); + final List 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 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 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 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 methods = genType - .getMethodDefinitions(); - int methodsCount = 0; + simpleListMethodsCount = genType.getMethodDefinitions().size(); + final List 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 properties = genTO - .getProperties(); - final List hashProps = genTO - .getHashCodeIdentifiers(); - final List 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 properties = genTO.getProperties(); + final List hashProps = genTO.getHashCodeIdentifiers(); + final List 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 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 properties = genTO - .getProperties(); - int propertyCount = 0; + compositeKeyListKeyCount++; + final List 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 properties = genTO - .getProperties(); - assertEquals(1, properties.size()); + final List 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 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 index 0000000000..687d2a11dd --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/test/resources/simple-string-demo.yang @@ -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]*"; + } + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java index b37f91fe44..a394edd906 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java @@ -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 index 0000000000..69443aa4d9 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/TypeConstants.java @@ -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() { + } +} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/AbstractGeneratedType.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/AbstractGeneratedType.java index 8c7ee35344..2144597772 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/AbstractGeneratedType.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/AbstractGeneratedType.java @@ -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 enclosedTypes; private final boolean isAbstract; - public AbstractGeneratedType(final Type parent, final String packageName, - final String name, final String comment, - final List annotationBuilders, - final boolean isAbstract, - final List implementsTypes, - final List enclosedGenTypeBuilders, - final List enclosedGenTOBuilders, - final List enumBuilders, - final List constants, - final List methodBuilders) { + public AbstractGeneratedType(final Type parent, final String packageName, final String name, final String comment, + final List annotationBuilders, final boolean isAbstract, + final List implementsTypes, final List enclosedGenTypeBuilders, + final List enclosedGenTOBuilders, final List enumBuilders, + final List constants, final List methodBuilders) { super(packageName, name); this.parent = parent; this.comment = comment; @@ -51,7 +45,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat } private List toUnmodifiableEnclosedTypes(final List enclosedGenTypeBuilders, - final List enclosedGenTOBuilders) { + final List enclosedGenTOBuilders) { final List 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 toUnmodifiableAnnotations( - final List annotationBuilders) { + protected List toUnmodifiableAnnotations(final List annotationBuilders) { final List 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 toUnmodifiableMethods( - List methodBuilders) { + protected List toUnmodifiableMethods(List methodBuilders) { final List 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 toUnmodifiableEnumerations( - List enumBuilders) { + protected List toUnmodifiableEnumerations(List enumBuilders) { final List 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 getImplements() { return implementsTypes; } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/ClassCodeGenerator.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/ClassCodeGenerator.java index 877bcfce63..b95ac48928 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/ClassCodeGenerator.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/ClassCodeGenerator.java @@ -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 fields = genTO.getProperties(); final List enums = genTO.getEnumerations(); + final List 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" + GAP + MEMBER_PATTERN_LIST + GAP + ASSIGN + GAP + + "new ArrayList()" + 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); } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/Constants.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/Constants.java index e5cb97f1a6..f200538138 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/Constants.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/Constants.java @@ -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() { + } } diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java index 804ac99ff2..16074c7e98 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java @@ -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> 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> availableImports, - boolean isIdentity) { - return createFileDeclaration(CLASS, genTransferObject, indent, - availableImports, isIdentity); + public static String createClassDeclaration(final GeneratedTransferObject genTransferObject, final String indent, + final Map> 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> availableImports, - boolean isIdentity) { + private static String createFileDeclaration(final String type, final GeneratedType genType, final String indent, + final Map> 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 annotations) { + private static StringBuilder appendAnnotations(final StringBuilder builder, final List 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 parameters = annotation - .getParameters(); + final List 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 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> availableImports, - final String currentPkg) { + public static String createConstant(final Constant constant, final String indent, + final Map> 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> availableImports, - final String currentPkg) { + public static String createField(final GeneratedProperty property, final String indent, + Map> availableImports, final String currentPkg) { final StringBuilder builder = new StringBuilder(); if (!property.getAnnotations().isEmpty()) { final List 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> availableImports, - final String currentPkg) { + public static String createMethodDeclaration(final MethodSignature method, final String indent, + Map> 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 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> availableImports, - boolean isIdentity) { + public static String createConstructor(GeneratedTransferObject genTransferObject, final String indent, + Map> availableImports, boolean isIdentity) { final StringBuilder builder = new StringBuilder(); final String currentPkg = genTransferObject.getPackageName(); - final List properties = genTransferObject - .getProperties(); + final List properties = genTransferObject.getProperties(); final List ctorParams = new ArrayList(); - 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 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> availableImports, - final String currentPkg) { + public static String createGetter(final GeneratedProperty property, final String indent, + Map> 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> availableImports, - String currentPkg) { + public static String createSetter(final GeneratedProperty property, final String indent, + Map> 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 properties, final String indent) { + public static String createHashCode(final List 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 properties, final String indent) { + public static String createEquals(final GeneratedTransferObject type, final List 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 properties, final String indent) { + public static String createToString(final GeneratedTransferObject type, final List 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 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> availableImports, - final String currentPkg) { + Map> 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 imports = availableImports.get(type - .getName()); + LinkedHashMap 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> availableImports, - String currentPkg) { + Map> 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 findMaxValue( - LinkedHashMap imports) { + private static List findMaxValue(LinkedHashMap imports) { final List result = new ArrayList(); 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> createImports( - GeneratedType genType) { + public static Map> createImports(GeneratedType genType) { final Map> imports = new HashMap>(); final String genTypePkg = genType.getPackageName(); final List constants = genType.getConstantDefinitions(); - final List methods = genType.getMethodDefinitions(); + final List methods = genType.getMethodDefinitions(); List 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> importedTypes, + private static void addTypeToImports(Type type, Map> 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 packages = importedTypes.get(typeName); @@ -700,12 +699,10 @@ public final class GeneratorUtil { } } - public static List createImportLines( - Map> imports) { + public static List createImportLines(Map> imports) { List importLines = new ArrayList(); - for (Map.Entry> entry : imports - .entrySet()) { + for (Map.Entry> entry : imports.entrySet()) { String typeName = entry.getKey(); LinkedHashMap 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 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 index 0000000000..c0f87dd910 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/samples/maven-code-gen-sample/src/main/yang/simple-string-demo.yang @@ -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]*"; + } + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java index 8ca88d8d61..d6722be51a 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java @@ -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 childNodes; @@ -34,7 +33,12 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai } @Override - public Set getChildNodes() { + public Set getChildNodes() { + return childNodes; + } + + @Override + public Set getChildNodeBuilders() { return addedChildNodes; } @@ -47,7 +51,12 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai this.childNodes = childNodes; } - public Set getGroupings() { + @Override + public Set getGroupings() { + return groupings; + } + + public Set 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 index 0000000000..c8e6968274 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java @@ -0,0 +1,83 @@ +/* + * 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; + +import java.util.ArrayList; +import java.util.List; + +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.parser.builder.impl.UnknownSchemaNodeBuilder; + +/** + * Basic implementation of SchemaNodeBuilder. + */ +public abstract class AbstractSchemaNodeBuilder implements SchemaNodeBuilder { + protected final int line; + protected final QName qname; + protected SchemaPath path; + protected String description; + protected String reference; + protected Status status = Status.CURRENT; + protected final List addedUnknownNodes = new ArrayList(); + + protected AbstractSchemaNodeBuilder(final QName qname, final int line) { + this.qname = qname; + this.line = line; + } + + @Override + public int getLine() { + return line; + } + + public QName getQName() { + return qname; + } + + public SchemaPath getPath() { + return path; + } + + public void setPath(SchemaPath schemaPath) { + this.path = schemaPath; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + if (status != null) { + this.status = status; + } + } + + @Override + public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) { + addedUnknownNodes.add(unknownNode); + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AugmentationSchemaBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AugmentationSchemaBuilder.java index f99179846c..76fe19f794 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AugmentationSchemaBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AugmentationSchemaBuilder.java @@ -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 getChildNodes(); - AugmentationSchema build(); boolean isResolved(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java index ee50d2ad02..1d199c2c64 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java @@ -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 index 0000000000..85f6b078bb --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/ConfigNode.java @@ -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); + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataNodeContainerBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataNodeContainerBuilder.java index e64bb02c6d..13b7e4874e 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataNodeContainerBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataNodeContainerBuilder.java @@ -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 getChildNodes(); + SchemaPath getPath(); + + Set getChildNodes(); + + Set getChildNodeBuilders(); void addChildNode(DataSchemaNodeBuilder childNode); - Set getGroupings(); + Set getGroupings(); + + Set getGroupingBuilders(); void addGrouping(GroupingBuilder groupingBuilder); void addUsesNode(UsesNodeBuilder usesBuilder); - Set getTypeDefinitions(); + Set getTypeDefinitionBuilders(); void addTypedef(TypeDefinitionBuilder typedefBuilder); - SchemaPath getPath(); - } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataSchemaNodeBuilder.java index a831b3d92f..bf96a82a14 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/DataSchemaNodeBuilder.java @@ -22,10 +22,6 @@ public interface DataSchemaNodeBuilder extends SchemaNodeBuilder { void setAugmenting(boolean augmenting); - boolean isConfiguration(); - - void setConfiguration(boolean configuration); - ConstraintsBuilder getConstraints(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java index e4088a84a6..20d9417f9d 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingBuilder.java @@ -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 getUnknownNodes(); - Set getGroupings(); - Set 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 index 0000000000..bcdc07782e --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/GroupingMember.java @@ -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); + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/TypeDefinitionBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/TypeDefinitionBuilder.java index db3ac36d69..289dcfe988 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/TypeDefinitionBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/TypeDefinitionBuilder.java @@ -9,8 +9,8 @@ package org.opendaylight.controller.yang.parser.builder.api; import java.util.List; -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; @@ -19,17 +19,10 @@ import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBui /** * Interface for builders of 'typedef' statement. */ -public interface TypeDefinitionBuilder extends TypeAwareBuilder, - SchemaNodeBuilder { +public interface TypeDefinitionBuilder extends TypeAwareBuilder, SchemaNodeBuilder, GroupingMember { TypeDefinition build(); - String getDescription(); - - String getReference(); - - Status getStatus(); - List getRanges(); void setRanges(List ranges); @@ -46,7 +39,9 @@ public interface TypeDefinitionBuilder extends TypeAwareBuilder, void setFractionDigits(Integer fractionDigits); - List getUnknownNodes(); + List getUnknownNodes(); + + List getUnknownNodeBuilders(); Object getDefaultValue(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java index c295c0eafd..626f0f4607 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/UsesNodeBuilder.java @@ -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 getAugmentations(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java index 78284c142e..d5f3c52497 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java @@ -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 unknownNodes; - private final List addedUnknownNodes = new ArrayList(); - 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(); 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 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 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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index 775751a166..b18f2558f7 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -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 childNodes = new HashSet(); private final Set groupings = new HashSet(); private final Set usesNodes = new HashSet(); + private final List addedUnknownNodes = new ArrayList(); 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 getChildNodes() { + public Set getChildNodes() { + return Collections.emptySet(); + } + + @Override + public Set getChildNodeBuilders() { return childNodes; } @Override - public Set getGroupings() { + public Set getGroupings() { + return Collections.emptySet(); + } + + @Override + public Set 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 unknownNodes = new ArrayList(); + 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 getTypeDefinitions() { + public Set 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 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 childNodes = Collections.emptyMap(); private Set groupings = Collections.emptySet(); private Set uses = Collections.emptySet(); - private String description; private String reference; private Status status; + private List 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 getUnknownSchemaNodes() { + return unknownNodes; + } + + private void setUnknownSchemaNodes( + List 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(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java index 1ba1a2dfdc..0761618b06 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java @@ -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 unknownNodes; - private final List addedUnknownNodes = new ArrayList(); // DataSchemaNode args private boolean augmenting; - private boolean configuration; + private boolean addedByUses; + private Boolean configuration; private final ConstraintsBuilder constraints; // AugmentationTarget args private final Set addedAugmentations = new HashSet(); @@ -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(); 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(); 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 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 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 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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java index d54cd22ec8..cfd3866841 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); + // DataSchemaNode args private boolean augmenting; private final ConstraintsBuilder constraints; + // DataNodeContainer args private final Set addedUsesNodes = new HashSet(); + // AugmentationTarget args private final Set addedAugmentations = new HashSet(); - 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 getTypeDefinitions() { + public Set 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 getUnknownSchemaNodes() { return unknownNodes; @@ -353,8 +356,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im return augmentations; } - private void setAvailableAugmentations( - Set augmentations) { + private void setAvailableAugmentations(Set 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("]"); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java index b1aa7de06a..ebfe520c39 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java @@ -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 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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java index e677d3c7a5..a194dea927 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java @@ -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 unknownNodes; + private final List addedUnknownNodes = new ArrayList(); + // DataSchemaNode args private boolean augmenting; - private boolean configuration; + private boolean addedByUses; + private Boolean configuration; + private final ConstraintsBuilder constraints; + // DataNodeContainer args private Set> typedefs; private final Set addedTypedefs = new HashSet(); private Set usesNodes; private final Set addedUsesNodes = new HashSet(); + // AugmentationTarget args private Set augmentations; private final Set addedAugmentations = new HashSet(); - private List unknownNodes; - private final List addedUnknownNodes = new ArrayList(); + // 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 childs = new HashMap(); - 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(); 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>(); 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(); 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(); 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(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { unknownNodes.add(b.build()); @@ -154,7 +196,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB } @Override - public Set getTypeDefinitions() { + public Set 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 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 augmentations) { + private void setAvailableAugmentations(Set augmentations) { if (augmentations != null) { this.augmentations = augmentations; } @@ -463,8 +524,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB return unknownNodes; } - private void setUnknownSchemaNodes( - List unknownSchemaNodes) { + private void setUnknownSchemaNodes(List 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("]"); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java index 239c0a5ed9..790275cff4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); 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 unknownNodes = new ArrayList(); + 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 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 getUnknownSchemaNodes() { + return unknownNodes; + } + + private void setUnknownSchemaNodes(List unknownSchemaNodes) { + if (unknownSchemaNodes != null) { + this.unknownNodes = unknownSchemaNodes; + } + } + @Override public int hashCode() { final int prime = 31; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java index 0558b91cd0..65fd1c49d9 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java @@ -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 addedExtensions = new ArrayList(); - private final List addedUnknownNodes = new ArrayList(); 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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java index 0681cf6b15..758478ba8c 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); 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 unknownNodes) { + private void setUnknownSchemaNodes(final List 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(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java index 5428259324..1cfba2517f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -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 childNodes; private final Set addedChildNodes = new HashSet(); @@ -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 childs = new HashMap(); - 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 getTypeDefinitions() { + public Set 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 getChildNodes() { + return childNodes; + } + @Override public void addChildNode(final DataSchemaNodeBuilder childNode) { addedChildNodes.add(childNode); } @Override - public Set getChildNodes() { + public Set getChildNodeBuilders() { return addedChildNodes; } @@ -213,7 +247,12 @@ public final class GroupingBuilderImpl implements GroupingBuilder { } @Override - public Set getGroupings() { + public Set getGroupings() { + return Collections.emptySet(); + } + + @Override + public Set 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 childNodes = Collections.emptyMap(); private Set groupings = Collections.emptySet(); private Set> 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 getChildNodes() { return new HashSet(childNodes.values()); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java index 6b76314e5c..9cce264e60 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); 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; } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java index 175910d913..ea504afae1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java @@ -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 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 getUnknownNodes() { + public List 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(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java index fdc8cd72dd..9bbe5e9bd0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); // 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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java index 786f08de49..54720b44e1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); // 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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java index 63a66e0892..ce87e3bb99 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); // DataSchemaNode args private boolean augmenting; - private boolean configuration; + private boolean addedByUses; + private Boolean configuration; private final ConstraintsBuilder constraints; // DataNodeContainer args private Set> typedefs; @@ -64,13 +66,42 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde private List 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 childs = new HashMap(); - 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>(); 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(); 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(); 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(); 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(); for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { unknownNodes.add(b.build()); @@ -161,7 +193,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde } @Override - public Set getTypeDefinitions() { + public Set 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 keyDefinition = Collections.emptyList(); private boolean augmenting; + private boolean addedByUses; private boolean configuration; private ConstraintDefinition constraints; private Set 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 augmentations) { + private void setAvailableAugmentations(Set 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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java index efa3849e90..0a9b6ddf37 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java @@ -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, TypeDefinitionBuilder> addedTypedefs = new HashMap, TypeDefinitionBuilder>(); private final Map, UnionTypeBuilder> addedUnionTypes = new HashMap, UnionTypeBuilder>(); private final List addedExtensions = new ArrayList(); - private final Map, UnknownSchemaNodeBuilder> addedUnknownNodes = new HashMap, UnknownSchemaNodeBuilder>(); + private final Map, List> addedUnknownNodes = new HashMap, List>(); private final Map, TypeAwareBuilder> dirtyNodes = new HashMap, 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 getTypeDefinitionBuilders() { + final Set typeDefinitions = new HashSet(); + for (final Map.Entry, TypeDefinitionBuilder> entry : addedTypedefs.entrySet()) { + final List 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 path) { return childNodes.get(path); } @@ -196,11 +228,32 @@ public class ModuleBuilder implements Builder { return addedGroupings.get(path); } + @Override + public Set getGroupings() { + return Collections.emptySet(); + } + + @Override + public Set getGroupingBuilders() { + final Set result = new HashSet(); + for (Map.Entry, GroupingBuilder> entry : addedGroupings.entrySet()) { + if (entry.getKey().size() == 2) { + result.add(entry.getValue()); + } + } + return result; + } + public Builder getModuleTypedef(final List path) { return addedTypedefs.get(path); } - public Set getChildNodes() { + @Override + public Set getChildNodes() { + return Collections.emptySet(); + } + + public Set getChildNodeBuilders() { final Set children = new HashSet(); for (Map.Entry, DataSchemaNodeBuilder> entry : childNodes.entrySet()) { final List path = entry.getKey(); @@ -228,8 +281,12 @@ public class ModuleBuilder implements Builder { return addedUsesNodes; } - public Set getUnknownNodes() { - return new HashSet(addedUnknownNodes.values()); + public List getUnknownNodes() { + List result = new ArrayList(); + for (List entry : addedUnknownNodes.values()) { + result.addAll(entry); + } + return result; } public Set getModuleTypedefs() { @@ -329,10 +386,23 @@ public class ModuleBuilder implements Builder { return builder; } - public ContainerSchemaNodeBuilder addContainerNode(final QName containerName, final List parentPath, - final int line) { + @Override + public void addChildNode(DataSchemaNodeBuilder child) { + final List pathToChild = new ArrayList(); + 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 parentPath, final int line) { final List pathToNode = new ArrayList(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 parentPath, final int line) { + public ListSchemaNodeBuilder addListNode(final SchemaPath schemaPath, final QName listName, final List parentPath, final int line) { final List pathToNode = new ArrayList(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 parentPath, final int line) { + public LeafSchemaNodeBuilder addLeafNode(final SchemaPath schemaPath, final QName leafName, final List parentPath, final int line) { final List pathToNode = new ArrayList(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 parentPath, final int line) { + public LeafListSchemaNodeBuilder addLeafListNode(final SchemaPath schemaPath, final QName qname, final List parentPath, final int line) { final List pathToNode = new ArrayList(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 pathToGroup = new ArrayList(); + 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 parentPath, final int line) { final List pathToGroup = new ArrayList(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 parentPath, final int line) { final List pathToAugment = new ArrayList(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 pathToTypedef = new ArrayList(); + 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 parentPath, final int line) { final List pathToUses = new ArrayList(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 parentPath, final int line) { + Builder parent = getActualNode(); + final List pathToCase = new ArrayList(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 parentPath, final int line) { + public AnyXmlBuilder addAnyXml(final SchemaPath schemaPath, final QName anyXmlName, final List parentPath, final int line) { final List pathToAnyXml = new ArrayList(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 pathToTypedef = new ArrayList(); + 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 parentPath, final int line) { final List pathToType = new ArrayList(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 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 unPath = new ArrayList(); + 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 nodes = new ArrayList(); + nodes.add(unknownNode); + addedUnknownNodes.put(unPath, nodes); } } @@ -707,7 +826,14 @@ public class ModuleBuilder implements Builder { } final List unPath = new ArrayList(parentPath); unPath.add(qname.getLocalName()); - addedUnknownNodes.put(unPath, builder); + + if (addedUnknownNodes.containsKey(unPath)) { + addedUnknownNodes.get(unPath).add(builder); + } else { + List nodes = new ArrayList(); + nodes.add(builder); + addedUnknownNodes.put(unPath, nodes); + } return builder; } @@ -1259,14 +1385,16 @@ public class ModuleBuilder implements Builder { } private List buildModuleUnknownNodes( - final Map, UnknownSchemaNodeBuilder> addedUnknownNodes) { + final Map, List> addedUnknownNodes) { final List unknownNodes = new ArrayList(); - for (Map.Entry, UnknownSchemaNodeBuilder> entry : addedUnknownNodes.entrySet()) { + for (Map.Entry, List> entry : addedUnknownNodes.entrySet()) { final List path = entry.getKey(); - final UnknownSchemaNodeBuilder child = entry.getValue(); - if (path.size() == 2) { - final UnknownSchemaNode node = child.build(); - unknownNodes.add(node); + final List child = entry.getValue(); + for (UnknownSchemaNodeBuilder un : child) { + if (path.size() == 2) { + final UnknownSchemaNode node = un.build(); + unknownNodes.add(node); + } } } return unknownNodes; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java index 956d8fe449..534ba2c841 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java @@ -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(); for (AugmentationSchemaBuilder builder : addedAugmentations) { augmentations.add(builder.build()); @@ -126,7 +126,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder } @Override - public Set getTypeDefinitions() { + public Set 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> typeDefinitions) { + private void setTypeDefinitions(final Set> typeDefinitions) { if (typeDefinitions != null) { this.typeDefinitions = typeDefinitions; } @@ -315,8 +314,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder return augmentations; } - private void setAvailableAugmentations( - Set augmentations) { + private void setAvailableAugmentations(Set augmentations) { if (augmentations != null) { this.augmentations = augmentations; } @@ -327,8 +325,7 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder return unknownNodes; } - private void setUnknownSchemaNodes( - final List unknownNodes) { + private void setUnknownSchemaNodes(final List 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(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java index e36adbdeb2..8cb4a6e56c 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java @@ -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 addedTypedefs = new HashSet(); private final Set addedGroupings = new HashSet(); - private final List addedUnknownNodes = new ArrayList(); 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> typedefs = new HashSet>(); @@ -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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java index a8628eae72..6ca07bc87f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java @@ -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 addedUnknownNodes = new ArrayList(); private List unknownNodes; + private final List addedUnknownNodes = new ArrayList(); private List ranges = Collections.emptyList(); private List lengths = Collections.emptyList(); private List 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> 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 getUnknownNodes() { + public List getUnknownNodes() { + return Collections.emptyList(); + } + + @Override + public List 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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java index 07db69901f..433ae962e0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java @@ -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 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 getUnknownNodes() { + public List 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("]"); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java index 3d3ad28891..14cf3a9b34 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java @@ -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 addedUnknownNodes = new ArrayList(); + private boolean addedByUses; + private List 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 unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); + if (unknownNodes == null) { + unknownNodes = new ArrayList(); + 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 unknownNodes) { + this.unknownNodes = unknownNodes; } public QName getNodeType() { @@ -141,6 +107,7 @@ public final class UnknownSchemaNodeBuilder implements SchemaNodeBuilder { private List 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 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(); + } } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java index 850938161b..77a465d5fd 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java @@ -18,8 +18,10 @@ import java.util.Set; import org.opendaylight.controller.yang.model.api.AugmentationSchema; import org.opendaylight.controller.yang.model.api.SchemaNode; import org.opendaylight.controller.yang.model.api.SchemaPath; +import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; import org.opendaylight.controller.yang.model.api.UsesNode; import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder; +import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder; import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.RefineHolder; @@ -28,17 +30,32 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { private boolean isBuilt; private UsesNodeImpl instance; private final int line; - private SchemaPath schemaPath; + private final DataNodeContainerBuilder parent; private final String groupingName; private SchemaPath groupingPath; private boolean augmenting; + private boolean addedByUses; private final Set addedAugments = new HashSet(); - private List refineBuilders = new ArrayList(); - private List refines = new ArrayList(); + private final List refineBuilders = new ArrayList(); + private final List refines = new ArrayList(); + private final List addedUnknownNodes = new ArrayList(); - public UsesNodeBuilderImpl(final String groupingName, final int line) { + public UsesNodeBuilderImpl(final String groupingName, final int line, final DataNodeContainerBuilder parent) { this.groupingName = groupingName; this.line = line; + this.parent = parent; + } + + public UsesNodeBuilderImpl(UsesNodeBuilder b) { + groupingName = b.getGroupingName(); + line = b.getLine(); + parent = b.getParent(); + groupingPath = b.getGroupingPath(); + augmenting = b.isAugmenting(); + addedByUses = b.isAddedByUses(); + addedAugments.addAll(b.getAugmentations()); + refineBuilders.addAll(b.getRefineNodes()); + refines.addAll(b.getRefines()); } @Override @@ -46,6 +63,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { if (!isBuilt) { instance = new UsesNodeImpl(groupingPath); instance.setAugmenting(augmenting); + instance.setAddedByUses(addedByUses); // AUGMENTATIONS final Set augments = new HashSet(); @@ -62,6 +80,13 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { } instance.setRefines(refineNodes); + // UNKNOWN NODES + List unknownNodes = new ArrayList(); + for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { + unknownNodes.add(b.build()); + } + instance.setUnknownSchemaNodes(unknownNodes); + isBuilt = true; } return instance; @@ -73,18 +98,18 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { } @Override - public void setGroupingPath(SchemaPath groupingPath) { - this.groupingPath = groupingPath; + public DataNodeContainerBuilder getParent() { + return parent; } @Override - public SchemaPath getPath() { - return schemaPath; + public SchemaPath getGroupingPath() { + return groupingPath; } @Override - public void setPath(SchemaPath path) { - this.schemaPath = path; + public void setGroupingPath(SchemaPath groupingPath) { + this.groupingPath = groupingPath; } @Override @@ -112,6 +137,16 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { this.augmenting = augmenting; } + @Override + public boolean isAddedByUses() { + return addedByUses; + } + + @Override + public void setAddedByUses(final boolean addedByUses) { + this.addedByUses = addedByUses; + } + @Override public List getRefineNodes() { return refineBuilders; @@ -132,12 +167,22 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { refines.add(refine); } + public List getUnknownNodes() { + return addedUnknownNodes; + } + + @Override + public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) { + addedUnknownNodes.add(unknownNode); + } - private final class UsesNodeImpl implements UsesNode { + public final class UsesNodeImpl implements UsesNode { private final SchemaPath groupingPath; private Set augmentations = Collections.emptySet(); private boolean augmenting; + private boolean addedByUses; private Map refines = Collections.emptyMap(); + private List unknownNodes = Collections.emptyList(); private UsesNodeImpl(final SchemaPath groupingPath) { this.groupingPath = groupingPath; @@ -153,8 +198,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { return augmentations; } - private void setAugmentations( - final Set augmentations) { + private void setAugmentations(final Set augmentations) { if (augmentations != null) { this.augmentations = augmentations; } @@ -169,6 +213,15 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { this.augmenting = augmenting; } + @Override + public boolean isAddedByUses() { + return addedByUses; + } + + private void setAddedByUses(final boolean addedByUses) { + this.addedByUses = addedByUses; + } + @Override public Map getRefines() { return refines; @@ -180,14 +233,26 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { } } + public List getUnknownSchemaNodes() { + return unknownNodes; + } + + private void setUnknownSchemaNodes(List unknownSchemaNodes) { + if (unknownSchemaNodes != null) { + this.unknownNodes = unknownSchemaNodes; + } + } + + public UsesNodeBuilder toBuilder() { + return UsesNodeBuilderImpl.this; + } + @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result - + ((groupingPath == null) ? 0 : groupingPath.hashCode()); - result = prime * result - + ((augmentations == null) ? 0 : augmentations.hashCode()); + result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode()); + result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode()); result = prime * result + (augmenting ? 1231 : 1237); return result; } @@ -226,8 +291,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { @Override public String toString() { - StringBuilder sb = new StringBuilder( - UsesNodeImpl.class.getSimpleName()); + StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName()); sb.append("[groupingPath=" + groupingPath + "]"); return sb.toString(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java index e74029b424..5dedd3c027 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java @@ -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> modules, - final ModuleBuilder module, SchemaContext context) { + final ModuleBuilder module, final SchemaContext context) { final Set 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> modules, final ModuleBuilder module) { final Map, UsesNodeBuilder> moduleUses = module.getUsesNodes(); for (Map.Entry, 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> modules, - final ModuleBuilder module, SchemaContext context) { + final ModuleBuilder module, final SchemaContext context) { final Map, UsesNodeBuilder> moduleUses = module.getUsesNodes(); for (Map.Entry, 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 path = usesBuilder.getPath().getPath(); + List path = usesBuilder.getParent().getPath().getPath(); GroupingBuilder result = null; Set 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 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 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> modules, final ModuleBuilder module, final IdentityrefTypeBuilder idref) { QName result = null; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java index 5bd46d1231..28095b5ef7 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java @@ -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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java index ba3599ca97..554866712f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java @@ -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 path = new ArrayList(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 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 grps = grouping.getGroupings(); + Set 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 typedefs = grouping.getTypeDefinitions(); + Set 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 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(); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java index 4dd46769d8..7d22891901 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java @@ -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; } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java index 8db4e8e6fd..73acebf717 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java @@ -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); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangModelBuilderUtil.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangModelBuilderUtil.java index 5423e486db..856f8e2ba7 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangModelBuilderUtil.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangModelBuilderUtil.java @@ -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 actualPath, final URI namespace, - final Date revision, final String prefix) { + final Date revision, final String prefix, final String... names) { final List path = new ArrayList(); 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 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 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 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 rangeStatements = getRangeConstraints(typeBody); Integer fractionDigits = getFractionDigits(typeBody); List lengthStatements = getLengthConstraints(typeBody); List patternStatements = getPatternConstraint(typeBody); - List enumConstants = getEnumConstants(typeBody, actualPath, namespace, revision, - prefix); + List 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 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 index 0000000000..2442f51da3 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/GroupingTest.java @@ -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 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 usesNodes = destination.getUses(); + assertEquals(1, usesNodes.size()); + UsesNode usesNode = usesNodes.iterator().next(); + Map 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 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 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 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 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 groupings = testModule.getGroupings(); + assertEquals(1, groupings.size()); + GroupingDefinition grouping = groupings.iterator().next(); + Set 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 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 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 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 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 nodes_u = destination.getUnknownSchemaNodes(); + assertEquals(1, nodes_u.size()); + UnknownSchemaNode node_u = nodes_u.get(0); + assertTrue(node_u.isAddedByUses()); + + List 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)); + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java index 9006f93c61..d331cff18d 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java @@ -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 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 usesNodes = destination.getUses(); - assertEquals(1, usesNodes.size()); - UsesNode usesNode = usesNodes.iterator().next(); - Map 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 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 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 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 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 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 groupings = testModule.getGroupings(); - assertEquals(1, groupings.size()); - GroupingDefinition grouping = groupings.iterator().next(); - Set children = grouping.getChildNodes(); - assertEquals(5, children.size()); - } - @Test public void testAugmentNodesTypesSchemaPath() throws Exception { Module testModule = TestUtils.findModule(modules, "types1"); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserWithContextTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserWithContextTest.java index ff32ee1fa8..be7b7ef7aa 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserWithContextTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserWithContextTest.java @@ -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 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 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 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 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 nodes_u = destination.getUnknownSchemaNodes(); + assertEquals(1, nodes_u.size()); + UnknownSchemaNode node_u = nodes_u.get(0); + assertTrue(node_u.isAddedByUses()); + + List 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))); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile1.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile1.yang index f6bc34d1b6..bd8f378ee1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile1.yang +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile1.yang @@ -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; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang index e594749508..b25f65e4a4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/testfile2.yang @@ -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; } diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/DataSchemaNode.java b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/DataSchemaNode.java index 25208aaab6..87cdbfd0a6 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/DataSchemaNode.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/DataSchemaNode.java @@ -12,16 +12,25 @@ public interface DataSchemaNode extends SchemaNode { /** * Returns true if the data node was added by augmentation, * otherwise returns false - * + * * @return true if the data node was added by augmentation, * otherwise returns false */ boolean isAugmenting(); + /** + * Returns true if the data node was added by uses statement, + * otherwise returns false + * + * @return true if the data node was added by uses statement, + * otherwise returns false + */ + boolean isAddedByUses(); + /** * Returns true if the data represents configuration data, * otherwise returns false - * + * * @return true if the data represents configuration data, * otherwise returns false */ @@ -29,7 +38,7 @@ public interface DataSchemaNode extends SchemaNode { /** * Returns the constraints associated with Data Schema Node - * + * * @return the constraints associated with Data Schema Node */ ConstraintDefinition getConstraints(); diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/GroupingDefinition.java b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/GroupingDefinition.java index 1c8398b86c..a04119b038 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/GroupingDefinition.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/GroupingDefinition.java @@ -17,4 +17,6 @@ package org.opendaylight.controller.yang.model.api; */ public interface GroupingDefinition extends DataNodeContainer, SchemaNode { + boolean isAddedByUses(); + } diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UnknownSchemaNode.java b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UnknownSchemaNode.java index 0430b7ab45..8e03113a59 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UnknownSchemaNode.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UnknownSchemaNode.java @@ -12,6 +12,9 @@ import org.opendaylight.controller.yang.common.QName; public interface UnknownSchemaNode extends SchemaNode { QName getNodeType(); + String getNodeParameter(); + boolean isAddedByUses(); + } diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UsesNode.java b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UsesNode.java index e76f5e8131..0fc8a0e49d 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UsesNode.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/UsesNode.java @@ -31,6 +31,8 @@ public interface UsesNode { */ boolean isAugmenting(); + boolean isAddedByUses(); + /** * Some of the properties of each node in the grouping can be refined with * the "refine" statement. diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/ExtendedType.java b/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/ExtendedType.java index e5ef2026f1..b9729102c9 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/ExtendedType.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/ExtendedType.java @@ -38,6 +38,7 @@ public class ExtendedType implements 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> { private Status status = Status.CURRENT; private String units = ""; private Object defaultValue = null; + private boolean addedByUses; private List ranges = Collections.emptyList(); private List lengths = Collections.emptyList(); @@ -94,6 +96,11 @@ public class ExtendedType implements TypeDefinition> { return this; } + public Builder addedByUses(final boolean addedByUses) { + this.addedByUses = addedByUses; + return this; + } + public Builder unknownSchemaNodes( final List unknownSchemaNodes) { this.unknownSchemaNodes = unknownSchemaNodes; @@ -141,6 +148,7 @@ public class ExtendedType implements 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> { return defaultValue; } + public boolean isAddedByUses() { + return addedByUses; + } + @Override public QName getQName() { return typeName; diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/InstanceIdentifier.java b/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/InstanceIdentifier.java index 8139d5b50b..05dffc62d1 100644 --- a/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/InstanceIdentifier.java +++ b/opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/InstanceIdentifier.java @@ -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 default implementation of Instance Identifier Type Definition interface. + * The default 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 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() { diff --git a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java index 443c7a42ab..ab31496103 100644 --- a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java +++ b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java @@ -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 nodeConncetors) { + private void addSpanPorts(Node node, List nodeConnectors) { List ncLists = new ArrayList(); - 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 ncLists = new ArrayList(); - 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 ncLists = new ArrayList(); + ncLists.add(nodeConnector); + addSpanPorts(nodeConnector.getNode(), ncLists); + return; + } + } } /* * Remove span configuration to local cache and notify clients */ - private void removeSpanPorts(Node node, List nodeConncetors) { + private void removeSpanPorts(Node node, List nodeConnectors) { List ncLists = new ArrayList(); - 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 ncLists = new ArrayList(); - ncLists.add(nodeConncetor); - removeSpanPorts(nodeConncetor.getNode(), ncLists); + private void removeSpanPort(NodeConnector nodeConnector) { + if (spanNodeConnectors.contains(nodeConnector)) { + List ncLists = new ArrayList(); + ncLists.add(nodeConnector); + removeSpanPorts(nodeConnector.getNode(), ncLists); + } } private void addNodeProps(Node node, Map propMap) {