Fix DataObject builer javadoc references
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / BuilderTemplate.xtend
index 8bfa8817a3b1dd2a43cea6c61fa33aeddeb4d0d9..fc45d33295668b6e3f4df4a5cf2dee08adc549ea 100644 (file)
@@ -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 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,21 +30,15 @@ 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
@@ -70,6 +65,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
     override body() '''
         «wrapToDocumentation(formatDataForJavaDoc(targetType))»
         «targetType.annotations.generateDeprecatedAnnotation»
+        «generatedAnnotation»
         public class «type.name» implements «BUILDER.importedName»<«targetType.importedName»> {
 
             «generateFields(false)»
@@ -131,7 +127,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»
@@ -205,7 +201,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
          * Set fields from given grouping argument. Valid argument is instance of one of following types:
          * <ul>
          «FOR impl : type.getAllIfcs»
-         * <li>«impl.fullyQualifiedName»</li>
+         * <li>«impl.importedName»</li>
          «ENDFOR»
          * </ul>
          *
@@ -230,7 +226,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
     def private generateIfCheck(Type impl, List<Type> 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;
             }
@@ -242,7 +238,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»
@@ -257,10 +253,10 @@ class BuilderTemplate extends AbstractBuilderTemplate {
         if (Types.isListType(ownGetterType)) {
             val itemType = (ownGetterType as ParameterizedType).actualTypeArguments.get(0)
             return '''
-                this._«propertyName» = «CODEHELPERS.importedName».checkListFieldCast(«itemType.fullyQualifiedName».class, "«propertyName»", «retrieveProperty»)'''
+                this._«propertyName» = «CODEHELPERS.importedName».checkListFieldCast(«itemType.importedName».class, "«propertyName»", «retrieveProperty»)'''
         }
         return '''
-            this._«propertyName» = «CODEHELPERS.importedName».checkFieldCast(«ownGetter.returnType.fullyQualifiedName».class, "«propertyName»", «retrieveProperty»)'''
+            this._«propertyName» = «CODEHELPERS.importedName».checkFieldCast(«ownGetter.returnType.importedName».class, "«propertyName»", «retrieveProperty»)'''
     }
 
     private def List<Type> getBaseIfcs(GeneratedType type) {
@@ -290,7 +286,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
     private def List<String> toListOfNames(Collection<Type> types) {
         val List<String> names = new ArrayList
         for (type : types) {
-            names.add(type.fullyQualifiedName)
+            names.add(type.importedName)
         }
         return names
     }
@@ -321,7 +317,11 @@ class BuilderTemplate extends AbstractBuilderTemplate {
         val returnType = field.returnType
         if (returnType instanceof ParameterizedType) {
             if (Types.isListType(returnType)) {
-                return generateListSetter(field, returnType.actualTypeArguments.get(0))
+                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))
             }
@@ -348,18 +348,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")»
                }
             }
@@ -367,24 +364,6 @@ class BuilderTemplate extends AbstractBuilderTemplate {
             this.«field.fieldName» = values;
             return this;
         }
-
-        /**
-          * Utility migration setter.
-          *
-          * <b>IMPORTANT NOTE</b>: 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 <b>NOT</b>
-          *                        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) '''
@@ -404,21 +383,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»
     '''
 
     /**
@@ -475,7 +439,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
         <a href="https://en.wikipedia.org/wiki/Fluent_interface">fluent interface</a>, where method chaining is used.
@@ -484,7 +448,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
         In general, this class is supposed to be used like this template:
         <pre>
           <code>
-            «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())
@@ -505,7 +469,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
               invocation, which is terminated by {@link #build()}, which is then returned from the method</li>
           <li>better understanding by humans, as the scope of mutable state (the builder) is kept to a minimum and is
               very localized</li>
-          <li>better optimization oportunities, as the object scope is minimized in terms of invocation (rather than
+          <li>better optimization opportunities, as the object scope is minimized in terms of invocation (rather than
               method) stack, making <a href="https://en.wikipedia.org/wiki/Escape_analysis">escape analysis</a> a lot
               easier. Given enough compiler (JIT/AOT) prowess, the cost of th builder object can be completely
               eliminated</li>