From 071db48e47fa3dd83da3933f1b35c3ca0d42f550 Mon Sep 17 00:00:00 2001 From: Lukas Sedlak Date: Mon, 29 Apr 2013 18:29:30 +0200 Subject: [PATCH] Added generation of Transfer Objects from Type Definitions. Extended functionality of Type provider to resolve Type Definitions in schema context as GeneratedTransfeObjects with proper package names and class names; Updated generateTypes in BindingGeneratorImpl to generate also Transfer Objects from Type Definitions; Added BindingGeneratorUtil to replace functionality of CodeGeneratorHelper; Modified EnumerationBuilderImpl - changed visibility from package protected to public due to need for generation of stand alone enums; Refactored GeneratorUtil with use of BindingGeneratorUtil methods; Fixed bug in where SchemaPath was incorectly generated for yang types in yang-model-util project; Changed YangModelParser API - removed parseYangModel method and changed parseYangModels param from vararg String to List of Files and from vararg InputStream to List of Input Streams; Modified YangToSourcesMojoj and GenerateSourcesTest in maven-yang-plugin due to change in YangModelParser API; Modified YangToSourcesPluginTest due to change in YangModelParser API; Modified Demo in binding-model-demo due to change in YangModelParser API; Modified GeneratedTypesTest in binding-generator-impl -> changed load of yang files due to change in YangModelParser API; Added comment generation for interface and class definition in binding-java-api-generator -> GeneratorUtil; Change-Id: Id1be574e10f7f80d1badfbdec2bcc4a98564fee5 Signed-off-by: Lukas Sedlak --- .../generator/impl/BindingGeneratorImpl.java | 128 ++++--- .../binding/yang/types/TypeProviderImpl.java | 355 +++++++++++++++++- .../generator/impl/GeneratedTypesTest.java | 38 +- .../binding-generator-util/pom.xml | 5 + .../generator/util/BindingGeneratorUtil.java | 192 ++++++++++ .../generator/util/CodeGeneratorHelper.java | 67 ---- .../type/builder/EnumerationBuilderImpl.java | 2 +- .../binding-java-api-generator/pom.xml | 48 +-- .../sal/java/api/generator/GeneratorUtil.java | 14 +- .../api/generator/InterfaceGenerator.java | 3 +- .../generator/test/GeneratorJavaFileTest.java | 26 +- .../opendaylight/controller/yang/Demo.java | 13 +- .../plugin/it/YangToSourcesPluginTest.java | 1 - .../plugin/YangToSourcesMojo.java | 17 +- .../plugin/GenerateSourcesTest.java | 4 +- .../model/parser/api/YangModelParser.java | 18 +- .../src/main/antlr/YangParser.g4 | 2 +- .../src/main/antlr/YangParser.g4.bak | 122 ++++++ .../impl/IdentitySchemaNodeBuilder.java | 29 +- .../parser/builder/impl/ModuleBuilder.java | 8 +- .../parser/impl/YangModelParserImpl.java | 80 ++-- .../parser/impl/YangValidationException.java | 26 ++ .../yang/model/parser/impl/TestUtils.java | 9 +- .../parser/impl/TypesResolutionTest.java | 6 +- 24 files changed, 888 insertions(+), 325 deletions(-) create mode 100644 opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java delete mode 100644 opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/CodeGeneratorHelper.java create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4.bak create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangValidationException.java diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java index a161c25016..dcee5fee33 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-impl/src/main/java/org/opendaylight/controller/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -18,9 +18,8 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.opendaylight.controller.binding.generator.util.CodeGeneratorHelper; +import org.opendaylight.controller.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.controller.binding.generator.util.Types; -import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl; import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; import org.opendaylight.controller.sal.binding.generator.api.BindingGenerator; import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider; @@ -98,20 +97,25 @@ public class BindingGeneratorImpl implements BindingGenerator { public List generateTypes(final SchemaContext context) { final List genTypes = new ArrayList(); - typeProvider = new TypeProviderImpl(context); if (context != null) { + typeProvider = new TypeProviderImpl(context); final Set modules = context.getModules(); - + if (modules != null) { for (final Module module : modules) { - DataNodeIterator moduleIterator = new DataNodeIterator(module); - + final DataNodeIterator moduleIterator = new DataNodeIterator( + module); + genTypeBuilders = new HashMap>(); - final List schemaContainers = moduleIterator.allContainers(); - final List schemaLists = moduleIterator.allLists(); + final List schemaContainers = moduleIterator + .allContainers(); + final List schemaLists = moduleIterator + .allLists(); - basePackageName = resolveBasePackageName( - module.getNamespace(), module.getYangVersion()); + basePackageName = BindingGeneratorUtil + .moduleNamespaceToPackageName( + module.getNamespace(), + module.getYangVersion()); if (schemaContainers.size() > 0) { for (final ContainerSchemaNode container : schemaContainers) { @@ -138,6 +142,9 @@ public class BindingGeneratorImpl implements BindingGenerator { genTypes.add(genNotifyType); } } + + //FIXME this is quick add of typedefs to generated types from type provider + genTypes.addAll(((TypeProviderImpl)typeProvider).getGeneratedTypeDefs()); } } return genTypes; @@ -202,7 +209,7 @@ public class BindingGeneratorImpl implements BindingGenerator { && (enumTypeDef.getQName() != null) && (enumTypeDef.getQName().getLocalName() != null)) { - final String enumerationName = CodeGeneratorHelper + final String enumerationName = BindingGeneratorUtil .parseToClassName(enumName); final EnumBuilder enumBuilder = typeBuilder .addEnumeration(enumerationName); @@ -213,7 +220,7 @@ public class BindingGeneratorImpl implements BindingGenerator { int listIndex = 0; for (final EnumPair enumPair : enums) { if (enumPair != null) { - final String enumPairName = CodeGeneratorHelper + final String enumPairName = BindingGeneratorUtil .parseToClassName(enumPair.getName()); Integer enumPairValue = enumPair.getValue(); @@ -236,7 +243,7 @@ public class BindingGeneratorImpl implements BindingGenerator { if (module != null) { String packageName = resolveBasePackageName(module.getNamespace(), module.getYangVersion()); - final String moduleName = CodeGeneratorHelper + final String moduleName = BindingGeneratorUtil .parseToClassName(module.getName()) + postfix; if (packageName != null) { @@ -250,7 +257,7 @@ public class BindingGeneratorImpl implements BindingGenerator { private GeneratedType rpcMethodsToGenType(final Module module) { if (module != null) { final Set rpcDefinitions = module.getRpcs(); - + //TODO: add implementation if ((rpcDefinitions != null) && !rpcDefinitions.isEmpty()) { final GeneratedTypeBuilder rpcTypeBuilder = moduleTypeBuilder( module, "Rpc"); @@ -269,7 +276,7 @@ public class BindingGeneratorImpl implements BindingGenerator { if (module != null) { final Set notifications = module .getNotifications(); - + //TODO: add implementation if ((notifications != null) && !notifications.isEmpty()) { final GeneratedTypeBuilder notifyTypeBuilder = moduleTypeBuilder( module, "Notification"); @@ -284,25 +291,26 @@ public class BindingGeneratorImpl implements BindingGenerator { return null; } - private String resolveGeneratedTypePackageName(final SchemaPath schemaPath) { - final StringBuilder builder = new StringBuilder(); - builder.append(basePackageName); - if ((schemaPath != null) && (schemaPath.getPath() != null)) { - final List pathToNode = schemaPath.getPath(); - final int traversalSteps = (pathToNode.size() - 1); - for (int i = 0; i < traversalSteps; ++i) { - builder.append("."); - String nodeLocalName = pathToNode.get(i).getLocalName(); - - // TODO: create method - nodeLocalName = nodeLocalName.replace(":", "."); - nodeLocalName = nodeLocalName.replace("-", "."); - builder.append(nodeLocalName); - } - return validatePackage(builder.toString()); - } - return null; - } + // private String resolveGeneratedTypePackageName(final SchemaPath + // schemaPath) { + // final StringBuilder builder = new StringBuilder(); + // builder.append(basePackageName); + // if ((schemaPath != null) && (schemaPath.getPath() != null)) { + // final List pathToNode = schemaPath.getPath(); + // final int traversalSteps = (pathToNode.size() - 1); + // for (int i = 0; i < traversalSteps; ++i) { + // builder.append("."); + // String nodeLocalName = pathToNode.get(i).getLocalName(); + // + // // TODO: refactor with use of BindingGeneratorUtil class + // nodeLocalName = nodeLocalName.replace(":", "."); + // nodeLocalName = nodeLocalName.replace("-", "."); + // builder.append(nodeLocalName); + // } + // return validatePackage(builder.toString()); + // } + // return null; + // } private GeneratedType containerToGenType(ContainerSchemaNode container) { if (container == null) { @@ -358,14 +366,17 @@ public class BindingGeneratorImpl implements BindingGenerator { .javaTypeForSchemaDefinitionType(typeDef); } else { if (isImported(leaf.getPath(), typeDef.getPath())) { - //TODO: resolving of imported enums as references to GeneratedTypeData interface + // TODO: resolving of imported enums as references to + // GeneratedTypeData interface } else { final EnumTypeDefinition enumTypeDef = enumTypeDefFromExtendedType(typeDef); - final EnumBuilder enumBuilder = resolveEnumFromTypeDefinition(enumTypeDef, leafName, - typeBuilder); - + final EnumBuilder enumBuilder = resolveEnumFromTypeDefinition( + enumTypeDef, leafName, typeBuilder); + if (enumBuilder != null) { - type = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName()); + type = new ReferencedTypeImpl( + enumBuilder.getPackageName(), + enumBuilder.getName()); } } } @@ -392,7 +403,7 @@ public class BindingGeneratorImpl implements BindingGenerator { && (leafPathQName.getNamespace() != null) && (typePathQName != null) && (typePathQName.getNamespace() != null)) { - + return !leafPathQName.getNamespace().equals( typePathQName.getNamespace()); } @@ -418,7 +429,7 @@ public class BindingGeneratorImpl implements BindingGenerator { .javaTypeForSchemaDefinitionType(typeDef); final GeneratedPropertyBuilder propBuilder = toBuilder - .addProperty(CodeGeneratorHelper + .addProperty(BindingGeneratorUtil .parseToClassName(leafName)); propBuilder.setReadOnly(isReadOnly); @@ -501,13 +512,14 @@ public class BindingGeneratorImpl implements BindingGenerator { return null; } - final String packageName = resolveGeneratedTypePackageName(schemaNode - .getPath()); + final String packageName = BindingGeneratorUtil + .packageNameForGeneratedType(basePackageName, + schemaNode.getPath()); final String schemaNodeName = schemaNode.getQName().getLocalName(); if ((packageName != null) && (schemaNode != null) && (schemaNodeName != null)) { - final String genTypeName = CodeGeneratorHelper + final String genTypeName = BindingGeneratorUtil .parseToClassName(schemaNodeName); final GeneratedTypeBuilder newType = new GeneratedTypeBuilderImpl( packageName, genTypeName); @@ -531,14 +543,14 @@ public class BindingGeneratorImpl implements BindingGenerator { private String getterMethodName(final String methodName) { final StringBuilder method = new StringBuilder(); method.append("get"); - method.append(CodeGeneratorHelper.parseToClassName(methodName)); + method.append(BindingGeneratorUtil.parseToClassName(methodName)); return method.toString(); } private String setterMethodName(final String methodName) { final StringBuilder method = new StringBuilder(); method.append("set"); - method.append(CodeGeneratorHelper.parseToClassName(methodName)); + method.append(BindingGeneratorUtil.parseToClassName(methodName)); return method.toString(); } @@ -564,7 +576,7 @@ public class BindingGeneratorImpl implements BindingGenerator { setMethod.addComment(comment); setMethod.addParameter(parameterType, - CodeGeneratorHelper.parseToParamName(schemaNodeName)); + BindingGeneratorUtil.parseToValidParamName(schemaNodeName)); setMethod.addReturnType(Types.voidType()); return setMethod; @@ -639,19 +651,12 @@ public class BindingGeneratorImpl implements BindingGenerator { * @return */ private GeneratedTOBuilder resolveListKey(final ListSchemaNode list) { - final String packageName = resolveGeneratedTypePackageName(list - .getPath()); + final String packageName = BindingGeneratorUtil + .packageNameForGeneratedType(basePackageName, list.getPath()); final String listName = list.getQName().getLocalName() + "Key"; - if ((packageName != null) && (list != null) && (listName != null)) { - final String genTOName = CodeGeneratorHelper - .parseToClassName(listName); - final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl( - packageName, genTOName); - - return newType; - } - return null; + return BindingGeneratorUtil.schemaNodeToTransferObjectBuilder( + packageName, list, listName); } private boolean isPartOfListKey(final LeafSchemaNode leaf, @@ -680,10 +685,11 @@ public class BindingGeneratorImpl implements BindingGenerator { private GeneratedTypeBuilder resolveListTypeBuilder( final ListSchemaNode list) { - final String packageName = resolveGeneratedTypePackageName(list - .getPath()); + final String packageName = BindingGeneratorUtil + .packageNameForGeneratedType(basePackageName, + list.getPath()); final String schemaNodeName = list.getQName().getLocalName(); - final String genTypeName = CodeGeneratorHelper + final String genTypeName = BindingGeneratorUtil .parseToClassName(schemaNodeName); GeneratedTypeBuilder typeBuilder = null; 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 076edd07a4..9a38297566 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,9 +7,24 @@ */ package org.opendaylight.controller.sal.binding.yang.types; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.opendaylight.controller.binding.generator.util.BindingGeneratorUtil; 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; import org.opendaylight.controller.sal.binding.generator.spi.TypeProvider; +import org.opendaylight.controller.sal.binding.model.api.Enumeration; +import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject; import org.opendaylight.controller.sal.binding.model.api.Type; +import org.opendaylight.controller.sal.binding.model.api.type.builder.EnumBuilder; +import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedPropertyBuilder; +import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder; +import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.controller.yang.model.api.DataSchemaNode; import org.opendaylight.controller.yang.model.api.LeafListSchemaNode; import org.opendaylight.controller.yang.model.api.LeafSchemaNode; @@ -17,18 +32,42 @@ import org.opendaylight.controller.yang.model.api.Module; import org.opendaylight.controller.yang.model.api.RevisionAwareXPath; import org.opendaylight.controller.yang.model.api.SchemaContext; import org.opendaylight.controller.yang.model.api.TypeDefinition; +import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition; +import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair; import org.opendaylight.controller.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.controller.yang.model.api.type.LeafrefTypeDefinition; +import org.opendaylight.controller.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.controller.yang.model.util.ExtendedType; -import org.opendaylight.controller.yang.model.util.Leafref; import org.opendaylight.controller.yang.model.util.SchemaContextUtil; public class TypeProviderImpl implements TypeProvider { - private SchemaContextUtil schemaContextUtil; + private final SchemaContext schemaContext; + private final SchemaContextUtil schemaContextUtil; + private Map> generatedTypeDefinitions; + private final List generatedTypeDefs = new ArrayList(); + + public TypeProviderImpl(final SchemaContext schemaContext) { + if (schemaContext == null) { + throw new IllegalArgumentException("Schema Context cannot be null!"); + } - public TypeProviderImpl(SchemaContext schemaContext) { + this.schemaContext = schemaContext; schemaContextUtil = new SchemaContextUtil(schemaContext); + this.generatedTypeDefinitions = new HashMap>(); + + resolveTypeDefsFromContext(); + + final Set moduleNames = generatedTypeDefinitions.keySet(); + + for (final String moduleName : moduleNames) { + generatedTypeDefs.addAll(generatedTypeDefinitions.get(moduleName) + .values()); + } + } + + public List getGeneratedTypeDefs() { + return generatedTypeDefs; } /* @@ -49,31 +88,103 @@ public class TypeProviderImpl implements TypeProvider { final TypeDefinition typeDefinition) { Type returnType = null; if (typeDefinition != null) { - if (typeDefinition instanceof Leafref) { - final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) typeDefinition; - returnType = provideTypeForLeafref(leafref); - } else if (typeDefinition instanceof IdentityrefTypeDefinition) { - - } else if (typeDefinition instanceof ExtendedType) { - final TypeDefinition baseType = typeDefinition.getBaseType(); - return javaTypeForSchemaDefinitionType(baseType); + final String typedefName = typeDefinition.getQName().getLocalName(); + if (typeDefinition instanceof ExtendedType) { + final TypeDefinition baseTypeDef = baseTypeDefForExtendedType(typeDefinition); + + if (baseTypeDef instanceof LeafrefTypeDefinition) { + final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) baseTypeDef; + returnType = provideTypeForLeafref(leafref); + } else if (baseTypeDef instanceof IdentityrefTypeDefinition) { + + } else if (baseTypeDef instanceof EnumTypeDefinition) { + final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) baseTypeDef; + returnType = resolveEnumFromTypeDefinition(enumTypeDef, + typedefName); + } else { + final Module module = schemaContextUtil + .resolveModuleFromSchemaPath(typeDefinition + .getPath()); + + if (module != null) { + final Map genTOs = generatedTypeDefinitions + .get(module.getName()); + if (genTOs != null) { + returnType = genTOs.get(typedefName); + } + } + } } else { - returnType = baseTypeForExtendedType(typeDefinition); + if (typeDefinition instanceof LeafrefTypeDefinition) { + final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) typeDefinition; + returnType = provideTypeForLeafref(leafref); + } else if (typeDefinition instanceof EnumTypeDefinition) { + final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDefinition; + returnType = resolveEnumFromTypeDefinition(enumTypeDef, + typedefName); + } else if (typeDefinition instanceof IdentityrefTypeDefinition) { + + } else { + returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER + .javaTypeForSchemaDefinitionType(typeDefinition); + } } + + // if (typeDefinition instanceof Leafref) { + // final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) + // typeDefinition; + // returnType = provideTypeForLeafref(leafref); + // } else if (typeDefinition instanceof IdentityrefTypeDefinition) { + // + // } else if (typeDefinition instanceof ExtendedType) { + // final TypeDefinition baseType = typeDefinition.getBaseType(); + // return javaTypeForSchemaDefinitionType(baseType); + // } else { + // returnType = baseTypeForExtendedType(typeDefinition); + // } } return returnType; } + private TypeDefinition baseTypeDefForExtendedType( + final TypeDefinition extendTypeDef) { + if (extendTypeDef != null) { + final TypeDefinition baseTypeDef = extendTypeDef.getBaseType(); + if (baseTypeDef instanceof ExtendedType) { + baseTypeDefForExtendedType(baseTypeDef); + } else { + return baseTypeDef; + } + } + return null; + } + public Type baseTypeForExtendedType(final TypeDefinition typeDefinition) { Type returnType = null; if (typeDefinition != null) { - if (typeDefinition instanceof ExtendedType) { - final TypeDefinition extType = typeDefinition.getBaseType(); - return baseTypeForExtendedType(extType); + final TypeDefinition baseTypeDefinition = baseTypeDefForExtendedType(typeDefinition); + + if (baseTypeDefinition instanceof EnumTypeDefinition) { + final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDefinition; + final String enumName = enumTypeDef.getQName().getLocalName(); + return resolveEnumFromTypeDefinition(enumTypeDef, enumName); } else { returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER .javaTypeForSchemaDefinitionType(typeDefinition); } + + // if (typeDefinition instanceof ExtendedType) { + // final TypeDefinition extType = typeDefinition.getBaseType(); + // return baseTypeForExtendedType(extType); + // } else if (typeDefinition instanceof EnumerationType) { + // final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) + // typeDefinition; + // final String enumName = enumTypeDef.getQName().getLocalName(); + // return resolveEnumFromTypeDefinition(enumTypeDef, enumName); + // } else { + // returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER + // .javaTypeForSchemaDefinitionType(typeDefinition); + // } } return returnType; } @@ -110,6 +221,86 @@ public class TypeProviderImpl implements TypeProvider { return returnType; } + private EnumBuilder resolveEnumFromTypeDefinition( + final EnumTypeDefinition enumTypeDef, final String enumName, + final GeneratedTypeBuilder typeBuilder) { + if ((enumTypeDef != null) && (typeBuilder != null) + && (enumTypeDef.getQName() != null) + && (enumTypeDef.getQName().getLocalName() != null)) { + + final String enumerationName = BindingGeneratorUtil + .parseToClassName(enumName); + final EnumBuilder enumBuilder = typeBuilder + .addEnumeration(enumerationName); + + if (enumBuilder != null) { + final List enums = enumTypeDef.getValues(); + if (enums != null) { + int listIndex = 0; + for (final EnumPair enumPair : enums) { + if (enumPair != null) { + final String enumPairName = BindingGeneratorUtil + .parseToClassName(enumPair.getName()); + Integer enumPairValue = enumPair.getValue(); + + if (enumPairValue == null) { + enumPairValue = listIndex; + } + enumBuilder.addValue(enumPairName, enumPairValue); + listIndex++; + } + } + } + return enumBuilder; + } + } + return null; + } + + private Enumeration resolveEnumFromTypeDefinition( + final EnumTypeDefinition enumTypeDef, final String enumName) { + if ((enumTypeDef != null) && (enumTypeDef.getQName() != null) + && (enumTypeDef.getQName().getLocalName() != null)) { + + final String enumerationName = BindingGeneratorUtil + .parseToClassName(enumName); + + Module module = schemaContextUtil + .resolveModuleFromSchemaPath(enumTypeDef.getPath()); + final String basePackageName = BindingGeneratorUtil + .moduleNamespaceToPackageName(module.getNamespace(), + module.getYangVersion()); + final String packageName = BindingGeneratorUtil + .packageNameForGeneratedType(basePackageName, + enumTypeDef.getPath()); + + final EnumBuilder enumBuilder = new EnumerationBuilderImpl( + packageName, enumerationName); + + if (enumBuilder != null) { + final List enums = enumTypeDef.getValues(); + if (enums != null) { + int listIndex = 0; + for (final EnumPair enumPair : enums) { + if (enumPair != null) { + final String enumPairName = BindingGeneratorUtil + .parseToClassName(enumPair.getName()); + Integer enumPairValue = enumPair.getValue(); + + if (enumPairValue == null) { + enumPairValue = listIndex; + } + enumBuilder.addValue(enumPairName, enumPairValue); + listIndex++; + } + } + } + return enumBuilder.toInstance(null); + } + } + return null; + } + private Type resolveTypeFromDataSchemaNode(final DataSchemaNode dataNode) { Type returnType = null; if (dataNode != null) { @@ -123,4 +314,138 @@ public class TypeProviderImpl implements TypeProvider { } return returnType; } + + private void resolveTypeDefsFromContext() { + final Set modules = schemaContext.getModules(); + if (modules != null) { + for (final Module module : modules) { + if (module != null) { + final String basePackageName = BindingGeneratorUtil + .moduleNamespaceToPackageName( + module.getNamespace(), + module.getYangVersion()); + + final Set> typeDefinitions = module + .getTypeDefinitions(); + + if ((typeDefinitions != null) && (basePackageName != null)) { + for (final TypeDefinition typedef : typeDefinitions) { + addGeneratedTypeDefinition(basePackageName, + module.getName(), typedef); + } + // for (final TypeDefinition typedef : + // typeDefinitions) { + // addUnionGeneratedTypeDefinition(basePackageName, + // module.getName(), typedef); + // } + } + } + } + } + } + + private void addGeneratedTypeDefinition(final String basePackageName, + final String moduleName, final TypeDefinition typedef) { + if ((basePackageName != null) && (moduleName != null) + && (typedef != null) && (typedef.getQName() != null)) { + final GeneratedTOBuilder genTO = typedefToTransferObject( + basePackageName, typedef); + + final String propertyName = BindingGeneratorUtil + .parseToValidParamName(typedef.getQName().getLocalName()); + + final TypeDefinition baseTypeDefinition = baseTypeDefForExtendedType(typedef); + if (!(baseTypeDefinition instanceof LeafrefTypeDefinition) + && !(baseTypeDefinition instanceof IdentityrefTypeDefinition)) { + Type returnType = null; + if (baseTypeDefinition instanceof EnumTypeDefinition) { + final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) baseTypeDefinition; + final String enumName = typedef.getQName().getLocalName(); + returnType = resolveEnumFromTypeDefinition(enumTypeDef, + enumName); + } else { + returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER + .javaTypeForSchemaDefinitionType(baseTypeDefinition); + } + + if (returnType != null) { + final GeneratedPropertyBuilder genPropBuilder = genTO + .addProperty(propertyName); + + genPropBuilder.addReturnType(returnType); + genTO.addEqualsIdentity(genPropBuilder); + genTO.addHashIdentity(genPropBuilder); + genTO.addToStringProperty(genPropBuilder); + + Map genTOsMap = generatedTypeDefinitions + .get(moduleName); + if (genTOsMap == null) { + genTOsMap = new HashMap(); + generatedTypeDefinitions.put(moduleName, genTOsMap); + } + genTOsMap.put(typedef.getQName().getLocalName(), + genTO.toInstance()); + } + } + } + } + + private void addUnionGeneratedTypeDefinition(final String basePackageName, + final String moduleName, final TypeDefinition typedef) { + if ((basePackageName != null) && (moduleName != null) + && (typedef != null) && (typedef.getQName() != null)) { + final TypeDefinition baseTypeDefinition = baseTypeDefForExtendedType(typedef); + + if ((baseTypeDefinition != null) + && (baseTypeDefinition instanceof UnionTypeDefinition)) { + final UnionTypeDefinition unionTypeDef = (UnionTypeDefinition) baseTypeDefinition; + + final List> unionTypes = unionTypeDef + .getTypes(); + final Map genTOsMap = generatedTypeDefinitions + .get(moduleName); + final GeneratedTOBuilder unionGenTransObject = typedefToTransferObject( + basePackageName, typedef); + if ((unionTypes != null) && (genTOsMap != null) + && (unionGenTransObject != null)) { + for (final TypeDefinition unionType : unionTypes) { + final String typeName = unionType.getQName() + .getLocalName(); + final GeneratedTransferObject genTransferObject = genTOsMap + .get(typeName); + + if (genTransferObject != null) { + unionGenTransObject + .addProperty( + BindingGeneratorUtil + .parseToValidParamName(genTransferObject + .getName())) + .addReturnType(genTransferObject); + } + } + genTOsMap.put(unionTypeDef.getQName().getLocalName(), + unionGenTransObject.toInstance()); + } + } + } + } + + private GeneratedTOBuilder typedefToTransferObject( + final String basePackageName, final TypeDefinition typedef) { + + final String packageName = BindingGeneratorUtil + .packageNameForGeneratedType(basePackageName, typedef.getPath()); + final String typeDefTOName = typedef.getQName().getLocalName(); + + if ((packageName != null) && (typedef != null) + && (typeDefTOName != null)) { + final String genTOName = BindingGeneratorUtil + .parseToClassName(typeDefTOName); + final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl( + packageName, genTOName); + + return newType; + } + return null; + } } 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 39afc37de7..0b03460075 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 @@ -7,15 +7,17 @@ */ package org.opendaylight.controller.sal.binding.generator.impl; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +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.Ignore; 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.Enumeration; import org.opendaylight.controller.sal.binding.model.api.GeneratedProperty; import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject; @@ -32,8 +34,13 @@ public class GeneratedTypesTest { private SchemaContext resolveSchemaContextFromFiles( final String... yangFiles) { final YangModelParser parser = new YangModelParserImpl(); - final Set modules = parser.parseYangModels(yangFiles); - + + final List inputFiles = new ArrayList(); + for (int i = 0; i < yangFiles.length; ++i) { + inputFiles.add(new File(yangFiles[i])); + } + + final Set modules = parser.parseYangModels(inputFiles); return parser.resolveSchemaContext(modules); } @@ -54,7 +61,7 @@ public class GeneratedTypesTest { final List genTypes = bindingGen.generateTypes(context); assertTrue(genTypes != null); } - + @Test public void testTypedefEnumResolving() { final String ianaIfTypePath = getClass().getResource( @@ -66,7 +73,7 @@ public class GeneratedTypesTest { final BindingGenerator bindingGen = new BindingGeneratorImpl(); final List genTypes = bindingGen.generateTypes(context); assertTrue(genTypes != null); - assertEquals(1, genTypes.size()); + assertEquals(2, genTypes.size()); final Type type = genTypes.get(0); assertTrue(type instanceof GeneratedType); @@ -92,7 +99,7 @@ public class GeneratedTypesTest { final List genTypes = bindingGen.generateTypes(context); assertTrue(genTypes != null); - assertEquals(13, genTypes.size()); + assertEquals(24, genTypes.size()); } @Test @@ -129,7 +136,7 @@ public class GeneratedTypesTest { final BindingGenerator bindingGen = new BindingGeneratorImpl(); final List genTypes = bindingGen.generateTypes(context); - assertEquals(25, genTypes.size()); + assertEquals(46, genTypes.size()); assertTrue(genTypes != null); int resolvedLeafrefCount = 0; @@ -205,7 +212,7 @@ public class GeneratedTypesTest { assertFalse(method.getReturnType().equals( "java.lang.Void")); assertTrue(method.getReturnType().getName() - .equals("String")); + .equals("Uri")); resolvedLeafrefCount++; } } @@ -238,7 +245,7 @@ public class GeneratedTypesTest { assertFalse(property.getReturnType().equals( "java.lang.Void")); assertTrue(property.getReturnType().getName() - .equals("String")); + .equals("Uri")); resolvedLeafrefCount++; } } @@ -247,7 +254,6 @@ public class GeneratedTypesTest { assertEquals(10, resolvedLeafrefCount); } - @Ignore @Test public void testContainerResolving() { final String filePath = getClass().getResource( @@ -266,7 +272,7 @@ public class GeneratedTypesTest { assertEquals("SimpleContainer", simpleContainer.getName()); assertEquals("NestedContainer", nestedContainer.getName()); - assertEquals(4, simpleContainer.getMethodDefinitions().size()); + assertEquals(5, simpleContainer.getMethodDefinitions().size()); assertEquals(4, nestedContainer.getMethodDefinitions().size()); int methodsCount = 0; @@ -326,7 +332,6 @@ public class GeneratedTypesTest { assertEquals(4, methodsCount); } - @Ignore @Test public void testLeafListResolving() { final String filePath = getClass().getResource( @@ -345,7 +350,7 @@ public class GeneratedTypesTest { assertEquals("SimpleContainer", simpleContainer.getName()); assertEquals("NestedContainer", nestedContainer.getName()); - assertEquals(4, simpleContainer.getMethodDefinitions().size()); + assertEquals(5, simpleContainer.getMethodDefinitions().size()); assertEquals(3, nestedContainer.getMethodDefinitions().size()); int methodsCount = 0; @@ -400,7 +405,6 @@ public class GeneratedTypesTest { assertEquals(3, methodsCount); } - @Ignore @Test public void testListResolving() { final String filePath = getClass() @@ -423,7 +427,7 @@ public class GeneratedTypesTest { assertEquals(2, genType.getMethodDefinitions().size()); genTypesCount++; } else if (genType.getName().equals("SimpleList")) { - assertEquals(7, genType.getMethodDefinitions().size()); + assertEquals(8, genType.getMethodDefinitions().size()); final List methods = genType .getMethodDefinitions(); int methodsCount = 0; diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/pom.xml b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/pom.xml index 8022cf4745..b60d108d17 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/pom.xml @@ -12,5 +12,10 @@ binding-model-api 1.0 + + org.opendaylight.controller + yang-model-api + 1.0 + \ No newline at end of file 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 new file mode 100644 index 0000000000..1e16a05def --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/BindingGeneratorUtil.java @@ -0,0 +1,192 @@ +package org.opendaylight.controller.binding.generator.util; + +import java.net.URI; +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl; +import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder; +import org.opendaylight.controller.yang.common.QName; +import org.opendaylight.controller.yang.model.api.SchemaNode; +import org.opendaylight.controller.yang.model.api.SchemaPath; + +public class BindingGeneratorUtil { + + private static final String[] SET_VALUES = new String[] { "abstract", + "assert", "boolean", "break", "byte", "case", "catch", "char", + "class", "const", "continue", "default", "double", "do", "else", + "enum", "extends", "false", "final", "finally", "float", "for", + "goto", "if", "implements", "import", "instanceof", "int", + "interface", "long", "native", "new", "null", "package", "private", + "protected", "public", "return", "short", "static", "strictfp", + "super", "switch", "synchronized", "this", "throw", "throws", + "transient", "true", "try", "void", "volatile", "while" }; + + private static Calendar calendar = new GregorianCalendar(); + + private BindingGeneratorUtil() { + } + + public static final Set JAVA_RESERVED_WORDS = new HashSet( + Arrays.asList(SET_VALUES)); + + public static String validateJavaPackage(final String packageName) { + if (packageName != null) { + final String[] packNameParts = packageName.split("\\."); + if (packNameParts != null) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < packNameParts.length; ++i) { + if (JAVA_RESERVED_WORDS.contains(packNameParts[i])) { + packNameParts[i] = "_" + packNameParts[i]; + } + if (i > 0) { + builder.append("."); + } + builder.append(packNameParts[i]); + } + return builder.toString(); + } + } + return packageName; + } + + public static String validateParameterName(final String parameterName) { + if (parameterName != null) { + if (JAVA_RESERVED_WORDS.contains(parameterName)) { + return "_" + parameterName; + } + } + return parameterName; + } + + public static GeneratedTOBuilder schemaNodeToTransferObjectBuilder( + final String basePackageName, final SchemaNode schemaNode, final String transObjectName) { + if (basePackageName != null && schemaNode != null && transObjectName != null) { + final String packageName = packageNameForGeneratedType(basePackageName, + schemaNode.getPath()); + + if (packageName != null) { + final String genTOName = BindingGeneratorUtil + .parseToClassName(transObjectName); + final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl( + packageName, genTOName); + + return newType; + } + } + return null; + } + + public static String moduleNamespaceToPackageName( + final URI moduleNamespace, final String yangVersion) { + final StringBuilder packageNameBuilder = new StringBuilder(); + + packageNameBuilder.append("org.opendaylight.yang.gen.v"); + packageNameBuilder.append(yangVersion); + packageNameBuilder.append(".rev"); + packageNameBuilder.append(calendar.get(Calendar.YEAR)); + packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1)); + packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH)); + packageNameBuilder.append("."); + + String namespace = moduleNamespace.toString(); + namespace = namespace.replace("://", "."); + namespace = namespace.replace("/", "."); + namespace = namespace.replace(":", "."); + namespace = namespace.replace("-", "."); + namespace = namespace.replace("@", "."); + namespace = namespace.replace("$", "."); + namespace = namespace.replace("#", "."); + namespace = namespace.replace("'", "."); + namespace = namespace.replace("*", "."); + namespace = namespace.replace("+", "."); + namespace = namespace.replace(",", "."); + namespace = namespace.replace(";", "."); + namespace = namespace.replace("=", "."); + + packageNameBuilder.append(namespace); + + return packageNameBuilder.toString(); + } + + public static String packageNameForGeneratedType( + final String basePackageName, final SchemaPath schemaPath) { + final StringBuilder builder = new StringBuilder(); + builder.append(basePackageName); + if ((schemaPath != null) && (schemaPath.getPath() != null)) { + final List pathToNode = schemaPath.getPath(); + final int traversalSteps = (pathToNode.size() - 1); + for (int i = 0; i < traversalSteps; ++i) { + builder.append("."); + String nodeLocalName = pathToNode.get(i).getLocalName(); + + nodeLocalName = nodeLocalName.replace(":", "."); + nodeLocalName = nodeLocalName.replace("-", "."); + builder.append(nodeLocalName); + } + return validateJavaPackage(builder.toString()); + } + return null; + } + + public static String parseToClassName(String token) { + token = token.replace(".", ""); + String correctStr = parseToCamelCase(token); + + // make first char upper-case + char first = Character.toUpperCase(correctStr.charAt(0)); + correctStr = first + correctStr.substring(1); + return correctStr; + } + + public static String parseToValidParamName(final String token) { + final String validToken = token.replace(".", ""); + String correctStr = parseToCamelCase(validToken); + + // make first char lower-case + char first = Character.toLowerCase(correctStr.charAt(0)); + correctStr = first + correctStr.substring(1); + return validateParameterName(correctStr); + } + + private static String parseToCamelCase(String token) { + if (token == null) { + throw new NullPointerException("Name can not be null"); + } + + String correctStr = token.trim(); + if (correctStr.length() == 0) { + throw new IllegalArgumentException("Name can not be emty"); + } + + correctStr = replaceWithCamelCase(correctStr, ' '); + correctStr = replaceWithCamelCase(correctStr, '-'); + correctStr = replaceWithCamelCase(correctStr, '_'); + return correctStr; + } + + private static String replaceWithCamelCase(String text, char removalChar) { + StringBuilder sb = new StringBuilder(text); + String toBeRemoved = String.valueOf(removalChar); + + int toBeRemovedPos = sb.indexOf(toBeRemoved); + while (toBeRemovedPos != -1) { + sb.replace(toBeRemovedPos, toBeRemovedPos + 1, ""); + // check if 'toBeRemoved' character is not the only character in + // 'text' + if (sb.length() == 0) { + throw new IllegalArgumentException("Name can not be '" + + toBeRemoved + "'"); + } + String replacement = String.valueOf(sb.charAt(toBeRemovedPos)) + .toUpperCase(); + sb.setCharAt(toBeRemovedPos, replacement.charAt(0)); + toBeRemovedPos = sb.indexOf(toBeRemoved); + } + return sb.toString(); + } +} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/CodeGeneratorHelper.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/CodeGeneratorHelper.java deleted file mode 100644 index 552be98295..0000000000 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/CodeGeneratorHelper.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.binding.generator.util; - -public class CodeGeneratorHelper { - - public static String parseToClassName(String token) { - String correctStr = parseToCamelCase(token); - - // make first char upper-case - char first = Character.toUpperCase(correctStr.charAt(0)); - correctStr = first + correctStr.substring(1); - return correctStr; - } - - public static String parseToParamName(String token) { - String correctStr = parseToCamelCase(token); - - // make first char lower-case - char first = Character.toLowerCase(correctStr.charAt(0)); - correctStr = first + correctStr.substring(1); - return correctStr; - } - - private static String parseToCamelCase(String token) { - if (token == null) { - throw new NullPointerException("Name can not be null"); - } - - String correctStr = token.trim(); - if (correctStr.length() == 0) { - throw new IllegalArgumentException("Name can not be emty"); - } - - correctStr = replaceWithCamelCase(correctStr, ' '); - correctStr = replaceWithCamelCase(correctStr, '-'); - correctStr = replaceWithCamelCase(correctStr, '_'); - return correctStr; - } - - private static String replaceWithCamelCase(String text, char removalChar) { - StringBuilder sb = new StringBuilder(text); - String toBeRemoved = String.valueOf(removalChar); - - int toBeRemovedPos = sb.indexOf(toBeRemoved); - while (toBeRemovedPos != -1) { - sb.replace(toBeRemovedPos, toBeRemovedPos + 1, ""); - // check if 'toBeRemoved' character is not the only character in - // 'text' - if (sb.length() == 0) { - throw new IllegalArgumentException("Name can not be '" - + toBeRemoved + "'"); - } - String replacement = String.valueOf(sb.charAt(toBeRemovedPos)) - .toUpperCase(); - sb.setCharAt(toBeRemovedPos, replacement.charAt(0)); - toBeRemovedPos = sb.indexOf(toBeRemoved); - } - return sb.toString(); - } - -} diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/EnumerationBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/EnumerationBuilderImpl.java index d48d5b92f2..62945ea451 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/EnumerationBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-generator-util/src/main/java/org/opendaylight/controller/binding/generator/util/generated/type/builder/EnumerationBuilderImpl.java @@ -17,7 +17,7 @@ import org.opendaylight.controller.sal.binding.model.api.Type; import org.opendaylight.controller.sal.binding.model.api.type.builder.AnnotationTypeBuilder; import org.opendaylight.controller.sal.binding.model.api.type.builder.EnumBuilder; -final class EnumerationBuilderImpl implements EnumBuilder { +public final class EnumerationBuilderImpl implements EnumBuilder { private final String packageName; private final String name; private final List values; diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/pom.xml b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/pom.xml index 661dcaa737..4517d7005d 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/pom.xml +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/pom.xml @@ -1,22 +1,28 @@ - - 4.0.0 - - org.opendaylight.controller - binding-generator - 1.0 - - binding-java-api-generator - - - org.opendaylight.controller - binding-model-api - 1.0 - - - org.opendaylight.controller - binding-generator-impl - 1.0 - test - - + + 4.0.0 + + org.opendaylight.controller + binding-generator + 1.0 + + binding-java-api-generator + + + org.opendaylight.controller + binding-model-api + 1.0 + + + org.opendaylight.controller + binding-generator-impl + 1.0 + test + + + org.opendaylight.controller + binding-generator-util + 1.0 + + \ No newline at end of file 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 b4387fe803..93cc9a25f5 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 @@ -27,6 +27,7 @@ import static org.opendaylight.controller.sal.java.api.generator.Constants.TAB; import java.util.List; +import org.opendaylight.controller.binding.generator.util.BindingGeneratorUtil; 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; @@ -61,7 +62,8 @@ public class GeneratorUtil { builder.append(PKG + GAP + genType.getPackageName() + SC); builder.append(NL); builder.append(NL); - + createComment(builder, genType.getComment(), indent); + if (!genType.getAnnotations().isEmpty()) { final List annotations = genType.getAnnotations(); appendAnnotations(builder, annotations); @@ -72,7 +74,8 @@ public 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("@"); @@ -171,13 +174,13 @@ public class GeneratorUtil { createComment(builder, comment, indent); builder.append(NL); builder.append(indent); - + if (!method.getAnnotations().isEmpty()) { final List annotations = method.getAnnotations(); appendAnnotations(builder, annotations); builder.append(NL); } - + builder.append(indent + getExplicitType(type) + GAP + name); builder.append(LB); for (int i = 0; i < parameters.size(); i++) { @@ -186,7 +189,8 @@ public class GeneratorUtil { if (i + 1 == parameters.size()) { separator = ""; } - builder.append(getExplicitType(p.getType()) + GAP + p.getName() + builder.append(getExplicitType(p.getType()) + GAP + + BindingGeneratorUtil.validateParameterName(p.getName()) + separator); } builder.append(RB); diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/InterfaceGenerator.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/InterfaceGenerator.java index bb5b91b97c..51ce324eb4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/InterfaceGenerator.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/InterfaceGenerator.java @@ -19,6 +19,7 @@ import java.util.List; 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.GeneratedTransferObject; import org.opendaylight.controller.sal.binding.model.api.GeneratedType; import org.opendaylight.controller.sal.binding.model.api.MethodSignature; import org.opendaylight.controller.sal.binding.model.api.Type; @@ -27,7 +28,7 @@ public class InterfaceGenerator implements CodeGenerator { public Writer generate(Type type) throws IOException { Writer writer = new StringWriter(); - if (type instanceof GeneratedType) { + if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) { GeneratedType genType = (GeneratedType) type; final List constants = genType.getConstantDefinitions(); diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java index 511445740d..5b5d503192 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/test/java/org/opendaylight/controller/sal/java/api/generator/test/GeneratorJavaFileTest.java @@ -7,11 +7,13 @@ */ package org.opendaylight.controller.sal.java.api.generator.test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -86,20 +88,26 @@ public class GeneratorJavaFileTest { assertTrue(filesList.contains("Type2.java")); assertTrue(filesList.contains("Type3.java")); } - + @Test public void compilationTest() throws Exception { final YangModelParserImpl parser = new YangModelParserImpl(); final BindingGenerator bindingGenerator = new BindingGeneratorImpl(); - File sourcesDir = new File("src/test/resources/yang"); - File[] sourceFiles = sourcesDir.listFiles(); - String[] sourcesDirPaths = new String[sourceFiles.length]; - for (int i = 0; i < sourceFiles.length; i++) { - sourcesDirPaths[i] = sourceFiles[i].getAbsolutePath(); + final File sourcesDir = new File("src/test/resources/yang"); + final List sourceFiles = new ArrayList(); + final File[] fileArray = sourcesDir.listFiles(); + + for (int i = 0; i < fileArray.length; ++i) { + sourceFiles.add(fileArray[i]); } + +// String[] sourcesDirPaths = new String[sourceFiles.length]; +// for (int i = 0; i < sourceFiles.length; i++) { +// sourcesDirPaths[i] = sourceFiles[i].getAbsolutePath(); +// } final Set modulesToBuild = parser - .parseYangModels(sourcesDirPaths); + .parseYangModels(sourceFiles); final SchemaContext context = parser .resolveSchemaContext(modulesToBuild); @@ -107,7 +115,7 @@ public class GeneratorJavaFileTest { final Set typesToGenerate = new HashSet(); final Set tosToGenerate = new HashSet(); for (Type type : types) { - if (type instanceof GeneratedType) { + if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) { typesToGenerate.add((GeneratedType) type); } diff --git a/opendaylight/sal/yang-prototype/code-generator/code-generator-demo/src/main/java/org/opendaylight/controller/yang/Demo.java b/opendaylight/sal/yang-prototype/code-generator/code-generator-demo/src/main/java/org/opendaylight/controller/yang/Demo.java index 60af153f83..9823390faf 100644 --- a/opendaylight/sal/yang-prototype/code-generator/code-generator-demo/src/main/java/org/opendaylight/controller/yang/Demo.java +++ b/opendaylight/sal/yang-prototype/code-generator/code-generator-demo/src/main/java/org/opendaylight/controller/yang/Demo.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.yang; import java.io.File; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -53,18 +54,14 @@ public class Demo { } String[] dirList = resourceDir.list(); - String[] absFiles = new String[dirList.length]; - - int i = 0; + List inputFiles = new ArrayList(); for (String fileName : dirList) { - File abs = new File(resourceDir, fileName); - absFiles[i] = abs.getAbsolutePath(); - i++; + inputFiles.add(new File(resourceDir, fileName)); } final YangModelParserImpl parser = new YangModelParserImpl(); final BindingGenerator bindingGenerator = new BindingGeneratorImpl(); - final Set modulesToBuild = parser.parseYangModels(absFiles); + final Set modulesToBuild = parser.parseYangModels(inputFiles); final SchemaContext context = parser .resolveSchemaContext(modulesToBuild); @@ -72,7 +69,7 @@ public class Demo { final Set typesToGenerate = new HashSet(); final Set tosToGenerate = new HashSet(); for (Type type : types) { - if (type instanceof GeneratedType) { + if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) { typesToGenerate.add((GeneratedType) type); } diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/java/org/opendaylight/controller/yang2sources/plugin/it/YangToSourcesPluginTest.java b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/java/org/opendaylight/controller/yang2sources/plugin/it/YangToSourcesPluginTest.java index 1d8f570853..4b41cfd944 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/java/org/opendaylight/controller/yang2sources/plugin/it/YangToSourcesPluginTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin-it/src/test/java/org/opendaylight/controller/yang2sources/plugin/it/YangToSourcesPluginTest.java @@ -68,7 +68,6 @@ public class YangToSourcesPluginTest { public void testNoYangFiles() throws VerificationException { Verifier v = setUp("NoYangFiles/", false); v.verifyTextInLog("[WARNING] yang-to-sources: No yang file found in "); - v.verifyTextInLog("[INFO] yang-to-sources: yang files parsed from []"); v.verifyTextInLog("[INFO] yang-to-sources: Code generator instantiated from org.opendaylight.controller.yang2sources.spi.CodeGeneratorTestImpl"); v.verifyTextInLog("[INFO] yang-to-sources: Sources generated by org.opendaylight.controller.yang2sources.spi.CodeGeneratorTestImpl: null"); } diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java index 32ad2abb10..18e7b4cca7 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/YangToSourcesMojo.java @@ -8,7 +8,7 @@ package org.opendaylight.controller.yang2sources.plugin; import java.io.File; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.Set; @@ -90,20 +90,21 @@ public final class YangToSourcesMojo extends AbstractMojo { */ private SchemaContext processYang() throws MojoExecutionException { try { - String[] yangFiles = Util.listFilesAsArrayOfPaths(yangFilesRootDir); - - if (yangFiles.length == 0) + Collection yangFiles = Util.listFiles(yangFilesRootDir); + + if (yangFiles.isEmpty()) { getLog().warn( Util.message("No %s file found in %s", LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir)); - // TODO only warning or throw exception ? - - Set parsedYang = parser.parseYangModels(yangFiles); + return null; + } + + Set parsedYang = parser.parseYangModels(new ArrayList(yangFiles)); SchemaContext resolveSchemaContext = parser .resolveSchemaContext(parsedYang); getLog().info( Util.message("%s files parsed from %s", LOG_PREFIX, - Util.YANG_SUFFIX, Arrays.toString(yangFiles))); + Util.YANG_SUFFIX, yangFiles)); return resolveSchemaContext; // MojoExecutionException is thrown since execution cannot continue diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/test/java/org/opendaylight/controller/yang2sources/plugin/GenerateSourcesTest.java b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/test/java/org/opendaylight/controller/yang2sources/plugin/GenerateSourcesTest.java index be19db1423..db703c2d0f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/test/java/org/opendaylight/controller/yang2sources/plugin/GenerateSourcesTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/test/java/org/opendaylight/controller/yang2sources/plugin/GenerateSourcesTest.java @@ -49,7 +49,7 @@ public class GenerateSourcesTest { @Test public void test() throws Exception { mojo.execute(); - verify(parser, times(1)).parseYangModels((String[]) anyVararg()); + verify(parser, times(1)).parseYangModels(anyListOf(File.class)); assertThat(GeneratorMock.called, is(1)); assertThat(GeneratorMock.outputDir, is(outDir)); } @@ -66,7 +66,5 @@ public class GenerateSourcesTest { outputDir = baseDir; return Lists.newArrayList(); } - } - } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-api/src/main/java/org/opendaylight/controller/yang/model/parser/api/YangModelParser.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-api/src/main/java/org/opendaylight/controller/yang/model/parser/api/YangModelParser.java index 59cea3041d..953cd436cb 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-api/src/main/java/org/opendaylight/controller/yang/model/parser/api/YangModelParser.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-api/src/main/java/org/opendaylight/controller/yang/model/parser/api/YangModelParser.java @@ -7,7 +7,9 @@ */ package org.opendaylight.controller.yang.model.parser.api; +import java.io.File; import java.io.InputStream; +import java.util.List; import java.util.Set; import org.opendaylight.controller.yang.model.api.Module; @@ -21,16 +23,6 @@ import org.opendaylight.controller.yang.model.api.type.UnknownTypeDefinition; */ public interface YangModelParser { - /** - * Parse single Yang model file and return the schema definition of Yang - * module defined in *.Yang file. - * - * @param yangFile - * yang file to parse - * @return the schema definition of Yang module defined in .Yang file. - */ - public Module parseYangModel(final String yangFile); - /** * Parse one or more Yang model files and return the definitions of Yang * modules defined in *.Yang files;
@@ -41,10 +33,10 @@ public interface YangModelParser { * yang files to parse * @return Set of Yang Modules */ - public Set parseYangModels(final String... yangFiles); - + public Set parseYangModels(final List yangFiles); + public Set parseYangModelsFromStreams( - final InputStream... yangModelStreams); + final List yangModelStreams); /** * Creates {@link SchemaContext} from specified Modules. The modules SHOULD diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 index e15184dea5..eea482a095 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4 @@ -78,7 +78,7 @@ require_instance_stmt : REQUIRE_INSTANCE_KEYWORD require_instance_arg stmtend; path_stmt : PATH_KEYWORD string stmtend; leafref_specification : path_stmt; enum_stmt : ENUM_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |value_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); -enum_specification : enum_stmt (identifier_stmt | enum_stmt )*; +enum_specification : enum_stmt (identifier_stmt | enum_stmt )+; default_stmt : DEFAULT_KEYWORD string stmtend; pattern_stmt : PATTERN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); length_stmt : LENGTH_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4.bak b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4.bak new file mode 100644 index 0000000000..e15184dea5 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/antlr/YangParser.g4.bak @@ -0,0 +1,122 @@ +parser grammar YangParser; + +@header { +package org.opendaylight.controller.antlrv4.code.gen; +} + +options{ + tokenVocab=YangLexer; + +} + + +yang : module_stmt | submodule_stmt ; + +string : STRING (PLUS STRING)*; + +identifier_stmt : IDENTIFIER string? stmtend; + +stmtend : (SEMICOLON) | (LEFT_BRACE identifier_stmt? RIGHT_BRACE); +deviate_replace_stmt : DEVIATE_KEYWORD string /* REPLACE_KEYWORD */ (SEMICOLON | (LEFT_BRACE (identifier_stmt |type_stmt | units_stmt | default_stmt | config_stmt | mandatory_stmt | min_elements_stmt | max_elements_stmt )* RIGHT_BRACE)); +deviate_delete_stmt : DEVIATE_KEYWORD string /* DELETE_KEYWORD */ (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt )* RIGHT_BRACE)); +deviate_add_stmt : DEVIATE_KEYWORD string /*ADD_KEYWORD*/ (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt | config_stmt | mandatory_stmt | min_elements_stmt | max_elements_stmt )* RIGHT_BRACE)); +deviate_not_supported_stmt : DEVIATE_KEYWORD string /*NOT_SUPPORTED_KEYWORD*/ (SEMICOLON | (LEFT_BRACE identifier_stmt? RIGHT_BRACE)); +deviation_stmt : DEVIATION_KEYWORD string LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt | deviate_not_supported_stmt | deviate_add_stmt | deviate_replace_stmt | deviate_delete_stmt)+ RIGHT_BRACE; +notification_stmt : NOTIFICATION_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE)); +output_stmt : OUTPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE; +input_stmt : INPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE; +rpc_stmt : RPC_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | input_stmt | output_stmt )* RIGHT_BRACE)); +when_stmt : WHEN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt )* RIGHT_BRACE)); + +augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)+ RIGHT_BRACE; +uses_augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)+ RIGHT_BRACE; +refine_anyxml_stmts : (identifier_stmt |must_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*; +refine_case_stmts : (identifier_stmt |description_stmt | reference_stmt )*; +refine_choice_stmts : (identifier_stmt |default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*; +refine_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*; +refine_leaf_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*; +refine_leaf_stmts : (identifier_stmt |must_stmt | default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*; +refine_container_stmts : (identifier_stmt |must_stmt | presence_stmt | config_stmt | description_stmt | reference_stmt )*; +refine_pom : (refine_container_stmts | refine_leaf_stmts | refine_leaf_list_stmts | refine_list_stmts | refine_choice_stmts | refine_case_stmts | refine_anyxml_stmts); +refine_stmt : REFINE_KEYWORD string (SEMICOLON | (LEFT_BRACE (refine_pom) RIGHT_BRACE)); +uses_stmt : USES_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | refine_stmt | uses_augment_stmt )* RIGHT_BRACE)); +anyxml_stmt : ANYXML_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | must_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +case_stmt : CASE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt )* RIGHT_BRACE)); +short_case_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | anyxml_stmt; +choice_stmt : CHOICE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt | short_case_stmt | case_stmt)* RIGHT_BRACE)); +unique_stmt : UNIQUE_KEYWORD string stmtend; +key_stmt : KEY_KEYWORD string stmtend; +list_stmt : LIST_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | must_stmt | key_stmt | unique_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE; +leaf_list_stmt : LEAF_LIST_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE; +leaf_stmt : LEAF_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE; +container_stmt : CONTAINER_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | when_stmt | if_feature_stmt | must_stmt | presence_stmt | config_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE)); +grouping_stmt : GROUPING_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE)); +value_stmt : VALUE_KEYWORD string stmtend; +max_value_arg : /*UNBOUNDED_KEYWORD |*/ string; +max_elements_stmt : MAX_ELEMENTS_KEYWORD max_value_arg stmtend; +min_elements_stmt : MIN_ELEMENTS_KEYWORD string stmtend; +error_app_tag_stmt : ERROR_APP_TAG_KEYWORD string stmtend; +error_message_stmt : ERROR_MESSAGE_KEYWORD string stmtend; +must_stmt : MUST_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +ordered_by_arg : string; /*USER_KEYWORD | SYSTEM_KEYWORD;*/ +ordered_by_stmt : ORDERED_BY_KEYWORD ordered_by_arg stmtend; +presence_stmt : PRESENCE_KEYWORD string stmtend; +mandatory_arg :string; // TRUE_KEYWORD | FALSE_KEYWORD; +mandatory_stmt : MANDATORY_KEYWORD mandatory_arg stmtend; +config_arg : string; // TRUE_KEYWORD | FALSE_KEYWORD; +config_stmt : CONFIG_KEYWORD config_arg stmtend; +status_arg : string; /*CURRENT_KEYWORD | OBSOLETE_KEYWORD | DEPRECATED_KEYWORD; */ +status_stmt : STATUS_KEYWORD status_arg stmtend; +position_stmt : POSITION_KEYWORD string stmtend; +bit_stmt : BIT_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |position_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +bits_specification : bit_stmt (bit_stmt | identifier_stmt)*; +union_specification : type_stmt (identifier_stmt | type_stmt )+; +identityref_specification : base_stmt ; +instance_identifier_specification : (require_instance_stmt )?; +require_instance_arg :string; // TRUE_KEYWORD | FALSE_KEYWORD; +require_instance_stmt : REQUIRE_INSTANCE_KEYWORD require_instance_arg stmtend; +path_stmt : PATH_KEYWORD string stmtend; +leafref_specification : path_stmt; +enum_stmt : ENUM_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |value_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +enum_specification : enum_stmt (identifier_stmt | enum_stmt )*; +default_stmt : DEFAULT_KEYWORD string stmtend; +pattern_stmt : PATTERN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +length_stmt : LENGTH_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +string_restrictions : (length_stmt | pattern_stmt )*; +fraction_digits_stmt : FRACTION_DIGITS_KEYWORD string stmtend; +decimal64_specification : (numerical_restrictions? (identifier_stmt)* fraction_digits_stmt | fraction_digits_stmt (identifier_stmt)* numerical_restrictions?); +range_stmt : RANGE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +numerical_restrictions : range_stmt ; +type_body_stmts : (identifier_stmt)* (numerical_restrictions | decimal64_specification | string_restrictions | enum_specification | leafref_specification | identityref_specification | instance_identifier_specification | bits_specification | union_specification) (identifier_stmt)*; +type_stmt : TYPE_KEYWORD string (SEMICOLON | (LEFT_BRACE type_body_stmts RIGHT_BRACE)); +typedef_stmt : TYPEDEF_KEYWORD string LEFT_BRACE (identifier_stmt | type_stmt | units_stmt | default_stmt | status_stmt | description_stmt | reference_stmt )+ RIGHT_BRACE; +if_feature_stmt : IF_FEATURE_KEYWORD string stmtend; +feature_stmt : FEATURE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +base_stmt : BASE_KEYWORD string stmtend; +identity_stmt : IDENTITY_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | base_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +yin_element_arg : string; // TRUE_KEYWORD | FALSE_KEYWORD; +yin_element_stmt : YIN_ELEMENT_KEYWORD yin_element_arg stmtend; +argument_stmt : ARGUMENT_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt)? (yin_element_stmt )? (identifier_stmt)* RIGHT_BRACE)); +extension_stmt : EXTENSION_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | argument_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE)); +revision_date_stmt : REVISION_DATE_KEYWORD string stmtend; +revision_stmt : REVISION_KEYWORD string (SEMICOLON | (LEFT_BRACE (description_stmt )? (reference_stmt )? RIGHT_BRACE)); +units_stmt : UNITS_KEYWORD string stmtend; +reference_stmt : REFERENCE_KEYWORD string stmtend; +description_stmt : DESCRIPTION_KEYWORD string stmtend; +contact_stmt : CONTACT_KEYWORD string stmtend; +organization_stmt : ORGANIZATION_KEYWORD string stmtend; +belongs_to_stmt : BELONGS_TO_KEYWORD string LEFT_BRACE prefix_stmt RIGHT_BRACE; +prefix_stmt : PREFIX_KEYWORD string stmtend; +namespace_stmt : NAMESPACE_KEYWORD string stmtend; +include_stmt : INCLUDE_KEYWORD string (SEMICOLON | (LEFT_BRACE (revision_date_stmt )? RIGHT_BRACE)); +import_stmt : IMPORT_KEYWORD string LEFT_BRACE prefix_stmt (revision_date_stmt )? RIGHT_BRACE; +yang_version_stmt : YANG_VERSION_KEYWORD string stmtend; +data_def_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | choice_stmt | anyxml_stmt | uses_stmt; +body_stmts : (( identifier_stmt| extension_stmt | feature_stmt | identity_stmt | typedef_stmt | grouping_stmt | data_def_stmt | augment_stmt | rpc_stmt | notification_stmt | deviation_stmt) )*; +revision_stmts : (revision_stmt )*; +linkage_stmts : (import_stmt | include_stmt )*; +meta_stmts : (organization_stmt | contact_stmt | description_stmt | reference_stmt )*; +submodule_header_stmts : (yang_version_stmt | belongs_to_stmt)+ ; +module_header_stmts : (yang_version_stmt | namespace_stmt | prefix_stmt)+ ; +submodule_stmt : SUBMODULE_KEYWORD string LEFT_BRACE submodule_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE; +module_stmt : MODULE_KEYWORD string LEFT_BRACE module_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java index 979d89298a..906afd97a0 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.controller.yang.model.parser.builder.impl; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -25,7 +24,6 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { private final IdentitySchemaNodeImpl instance; private IdentitySchemaNodeBuilder baseIdentity; private String baseIdentityName; - private final List addedUnknownNodes = new ArrayList(); IdentitySchemaNodeBuilder(final QName qname) { this.qname = qname; @@ -40,14 +38,6 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { final IdentitySchemaNode base = baseIdentity.build(); instance.setBaseIdentity(base); } - - // UNKNOWN NODES - final List unknownNodes = new ArrayList(); - for (UnknownSchemaNodeBuilder b : addedUnknownNodes) { - unknownNodes.add(b.build()); - } - instance.setUnknownSchemaNodes(unknownNodes); - return instance; } @@ -83,13 +73,10 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { } } - public List getUnknownNodes() { - return addedUnknownNodes; - } - @Override - public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); + public void addUnknownSchemaNode(final UnknownSchemaNodeBuilder unknownNode) { + throw new IllegalStateException( + "Can not add schema node to identity statement"); } public String getBaseIdentityName() { @@ -111,7 +98,6 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { private String reference; private Status status = Status.CURRENT; private SchemaPath path; - private List unknownNodes = Collections.emptyList(); private IdentitySchemaNodeImpl(final QName qname) { this.qname = qname; @@ -171,14 +157,7 @@ public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder { @Override public List getUnknownSchemaNodes() { - return unknownNodes; - } - - private void setUnknownSchemaNodes( - List unknownSchemaNodes) { - if (unknownSchemaNodes != null) { - this.unknownNodes = unknownSchemaNodes; - } + return Collections.emptyList(); } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java index 51ab3639bb..7cb51db6a6 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java @@ -528,7 +528,7 @@ public class ModuleBuilder implements Builder { List pathToCase = new ArrayList(parentPath); ChoiceCaseBuilder builder = new ChoiceCaseBuilder(caseName); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes + final ChoiceBuilder parent = (ChoiceBuilder) moduleNodes .get(pathToCase); if (parent != null) { if (parent instanceof AugmentationSchemaBuilder) { @@ -538,6 +538,7 @@ public class ModuleBuilder implements Builder { } pathToCase.add(caseName.getLocalName()); + addedChilds.put(pathToCase, builder); moduleNodes.put(pathToCase, builder); return builder; @@ -608,13 +609,12 @@ public class ModuleBuilder implements Builder { public void addIdentityrefType(String baseString, List parentPath, SchemaPath schemaPath) { - List pathToIdentityref = new ArrayList(parentPath); TypeAwareBuilder parent = (TypeAwareBuilder) moduleNodes - .get(pathToIdentityref); + .get(parentPath); IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder( baseString, schemaPath); parent.setType(identityref); - dirtyNodes.put(pathToIdentityref, parent); + dirtyNodes.put(parentPath, parent); } public DeviationBuilder addDeviation(String targetPath, diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java index 8a72419176..60937fff22 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java @@ -88,21 +88,27 @@ public class YangModelParserImpl implements YangModelParser { .getLogger(YangModelParserImpl.class); @Override - public Module parseYangModel(final String yangFile) { - final Map> modules = resolveModuleBuilders(yangFile); - final Set result = build(modules); - return result.iterator().next(); - } - - @Override - public Set parseYangModels(final String... yangFiles) { - final Map> modules = resolveModuleBuilders(yangFiles); - return build(modules); + public Set parseYangModels(final List yangFiles) { + if (yangFiles != null) { + final List inputStreams = new ArrayList(); + + for (final File yangFile : yangFiles) { + try { + inputStreams.add(new FileInputStream(yangFile)); + } catch (FileNotFoundException e) { + logger.warn("Exception while reading yang file: " + + yangFile.getName(), e); + } + } + final Map> modules = resolveModuleBuilders(inputStreams); + return build(modules); + } + return Collections.emptySet(); } @Override public Set parseYangModelsFromStreams( - final InputStream... yangModelStreams) { + final List yangModelStreams) { final Map> modules = resolveModuleBuilders(yangModelStreams); return build(modules); } @@ -113,53 +119,10 @@ public class YangModelParserImpl implements YangModelParser { } private Map> resolveModuleBuilders( - final String... yangFiles) { - final InputStream[] streams = loadStreams(yangFiles); - Map> result = Collections - .emptyMap(); - - if (streams != null) { - result = resolveModuleBuilders(streams); - closeStreams(streams); - } - return result; - } - - private InputStream[] loadStreams(final String... yangFiles) { - final InputStream[] streams = new InputStream[yangFiles.length]; - for (int i = 0; i < yangFiles.length; i++) { - final String yangFileName = yangFiles[i]; - final File yangFile = new File(yangFileName); - try { - streams[i] = new FileInputStream(yangFile); - } catch (FileNotFoundException e) { - logger.warn("Exception while reading yang stream: " - + streams[i], e); - } - } - return streams; - } - - private void closeStreams(final InputStream[] streams) { - if (streams != null) { - for (int i = 0; i < streams.length; i++) { - try { - if (streams[i] != null) { - streams[i].close(); - } - } catch (IOException e) { - logger.warn("Exception while closing yang stream: " - + streams[i], e); - } - } - } - } - - private Map> resolveModuleBuilders( - final InputStream... yangFiles) { + final List yangFileStreams) { final Map> modules = new HashMap>(); final ParseTreeWalker walker = new ParseTreeWalker(); - final List trees = parseStreams(yangFiles); + final List trees = parseStreams(yangFileStreams); final ModuleBuilder[] builders = new ModuleBuilder[trees.size()]; // validate yang @@ -189,7 +152,7 @@ public class YangModelParserImpl implements YangModelParser { return modules; } - private List parseStreams(final InputStream... yangStreams) { + private List parseStreams(final List yangStreams) { final List trees = new ArrayList(); for (InputStream yangStream : yangStreams) { trees.add(parseStream(yangStream)); @@ -412,7 +375,8 @@ public class YangModelParserImpl implements YangModelParser { tdb.setLengths(old.getLengths()); tdb.setPatterns(old.getPatterns()); tdb.setFractionDigits(old.getFractionDigits()); - + tdb.setPath(old.getPath()); + final TypeDefinition oldType = old.getType(); if (oldType == null) { tdb.setType(old.getTypedef()); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangValidationException.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangValidationException.java new file mode 100644 index 0000000000..43d39406de --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangValidationException.java @@ -0,0 +1,26 @@ +/* + * 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.parser.impl; + +/** + * Unchecked exception thrown if yang definition is not valid according to + * {@link YangModelValidationListener} + */ +public class YangValidationException extends RuntimeException { + + private static final long serialVersionUID = 7414330400390825381L; + + public YangValidationException(String message, Throwable cause) { + super(message, cause); + } + + public YangValidationException(String message) { + super(message); + } + +} \ No newline at end of file diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TestUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TestUtils.java index 8038bd858b..547710929f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TestUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TestUtils.java @@ -31,13 +31,12 @@ final class TestUtils { public static Set loadModules(String resourceDirectory) { YangModelParser parser = new YangModelParserImpl(); - File testDir = new File(resourceDirectory); - String[] fileList = testDir.list(); - String[] testFiles = new String[fileList.length]; + final File testDir = new File(resourceDirectory); + final String[] fileList = testDir.list(); + final List testFiles = new ArrayList(); for (int i = 0; i < fileList.length; i++) { String fileName = fileList[i]; - File file = new File(testDir, fileName); - testFiles[i] = file.getAbsolutePath(); + testFiles.add(new File(testDir, fileName)); } return parser.parseYangModels(testFiles); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java index 46630b845a..7acf7cbbe4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java @@ -255,18 +255,20 @@ public class TypesResolutionTest { assertEquals(502L, (long) bit4.getPosition()); } + @Test public void testIanaTimezones() { Module tested = TestUtils.findModule(testedModules, "iana-timezones"); Set> typedefs = tested.getTypeDefinitions(); TypeDefinition testedType = TestUtils.findTypedef(typedefs, "iana-timezone"); - + /* + // FIXME: Refactor sources not to be timezone specific. String expectedDesc = "A timezone location as defined by the IANA timezone\n database (http://www.iana.org/time-zones)"; assertEquals(expectedDesc, testedType.getDescription()); assertNull(testedType.getReference()); assertEquals(Status.CURRENT, testedType.getStatus()); - + */ QName testedTypeQName = testedType.getQName(); assertEquals(URI.create("urn:ietf:params:xml:ns:yang:iana-timezones"), testedTypeQName.getNamespace()); -- 2.36.6