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=549574bf12d6902c2b22523cb7f9d67b70d46f19;hb=02d20c1c5ae09f79dd6f20d650888679b127a243;hp=94bbbcc9c50281c2e89d2cc1f264797ca3cf2155;hpb=1223c177f889d632fbb2b9c005c077966236365b;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 94bbbcc9c5..549574bf12 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,12 +8,13 @@
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
import com.google.common.collect.Sets
import java.util.ArrayList
import java.util.Collection
@@ -29,23 +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
-import com.google.common.collect.ImmutableSet
/**
* 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,7 +63,7 @@ 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)»
@@ -95,7 +87,11 @@ class BuilderTemplate extends AbstractBuilderTemplate {
«generateSetters»
- @«OVERRIDE.importedName»
+ /**
+ * A new {@link «targetType.name»} instance.
+ *
+ * @return A new {@link «targetType.name»} instance.
+ */
public «targetType.name» build() {
return new «type.enclosedTypes.get(0).importedName»(this);
}
@@ -132,7 +128,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
def private Object generateConstructorFromIfc(Type impl) '''
«IF (impl instanceof GeneratedType)»
«IF impl.hasNonDefaultMethods»
- public «type.name»(«impl.fullyQualifiedName» arg) {
+ public «type.name»(«impl.importedName» arg) {
«printConstructorPropertySetter(impl)»
}
«ENDIF»
@@ -206,7 +202,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
* Set fields from given grouping argument. Valid argument is instance of one of following types:
*
«FOR impl : type.getAllIfcs»
- * - «impl.fullyQualifiedName»
+ * - {@link «impl.importedName»}
«ENDFOR»
*
*
@@ -231,7 +227,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
def private generateIfCheck(Type impl, List done) '''
«IF (impl instanceof GeneratedType && (impl as GeneratedType).hasNonDefaultMethods)»
«val implType = impl as GeneratedType»
- if (arg instanceof «implType.fullyQualifiedName») {
+ if (arg instanceof «implType.importedName») {
«printPropertySetter(implType)»
isValidArg = true;
}
@@ -243,7 +239,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
«val ifc = implementedIfc as GeneratedType»
«FOR getter : ifc.nonDefaultMethods»
«IF BindingMapping.isGetterMethodName(getter.name) && !hasOverrideAnnotation(getter)»
- «printPropertySetter(getter, '''((«ifc.fullyQualifiedName»)arg).«getter.name»()''', getter.propertyNameFromGetter)»;
+ «printPropertySetter(getter, '''((«ifc.importedName»)arg).«getter.name»()''', getter.propertyNameFromGetter)»;
«ENDIF»
«ENDFOR»
«ENDIF»
@@ -255,15 +251,21 @@ class BuilderTemplate extends AbstractBuilderTemplate {
if (Types.strictTypeEquals(getter.returnType, ownGetterType)) {
return "this._" + propertyName + " = " + retrieveProperty
}
- if (Types.isListType(ownGetterType)) {
- val itemType = (ownGetterType as ParameterizedType).actualTypeArguments.get(0)
- return '''
- this._«propertyName» = «CODEHELPERS.importedName».checkListFieldCast(«itemType.fullyQualifiedName».class, "«propertyName»", «retrieveProperty»)'''
+ if (ownGetterType instanceof ParameterizedType) {
+ val itemType = ownGetterType.actualTypeArguments.get(0)
+ if (Types.isListType(ownGetterType)) {
+ return printPropertySetter(retrieveProperty, propertyName, "checkListFieldCast", itemType.importedName)
+ }
+ if (Types.isSetType(ownGetterType)) {
+ return printPropertySetter(retrieveProperty, propertyName, "checkSetFieldCast", itemType.importedName)
+ }
}
- return '''
- this._«propertyName» = «CODEHELPERS.importedName».checkFieldCast(«ownGetter.returnType.fullyQualifiedName».class, "«propertyName»", «retrieveProperty»)'''
+ return printPropertySetter(retrieveProperty, propertyName, "checkFieldCast", ownGetterType.importedName)
}
+ def private printPropertySetter(String retrieveProperty, String propertyName, String checkerName, String className) '''
+ this._«propertyName» = «CODEHELPERS.importedName».«checkerName»(«className».class, "«propertyName»", «retrieveProperty»)'''
+
private def List getBaseIfcs(GeneratedType type) {
val List baseIfcs = new ArrayList();
for (ifc : type.implements) {
@@ -291,7 +293,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
private def List toListOfNames(Collection types) {
val List names = new ArrayList
for (type : types) {
- names.add(type.fullyQualifiedName)
+ names.add(type.importedName)
}
return names
}
@@ -321,8 +323,12 @@ class BuilderTemplate extends AbstractBuilderTemplate {
def private generateSetter(GeneratedProperty field) {
val returnType = field.returnType
if (returnType instanceof ParameterizedType) {
- if (Types.isListType(returnType)) {
- return generateListSetter(field, returnType.actualTypeArguments.get(0))
+ if (Types.isListType(returnType) || Types.isSetType(returnType)) {
+ val arguments = returnType.actualTypeArguments
+ if (arguments.isEmpty) {
+ return generateListSetter(field, Types.objectType)
+ }
+ return generateListSetter(field, arguments.get(0))
} else if (Types.isMapType(returnType)) {
return generateMapSetter(field, returnType.actualTypeArguments.get(1))
}
@@ -349,18 +355,15 @@ class BuilderTemplate extends AbstractBuilderTemplate {
'''
- // FIXME: MDSAL-540: remove the migration setter
def private generateMapSetter(GeneratedProperty field, Type actualType) '''
«val restrictions = restrictionsForSetter(actualType)»
- «val actualTypeRef = actualType.importedName»
- «val setterName = "set" + field.name.toFirstUpper»
«IF restrictions !== null»
«generateCheckers(field, restrictions, actualType)»
«ENDIF»
- public «type.getName» «setterName»(final «field.returnType.importedName» values) {
+ public «type.getName» set«field.name.toFirstUpper»(final «field.returnType.importedName» values) {
«IF restrictions !== null»
if (values != null) {
- for («actualTypeRef» value : values.values()) {
+ for («actualType.importedName» value : values.values()) {
«checkArgument(field, restrictions, actualType, "value")»
}
}
@@ -368,24 +371,6 @@ class BuilderTemplate extends AbstractBuilderTemplate {
this.«field.fieldName» = values;
return this;
}
-
- /**
- * Utility migration setter.
- *
- * IMPORTANT NOTE: This method does not completely match previous mechanics, as the list is processed as
- * during this method's execution. Any future modifications of the list are NOT
- * reflected in this builder nor its products.
- *
- * @param values Legacy List of values
- * @return this builder
- * @throws IllegalArgumentException if the list contains entries with the same key
- * @throws NullPointerException if the list contains a null entry
- * @deprecated Use {#link #«setterName»(«JU_MAP.importedName»)} instead.
- */
- @«DEPRECATED.importedName»(forRemoval = true)
- public «type.getName» «setterName»(final «JU_LIST.importedName»<«actualTypeRef»> values) {
- return «setterName»(«CODEHELPERS.importedName».compatMap(values));
- }
'''
def private generateSimpleSetter(GeneratedProperty field, Type actualType) '''
@@ -405,21 +390,6 @@ class BuilderTemplate extends AbstractBuilderTemplate {
this.«field.fieldName» = value;
return this;
}
- «val uintType = UINT_TYPES.get(field.returnType)»
- «IF uintType !== null»
-
- /**
- * Utility migration setter.
- *
- * @param value field value in legacy type
- * @return this builder
- * @deprecated Use {#link «setterName»(«field.returnType.importedJavadocName»)} instead.
- */
- @Deprecated(forRemoval = true)
- public «type.getName» «setterName»(final «uintType.importedName» value) {
- return «setterName»(«CODEHELPERS.importedName».compatUint(value));
- }
- «ENDIF»
'''
/**
@@ -450,7 +420,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
* @throws NullPointerException if {@code augmentation} is null
*/
public «type.name» addAugmentation(«augmentTypeRef» augmentation) {
- «jlClassRef» extends «augmentTypeRef»> augmentationType = augmentation.«DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME»();
+ «jlClassRef» extends «augmentTypeRef»> augmentationType = augmentation.«BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME»();
if (!(this.«AUGMENTATION_FIELD» instanceof «hashMapRef»)) {
this.«AUGMENTATION_FIELD» = new «hashMapRef»<>();
}
@@ -476,7 +446,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
'''
private def createDescription(GeneratedType targetType) {
- val target = type.importedName
+ val target = targetType.importedName
return '''
Class that builds {@link «target»} instances. Overall design of the class is that of a
fluent interface, where method chaining is used.
@@ -485,7 +455,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
In general, this class is supposed to be used like this template:
- «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())
@@ -506,14 +476,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»
'''
}