X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-java-api-generator%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjava%2Fapi%2Fgenerator%2FBuilderTemplate.xtend;h=d920c519085644d984989c4c4ec6e30cef926bc9;hb=refs%2Fchanges%2F44%2F100844%2F1;hp=0b361e000a6f09c82ec80bca8b5d631b7be94ef6;hpb=3f1606d1ee1892cc08b1421b52f759fa7743e901;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend index 0b361e000a..d920c51908 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend @@ -8,10 +8,10 @@ package org.opendaylight.mdsal.binding.java.api.generator import static extension org.apache.commons.text.StringEscapeUtils.escapeJava -import static org.opendaylight.mdsal.binding.model.util.BindingTypes.DATA_OBJECT +import static org.opendaylight.mdsal.binding.model.ri.BindingTypes.DATA_OBJECT import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTABLE_AUGMENTATION_NAME import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTATION_FIELD -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME +import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableSet @@ -30,22 +30,14 @@ import org.opendaylight.mdsal.binding.model.api.JavaTypeName import org.opendaylight.mdsal.binding.model.api.MethodSignature; import org.opendaylight.mdsal.binding.model.api.ParameterizedType import org.opendaylight.mdsal.binding.model.api.Type -import org.opendaylight.mdsal.binding.model.util.TypeConstants -import org.opendaylight.mdsal.binding.model.util.Types +import org.opendaylight.mdsal.binding.model.ri.TypeConstants +import org.opendaylight.mdsal.binding.model.ri.Types import org.opendaylight.mdsal.binding.spec.naming.BindingMapping -import org.opendaylight.yangtools.concepts.Builder /** * Template for generating JAVA builder classes. */ class BuilderTemplate extends AbstractBuilderTemplate { - /** - * Constant used as suffix for builder name. - */ - package static val BUILDER_STR = "Builder"; - - static val BUILDER = JavaTypeName.create(Builder) - val BuilderImplTemplate implTemplate /** @@ -71,18 +63,33 @@ class BuilderTemplate extends AbstractBuilderTemplate { «wrapToDocumentation(formatDataForJavaDoc(targetType))» «targetType.annotations.generateDeprecatedAnnotation» «generatedAnnotation» - public class «type.name» implements «BUILDER.importedName»<«targetType.importedName»> { + public class «type.name» { «generateFields(false)» «constantsDeclarations()» «IF augmentType !== null» - «generateAugmentField()» + «val augmentTypeRef = augmentType.importedName» + «val mapTypeRef = JU_MAP.importedName» + «mapTypeRef»<«CLASS.importedName» extends «augmentTypeRef»>, «augmentTypeRef»> «AUGMENTATION_FIELD» = «mapTypeRef».of(); «ENDIF» + /** + * Construct an empty builder. + */ + public «type.name»() { + // No-op + } + «generateConstructorsFromIfcs()» + «val targetTypeName = targetType.importedName» + /** + * Construct a builder initialized with state from specified {@link «targetTypeName»}. + * + * @param base «targetTypeName» from which the builder should be initialized + */ public «generateCopyConstructor(targetType, type.enclosedTypes.get(0))» «generateMethodFieldsFrom()» @@ -95,8 +102,12 @@ class BuilderTemplate extends AbstractBuilderTemplate { «generateSetters» - @«OVERRIDE.importedName» - public «targetType.name» build() { + /** + * A new {@link «targetTypeName»} instance. + * + * @return A new {@link «targetTypeName»} instance. + */ + public «targetTypeName» build() { return new «type.enclosedTypes.get(0).importedName»(this); } @@ -116,9 +127,6 @@ class BuilderTemplate extends AbstractBuilderTemplate { * Generate default constructor and constructor for every implemented interface from uses statements. */ def private generateConstructorsFromIfcs() ''' - public «type.name»() { - } - «IF (!(targetType instanceof GeneratedTransferObject))» «FOR impl : targetType.implements SEPARATOR "\n"» «generateConstructorFromIfc(impl)» @@ -132,9 +140,16 @@ class BuilderTemplate extends AbstractBuilderTemplate { def private Object generateConstructorFromIfc(Type impl) ''' «IF (impl instanceof GeneratedType)» «IF impl.hasNonDefaultMethods» - public «type.name»(«impl.fullyQualifiedName» arg) { + «val typeName = impl.importedName» + /** + * Construct a new builder initialized from specified {@link «typeName»}. + * + * @param arg «typeName» from which the builder should be initialized + */ + public «type.name»(«typeName» arg) { «printConstructorPropertySetter(impl)» } + «ENDIF» «FOR implTypeImplement : impl.implements» «generateConstructorFromIfc(implTypeImplement)» @@ -206,7 +221,7 @@ class BuilderTemplate extends AbstractBuilderTemplate { * Set fields from given grouping argument. Valid argument is instance of one of following types: *
- «target» createTarget(int fooXyzzy, int barBaz) {
+ «target» create«target»(int fooXyzzy, int barBaz) {
return new «target»Builder()
.setFoo(new FooBuilder().setXyzzy(fooXyzzy).build())
.setBar(new BarBuilder().setBaz(barBaz).build())
@@ -489,14 +493,13 @@ class BuilderTemplate extends AbstractBuilderTemplate {
invocation, which is terminated by {@link #build()}, which is then returned from the method
better understanding by humans, as the scope of mutable state (the builder) is kept to a minimum and is
very localized
- better optimization oportunities, as the object scope is minimized in terms of invocation (rather than
+ better optimization opportunities, as the object scope is minimized in terms of invocation (rather than
method) stack, making escape analysis a lot
easier. Given enough compiler (JIT/AOT) prowess, the cost of th builder object can be completely
eliminated
@see «target»
- @see «BUILDER.importedName»
'''
}