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%2FUnionTemplate.xtend;h=4f0ab4b1577cb8bd261eed26e0568e75400407a4;hb=7f453ef5095fccba4c63d2bb7eb298d3e97e028b;hp=71c80181d3b6b8b96c2402ca12b1bda80ac17da1;hpb=ce1e55484544d25297cb60cdfc6758e9b14945fb;p=mdsal.git diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend index 71c80181d3..4f0ab4b157 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/UnionTemplate.xtend @@ -7,22 +7,25 @@ */ package org.opendaylight.mdsal.binding.java.api.generator -import static org.opendaylight.mdsal.binding.model.util.Types.BOOLEAN; +import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.BINARY_TYPE; +import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.BOOLEAN_TYPE; +import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.EMPTY_TYPE; +import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.STRING_TYPE; +import static org.opendaylight.mdsal.binding.model.util.Types.STRING; import static org.opendaylight.mdsal.binding.model.util.Types.getOuterClassName; -import com.google.common.base.Preconditions; -import com.google.common.io.BaseEncoding -import java.beans.ConstructorProperties -import org.opendaylight.mdsal.binding.model.api.GeneratedProperty +import java.util.Base64; +import org.gaul.modernizer_maven_annotations.SuppressModernizer import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject import org.opendaylight.mdsal.binding.model.api.Enumeration +import org.opendaylight.mdsal.binding.model.api.Type import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition /** * Template for generating JAVA class. */ +@SuppressModernizer class UnionTemplate extends ClassTemplate { - /** * Creates instance of this class with concrete genType. * @@ -30,9 +33,6 @@ class UnionTemplate extends ClassTemplate { */ new(NestedJavaGeneratedType javaType, GeneratedTransferObject genType) { super(javaType, genType) - if (isBaseEncodingImportRequired) { - addImport(BaseEncoding) - } } /** @@ -42,23 +42,6 @@ class UnionTemplate extends ClassTemplate { */ new(GeneratedTransferObject genType) { super(genType) - if (isBaseEncodingImportRequired) { - addImport(BaseEncoding) - } - } - - final private def boolean isBaseEncodingImportRequired() { - for (property : finalProperties) { - val propRet = property.returnType - if (propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).typedef && - (propRet as GeneratedTransferObject).properties !== null && - !(propRet as GeneratedTransferObject).properties.empty && - ((propRet as GeneratedTransferObject).properties.size == 1) && - (propRet as GeneratedTransferObject).properties.get(0).name.equals("value") && - "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)) { - return true; - } - } } override constructors() ''' @@ -70,44 +53,30 @@ class UnionTemplate extends ClassTemplate { «IF properties.empty && !parentProperties.empty» «parentConstructor» «ENDIF» + + «generateStringValue» ''' private def unionConstructors() ''' «FOR property : finalProperties SEPARATOR "\n"» - «val propRet = property.returnType» - «IF "char[]".equals(propRet.name)» - /** - * Constructor provided only for using in JMX. Don't use it for - * construction new object of this union type. - */ - @«ConstructorProperties.importedName»("«property.name»") - public «type.name»(«propRet.importedName» «property.fieldName») { - «String.importedName» defVal = new «String.importedName»(«property.fieldName»); - «type.name» defInst = «typeBuilder()».getDefaultInstance(defVal); - «FOR other : finalProperties» - «IF other.name.equals("value")» - «IF other.returnType.importedName.contains("[]")» - this.«other.fieldName» = «other.fieldName» == null ? null : «other.fieldName».clone(); - «ELSE» - this.«other.fieldName» = «other.fieldName»; - «ENDIF» - «ELSE» - this.«other.fieldName» = defInst.«other.fieldName»; - «ENDIF» - «ENDFOR» - } - «ELSE» - «val propertyAndTopParentProperties = parentProperties + #[property]» - public «type.name»(«propertyAndTopParentProperties.asArgumentsDeclaration») { - super(«parentProperties.asArguments»); - this.«property.fieldName» = «property.fieldName»; - «FOR other : finalProperties» - «IF property != other && !"value".equals(other.name)» - this.«other.fieldName» = null; - «ENDIF» - «ENDFOR» - } + «val actualType = property.returnType» + «val restrictions = restrictionsForSetter(actualType)» + «IF restrictions !== null» + «generateCheckers(property, restrictions, actualType)» «ENDIF» + «val propertyAndTopParentProperties = parentProperties + #[property]» + public «type.name»(«propertyAndTopParentProperties.asArgumentsDeclaration») { + super(«parentProperties.asArguments»); + «IF restrictions !== null» + «checkArgument(property, restrictions, actualType, property.fieldName)» + «ENDIF» + this.«property.fieldName» = «property.fieldName»; + «FOR other : finalProperties» + «IF property != other» + this.«other.fieldName» = null; + «ENDIF» + «ENDFOR» + } «ENDFOR» ''' @@ -127,73 +96,76 @@ class UnionTemplate extends ClassTemplate { «ENDFOR» ''' - override protected getterMethod(GeneratedProperty field) { - if (!"value".equals(field.name)) { - return super.getterMethod(field) - } - - Preconditions.checkArgument("char[]".equals(field.returnType.importedName)) - - ''' - public char[] «field.getterMethodName»() { - if («field.fieldName» == null) { - «FOR property : finalProperties.filter([ p | !"value".equals(p.name)]) SEPARATOR " else"» - if («property.fieldName» != null) { - «val propRet = property.returnType» - «IF "java.lang.String".equals(propRet.fullyQualifiedName)» - ««« type string - «field.fieldName» = «property.fieldName».toCharArray(); - «ELSEIF "org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(propRet.fullyQualifiedName)» - ««« type instance-identifier - «field.fieldName» = «property.fieldName».toString().toCharArray(); - «ELSEIF "byte[]".equals(propRet.name)» - ««« type binary - «field.fieldName» = new «String.importedName»(«property.fieldName»).toCharArray(); - «ELSEIF propRet.fullyQualifiedName.startsWith("java.lang") - || propRet instanceof Enumeration - || propRet.fullyQualifiedName.startsWith("java.math")» - ««« type int*, uint, decimal64 or enumeration* - «field.fieldName» = «property.fieldName».toString().toCharArray(); - «ELSEIF propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).unionType» - ««« union type - «field.fieldName» = «property.fieldName».getValue(); - «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject - && (propRet as GeneratedTransferObject).typedef // Is it a typedef - && (propRet as GeneratedTransferObject).properties !== null - && !(propRet as GeneratedTransferObject).properties.empty - && ((propRet as GeneratedTransferObject).properties.size == 1) - && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value") - && BOOLEAN.equals((propRet as GeneratedTransferObject).properties.get(0).returnType)» // And the property value is of type boolean - ««« generated boolean typedef - «field.fieldName» = «property.fieldName».isValue().toString().toCharArray(); - «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject - && (propRet as GeneratedTransferObject).typedef // Is it a typedef - && (propRet as GeneratedTransferObject).properties !== null - && !(propRet as GeneratedTransferObject).properties.empty - && ((propRet as GeneratedTransferObject).properties.size == 1) - && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value") - && "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)» - ««« generated byte[] typedef - «field.fieldName» = BaseEncoding.base64().encode(«property.fieldName».getValue()).toCharArray(); - «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject - && (propRet as GeneratedTransferObject).typedef // Is it a typedef - && (propRet as GeneratedTransferObject).baseType instanceof BitsTypeDefinition» - ««« generated bits typedef - «field.fieldName» = java.util.Arrays.toString(«property.fieldName».getValue()).toCharArray(); - «ELSE» - ««« generated type - «field.fieldName» = «property.fieldName».getValue().toString().toCharArray(); - «ENDIF» - } - «ENDFOR» - } - return «field.fieldName» == null ? null : «field.fieldName».clone(); + def generateStringValue() + ''' + /** + * Return a String representing the value of this union. + * + * @return String representation of this union's value. + */ + public «STRING.importedName» stringValue() { + «FOR property : finalProperties» + «val field = property.fieldName» + if («field» != null) { + «val propRet = property.returnType» + «IF STRING_TYPE.equals(propRet)» + ««« type string + return «field»; + «ELSEIF "org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(propRet.fullyQualifiedName)» + ««« type instance-identifier + return «field».toString(); + «ELSEIF BINARY_TYPE.equals(propRet)» + ««« type binary + return new «STRING.importedName»(«field»); + «ELSEIF propRet.fullyQualifiedName.startsWith("java.lang") || propRet instanceof Enumeration + || propRet.fullyQualifiedName.startsWith("java.math")» + ««« type int*, decimal64 or enumeration* + return «field».toString(); + «ELSEIF "org.opendaylight.yangtools.yang.common".equals(propRet.packageName) + && propRet.name.startsWith("Uint")» + ««« type uint* + return «field».toCanonicalString(); + «ELSEIF propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).unionType» + ««« union type + return «field».stringValue(); + «ELSEIF BOOLEAN_TYPE.equals(propRet.typedefReturnType)» + ««« generated boolean typedef + return «field».isValue().toString(); + «ELSEIF BINARY_TYPE.equals(propRet.typedefReturnType)» + ««« generated byte[] typedef + return «Base64.importedName».getEncoder().encodeToString(«field».getValue()); + «ELSEIF EMPTY_TYPE.equals(propRet) || EMPTY_TYPE.equals(propRet.typedefReturnType)» + ««« generated empty typedef + return ""; + «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject + && (propRet as GeneratedTransferObject).typedef // Is it a typedef + && (propRet as GeneratedTransferObject).baseType instanceof BitsTypeDefinition» + ««« generated bits typedef + return «JU_ARRAYS.importedName».toString(«field».getValue()); + «ELSE» + ««« generated type + return «field».getValue().toString(); + «ENDIF» } - ''' - } + «ENDFOR» + + throw new IllegalStateException("No value assinged"); + } + ''' - override def isReadOnly(GeneratedProperty field) { - return !"value".equals(field.name) && super.isReadOnly(field) + private static def Type typedefReturnType(Type type) { + if (!(type instanceof GeneratedTransferObject)) { + return null + } + val gto = type as GeneratedTransferObject + if (!gto.typedef || gto.properties === null || gto.properties.size != 1) { + return null + } + val prop = gto.properties.get(0) + if (prop.name.equals("value")) { + return prop.returnType + } + return null } override protected copyConstructor() ''' @@ -206,15 +178,14 @@ class UnionTemplate extends ClassTemplate { «IF !parentProperties.empty» super(source); «ENDIF» - «IF !properties.empty» - «FOR p : properties» - «IF !"value".equals(p.name) && p.returnType.importedName.contains("[]")» - this.«p.fieldName» = source.«p.fieldName» == null ? null : source.«p.fieldName».clone(); - «ELSE» - this.«p.fieldName» = source.«p.fieldName»; - «ENDIF» - «ENDFOR» - «ENDIF» + «FOR p : properties» + «val fieldName = p.fieldName» + «IF p.returnType.name.endsWith("[]")» + this.«fieldName» = source.«fieldName» == null ? null : source.«fieldName».clone(); + «ELSE» + this.«fieldName» = source.«fieldName»; + «ENDIF» + «ENDFOR» } '''