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=4779907d5792efe1578be54ec177c27bb2f85a7b;hb=d98a0c1eeac636d14d0d4b576e1e01bde9722ff1;hp=8ec3b584097e96d1444decbb0f0a109daeaee04b;hpb=12b9a4a5099fea3f3dcc58370271311c015b3d7b;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 8ec3b58409..4779907d57 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,21 +7,34 @@
*/
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.Types.getOuterClassName;
+import static org.opendaylight.mdsal.binding.model.ri.BaseYangTypes.BINARY_TYPE;
+import static org.opendaylight.mdsal.binding.model.ri.BaseYangTypes.BOOLEAN_TYPE;
+import static org.opendaylight.mdsal.binding.model.ri.BaseYangTypes.EMPTY_TYPE;
+import static org.opendaylight.mdsal.binding.model.ri.BaseYangTypes.STRING_TYPE;
+import static org.opendaylight.mdsal.binding.model.ri.Types.STRING;
+import static org.opendaylight.mdsal.binding.model.ri.Types.getOuterClassName;
+import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.BUILDER_SUFFIX
-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
.
+ *
+ * @param genType generated transfer object which will be transformed to JAVA class source code
+ */
+ new(NestedJavaGeneratedType javaType, GeneratedTransferObject genType) {
+ super(javaType, genType)
+ }
/**
* Creates instance of this class with concrete genType
.
@@ -30,23 +43,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() '''
@@ -58,53 +54,39 @@ 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»
'''
def typeBuilder() {
val outerCls = getOuterClassName(type);
- if(outerCls !== null) {
- return outerCls + type.name + "Builder"
+ if (outerCls !== null) {
+ return outerCls + type.name + BUILDER_SUFFIX
}
- return type.name + "Builder"
+ return type.name + BUILDER_SUFFIX
}
private def unionConstructorsParentProperties() '''
@@ -115,73 +97,79 @@ class UnionTemplate extends ClassTemplate {
«ENDFOR»
'''
- override protected getterMethod(GeneratedProperty field) {
- if (!"value".equals(field.name)) {
- return super.getterMethod(field)
+ 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»
+ ««« type int* or enumeration*
+ return «field».toString();
+ «ELSEIF "org.opendaylight.yangtools.yang.common".equals(propRet.packageName)
+ && (propRet.name.startsWith("Uint") || "Decimal64".equals(propRet.name))»
+ ««« type uint*, decimal64
+ 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.isBitsType»
+ ««« generated bits typedef
+ return «JU_ARRAYS.importedName».toString(«field».getValue());
+ «ELSE»
+ ««« generated type
+ return «field».getValue().toString();
+ «ENDIF»
+ }
+ «ENDFOR»
+ throw new IllegalStateException("No value assigned");
}
+ '''
- 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();
- }
- '''
+ private static def isBitsType(Type type) {
+ if (type instanceof GeneratedTransferObject) {
+ return type.typedef && type.baseType instanceof BitsTypeDefinition
+ }
+ return false
}
- 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() '''
@@ -194,15 +182,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»
}
'''