-package org.opendaylight.yangtools.sal.java.api.generator
-
-import java.util.List
-import java.util.Map
-import org.opendaylight.yangtools.binding.generator.util.TypeConstants
-import org.opendaylight.yangtools.sal.binding.model.api.Constant
-import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
-import org.opendaylight.yangtools.sal.binding.model.api.Type
-
-class ClassTemplate {
-
- val GeneratedTransferObject genTO
- val Map<String, String> imports
- val List<GeneratedProperty> fields
- val List<Enumeration> enums
- val List<Constant> consts
-
- new(GeneratedTransferObject genTO) {
- if (genTO == null) {
- throw new IllegalArgumentException("Generated transfer object reference cannot be NULL!")
- }
-
- this.genTO = genTO
- this.imports = GeneratorUtil.createImports(genTO)
- this.fields = genTO.properties
- this.enums = genTO.enumerations
- this.consts = genTO.constantDefinitions
- }
-
- def generate() {
- val body = generateBody(false)
- val pkgAndImports = generatePkgAndImports
- return pkgAndImports.toString + body.toString
- }
-
- def generateAsInnerClass() {
- return generateBody(true)
- }
-
- def private generateBody(boolean isInnerClass) '''
- «genTO.comment.generateComment»
- «generateClassDeclaration(isInnerClass)» {
-
- «generateEnums»
-
- «generateConstants»
-
- «generateFields»
-
- «generateConstructor»
-
- «FOR field : fields SEPARATOR "\n"»
- «field.generateGetter»
- «IF !field.readOnly»
-
- «field.generateSetter»
- «ENDIF»
- «ENDFOR»
-
- «generateHashCode»
-
- «generateEquals»
-
- «generateToString»
-
- }
- '''
-
- def private generateComment(String comment) '''
- «IF comment != null && !comment.empty»
- /*
- «comment»
- */
- «ENDIF»
- '''
-
- def private generateClassDeclaration(boolean isInnerClass) '''
- public«
- IF (isInnerClass)»«
- " static final "»«
- ELSEIF (genTO.abstract)»«
- " abstract "»«
- ELSE»«
- " "»«
- ENDIF»class «genTO.name»«
- IF (genTO.extends != null)»«
- " extends "»«genTO.extends.resolveName»«
- ENDIF»«
- IF (!genTO.implements.empty)»«
- " implements "»«
- FOR type : genTO.implements SEPARATOR ", "»«
- type.resolveName»«
- ENDFOR»«
- ENDIF
- »'''
-
- def private generateEnums() '''
- «IF !enums.empty»
- «FOR e : enums SEPARATOR "\n"»
- «val enumTemplate = new EnumTemplate(e)»
- «enumTemplate.generateAsInnerClass»
- «ENDFOR»
- «ENDIF»
- '''
-
- def private generateConstants() '''
- «IF !consts.empty»
- «FOR c : consts»
- «IF c.name == TypeConstants.PATTERN_CONSTANT_NAME»
- «val cValue = c.value»
- «IF cValue instanceof List<?>»
- «val cValues = cValue as List<?>»
- private static final List<Pattern> «Constants.MEMBER_PATTERN_LIST» = new ArrayList<Pattern>();
- public static final List<String> «TypeConstants.PATTERN_CONSTANT_NAME» = Arrays.asList(«
- FOR v : cValues SEPARATOR ", "»«
- IF v instanceof String»"«
- v as String»"«
- ENDIF»«
- ENDFOR»);
-
- «generateStaticInicializationBlock»
- «ENDIF»
- «ELSE»
- public static final «c.type.resolveName» «c.name» = «c.value»;
- «ENDIF»
- «ENDFOR»
- «ENDIF»
- '''
-
- def private generateStaticInicializationBlock() '''
- static {
- for (String regEx : «TypeConstants.PATTERN_CONSTANT_NAME») {
- «Constants.MEMBER_PATTERN_LIST».add(Pattern.compile(regEx));
- }
- }
- '''
- def private generateFields() '''
- «IF !fields.empty»
- «FOR f : fields»
- private «f.returnType.resolveName» «f.name»;
- «ENDFOR»
- «ENDIF»
- '''
-
- def private generateConstructor() '''
- «val genTOTopParent = GeneratorUtil.getTopParrentTransportObject(genTO)»
- «val properties = GeneratorUtil.resolveReadOnlyPropertiesFromTO(genTO.properties)»
- «val propertiesAllParents = GeneratorUtil.getPropertiesOfAllParents(genTO)»
- «IF !genTO.unionType»
-««« create constructor for every parent property
- «IF genTOTopParent != genTO && genTOTopParent.unionType»
- «FOR parentProperty : propertiesAllParents SEPARATOR "\n"»
- «val parentPropertyAndProperties = properties + #[parentProperty]»
- «if (genTO.abstract) "protected" else "public"» «genTO.name»(«parentPropertyAndProperties.generateParameters») {
- super(«#[parentProperty].generateParameterNames»);
- «FOR property : properties»
- this.«property.name» = «property.name»;
- «ENDFOR»
- }
- «ENDFOR»
-««« create one constructor
- «ELSE»
- «val propertiesAll = propertiesAllParents + properties»
- «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertiesAll.generateParameters») {
- super(«propertiesAllParents.generateParameterNames()»);
- «FOR property : properties»
- this.«property.name» = «property.name»;
- «ENDFOR»
- }
- «ENDIF»
-««« create constructor for every property
- «ELSE»
- «FOR property : properties SEPARATOR "\n"»
- «val propertyAndTopParentProperties = propertiesAllParents + #[property]»
- «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertyAndTopParentProperties.generateParameters») {
- super(«propertiesAllParents.generateParameterNames()»);
- this.«property.name» = «property.name»;
- }
- «ENDFOR»
- «ENDIF»
- '''
-
- def private generateGetter(GeneratedProperty field) '''
- public «field.returnType.resolveName» get«field.name.toFirstUpper»() {
- return «field.name»;
- }
- '''
-
- def private generateSetter(GeneratedProperty field) '''
- «val type = field.returnType.resolveName»
- public void set«field.name.toFirstUpper»(«type» «field.name») {
- this.«field.name» = «field.name»;
- }
- '''
-
- def private generateParameters(Iterable<GeneratedProperty> parameters) '''«
- IF !parameters.empty»«
- FOR parameter : parameters SEPARATOR ", "»«
- parameter.returnType.resolveName» «parameter.name»«
- ENDFOR»«
- ENDIF
- »'''
-
- def private generateParameterNames(Iterable<GeneratedProperty> parameters) '''«
- IF !parameters.empty»«
- FOR parameter : parameters SEPARATOR ", "»«
- parameter.name»«
- ENDFOR»«
- ENDIF
- »'''
-
- def private generateHashCode() '''
- «IF !genTO.hashCodeIdentifiers.empty»
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- «FOR property : genTO.hashCodeIdentifiers»
- result = prime * result + ((«property.name» == null) ? 0 : «property.name».hashCode());
- «ENDFOR»
- return result;
- }
- «ENDIF»
- '''
- def private generateEquals() '''
- «IF !genTO.equalsIdentifiers.empty»
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- «genTO.name» other = («genTO.name») obj;
- «FOR property : genTO.equalsIdentifiers»
- «val fieldName = property.name»
- if («fieldName» == null) {
- if (other.«fieldName» != null) {
- return false;
- }
- } else if(!«fieldName».equals(other.«fieldName»)) {
- return false;
- }
- «ENDFOR»
- return true;
- }
- «ENDIF»
- '''
-
- def private generateToString() '''
- «IF !genTO.toStringIdentifiers.empty»
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder();
- «val properties = genTO.toStringIdentifiers»
- builder.append("«genTO.name» [«properties.get(0).name»=");
- builder.append(«properties.get(0).name»);
- «FOR i : 1..<genTO.toStringIdentifiers.size»
- builder.append(", «properties.get(i).name»=");
- builder.append(«properties.get(i).name»);
- «ENDFOR»
- builder.append("]");
- return builder.toString();
- }
- «ENDIF»
- '''
-
- def private generatePkgAndImports() '''
- package «genTO.packageName»;
-
-
- «IF !imports.empty»
- «FOR entry : imports.entrySet»
- import «entry.value».«entry.key»;
- «ENDFOR»
- «ENDIF»
-
- '''
-
- def private resolveName(Type type) {
- GeneratorUtil.putTypeIntoImports(genTO, type, imports);
- GeneratorUtil.getExplicitType(genTO, type, imports)
- }
-
-}
\ No newline at end of file
+package org.opendaylight.yangtools.sal.java.api.generator\r
+\r
+import java.util.List\r
+import org.opendaylight.yangtools.binding.generator.util.TypeConstants\r
+import org.opendaylight.yangtools.sal.binding.model.api.Constant\r
+import org.opendaylight.yangtools.sal.binding.model.api.Enumeration\r
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty\r
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject\r
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType\r
+import java.util.ArrayList\r
+import java.util.Collections\r
+\r
+/**\r
+ * Template for generating JAVA class. \r
+ */\r
+class ClassTemplate extends BaseTemplate {\r
+\r
+ protected val List<GeneratedProperty> properties\r
+ protected val List<GeneratedProperty> finalProperties\r
+ protected val List<GeneratedProperty> parentProperties\r
+ protected val Iterable<GeneratedProperty> allProperties;\r
+ \r
+ /**\r
+ * List of enumeration which are generated as JAVA enum type.\r
+ */\r
+ protected val List<Enumeration> enums\r
+ \r
+ /**\r
+ * List of constant instances which are generated as JAVA public static final attributes.\r
+ */\r
+ protected val List<Constant> consts\r
+ \r
+ /**\r
+ * List of generated types which are enclosed inside <code>genType</code>\r
+ */\r
+ protected val List<GeneratedType> enclosedGeneratedTypes;\r
+ \r
+ \r
+ protected val GeneratedTransferObject genTO;\r
+\r
+ /**\r
+ * Creates instance of this class with concrete <code>genType</code>.\r
+ * \r
+ * @param genType generated transfer object which will be transformed to JAVA class source code\r
+ */\r
+ new(GeneratedTransferObject genType) {\r
+ super(genType)\r
+ this.genTO = genType\r
+ this.properties = genType.properties\r
+ this.finalProperties = GeneratorUtil.resolveReadOnlyPropertiesFromTO(genTO.properties)\r
+ this.parentProperties = GeneratorUtil.getPropertiesOfAllParents(genTO)\r
+\r
+ var List<GeneratedProperty> sorted = new ArrayList<GeneratedProperty>();\r
+ sorted.addAll(properties);\r
+ sorted.addAll(parentProperties);\r
+ Collections.sort(sorted, new PropertyComparator());\r
+ \r
+ this.allProperties = sorted\r
+ this.enums = genType.enumerations\r
+ this.consts = genType.constantDefinitions\r
+ this.enclosedGeneratedTypes = genType.enclosedTypes\r
+ }\r
+ \r
+\r
+ \r
+ \r
+ \r
+ /**\r
+ * Generates JAVA class source code (class body only).\r
+ * \r
+ * @return string with JAVA class body source code\r
+ */\r
+ def CharSequence generateAsInnerClass() {\r
+ return generateBody(true)\r
+ }\r
+ \r
+\r
+ \r
+ override protected body() {\r
+ generateBody(false);\r
+ }\r
+\r
+ /**\r
+ * Template method which generates class body.\r
+ * \r
+ * @param isInnerClass boolean value which specify if generated class is|isn't inner\r
+ * @return string with class source code in JAVA format\r
+ */\r
+ def protected generateBody(boolean isInnerClass) '''\r
+ «type.comment.asJavadoc»\r
+ «generateClassDeclaration(isInnerClass)» {\r
+ «innerClassesDeclarations»\r
+ «enumDeclarations»\r
+ «constantsDeclarations»\r
+ «generateFields»\r
+ «constructors»\r
+ «FOR field : properties SEPARATOR "\n"»\r
+ «field.getterMethod»\r
+ «IF !field.readOnly»\r
+ «field.setterMethod»\r
+ «ENDIF»\r
+ «ENDFOR»\r
+ «generateHashCode»\r
+ «generateEquals»\r
+ «generateToString»\r
+ \r
+ }\r
+ '''\r
+ \r
+ \r
+ /**\r
+ * Template method which generates inner classes inside this interface.\r
+ * \r
+ * @return string with the source code for inner classes in JAVA format\r
+ */\r
+ def protected innerClassesDeclarations() '''\r
+ «IF !enclosedGeneratedTypes.empty»\r
+ «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»\r
+ «IF (innerClass instanceof GeneratedTransferObject)»\r
+ «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»\r
+ «classTemplate.generateAsInnerClass»\r
+ \r
+ «ENDIF»\r
+ «ENDFOR»\r
+ «ENDIF»\r
+ '''\r
+ \r
+ \r
+ def protected constructors() '''\r
+ «allValuesConstructor»\r
+ «IF !allProperties.empty»\r
+ «copyConstructor»\r
+ «ENDIF»\r
+ «IF properties.empty && !parentProperties.empty »\r
+ «parentConstructor»\r
+ «ENDIF»\r
+ '''\r
+ \r
+ def protected allValuesConstructor() '''\r
+ public «type.name»(«allProperties.asArgumentsDeclaration») {\r
+ «IF false == parentProperties.empty»\r
+ super(«parentProperties.asArguments»);\r
+ «ENDIF»\r
+ «FOR p : properties» \r
+ this.«p.fieldName» = «p.fieldName»;\r
+ «ENDFOR»\r
+ }\r
+ '''\r
+ \r
+ \r
+ def protected copyConstructor() '''\r
+ /**\r
+ * Creates a copy from Source Object.\r
+ *\r
+ * @param source Source object\r
+ */\r
+ public «type.name»(«type.name» source) {\r
+ «IF false == parentProperties.empty»\r
+ super(source);\r
+ «ENDIF»\r
+ «FOR p : properties» \r
+ this.«p.fieldName» = source.«p.fieldName»;\r
+ «ENDFOR»\r
+ }\r
+ '''\r
+ \r
+ def protected parentConstructor() '''\r
+ /**\r
+ * Creates a new instance from «genTO.superType.importedName»\r
+ *\r
+ * @param source Source object\r
+ */\r
+ public «type.name»(«genTO.superType.importedName» source) {\r
+ super(source);\r
+ }\r
+ '''\r
+ \r
+\r
+ \r
+ /**\r
+ * Template method which generates JAVA class declaration.\r
+ * \r
+ * @param isInnerClass boolean value which specify if generated class is|isn't inner\r
+ * @return string with class declaration in JAVA format\r
+ */\r
+ def protected generateClassDeclaration(boolean isInnerClass) '''\r
+ public«\r
+ IF (isInnerClass)»«\r
+ " static final "»«\r
+ ELSEIF (type.abstract)»«\r
+ " abstract "»«\r
+ ELSE»«\r
+ " "»«\r
+ ENDIF»class «type.name»«\r
+ IF (genTO.superType != null)»«\r
+ " extends "»«genTO.superType.importedName»«\r
+ ENDIF»\r
+ «IF (!type.implements.empty)»«\r
+ " implements "»«\r
+ FOR type : type.implements SEPARATOR ", "»«\r
+ type.importedName»«\r
+ ENDFOR»«\r
+ ENDIF\r
+ »'''\r
+ \r
+ /**\r
+ * Template method which generates JAVA enum type.\r
+ * \r
+ * @return string with inner enum source code in JAVA format\r
+ */\r
+ def protected enumDeclarations() '''\r
+ «IF !enums.empty»\r
+ «FOR e : enums SEPARATOR "\n"»\r
+ «val enumTemplate = new EnumTemplate(e)»\r
+ «enumTemplate.generateAsInnerClass»\r
+ «ENDFOR»\r
+ «ENDIF»\r
+ '''\r
+ \r
+ /**\r
+ * Template method wich generates JAVA constants.\r
+ * \r
+ * @return string with constants in JAVA format \r
+ */\r
+ def protected constantsDeclarations() '''\r
+ «IF !consts.empty»\r
+ «FOR c : consts»\r
+ «IF c.name == TypeConstants.PATTERN_CONSTANT_NAME»\r
+ «val cValue = c.value»\r
+ «IF cValue instanceof List<?>»\r
+ «val cValues = cValue as List<?>»\r
+ private static final List<Pattern> «Constants.MEMBER_PATTERN_LIST» = new ArrayList<Pattern>();\r
+ public static final List<String> «TypeConstants.PATTERN_CONSTANT_NAME» = java.util.Arrays.asList(«\r
+ FOR v : cValues SEPARATOR ", "»«\r
+ IF v instanceof String»"«\r
+ v as String»"«\r
+ ENDIF»«\r
+ ENDFOR»);\r
+\r
+ «generateStaticInicializationBlock»\r
+ «ENDIF»\r
+ «ELSE»\r
+ public static final «c.type.importedName» «c.name» = «c.value»;\r
+ «ENDIF»\r
+ «ENDFOR»\r
+ «ENDIF»\r
+ '''\r
+\r
+ /**\r
+ * Template method which generates JAVA static initialization block.\r
+ *\r
+ * @return string with static initialization block in JAVA format\r
+ */\r
+ def protected generateStaticInicializationBlock() '''\r
+ static {\r
+ for (String regEx : «TypeConstants.PATTERN_CONSTANT_NAME») {\r
+ «Constants.MEMBER_PATTERN_LIST».add(Pattern.compile(regEx));\r
+ }\r
+ }\r
+ '''\r
+\r
+ /**\r
+ * Template method which generates JAVA class attributes.\r
+ *\r
+ * @return string with the class attributes in JAVA format\r
+ */\r
+ def protected generateFields() '''\r
+ «IF !properties.empty»\r
+ «FOR f : properties»\r
+ «IF f.readOnly»final«ENDIF» private «f.returnType.importedName» «f.fieldName»;\r
+ «ENDFOR»\r
+ «ENDIF»\r
+ '''\r
+\r
+\r
+ /**\r
+ * Template method which generates the method <code>hashCode()</code>.\r
+ *\r
+ * @return string with the <code>hashCode()</code> method definition in JAVA format\r
+ */\r
+ def protected generateHashCode() '''\r
+ «IF !genTO.hashCodeIdentifiers.empty»\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ «FOR property : genTO.hashCodeIdentifiers»\r
+ «IF property.returnType.name.contains("[")»\r
+ result = prime * result + ((«property.fieldName» == null) ? 0 : java.util.Arrays.hashCode(«property.fieldName»));\r
+ «ELSE»\r
+ result = prime * result + ((«property.fieldName» == null) ? 0 : «property.fieldName».hashCode());\r
+ «ENDIF»\r
+ «ENDFOR»\r
+ return result;\r
+ }\r
+ «ENDIF»\r
+ '''\r
+\r
+ /**\r
+ * Template method which generates the method <code>equals()</code>.\r
+ *\r
+ * @return string with the <code>equals()</code> method definition in JAVA format\r
+ */\r
+ def protected generateEquals() '''\r
+ «IF !genTO.equalsIdentifiers.empty»\r
+ @Override\r
+ public boolean equals(java.lang.Object obj) {\r
+ if (this == obj) {\r
+ return true;\r
+ }\r
+ if (obj == null) {\r
+ return false;\r
+ }\r
+ if (getClass() != obj.getClass()) {\r
+ return false;\r
+ }\r
+ «type.name» other = («type.name») obj;\r
+ «FOR property : genTO.equalsIdentifiers»\r
+ «val fieldName = property.fieldName»\r
+ if («fieldName» == null) {\r
+ if (other.«fieldName» != null) {\r
+ return false;\r
+ }\r
+ «IF property.returnType.name.contains("[")»\r
+ } else if(!java.util.Arrays.equals(«fieldName», other.«fieldName»)) {\r
+ «ELSE»\r
+ } else if(!«fieldName».equals(other.«fieldName»)) {\r
+ «ENDIF»\r
+ return false;\r
+ }\r
+ «ENDFOR»\r
+ return true;\r
+ }\r
+ «ENDIF»\r
+ '''\r
+\r
+ /**\r
+ * Template method which generates the method <code>toString()</code>.\r
+ *\r
+ * @return string with the <code>toString()</code> method definition in JAVA format\r
+ */\r
+ def protected generateToString() '''\r
+ «IF !genTO.toStringIdentifiers.empty»\r
+ @Override\r
+ public String toString() {\r
+ StringBuilder builder = new StringBuilder();\r
+ «val properties = genTO.toStringIdentifiers»\r
+ builder.append("«type.name» [«properties.get(0).fieldName»=");\r
+ «IF properties.get(0).returnType.name.contains("[")»\r
+ builder.append(java.util.Arrays.toString(«properties.get(0).fieldName»));\r
+ «ELSE»\r
+ builder.append(«properties.get(0).fieldName»);\r
+ «ENDIF»\r
+ «FOR i : 1..<genTO.toStringIdentifiers.size»\r
+ builder.append(", «properties.get(i).fieldName»=");\r
+ «IF properties.get(i).returnType.name.contains("[")»\r
+ builder.append(java.util.Arrays.toString(«properties.get(i).fieldName»));\r
+ «ELSE»\r
+ builder.append(«properties.get(i).fieldName»);\r
+ «ENDIF»\r
+ «ENDFOR»\r
+ builder.append("]");\r
+ return builder.toString();\r
+ }\r
+ «ENDIF»\r
+ '''\r
+ \r
+}\r