import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.binding.model.api.Constant;
+import org.opendaylight.mdsal.binding.model.api.Enumeration;
+import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.model.api.Type;
import org.opendaylight.mdsal.binding.model.api.TypeComment;
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
public interface GeneratedTypeBuilderBase<T extends GeneratedTypeBuilderBase<T>> extends Type, AnnotableTypeBuilder {
- /**
- * Adds new Enclosing Transfer Object into definition of Generated Type and returns <code>new</code> Instance
- * of Generated TO Builder.<br>
- * There is no need of specifying of Package Name because enclosing Type is already defined inside Generated Type
- * with specific package name.<br>
- * The name of enclosing Type cannot be same as Name of parent type and if there is already defined enclosing type
- * with the same name, the new enclosing type will simply overwrite the older definition.<br>
- * If the name of enclosing type is <code>null</code> the method SHOULD throw {@link IllegalArgumentException}.
- *
- * @param name Name of Enclosing Type
- * @return <code>new</code> Instance of Generated Type Builder.
- */
- GeneratedTOBuilder addEnclosingTransferObject(String name);
-
/**
* Adds new Enclosing Transfer Object <code>genTOBuilder</code> into definition of Generated Type.
*
* If the parameter <code>genTOBuilder</code> of enclosing type is <code>null</code> the method SHOULD throw
* {@link IllegalArgumentException}.
*
- * @param genTOBuilder Name of Enclosing Type
+ * @param genTO Name of Enclosing Type
*/
- T addEnclosingTransferObject(GeneratedTOBuilder genTOBuilder);
+ T addEnclosingTransferObject(GeneratedTransferObject genTO);
/**
* Adds String definition of comment into Method Signature definition.<br>
* Name of Enumeration cannot be <code>null</code>, if it is <code>null</code> the method SHOULD throw
* {@link IllegalArgumentException}.
*
- * @param name Enumeration Name
- * @return <code>new</code> instance of Enumeration Builder.
+ * @param enumeration Enumeration to add
*/
- EnumBuilder addEnumeration(String name);
+ void addEnumeration(Enumeration enumeration);
List<MethodSignatureBuilder> getMethodDefinitions();
*/
private Enumeration resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName,
final GeneratedTypeBuilder typeBuilder, final ModuleContext context) {
- final EnumBuilder enumBuilder = typeBuilder.addEnumeration(BindingMapping.getClassName(enumName));
+ final EnumBuilder enumBuilder = typeProvider.newEnumerationBuilder(typeBuilder.getIdentifier()
+ .createEnclosed(BindingMapping.getClassName(enumName), "$"));
typeProvider.addEnumDescription(enumBuilder, enumTypeDef);
enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
final Enumeration ret = enumBuilder.toInstance();
+ typeBuilder.addEnumeration(ret);
+
context.addTypeToSchema(ret, enumTypeDef);
context.addInnerTypedefType(enumTypeDef.getPath(), ret);
return ret;
// 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);
- if (genTOBuilder != null) {
- returnType = genTOBuilder.build();
- }
+ returnType = addTOToTypeBuilder((BitsTypeDefinition) typeDef, typeBuilder, leaf, parentModule);
} else {
// It is constrained version of already declared type (inner declared type exists, only for special
// cases (Enum, Union, Bits), which were already checked.
final UnionTypeDefinition unionDef = (UnionTypeDefinition) typeDef;
returnType = addTOToTypeBuilder(unionDef, typeBuilder, node, parentModule);
} else if (typeDef instanceof BitsTypeDefinition) {
- final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((BitsTypeDefinition) typeDef, typeBuilder,
- node, parentModule);
- returnType = genTOBuilder.build();
+ returnType = addTOToTypeBuilder((BitsTypeDefinition) typeDef, typeBuilder, node, parentModule);
} else {
final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, inGrouping);
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);
+ genTOBuilders.forEach(builder -> typeBuilder.addEnclosingTransferObject(builder.build()));
for (GeneratedTOBuilder builder : types) {
+ final GeneratedTransferObject type = builder.build();
+ resultTOBuilder.addEnclosingTransferObject(type);
if (builder.isUnion()) {
- final GeneratedTransferObject type = builder.build();
createUnionBuilder(builder, typeBuilder, type, parentModule);
}
}
* @param parentModule parent module
* @return generated TO builder for <code>typeDef</code>
*/
- private GeneratedTOBuilder addTOToTypeBuilder(final BitsTypeDefinition typeDef,
+ private GeneratedTransferObject addTOToTypeBuilder(final BitsTypeDefinition typeDef,
final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule) {
- final GeneratedTOBuilder genTOBuilder = typeProvider.provideGeneratedTOBuilderForBitsTypeDefinition(
- allocateNestedType(typeBuilder.getIdentifier(), leaf.getQName()), typeDef, parentModule.getName());
- typeBuilder.addEnclosingTransferObject(genTOBuilder);
- return genTOBuilder;
+ final GeneratedTransferObject genTO = typeProvider.provideGeneratedTOBuilderForBitsTypeDefinition(
+ allocateNestedType(typeBuilder.getIdentifier(), leaf.getQName()), typeDef, parentModule.getName())
+ .build();
+ typeBuilder.addEnclosingTransferObject(genTO);
+ return genTO;
}
/**
"Local Name in EnumTypeDefinition QName cannot be NULL!");
Preconditions.checkArgument(typeBuilder != null, "Generated Type Builder reference cannot be NULL!");
- final EnumBuilder enumBuilder = typeBuilder.addEnumeration(BindingMapping.getClassName(enumName));
-
+ final EnumBuilder enumBuilder = newEnumerationBuilder(
+ typeBuilder.getIdentifier().createEnclosed(BindingMapping.getClassName(enumName), "$"));
addEnumDescription(enumBuilder, enumTypeDef);
enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
- return enumBuilder.toInstance();
+ final Enumeration ret = enumBuilder.toInstance();
+ typeBuilder.addEnumeration(ret);
+
+ return ret;
}
public abstract void addEnumDescription(EnumBuilder enumBuilder, EnumTypeDefinition enumTypeDef);
Preconditions.checkState(!builders.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typedef);
final GeneratedTOBuilder resultTOBuilder = builders.remove(0);
- builders.forEach(resultTOBuilder::addEnclosingTransferObject);
+ builders.forEach(builder -> resultTOBuilder.addEnclosingTransferObject(builder.build()));
return resultTOBuilder;
}
this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
this.constants = makeUnmodifiable(builder.getConstants());
- this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations());
+ this.enumerations = List.copyOf(builder.getEnumerations());
this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
- this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(),
- builder.getEnclosedTransferObjects());
+ this.enclosedTypes = List.copyOf(builder.getEnclosedTransferObjects());
this.properties = toUnmodifiableProperties(builder.getProperties());
this.isAbstract = builder.isAbstract();
this.definition = builder.getYangSourceDefinition().orElse(null);
import org.opendaylight.mdsal.binding.model.api.AbstractBaseType;
import org.opendaylight.mdsal.binding.model.api.AccessModifier;
import org.opendaylight.mdsal.binding.model.api.Constant;
+import org.opendaylight.mdsal.binding.model.api.Enumeration;
+import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.Type;
import org.opendaylight.mdsal.binding.model.api.TypeComment;
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
-import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
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.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
import org.opendaylight.yangtools.util.LazyCollections;
private List<AnnotationTypeBuilder> annotationBuilders = Collections.emptyList();
private List<Type> implementsTypes = Collections.emptyList();
- private List<EnumBuilder> enumDefinitions = Collections.emptyList();
+ private List<Enumeration> enumDefinitions = Collections.emptyList();
private List<Constant> constants = Collections.emptyList();
private List<MethodSignatureBuilder> methodDefinitions = Collections.emptyList();
- private final List<GeneratedTypeBuilder> enclosedTypes = Collections.emptyList();
- private List<GeneratedTOBuilder> enclosedTransferObjects = Collections.emptyList();
+ private List<GeneratedTransferObject> enclosedTransferObjects = Collections.emptyList();
private List<GeneratedPropertyBuilder> properties = Collections.emptyList();
private TypeComment comment;
private boolean isAbstract;
return this.implementsTypes;
}
- protected List<EnumBuilder> getEnumerations() {
+ protected List<Enumeration> getEnumerations() {
return this.enumDefinitions;
}
return this.methodDefinitions;
}
- protected List<GeneratedTypeBuilder> getEnclosedTypes() {
- return this.enclosedTypes;
- }
-
- protected List<GeneratedTOBuilder> getEnclosedTransferObjects() {
+ protected List<GeneratedTransferObject> getEnclosedTransferObjects() {
return this.enclosedTransferObjects;
}
abstract AbstractEnumerationBuilder newEnumerationBuilder(JavaTypeName identifier);
@Override
- public GeneratedTOBuilder addEnclosingTransferObject(final String name) {
- checkArgument(name != null, "Name for Enclosing Generated Transfer Object cannot be null!");
- final GeneratedTOBuilder builder = new CodegenGeneratedTOBuilder(getIdentifier().createEnclosed(name));
-
- checkArgument(!enclosedTransferObjects.contains(builder),
+ public T addEnclosingTransferObject(final GeneratedTransferObject genTO) {
+ checkArgument(genTO != null, "Parameter genTO cannot be null!");
+ checkArgument(!enclosedTransferObjects.contains(genTO),
"This generated type already contains equal enclosing transfer object.");
- this.enclosedTransferObjects = LazyCollections.lazyAdd(this.enclosedTransferObjects, builder);
- return builder;
- }
-
- @Override
- public T addEnclosingTransferObject(final GeneratedTOBuilder genTOBuilder) {
- checkArgument(genTOBuilder != null, "Parameter genTOBuilder cannot be null!");
- checkArgument(!enclosedTransferObjects.contains(genTOBuilder),
- "This generated type already contains equal enclosing transfer object.");
- this.enclosedTransferObjects = LazyCollections.lazyAdd(this.enclosedTransferObjects, genTOBuilder);
+ this.enclosedTransferObjects = LazyCollections.lazyAdd(this.enclosedTransferObjects, genTO);
return thisInstance();
}
}
@Override
- public EnumBuilder addEnumeration(final String name) {
- checkArgument(name != null, "Name of enumeration cannot be null!");
+ public void addEnumeration(final Enumeration enumeration) {
+ checkArgument(enumeration != null, "Enumeration cannot be null!");
// This enumeration may be generated from a leaf, which may end up colliding with its enclosing type
// hierarchy. If that is the case, we use a single '$' suffix to disambiguate -- that cannot come from the user
// and hence is marking our namespace
- final EnumBuilder builder = newEnumerationBuilder(getIdentifier().createEnclosed(name, "$"));
- checkArgument(!enumDefinitions.contains(builder),
- "Generated type %s already contains an enumeration for %s", this, builder);
- this.enumDefinitions = LazyCollections.lazyAdd(this.enumDefinitions, builder);
- return builder;
+ checkArgument(!enumDefinitions.contains(enumeration),
+ "Generated type %s already contains an enumeration for %s", this, enumeration);
+ this.enumDefinitions = LazyCollections.lazyAdd(this.enumDefinitions, enumeration);
}
@Override
builder.append(getAnnotations());
builder.append(", implements=");
builder.append(getImplementsTypes());
- builder.append(", enclosedTypes=");
- builder.append(getEnclosedTypes());
builder.append(", constants=");
builder.append(getConstants());
builder.append(", enumerations=");
builder.append(getAnnotations());
builder.append(", implements=");
builder.append(getImplementsTypes());
- builder.append(", enclosedTypes=");
- builder.append(getEnclosedTypes());
builder.append(", constants=");
builder.append(getConstants());
builder.append(", enumerations=");
import org.opendaylight.mdsal.binding.model.api.Restrictions;
import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
+import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTOBuilder;
import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
import org.opendaylight.yangtools.yang.common.QName;
JavaTypeName.create("org.opendaylight.yangtools.test", "TestType"));
genTypeBuilder.addMethod("testMethod");
genTypeBuilder.addAnnotation("org.opendaylight.yangtools.test.annotation", "AnnotationTest");
- genTypeBuilder.addEnclosingTransferObject("testObject");
+ genTypeBuilder.addEnclosingTransferObject(new CodegenGeneratedTOBuilder(genTypeBuilder.getIdentifier()
+ .createEnclosed("testObject")).build());
genTypeBuilder.addProperty("newProp");
GeneratedTypeBuilder genType = new CodegenGeneratedTypeBuilder(
JavaTypeName.create("org.opendaylight.yangtools.test", "Type2"));
JavaTypeName.create("my.package", "MyName"));
generatedTypeBuilder.addEnclosingTransferObject(new CodegenGeneratedTOBuilder(
- JavaTypeName.create("my.package", "myName")));
+ JavaTypeName.create("my.package", "myName")).build());
generatedTypeBuilder.addEnclosingTransferObject(new CodegenGeneratedTOBuilder(
- JavaTypeName.create("my.package", "myName")));
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void addEnclosingTransferObjectArgumentTest2() {
- CodegenGeneratedTypeBuilder generatedTypeBuilder = new CodegenGeneratedTypeBuilder(
- JavaTypeName.create("my.package", "MyName"));
-
- generatedTypeBuilder.addEnclosingTransferObject("myName");
- generatedTypeBuilder.addEnclosingTransferObject("myName");
+ JavaTypeName.create("my.package", "myName")).build());
}
@Test(expected = IllegalArgumentException.class)
generatedTypeBuilder.addAnnotation("my.package", "myName");
generatedTypeBuilder.addAnnotation("my.package", "myName");
}
-
- @Test(expected = IllegalArgumentException.class)
- public void addEnumerationIllegalArgumentTest() {
- CodegenGeneratedTypeBuilder generatedTypeBuilder = new CodegenGeneratedTypeBuilder(
- JavaTypeName.create("my.package", "MyName"));
-
- generatedTypeBuilder.addEnumeration("myName");
- generatedTypeBuilder.addEnumeration("myName");
- }
}
import org.opendaylight.mdsal.binding.model.api.Constant;
import org.opendaylight.mdsal.binding.model.api.Enumeration;
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.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.MethodSignature;
GeneratedTypeBuilder generatedTypeBuilder = new CodegenGeneratedTypeBuilder(
JavaTypeName.create("my.package", "MyName"));
- EnumBuilder enumBuilder = generatedTypeBuilder.addEnumeration("myEnumName");
- EnumBuilder enumBuilder2 = generatedTypeBuilder.addEnumeration("myEnumName2");
+ EnumBuilder enumBuilder = new CodegenEnumerationBuilder(generatedTypeBuilder.getIdentifier()
+ .createEnclosed("myEnumName"));
+ EnumBuilder enumBuilder2 = new CodegenEnumerationBuilder(generatedTypeBuilder.getIdentifier()
+ .createEnclosed("myEnumName2"));
- assertNotNull(enumBuilder);
- assertNotNull(enumBuilder2);
+ generatedTypeBuilder.addEnumeration(enumBuilder.toInstance());
+ generatedTypeBuilder.addEnumeration(enumBuilder2.toInstance());
GeneratedType instance = generatedTypeBuilder.build();
List<Enumeration> enumerations = instance.getEnumerations();
assertFalse(implementTypes.contains(Types.typeForClass(Throwable.class)));
}
- @Test(expected = IllegalArgumentException.class)
- public void addEnclosingTransferObjectIllegalArgumentTest() {
- new CodegenGeneratedTypeBuilder(JavaTypeName.create("my.package", "MyName")).addEnclosingTransferObject(
- (String) null);
- }
-
@Test(expected = IllegalArgumentException.class)
public void addEnclosingTransferObjectIllegalArgumentTest2() {
new CodegenGeneratedTypeBuilder(JavaTypeName.create("my.package", "MyName")).addEnclosingTransferObject(
- (GeneratedTOBuilder) null);
+ (GeneratedTransferObject) null);
}
@Test
GeneratedTypeBuilder generatedTypeBuilder = new CodegenGeneratedTypeBuilder(
JavaTypeName.create("my.package", "MyName"));
- GeneratedTOBuilder enclosingTransferObject = generatedTypeBuilder.addEnclosingTransferObject("myTOName");
- GeneratedTOBuilder enclosingTransferObject2 = generatedTypeBuilder.addEnclosingTransferObject("myTOName2");
- assertEquals(generatedTypeBuilder, generatedTypeBuilder.addEnclosingTransferObject(
- new CodegenGeneratedTOBuilder(generatedTypeBuilder.getIdentifier().createEnclosed("myTOName3"))));
-
- assertNotNull(enclosingTransferObject);
- assertNotNull(enclosingTransferObject2);
+ GeneratedTOBuilder enclosingTransferObject = new CodegenGeneratedTOBuilder(generatedTypeBuilder.getIdentifier()
+ .createEnclosed("myTOName"));
+ GeneratedTOBuilder enclosingTransferObject2 = new CodegenGeneratedTOBuilder(generatedTypeBuilder.getIdentifier()
+ .createEnclosed("myTOName2"));
+ GeneratedTOBuilder enclosingTransferObject3 = new CodegenGeneratedTOBuilder(generatedTypeBuilder.getIdentifier()
+ .createEnclosed("myTOName3"));
+ generatedTypeBuilder.addEnclosingTransferObject(enclosingTransferObject.build());
+ generatedTypeBuilder.addEnclosingTransferObject(enclosingTransferObject2.build());
+ generatedTypeBuilder.addEnclosingTransferObject(enclosingTransferObject3.build());
GeneratedType instance = generatedTypeBuilder.build();
List<GeneratedType> enclosedTypes = instance.getEnclosedTypes();
assertTrue(enclosedTypes.contains(enclosingTransferObject.build()));
assertTrue(enclosedTypes.contains(enclosingTransferObject2.build()));
- assertTrue(enclosedTypes.contains(new CodegenGeneratedTOBuilder(
- generatedTypeBuilder.getIdentifier().createEnclosed("myTOName3")).build()));
+ assertTrue(enclosedTypes.contains(enclosingTransferObject3.build()));
assertFalse(enclosedTypes.contains(new CodegenGeneratedTOBuilder(
generatedTypeBuilder.getIdentifier().createEnclosed("myTOName4")).build()));
}
assertEquals(
"GeneratedTransferObject [packageName=my.package, name=MyName, comment=My comment.., annotations=[], "
- + "implements=[], enclosedTypes=[], constants=[], enumerations=[], properties=, methods=[]]",
+ + "implements=[], constants=[], enumerations=[], properties=, methods=[]]",
generatedTypeBuilder.toString());
GeneratedType instance = generatedTypeBuilder.build();
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
import org.opendaylight.mdsal.binding.model.api.MethodSignature;
import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTOBuilder;
import org.opendaylight.mdsal.binding.model.util.generated.type.builder.CodegenGeneratedTypeBuilder;
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
import org.opendaylight.yangtools.yang.binding.Augmentable;
@VisibleForTesting
static BuilderTemplate templateForType(final GeneratedType type) {
final JavaTypeName origName = type.getIdentifier();
+ final JavaTypeName builderName = origName.createSibling(origName.simpleName() + BuilderTemplate.BUILDER_STR);
- final GeneratedTypeBuilder builderTypeBuilder = new CodegenGeneratedTypeBuilder(
- origName.createSibling(origName.simpleName() + BuilderTemplate.BUILDER_STR));
-
- final GeneratedTOBuilder implTypeBuilder = builderTypeBuilder.addEnclosingTransferObject(
- origName.simpleName() + "Impl");
- implTypeBuilder.addImplementsType(type);
-
- return new BuilderTemplate(builderTypeBuilder.build(), type, getKey(type));
+ return new BuilderTemplate(new CodegenGeneratedTypeBuilder(builderName)
+ .addEnclosingTransferObject(new CodegenGeneratedTOBuilder(
+ builderName.createEnclosed(origName.simpleName() + "Impl"))
+ .addImplementsType(type)
+ .build())
+ .build(), type, getKey(type));
}
private static Type getKey(final GeneratedType type) {