Annotate non-null build() return
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / BuilderTemplate.xtend
index 7dfd93a55154be5201a35d9904e9ed7052af6b74..fe0c37e1c5d54442fc4cf03030aa73e021501be5 100644 (file)
@@ -11,7 +11,7 @@ import static extension org.apache.commons.text.StringEscapeUtils.escapeJava
 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
@@ -70,11 +70,26 @@ class BuilderTemplate extends AbstractBuilderTemplate {
             «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()»
@@ -88,11 +103,11 @@ class BuilderTemplate extends AbstractBuilderTemplate {
             «generateSetters»
 
             /**
-             * A new {@link «targetType.name»} instance.
+             * A new {@link «targetTypeName»} instance.
              *
-             * @return A new {@link «targetType.name»} instance.
+             * @return A new {@link «targetTypeName»} instance.
              */
-            public «targetType.name» build() {
+            public «targetType.importedNonNull» build() {
                 return new «type.enclosedTypes.get(0).importedName»(this);
             }
 
@@ -112,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)»
@@ -128,9 +140,16 @@ class BuilderTemplate extends AbstractBuilderTemplate {
     def private Object generateConstructorFromIfc(Type impl) '''
         «IF (impl instanceof GeneratedType)»
             «IF impl.hasNonDefaultMethods»
-                public «type.name»(«impl.importedName» 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)»
@@ -202,7 +221,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.importedName»</li>
+         *   <li>{@link «impl.importedName»}</li>
          «ENDFOR»
          * </ul>
          *
@@ -254,22 +273,11 @@ class BuilderTemplate extends AbstractBuilderTemplate {
         if (ownGetterType instanceof ParameterizedType) {
             val itemType = ownGetterType.actualTypeArguments.get(0)
             if (Types.isListType(ownGetterType)) {
-                val importedClass = importedClass(itemType)
-                if (importedClass !== null) {
-                    return printPropertySetter(retrieveProperty, propertyName, "checkListFieldCastIdentity", importedClass)
-                }
                 return printPropertySetter(retrieveProperty, propertyName, "checkListFieldCast", itemType.importedName)
             }
             if (Types.isSetType(ownGetterType)) {
-                val importedClass = importedClass(itemType)
-                if (importedClass !== null) {
-                    return printPropertySetter(retrieveProperty, propertyName, "checkSetFieldCastIdentity", importedClass)
-                }
                 return printPropertySetter(retrieveProperty, propertyName, "checkSetFieldCast", itemType.importedName)
             }
-            if (Types.CLASS.equals(ownGetterType)) {
-                return printPropertySetter(retrieveProperty, propertyName, "checkFieldCastIdentity", itemType.identifier.importedName)
-            }
         }
         return printPropertySetter(retrieveProperty, propertyName, "checkFieldCast", ownGetterType.importedName)
     }
@@ -277,15 +285,6 @@ class BuilderTemplate extends AbstractBuilderTemplate {
     def private printPropertySetter(String retrieveProperty, String propertyName, String checkerName, String className) '''
             this._«propertyName» = «CODEHELPERS.importedName».«checkerName»(«className».class, "«propertyName»", «retrieveProperty»)'''
 
-    private def importedClass(Type type) {
-        if (type instanceof ParameterizedType) {
-            if (Types.CLASS.equals(type.rawType)) {
-                return type.actualTypeArguments.get(0).identifier.importedName
-            }
-        }
-        return null
-    }
-
     private def List<Type> getBaseIfcs(GeneratedType type) {
         val List<Type> baseIfcs = new ArrayList();
         for (ifc : type.implements) {
@@ -430,7 +429,6 @@ class BuilderTemplate extends AbstractBuilderTemplate {
 
         «IF augmentType !== null»
             «val augmentTypeRef = augmentType.importedName»
-            «val jlClassRef = CLASS.importedName»
             «val hashMapRef = JU_HASHMAP.importedName»
             /**
               * Add an augmentation to this builder's product.
@@ -440,12 +438,11 @@ 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»();
                 if (!(this.«AUGMENTATION_FIELD» instanceof «hashMapRef»)) {
                     this.«AUGMENTATION_FIELD» = new «hashMapRef»<>();
                 }
 
-                this.«AUGMENTATION_FIELD».put(augmentationType, augmentation);
+                this.«AUGMENTATION_FIELD».put(augmentation.«BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME»(), augmentation);
                 return this;
             }
 
@@ -456,7 +453,7 @@ class BuilderTemplate extends AbstractBuilderTemplate {
               * @param augmentationType augmentation type to be removed
               * @return this builder
               */
-            public «type.name» removeAugmentation(«jlClassRef»<? extends «augmentTypeRef»> augmentationType) {
+            public «type.name» removeAugmentation(«CLASS.importedName»<? extends «augmentTypeRef»> augmentationType) {
                 if (this.«AUGMENTATION_FIELD» instanceof «hashMapRef») {
                     this.«AUGMENTATION_FIELD».remove(augmentationType);
                 }