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%2FAbstractBuilderTemplate.xtend;h=c558ada0f59c4c26259c2b8aa8b011da715b36da;hb=refs%2Fchanges%2F44%2F100844%2F1;hp=60e6983beeb8bfab5bebcaea8dfcf0aba6b87548;hpb=3a2c2590fe64953e59953c9a7dde5e97ecfe34ec;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/AbstractBuilderTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/AbstractBuilderTemplate.xtend index 60e6983bee..c558ada0f5 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/AbstractBuilderTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/AbstractBuilderTemplate.xtend @@ -7,26 +7,22 @@ */ package org.opendaylight.mdsal.binding.java.api.generator -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTABLE_AUGMENTATION_NAME -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 +import java.util.Comparator import java.util.List -import java.util.Map import java.util.Set +import org.opendaylight.mdsal.binding.model.api.AnnotationType import org.opendaylight.mdsal.binding.model.api.GeneratedProperty import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject import org.opendaylight.mdsal.binding.model.api.GeneratedType import org.opendaylight.mdsal.binding.model.api.Type -import org.opendaylight.mdsal.binding.model.util.Types +import org.opendaylight.mdsal.binding.model.ri.BindingTypes import org.opendaylight.mdsal.binding.spec.naming.BindingMapping -import org.opendaylight.yangtools.yang.binding.CodeHelpers -import org.opendaylight.yangtools.yang.binding.Identifiable abstract class AbstractBuilderTemplate extends BaseTemplate { + static val Comparator KEY_PROPS_COMPARATOR = [ p1, p2 | return p1.name.compareTo(p2.name) ] + /** * Generated property is set if among methods is found one with the name GET_AUGMENTATION_METHOD_NAME. */ @@ -35,7 +31,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { /** * Set of class attributes (fields) which are derived from the getter methods names. */ - protected val Set properties + protected val Set properties /** * GeneratedType for key type, null if this type does not have a key. @@ -45,7 +41,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { protected val GeneratedType targetType; new(AbstractJavaGeneratedType javaType, GeneratedType type, GeneratedType targetType, - Set properties, Type augmentType, Type keyType) { + Set properties, Type augmentType, Type keyType) { super(javaType, type) this.targetType = targetType this.properties = properties @@ -53,13 +49,14 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { this.keyType = keyType } - new(GeneratedType type, GeneratedType targetType, Set 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 } /** @@ -79,28 +76,6 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { «ENDIF» ''' - def protected final generateAugmentField(boolean isPrivate) ''' - «IF augmentType !== null» - «IF isPrivate»private «ENDIF»«Map.importedName»<«Class.importedName», «augmentType.importedName»> «AUGMENTATION_FIELD» = «Collections.importedName».emptyMap(); - «ENDIF» - ''' - - override generateToString(Collection 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»", «AUGMENTATION_FIELD».values()); - «ENDIF» - return helper.toString(); - } - «ENDIF» - ''' - /** * Template method which generate getter methods for IMPL class. * @@ -108,7 +83,7 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { */ def final generateGetters(boolean addOverride) ''' «IF keyType !== null» - «IF addOverride»@«Override.importedName»«ENDIF» + «IF addOverride»@«OVERRIDE.importedName»«ENDIF» public «keyType.importedName» «BindingMapping.IDENTIFIABLE_KEY_NAME»() { return key; } @@ -116,44 +91,47 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { «ENDIF» «IF !properties.empty» «FOR field : properties SEPARATOR '\n'» - «IF addOverride»@«Override.importedName»«ENDIF» + «IF addOverride»@«OVERRIDE.importedName»«ENDIF» «field.getterMethod» «ENDFOR» «ENDIF» - «IF augmentType !== null» - - @SuppressWarnings("unchecked") - «IF addOverride»@«Override.importedName»«ENDIF» - public E «AUGMENTABLE_AUGMENTATION_NAME»(«Class.importedName» augmentationType) { - return (E) «AUGMENTATION_FIELD».get(«CodeHelpers.importedName».nonNullValue(augmentationType, "augmentationType")); - } - «ENDIF» ''' def protected final CharSequence generateCopyConstructor(Type fromType, Type implType) ''' «type.name»(«fromType.importedName» base) { - «val allProps = new ArrayList(properties)» - «val isList = implementsIfc(targetType, Types.parameterizedTypeFor(Types.typeForClass(Identifiable), targetType))» - «IF isList && keyType !== null» + «IF augmentType !== null» + «generateCopyAugmentation(implType)» + «ENDIF» + «IF keyType !== null && implementsIfc(targetType, BindingTypes.identifiable(targetType))» «val keyProps = new ArrayList((keyType as GeneratedTransferObject).properties)» - «Collections.sort(keyProps, [ p1, p2 | return p1.name.compareTo(p2.name) ])» + «keyProps.sort(KEY_PROPS_COMPARATOR)» + «val allProps = new ArrayList(properties)» «FOR field : keyProps» «removeProperty(allProps, field.name)» «ENDFOR» «generateCopyKeys(keyProps)» - «ENDIF» - «FOR field : allProps» - this.«field.fieldName» = base.«field.getterMethodName»(); - «ENDFOR» - «IF augmentType !== null» - «generateCopyAugmentation(implType)» + «generateCopyNonKeys(allProps)» + «ELSE» + «generateCopyNonKeys(properties)» «ENDIF» } ''' + def protected final CharSequence generateDeprecatedAnnotation(List annotations) { + var AnnotationType found = annotations.findDeprecatedAnnotation + if (found === null) { + return "" + } + return generateDeprecatedAnnotation(found) + } + def protected abstract CharSequence generateCopyKeys(List keyProps) - def protected abstract CharSequence generateCopyAugmentation(Type implType); + def protected abstract CharSequence generateCopyNonKeys(Collection props) + + def protected abstract CharSequence generateCopyAugmentation(Type implType) + + def protected abstract CharSequence generateDeprecatedAnnotation(AnnotationType ann) private def boolean implementsIfc(GeneratedType type, Type impl) { for (Type ifc : type.implements) { @@ -164,15 +142,32 @@ abstract class AbstractBuilderTemplate extends BaseTemplate { return false; } - private def void removeProperty(Collection props, String name) { - var GeneratedProperty toRemove = null - for (p : props) { - if (p.name.equals(name)) { - toRemove = p; + private def void removeProperty(Collection props, String name) { + val iter = props.iterator + while (iter.hasNext) { + if (name.equals(iter.next.name)) { + iter.remove + return } } - if (toRemove !== null) { - props.remove(toRemove); + } + + private static def findDeprecatedAnnotation(List annotations) { + if (annotations !== null) { + for (annotation : annotations) { + if (DEPRECATED.equals(annotation.identifier)) { + return annotation + } + } } + 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]) } }