+/**\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
+ protected val Restrictions restrictions\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
+ this.restrictions = genType.restrictions\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
+ * 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
+ 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
+ «suidDeclaration»\r
+ «innerClassesDeclarations»\r
+ «enumDeclarations»\r
+ «constantsDeclarations»\r
+ «generateFields»\r
+\r
+ «constructors»\r
+ \r
+ «defaultInstance»\r
+\r
+ «FOR field : properties SEPARATOR "\n"»\r
+ «field.getterMethod»\r
+ «IF !field.readOnly»\r
+ «field.setterMethod»\r
+ «ENDIF»\r
+ «ENDFOR»\r
+\r
+ «generateHashCode»\r
+\r
+ «generateEquals»\r
+\r
+ «generateToString(genTO.toStringIdentifiers)»\r
+\r
+ «generateGetLength»\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
+ «IF genTO.unionType»\r
+ «genUnionConstructor»\r
+ «ELSE»\r
+ «allValuesConstructor»\r
+ «ENDIF»\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
+ «IF genTO.typedef && !allProperties.empty && allProperties.size == 1 && allProperties.get(0).name.equals("value")»\r
+ @«ConstructorProperties.importedName»("value")\r
+ «ENDIF»\r
+ public «type.name»(«allProperties.asArgumentsDeclaration») {\r
+ «IF false == parentProperties.empty»\r
+ super(«parentProperties.asArguments»);\r
+ «ENDIF»\r
+ «FOR p : allProperties» \r
+ «generateRestrictions(type, p.fieldName.toString, p.returnType)»\r
+ «ENDFOR»\r
+ «FOR p : properties» \r
+ this.«p.fieldName» = «p.fieldName»;\r
+ «ENDFOR»\r
+ }\r
+ '''\r
+\r
+ def protected genUnionConstructor() '''\r
+ «FOR p : allProperties»\r
+ «val List<GeneratedProperty> other = new ArrayList(properties)»\r
+ «val added = other.remove(p)»\r
+ «genConstructor(p, other)»\r
+ «ENDFOR»\r
+\r
+ '''\r
+\r
+ def protected genConstructor(GeneratedProperty property, GeneratedProperty... other) '''\r
+ public «type.name»(«property.returnType.importedName + " " + property.name») {\r
+ «IF false == parentProperties.empty»\r
+ super(«parentProperties.asArguments»);\r
+ «ENDIF»\r
+ «generateRestrictions(type, property.fieldName.toString, property.returnType)»\r
+ this.«property.fieldName» = «property.name»;\r
+ «FOR p : other»\r
+ this.«p.fieldName» = null;\r
+ «ENDFOR»\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
+ def protected defaultInstance() '''\r
+ «IF genTO.typedef && !allProperties.empty && !genTO.unionType»\r
+ «val prop = allProperties.get(0)»\r
+ «IF !("org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(prop.returnType.fullyQualifiedName))»\r
+ public static «genTO.name» getDefaultInstance(String defaultValue) {\r
+ «IF "byte[]".equals(prop.returnType.name)»\r
+ «BaseEncoding.importedName» baseEncoding = «BaseEncoding.importedName».base64(); \r
+ return new «genTO.name»(baseEncoding.decode(defaultValue));\r
+ «ELSEIF "java.lang.String".equals(prop.returnType.fullyQualifiedName)»\r
+ return new «genTO.name»(defaultValue);\r
+ «ELSEIF allProperties.size > 1»\r
+ «bitsArgs»\r
+ «ELSE»\r
+ return new «genTO.name»(new «prop.returnType.importedName»(defaultValue));\r
+ «ENDIF»\r
+ }\r
+ «ENDIF»\r
+ «ENDIF»\r
+ '''\r
+\r
+ def protected bitsArgs() '''\r
+ «List.importedName»<«String.importedName»> properties = «Lists.importedName».newArrayList(«allProperties.propsAsArgs»);\r
+ if (!properties.contains(defaultValue)) {\r
+ throw new «IllegalArgumentException.importedName»("invalid default parameter");\r
+ }\r
+ int i = 0;\r
+ return new «genTO.name»(\r
+ «FOR prop : allProperties SEPARATOR ","»\r
+ properties.get(i++).equals(defaultValue) ? new «Boolean.importedName»("true") : null\r
+ «ENDFOR»\r
+ );\r
+ '''\r
+\r
+ def protected propsAsArgs(Iterable<GeneratedProperty> properties) '''\r
+ «FOR prop : properties SEPARATOR ","»\r
+ "«prop.name»"\r
+ «ENDFOR»\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
+ def protected suidDeclaration() '''\r
+ «IF genTO.SUID != null»\r
+ private static final long serialVersionUID = «genTO.SUID.value»L; \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.importedName»<«Pattern.importedName»> «Constants.MEMBER_PATTERN_LIST» = new «ArrayList.importedName»<«Pattern.importedName»>();\r
+ public static final «List.importedName»<String> «TypeConstants.PATTERN_CONSTANT_NAME» = «Arrays.importedName».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 : «Arrays.importedName».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(!«Arrays.importedName».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
+ def private generateGetLength() '''\r
+ «IF restrictions != null && !(restrictions.lengthConstraints.empty)»\r
+ public static «List.importedName»<«Range.importedName»<Integer>> getLength() {\r
+ final «List.importedName»<«Range.importedName»<Integer>> result = new «ArrayList.importedName»<>();\r
+ «FOR r : restrictions.lengthConstraints»\r
+ result.add(«Range.importedName».closed(«r.min», «r.max»));\r
+ «ENDFOR»\r
+ return result;\r
+ }\r
+ «ENDIF»\r
+ '''\r
+\r
+ def private generateGetRange() '''\r
+ «IF restrictions != null && !(restrictions.lengthConstraints.empty)»\r
+ public static «List.importedName»<«Range.importedName»<Integer>> getLength() {\r
+ final «List.importedName»<«Range.importedName»<Integer>> result = new «ArrayList.importedName»<>();\r
+ «List.importedName»<«Range.importedName»<«Integer.importedName»>> lengthConstraints = new «ArrayList.importedName»<>(); \r
+ «FOR r : restrictions.lengthConstraints»\r
+ result.add(«Range.importedName».closed(«r.min», «r.max»));\r
+ «ENDFOR»\r
+ return result;\r
+ }\r
+ «ENDIF»\r
+ '''\r
+\r
+}\r