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%2FInterfaceTemplate.xtend;h=a6d549069fbf7f51ac7221f05655c546c7c6f605;hb=refs%2Fchanges%2F18%2F110318%2F1;hp=667f78055efa8c5609247c712272ee2b8f8bd304;hpb=adc23d90f8d367517b854bcd7533578c148812e8;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend index 667f78055e..a6d549069f 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend @@ -7,22 +7,21 @@ */ package org.opendaylight.mdsal.binding.java.api.generator -import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.getGetterMethodForNonnull -import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.getGetterMethodForRequire -import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.isGetterMethodName -import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.isNonnullMethodName -import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.isRequireMethodName +import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.getGetterMethodForNonnull +import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.getGetterMethodForRequire +import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.isGetterMethodName +import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.isNonnullMethodName +import static extension org.opendaylight.yangtools.yang.binding.contract.Naming.isRequireMethodName import static org.opendaylight.mdsal.binding.model.ri.Types.BOOLEAN import static org.opendaylight.mdsal.binding.model.ri.Types.STRING -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.REQUIRE_PREFIX -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTATION_FIELD -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.BINDING_EQUALS_NAME -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.BINDING_HASHCODE_NAME -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.BINDING_TO_STRING_NAME -import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME +import static org.opendaylight.yangtools.yang.binding.contract.Naming.REQUIRE_PREFIX +import static org.opendaylight.yangtools.yang.binding.contract.Naming.AUGMENTATION_FIELD +import static org.opendaylight.yangtools.yang.binding.contract.Naming.BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME +import static org.opendaylight.yangtools.yang.binding.contract.Naming.BINDING_EQUALS_NAME +import static org.opendaylight.yangtools.yang.binding.contract.Naming.BINDING_HASHCODE_NAME +import static org.opendaylight.yangtools.yang.binding.contract.Naming.BINDING_TO_STRING_NAME import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.MoreObjects import java.util.List import java.util.Locale import java.util.Map.Entry @@ -34,6 +33,7 @@ import org.opendaylight.mdsal.binding.model.api.Enumeration import org.opendaylight.mdsal.binding.model.api.GeneratedType 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.ri.Types import org.opendaylight.mdsal.binding.model.ri.TypeConstants @@ -41,7 +41,6 @@ import org.opendaylight.mdsal.binding.model.ri.TypeConstants /** * Template for generating JAVA interfaces. */ - @SuppressModernizer class InterfaceTemplate extends BaseTemplate { /** * List of constant instances which are generated as JAVA public static final attributes. @@ -116,7 +115,7 @@ class InterfaceTemplate extends BaseTemplate { «val annotations = method.annotations» «IF annotations !== null && !annotations.empty» «FOR annotation : annotations» - «IF method.returnType != BOOLEAN || !(annotation.identifier == OVERRIDE)» + «IF !BOOLEAN.equals(method.returnType) || !OVERRIDE.equals(annotation.identifier)» «annotation.generateAnnotation» «ENDIF» «ENDFOR» @@ -166,7 +165,7 @@ class InterfaceTemplate extends BaseTemplate { ''' /** - * Template method wich generates JAVA constants. + * Template method which generates JAVA constants. * * @return string with constants in JAVA format */ @@ -194,6 +193,8 @@ class InterfaceTemplate extends BaseTemplate { «generateStaticMethod(m)» «ELSEIF m.parameters.empty && m.name.isGetterMethodName» «generateAccessorMethod(m)» + «ELSEIF m.parameters.empty && m.name.isNonnullMethodName» + «generateNonnullAccessorMethod(m)» «ELSE» «generateMethod(m)» «ENDIF» @@ -201,6 +202,7 @@ class InterfaceTemplate extends BaseTemplate { «ENDIF» ''' + @SuppressModernizer def private generateDefaultMethod(MethodSignature method) { if (method.name.isNonnullMethodName) { generateNonnullMethod(method) @@ -208,20 +210,22 @@ class InterfaceTemplate extends BaseTemplate { generateRequireMethod(method) } else { switch method.name { - case DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME : generateDefaultImplementedInterface + case BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME : generateDefaultImplementedInterface default : - if (VOID == method.returnType.identifier) { + if (VOID.equals(method.returnType.identifier)) { generateNoopVoidInterfaceMethod(method) } } } } + @SuppressModernizer def private generateStaticMethod(MethodSignature method) { switch method.name { case BINDING_EQUALS_NAME : generateBindingEquals case BINDING_HASHCODE_NAME : generateBindingHashCode case BINDING_TO_STRING_NAME : generateBindingToString + default : "" } } @@ -266,9 +270,17 @@ class InterfaceTemplate extends BaseTemplate { ''' } + def private generateNonnullAccessorMethod(MethodSignature method) { + return ''' + «accessorJavadoc(method, ", or an empty instance if it is not present.")» + «method.annotations.generateAnnotations» + «method.returnType.importedNonNull» «method.name»(); + ''' + } + def private generateDefaultImplementedInterface() ''' @«OVERRIDE.importedName» - default «CLASS.importedName»<«type.fullyQualifiedName»> «DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME»() { + default «CLASS.importedName»<«type.fullyQualifiedName»> «BINDING_CONTRACT_IMPLEMENTED_INTERFACE_NAME»() { return «type.fullyQualifiedName».class; } ''' @@ -284,14 +296,17 @@ class InterfaceTemplate extends BaseTemplate { * * @param obj Object for which to generate hashCode() result. * @return Hash code value of data modeled by this interface. - * @throws «NPE.importedName» if {@code obj} is null + * @throws «NPE.importedName» if {@code obj} is {@code null} */ static int «BINDING_HASHCODE_NAME»(final «type.fullyQualifiedNonNull» obj) { - final int prime = 31; int result = 1; - «FOR property : typeAnalysis.value» - result = prime * result + «property.importedUtilClass».hashCode(obj.«property.getterMethodName»()); - «ENDFOR» + «val props = typeAnalysis.value» + «IF !props.empty» + final int prime = 31; + «FOR property : props» + result = prime * result + «property.importedUtilClass».hashCode(obj.«property.getterMethodName»()); + «ENDFOR» + «ENDIF» «IF augmentable» for (var augmentation : obj.augmentations().values()) { result += augmentation.hashCode(); @@ -313,22 +328,18 @@ class InterfaceTemplate extends BaseTemplate { * @param thisObj Object acting as the receiver of equals invocation * @param obj Object acting as argument to equals invocation * @return True if thisObj and obj are considered equal - * @throws «NPE.importedName» if {@code thisObj} is null + * @throws «NPE.importedName» if {@code thisObj} is {@code null} */ static boolean «BINDING_EQUALS_NAME»(final «type.fullyQualifiedNonNull» thisObj, final «Types.objectType().importedName» obj) { if (thisObj == obj) { return true; } - final «type.fullyQualifiedName» other = «CODEHELPERS.importedName».checkCast(«type.fullyQualifiedName».class, obj); - if (other == null) { - return false; - } - «FOR property : ByTypeMemberComparator.sort(typeAnalysis.value)» - if (!«property.importedUtilClass».equals(thisObj.«property.getterName»(), other.«property.getterName»())) { - return false; - } - «ENDFOR» - return «IF augmentable»thisObj.augmentations().equals(other.augmentations())«ELSE»true«ENDIF»; + final var other = «CODEHELPERS.importedName».checkCast(«type.fullyQualifiedName».class, obj); + return other != null + «FOR property : ByTypeMemberComparator.sort(typeAnalysis.value)» + && «property.importedUtilClass».equals(thisObj.«property.getterName»(), other.«property.getterName»()) + «ENDFOR» + «IF augmentable»&& thisObj.augmentations().equals(other.augmentations())«ENDIF»; } «ENDIF» ''' @@ -342,10 +353,10 @@ class InterfaceTemplate extends BaseTemplate { * * @param obj Object for which to generate toString() result. * @return {@link «STRING.importedName»} value of data modeled by this interface. - * @throws «NPE.importedName» if {@code obj} is null + * @throws «NPE.importedName» if {@code obj} is {@code null} */ static «STRING.importedName» «BINDING_TO_STRING_NAME»(final «type.fullyQualifiedNonNull» obj) { - final «MoreObjects.importedName».ToStringHelper helper = «MoreObjects.importedName».toStringHelper("«type.name»"); + final var helper = «MOREOBJECTS.importedName».toStringHelper("«type.name»"); «FOR property : typeAnalysis.value» «CODEHELPERS.importedName».appendValue(helper, "«property.name»", obj.«property.getterName»()); «ENDFOR» @@ -377,8 +388,11 @@ class InterfaceTemplate extends BaseTemplate { ''' def private String nullableType(Type type) { - if (type.isObject && (Types.isMapType(type) || Types.isListType(type))) { - return type.importedNullable + if (type.isObject && type instanceof ParameterizedType) { + val param = type as ParameterizedType + if (Types.isMapType(param) || Types.isListType(param) || Types.isSetType(param)) { + return type.importedNullable + } } return type.importedName }