Pick up byte-buddy from yangtools
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / ListKeyTemplate.xtend
index 55f099e95d5718074cb523c01ae7114a978e99bd..7f3c8bcb9207d5b5b5b7137f1f124e80b24b125f 100644 (file)
@@ -8,13 +8,16 @@
 package org.opendaylight.mdsal.binding.java.api.generator
 
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty
+import org.opendaylight.mdsal.binding.model.api.GeneratedType
 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
+import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
+import org.opendaylight.mdsal.binding.model.api.Type
+import org.opendaylight.mdsal.binding.model.ri.BindingTypes
 
 /**
  * Template for generating JAVA class.
  */
-class ListKeyTemplate extends ClassTemplate {
-
+final class ListKeyTemplate extends ClassTemplate {
     /**
      * Creates instance of this class with concrete <code>genType</code>.
      *
@@ -24,37 +27,60 @@ class ListKeyTemplate extends ClassTemplate {
         super(genType)
     }
 
-
-    override final allValuesConstructor() '''
+    override allValuesConstructor() '''
+        /**
+         * Constructs an instance.
+         *
+         «FOR p : allProperties»
+            * @param «p.fieldName» the entity «p.getName»
+         «ENDFOR»
+         * @throws NullPointerException if any of the arguments are null
+         */
         public «type.name»(«allProperties.asNonNullArgumentsDeclaration») {
             «FOR p : allProperties»
-                «CODEHELPERS.importedName».requireValue(«p.fieldName»);
+                «val fieldName = p.fieldName»
+                this.«fieldName» = «CODEHELPERS.importedName».requireKeyProp(«fieldName», "«p.name»")«p.cloneCall»;
             «ENDFOR»
             «FOR p : properties»
                 «generateRestrictions(type, p.fieldName, p.returnType)»
             «ENDFOR»
+        }
+    '''
 
-            «FOR p : allProperties»
-                «val fieldName = p.fieldName»
-                «IF p.returnType.name.endsWith("[]")»
-                    this.«fieldName» = «fieldName».clone();
-                «ELSE»
-                    this.«fieldName» = «fieldName»;
-                «ENDIF»
-            «ENDFOR»
+    override getterMethod(GeneratedProperty field) '''
+        /**
+         * Return «field.getName», guaranteed to be non-null.
+         *
+         * @return {@code «field.returnType.importedName»} «field.getName», guaranteed to be non-null.
+         */
+        public «field.returnType.importedNonNull» «field.getterMethodName»() {
+            return «field.fieldName»«field.cloneCall»;
         }
     '''
 
-    override final getterMethod(GeneratedProperty field) {
+    override protected String formatDataForJavaDoc(GeneratedType type) {
+        val listType = findListType(type)
+        if (listType === null) {
+            return ""
+        }
+
+        val importedName = listType.importedName
+        return '''
+            This class represents the key of {@link «importedName»} class.
+
+            @see «importedName»
         '''
-            public «field.returnType.importedNonNull» «field.getterMethodName»() {
-                «val fieldName = field.fieldName»
-                «IF field.returnType.name.endsWith("[]")»
-                return «fieldName».clone();
-                «ELSE»
-                return «fieldName»;
-                «ENDIF»
+    }
+
+    private static def Type findListType(GeneratedType type) {
+        for (Type implType : type.getImplements()) {
+            if (implType instanceof ParameterizedType) {
+                val identifiable = BindingTypes.extractKeyType(implType)
+                if (identifiable !== null) {
+                    return identifiable
+                }
             }
-        '''
+        }
+        return null
     }
 }