*/
void setBaseType(TypeDefinition<?> typeDef);
- boolean isUnion();
-
/**
*
* @param isUnion
}
typeProvider.putReferencedType(leaf.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
- final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
- returnType = addTOToTypeBuilder(unionDef, typeBuilder, leaf, parentModule);
- // Store the inner type within the union so that we can find the reference for it
- context.addInnerTypedefType(typeDef.getPath(), returnType);
+ GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((UnionTypeDefinition) typeDef, typeBuilder, leaf,
+ parentModule);
+ if (genTOBuilder != null) {
+ returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule);
+ // Store the inner type within the union so that we can find the reference for it
+ context.addInnerTypedefType(typeDef.getPath(), returnType);
+ }
} else if (typeDef instanceof BitsTypeDefinition) {
GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((BitsTypeDefinition) typeDef, typeBuilder, leaf,
parentModule);
returnType = new ReferencedTypeImpl(enumBuilder.getIdentifier());
typeProvider.putReferencedType(node.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
- final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
- returnType = addTOToTypeBuilder(unionDef, typeBuilder, node, parentModule);
+ final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((UnionTypeDefinition)typeDef, typeBuilder,
+ node, parentModule);
+ if (genTOBuilder != null) {
+ returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule);
+ }
} else if (typeDef instanceof BitsTypeDefinition) {
final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((BitsTypeDefinition)typeDef, typeBuilder,
node, parentModule);
return true;
}
- private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final UnionTypeDefinition typeDef,
+ private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final TypeDefinition<?> typeDef,
final GeneratedTypeBuilder typeBuilder, final Module parentModule) {
- final GeneratedTOBuilder returnTypeBuilder = typeProvider.newGeneratedTOBuilder(genTOBuilder.getIdentifier());
- returnTypeBuilder.setIsUnion(true);
- addCodegenInformation(returnTypeBuilder, parentModule, typeDef);
- returnTypeBuilder.setSchemaPath(typeDef.getPath());
- returnTypeBuilder.setModuleName(parentModule.getName());
- final GeneratedTransferObject returnType = returnTypeBuilder.build();
+ final GeneratedTOBuilder returnType = typeProvider.newGeneratedTOBuilder(genTOBuilder.getIdentifier());
+
+ addCodegenInformation(returnType, parentModule, typeDef);
+ returnType.setSchemaPath(typeDef.getPath());
+ returnType.setModuleName(parentModule.getName());
genTOBuilder.setTypedef(true);
genTOBuilder.setIsUnion(true);
AbstractTypeProvider.addUnitsToGenTO(genTOBuilder, typeDef.getUnits().orElse(null));
- createUnionBuilder(genTOBuilder, typeBuilder, returnType, parentModule);
- return returnType;
+
+
+ final GeneratedTOBuilder unionBuilder = createUnionBuilder(genTOBuilder, typeBuilder);
+
+
+ final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
+ method.setReturnType(returnType);
+ method.addParameter(Types.STRING, "defaultValue");
+ method.setAccessModifier(AccessModifier.PUBLIC);
+ method.setStatic(true);
+
+ final Set<Type> types = typeProvider.getAdditionalTypes().get(parentModule);
+ if (types == null) {
+ typeProvider.getAdditionalTypes().put(parentModule,
+ Sets.newHashSet(unionBuilder.build()));
+ } else {
+ types.add(unionBuilder.build());
+ }
+ return returnType.build();
}
- private void createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder,
- final GeneratedTransferObject returnType, final Module parentModule) {
+ private GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder,
+ final GeneratedTypeBuilder typeBuilder) {
final StringBuilder sb = new StringBuilder();
// Append enclosing path hierarchy without dots
final GeneratedTOBuilder unionBuilder = typeProvider.newGeneratedTOBuilder(
JavaTypeName.create(typeBuilder.getPackageName(), sb.toString()));
unionBuilder.setIsUnionBuilder(true);
-
- final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
- method.setReturnType(returnType);
- method.addParameter(Types.STRING, "defaultValue");
- method.setAccessModifier(AccessModifier.PUBLIC);
- method.setStatic(true);
-
- final GeneratedTransferObject unionBuilderType = unionBuilder.build();
- final Set<Type> types = typeProvider.getAdditionalTypes().get(parentModule);
- if (types == null) {
- typeProvider.getAdditionalTypes().put(parentModule, Sets.newHashSet(unionBuilderType));
- } else {
- types.add(unionBuilderType);
- }
+ return unionBuilder;
}
private GeneratedTypeBuilder addDefaultInterfaceDefinition(final ModuleContext context,
return addDefaultInterfaceDefinition(packageName, schemaNode, childOf, context);
}
+
/**
* Instantiates generated type builder with <code>packageName</code> and
* <code>schemaNode</code>.
* parent module
* @return generated TO builder for <code>typeDef</code>
*/
- private Type addTOToTypeBuilder(final UnionTypeDefinition typeDef,
+ private GeneratedTOBuilder addTOToTypeBuilder(final UnionTypeDefinition typeDef,
final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule) {
final List<GeneratedTOBuilder> types = typeProvider.provideGeneratedTOBuildersForUnionTypeDef(
typeBuilder.getIdentifier().createEnclosed(BindingMapping.getClassName(leaf.getQName())),
checkState(!types.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typeDef);
final List<GeneratedTOBuilder> genTOBuilders = new ArrayList<>(types);
final GeneratedTOBuilder resultTOBuilder = types.remove(0);
- types.forEach(resultTOBuilder::addEnclosingTransferObject);
- genTOBuilders.forEach(typeBuilder::addEnclosingTransferObject);
-
- for (GeneratedTOBuilder builder : types) {
- if (builder.isUnion()) {
- final GeneratedTransferObject type = builder.build();
- createUnionBuilder(builder, typeBuilder, type, parentModule);
- }
+ for (final GeneratedTOBuilder genTOBuilder : types) {
+ resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
}
- return createReturnTypeForUnion(resultTOBuilder, typeDef, typeBuilder, parentModule);
+ final GeneratedPropertyBuilder genPropBuilder = resultTOBuilder.addProperty("value");
+ genPropBuilder.setReturnType(Types.CHAR_ARRAY);
+ resultTOBuilder.addEqualsIdentity(genPropBuilder);
+ resultTOBuilder.addHashIdentity(genPropBuilder);
+ resultTOBuilder.addToStringProperty(genPropBuilder);
+ processEnclosedTOBuilderes(typeBuilder, genTOBuilders);
+ return resultTOBuilder;
}
/**
}
+ private static GeneratedTOBuilder processEnclosedTOBuilderes(final GeneratedTypeBuilder typeBuilder,
+ final List<GeneratedTOBuilder> genTOBuilders) {
+ for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) {
+ typeBuilder.addEnclosingTransferObject(genTOBuilder);
+ }
+ return genTOBuilders.get(0);
+ }
+
/**
* Adds the implemented types to type builder.
*
private GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition<?> typedef,
final Type javaType, final String moduleName) {
Preconditions.checkNotNull(javaType, "javaType cannot be null");
+ final String propertyName = "value";
final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName);
genTOBuilder.setRestrictions(BindingGeneratorUtil.getRestrictions(typedef));
- final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty("value");
+ final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty(propertyName);
genPropBuilder.setReturnType(javaType);
genTOBuilder.addEqualsIdentity(genPropBuilder);
genTOBuilder.addHashIdentity(genPropBuilder);
final GeneratedTOBuilder resultTOBuilder = builders.remove(0);
builders.forEach(resultTOBuilder::addEnclosingTransferObject);
+
+ resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY);
return resultTOBuilder;
}
final Module module = findParentModule(schemaContext, parentNode);
final GeneratedTOBuilder unionGenTOBuilder = newGeneratedTOBuilder(typeName);
- unionGenTOBuilder.setIsUnion(true);
- final GeneratedPropertyBuilder genPropBuilder = unionGenTOBuilder.addProperty("value");
- genPropBuilder.setReturnType(Types.CHAR_ARRAY);
- unionGenTOBuilder.addEqualsIdentity(genPropBuilder);
- unionGenTOBuilder.addHashIdentity(genPropBuilder);
- unionGenTOBuilder.addToStringProperty(genPropBuilder);
unionGenTOBuilder.setSchemaPath(typedef.getPath());
unionGenTOBuilder.setModuleName(module.getName());
addCodegenInformation(unionGenTOBuilder, typedef);
+
generatedTOBuilders.add(unionGenTOBuilder);
+ unionGenTOBuilder.setIsUnion(true);
// Pattern string is the key, XSD regex is the value. The reason for this choice is that the pattern carries
// also negation information and hence guarantees uniqueness.
final GeneratedPropertyBuilder propertyBuilder;
propertyBuilder = parentUnionGenTOBuilder.addProperty(BindingMapping.getPropertyName(
newTOBuilderName.simpleName()));
- propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0).build());
+ propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0));
parentUnionGenTOBuilder.addEqualsIdentity(propertyBuilder);
parentUnionGenTOBuilder.addToStringProperty(propertyBuilder);
"org.opendaylight.yang.gen.v1.urn.bit.union.in.leaf.rev130626.ParentContainer",
lf1Leaf.getIdentifier().immediatelyEnclosingClass().get().toString());
- assertEquals("Lf generated TO has incorrect number of properties", 5, lf1Leaf.getProperties().size());
+ assertEquals("Lf generated TO has incorrect number of properties", 4, lf1Leaf.getProperties().size());
containsAttributes(lf1Leaf, true, true, true, new NameTypePattern("uint32", "Long"));
containsAttributes(lf1Leaf, true, true, true, new NameTypePattern("int8", "Byte"));
containsAttributes(lf1Leaf, true, true, true, new NameTypePattern("string", "String"));
containsAttributes(lf1Leaf, true, false, true, new NameTypePattern("lf2", "Lf2"));
- containsAttributes(lf1Leaf, true, false, true, new NameTypePattern("value", "char[]"));
// nested types in leaf, contains Lf2?
assertNotNull("Lf2 TO wasn't found.", lf2Leaf);
"org.opendaylight.yang.gen.v1.urn.bit.union.in.leaf.rev130626.ParentContainer",
lf2Leaf.getIdentifier().immediatelyEnclosingClass().get().toString());
- assertEquals("Lf generated TO has incorrect number of properties", 3, lf2Leaf.getProperties().size());
+ assertEquals("Lf generated TO has incorrect number of properties", 2, lf2Leaf.getProperties().size());
containsAttributes(lf2Leaf, true, true, true, new NameTypePattern("string", "String"));
containsAttributes(lf2Leaf, true, true, true, new NameTypePattern("uint64", "BigInteger"));
- containsAttributes(lf2Leaf, true, true, true, new NameTypePattern("value", "char[]"));
}
@Test
assertEquals("TypeUnion1 has incorrect package name.",
"org.opendaylight.yang.gen.v1.urn.bit.union.in.leaf.rev130626", typeUnion1.getPackageName());
- assertEquals("TypeUnion1 generated TO has incorrect number of properties", 5, typeUnion1.getProperties().size());
+ assertEquals("TypeUnion1 generated TO has incorrect number of properties", 4, typeUnion1.getProperties().size());
containsAttributes(typeUnion1, true, true, true, new NameTypePattern("uint32", "Long"));
containsAttributes(typeUnion1, true, true, true, new NameTypePattern("int8", "Byte"));
containsAttributes(typeUnion1, true, true, true, new NameTypePattern("string", "String"));
containsAttributes(typeUnion1, true, false, true, new NameTypePattern("typeUnion2", "TypeUnion2"));
- containsAttributes(typeUnion1, true, false, true, new NameTypePattern("value", "char[]"));
assertNotNull("TypeUnion2 TO wasn't found.", typeUnion2);
assertEquals("TypeUnion2 TO has incorrect number of occurences.", 1, typeUnion2Counter);
assertEquals("TypeUnion2 has incorrect package name.",
"org.opendaylight.yang.gen.v1.urn.bit.union.in.leaf.rev130626", typeUnion2.getPackageName());
- assertEquals("TypeUnion2 generated TO has incorrect number of properties", 3, typeUnion2.getProperties().size());
+ assertEquals("TypeUnion2 generated TO has incorrect number of properties", 2, typeUnion2.getProperties().size());
containsAttributes(typeUnion2, true, true, true, new NameTypePattern("string", "String"));
containsAttributes(typeUnion2, true, true, true, new NameTypePattern("uint64", "BigInteger"));
- containsAttributes(typeUnion2, true, true, true, new NameTypePattern("value", "char[]"));
+
}
@Test
assertTrue(mplsLabelType instanceof GeneratedTransferObject);
final GeneratedTransferObject gto = (GeneratedTransferObject) mplsLabelType;
final Iterator<GeneratedProperty> it = gto.getEqualsIdentifiers().iterator();
- final GeneratedProperty value = it.next();
final GeneratedProperty special = it.next();
final GeneratedProperty general = it.next();
assertFalse(it.hasNext());
assertEquals("mplsLabelSpecialPurpose", special.getName());
assertEquals("Type (java.lang.Class)", special.getReturnType().toString());
-
- assertEquals("value", value.getName());
- assertEquals("Type (char[])", value.getReturnType().toString());
}
}
+++ /dev/null
-/*
- * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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.mdsal.binding.generator.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.Iterables;
-import java.util.List;
-import org.junit.Test;
-import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
-import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.mdsal.binding.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.model.api.MethodSignature;
-import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-
-public class Mdsal320Test {
-
- @Test
- public void mdsal320Test() {
- final SchemaContext context = YangParserTestUtils.parseYangResource("/mdsal320.yang");
-
- final List<Type> generateTypes = new BindingGeneratorImpl().generateTypes(context);
- assertNotNull(generateTypes);
- assertEquals(4, generateTypes.size());
-
- final Type fooType = generateTypes.stream().filter(type -> type.getFullyQualifiedName()
- .equals("org.opendaylight.yang.gen.v1.urn.odl.yt320.norev.Foo")).findFirst().get();
- assertTrue(fooType instanceof GeneratedType);
- final GeneratedType foo = (GeneratedType) fooType;
-
- GeneratedTransferObject bar = null;
- GeneratedTransferObject bar1 = null;
- for (GeneratedType enc : foo.getEnclosedTypes()) {
- switch (enc.getName()) {
- case "Bar":
- assertTrue(enc instanceof GeneratedTransferObject);
- bar = (GeneratedTransferObject) enc;
- break;
- case "Bar1":
- assertTrue(enc instanceof GeneratedTransferObject);
- bar1 = (GeneratedTransferObject) enc;
- break;
- default:
- throw new IllegalStateException("Unexpected type " + enc);
- }
- }
- assertNotNull(bar);
- assertTrue(bar.isUnionType());
- assertNotNull(bar1);
- assertTrue(bar1.isUnionType());
-
- final MethodSignature getBar = Iterables.getOnlyElement(foo.getMethodDefinitions());
- final Type getBarType = getBar.getReturnType();
- assertTrue(getBarType instanceof GeneratedTransferObject);
- final GeneratedTransferObject getBarTO = (GeneratedTransferObject) getBarType;
- assertTrue(getBarTO.isUnionType());
- assertEquals(bar, getBarTO);
-
- final GeneratedProperty bar1Prop = bar.getProperties().stream().filter(prop -> "bar1".equals(prop.getName()))
- .findFirst().get();
- final Type bar1PropRet = bar1Prop.getReturnType();
- assertEquals(bar1, bar1PropRet);
- }
-}
+++ /dev/null
-module yt320 {
- namespace "urn:odl:yt320";
- prefix yt320;
-
- container foo {
- leaf bar {
- type union {
- type enumeration {
- enum "foo";
- }
- type string {
- length 2;
- }
- type union {
- type enumeration {
- enum bar;
- }
- type string {
- length 1;
- }
- }
- }
- }
- }
-}
-
import java.util.List;
import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
this.isUnionType = isUnion;
}
- @Override
- public final boolean isUnion() {
- return isUnionType;
- }
-
@Override
public final void setIsUnionBuilder(final boolean isUnionTypeBuilder) {
this.isUnionTypeBuilder = isUnionTypeBuilder;
import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.Restrictions;
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
private final String moduleName;
private final SchemaPath schemaPath;
- GTO(final CodegenGeneratedTOBuilder builder) {
+ public GTO(final CodegenGeneratedTOBuilder builder) {
super(builder);
this.restrictions = builder.restrictions;
this.reference = builder.reference;
CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
}
-
- @Test
- public void twoNestedUnionsTest() throws Exception {
- final File sourcesOutputDir = CompilationTestUtils.generatorOutput("mdsal320");
- final File compiledOutputDir = CompilationTestUtils.compilerOutput("mdsal320");
- generateTestSources("/compilation/mdsal320", sourcesOutputDir);
- CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
- CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir);
- }
-
private void generateTestSources(final String resourceDirPath, final File sourcesOutputDir)
throws IOException, URISyntaxException {
final List<File> sourceFiles = CompilationTestUtils.getSourceFiles(resourceDirPath);
+++ /dev/null
-module yt320 {
- namespace "urn:odl:yt320";
- prefix yt320;
-
- container foo {
- leaf bar {
- type union {
- type enumeration {
- enum "foo";
- }
- type string {
- length 2;
- }
- type union {
- type enumeration {
- enum bar;
- }
- type string {
- length 1;
- }
- }
- }
- }
- }
-}
-