}
typeProvider.putReferencedType(leaf.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
- 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);
- }
+ 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);
} 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 GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder((UnionTypeDefinition)typeDef, typeBuilder,
- node, parentModule);
- if (genTOBuilder != null) {
- returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule);
- }
+ 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);
return true;
}
- private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final TypeDefinition<?> typeDef,
+ private Type createReturnTypeForUnion(final GeneratedTOBuilder genTOBuilder, final UnionTypeDefinition typeDef,
final GeneratedTypeBuilder typeBuilder, final Module parentModule) {
- final GeneratedTOBuilder returnType = typeProvider.newGeneratedTOBuilder(genTOBuilder.getIdentifier());
-
- addCodegenInformation(returnType, parentModule, typeDef);
- returnType.setSchemaPath(typeDef.getPath());
- returnType.setModuleName(parentModule.getName());
+ 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();
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);
-
+ private void createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder,
+ final GeneratedTransferObject returnType, final Module parentModule) {
+ // Append enclosing path hierarchy without dots
+ final StringBuilder sb = new StringBuilder();
+ genTOBuilder.getIdentifier().localNameComponents().forEach(sb::append);
+ final GeneratedTOBuilder unionBuilder = typeProvider.newGeneratedTOBuilder(
+ JavaTypeName.create(typeBuilder.getPackageName(), sb.append("Builder").toString()));
+ unionBuilder.setIsUnionBuilder(true);
final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance");
method.setReturnType(returnType);
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(unionBuilder.build()));
+ typeProvider.getAdditionalTypes().put(parentModule, Sets.newHashSet(unionBuilderType));
} else {
- types.add(unionBuilder.build());
+ types.add(unionBuilderType);
}
- return returnType.build();
- }
-
- private GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder,
- final GeneratedTypeBuilder typeBuilder) {
- // Append enclosing path hierarchy without dots
- final StringBuilder sb = new StringBuilder();
- genTOBuilder.getIdentifier().localNameComponents().forEach(sb::append);
- final GeneratedTOBuilder unionBuilder = typeProvider.newGeneratedTOBuilder(
- JavaTypeName.create(typeBuilder.getPackageName(), sb.append("Builder").toString()));
- unionBuilder.setIsUnionBuilder(true);
- return unionBuilder;
}
private GeneratedTypeBuilder addDefaultInterfaceDefinition(final ModuleContext context,
return addDefaultInterfaceDefinition(packageName, schemaNode, baseInterface, context);
}
-
/**
* Instantiates generated type builder with <code>packageName</code> and
* <code>schemaNode</code>.
* parent module
* @return generated TO builder for <code>typeDef</code>
*/
- private GeneratedTOBuilder addTOToTypeBuilder(final UnionTypeDefinition typeDef,
+ private Type 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);
- for (final GeneratedTOBuilder genTOBuilder : types) {
- resultTOBuilder.addEnclosingTransferObject(genTOBuilder);
+ 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);
+ }
}
- processEnclosedTOBuilderes(typeBuilder, genTOBuilders);
- return resultTOBuilder;
+ return createReturnTypeForUnion(resultTOBuilder, typeDef, typeBuilder, parentModule);
}
/**
}
- 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.
*