Specialize relative leafref types during instantiation
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / AbstractBuilderTemplate.xtend
index 010450485b20ce354bd291c6aabd318d09b5d82f..5dcce2a4c9b28f7b979bb4f80360c65d41222aa9 100644 (file)
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator
 
-import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTATION_FIELD
 
-import com.google.common.base.MoreObjects
 import java.util.ArrayList
 import java.util.Collection
 import java.util.Collections
@@ -36,7 +34,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
     /**
      * Set of class attributes (fields) which are derived from the getter methods names.
      */
-    protected val Set<GeneratedProperty> properties
+    protected val Set<BuilderGeneratedProperty> properties
 
     /**
      * GeneratedType for key type, null if this type does not have a key.
@@ -46,7 +44,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
     protected val GeneratedType targetType;
 
     new(AbstractJavaGeneratedType javaType, GeneratedType type, GeneratedType targetType,
-            Set<GeneratedProperty> properties, Type augmentType, Type keyType) {
+            Set<BuilderGeneratedProperty> properties, Type augmentType, Type keyType) {
         super(javaType, type)
         this.targetType = targetType
         this.properties = properties
@@ -54,13 +52,14 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
         this.keyType = keyType
     }
 
-    new(GeneratedType type, GeneratedType targetType, Set<GeneratedProperty> properties, Type augmentType,
-            Type keyType) {
+    new(GeneratedType type, GeneratedType targetType, Type keyType) {
         super(type)
         this.targetType = targetType
-        this.properties = properties
-        this.augmentType = augmentType
         this.keyType = keyType
+
+        val analysis = analyzeTypeHierarchy(targetType)
+        augmentType = analysis.key
+        properties = analysis.value
     }
 
     /**
@@ -87,22 +86,6 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
         '''
     }
 
-    override generateToString(Collection<GeneratedProperty> properties) '''
-        «IF properties !== null»
-            @«OVERRIDE.importedName»
-            public «STRING.importedName» toString() {
-                final «MoreObjects.importedName».ToStringHelper helper = «MoreObjects.importedName».toStringHelper("«targetType.name»");
-                «FOR property : properties»
-                    «CODEHELPERS.importedName».appendValue(helper, "«property.fieldName»", «property.fieldName»);
-                «ENDFOR»
-                «IF augmentType !== null»
-                    «CODEHELPERS.importedName».appendValue(helper, "«AUGMENTATION_FIELD»", augmentations().values());
-                «ENDIF»
-                return helper.toString();
-            }
-        «ENDIF»
-    '''
-
     /**
      * Template method which generate getter methods for IMPL class.
      *
@@ -152,14 +135,10 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
         return generateDeprecatedAnnotation(found)
     }
 
-    def protected final CharSequence generateCopyNonKeys(Collection<GeneratedProperty> props) '''
-        «FOR field : props»
-            this.«field.fieldName» = base.«field.getterMethodName»();
-        «ENDFOR»
-    '''
-
     def protected abstract CharSequence generateCopyKeys(List<GeneratedProperty> keyProps)
 
+    def protected abstract CharSequence generateCopyNonKeys(Collection<BuilderGeneratedProperty> props)
+
     def protected abstract CharSequence generateCopyAugmentation(Type implType)
 
     def protected abstract CharSequence generateDeprecatedAnnotation(AnnotationType ann)
@@ -173,7 +152,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
         return false;
     }
 
-    private def void removeProperty(Collection<GeneratedProperty> props, String name) {
+    private def void removeProperty(Collection<BuilderGeneratedProperty> props, String name) {
         val iter = props.iterator
         while (iter.hasNext) {
             if (name.equals(iter.next.name)) {
@@ -193,4 +172,12 @@ abstract class AbstractBuilderTemplate extends BaseTemplate {
         }
         return null
     }
+
+    package static def hasNonDefaultMethods(GeneratedType type) {
+        !type.methodDefinitions.isEmpty && type.methodDefinitions.exists([def | !def.isDefault])
+    }
+
+    package static def nonDefaultMethods(GeneratedType type) {
+        type.methodDefinitions.filter([def | !def.isDefault])
+    }
 }