1 package org.opendaylight.controller.sal.java.api.generator
5 import org.opendaylight.controller.binding.generator.util.TypeConstants
6 import org.opendaylight.controller.sal.binding.model.api.Constant
7 import org.opendaylight.controller.sal.binding.model.api.Enumeration
8 import org.opendaylight.controller.sal.binding.model.api.GeneratedProperty
9 import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject
10 import org.opendaylight.controller.sal.binding.model.api.Type
14 val GeneratedTransferObject genTO
15 val Map<String, String> imports
16 val List<GeneratedProperty> fields
17 val List<Enumeration> enums
18 val List<Constant> consts
20 new(GeneratedTransferObject genTO) {
22 throw new IllegalArgumentException("Generated transfer object reference cannot be NULL!")
26 this.imports = GeneratorUtil.createImports(genTO)
27 this.fields = genTO.properties
28 this.enums = genTO.enumerations
29 this.consts = genTO.constantDefinitions
33 val body = generateBody(false)
34 val pkgAndImports = generatePkgAndImports
35 return pkgAndImports.toString + body.toString
38 def generateAsInnerClass() {
39 return generateBody(true)
42 def private generateBody(boolean isInnerClass) '''
43 «genTO.comment.generateComment»
44 «generateClassDeclaration(isInnerClass)» {
54 «FOR field : fields SEPARATOR "\n"»
55 «field.generateGetter»
58 «field.generateSetter»
71 def private generateComment(String comment) '''
72 «IF comment != null && !comment.empty»
79 def private generateClassDeclaration(boolean isInnerClass) '''
83 ELSEIF (genTO.abstract)»«
87 ENDIF»class «genTO.name»«
88 IF (genTO.extends != null)»«
89 " extends "»«genTO.extends.resolveName»«
91 IF (!genTO.implements.empty)»«
93 FOR type : genTO.implements SEPARATOR ", "»«
99 def private generateEnums() '''
101 «FOR e : enums SEPARATOR "\n"»
102 «val enumTemplate = new EnumTemplate(e)»
103 «enumTemplate.generateAsInnerClass»
108 def private generateConstants() '''
111 «IF c.name == TypeConstants.PATTERN_CONSTANT_NAME»
112 «val cValue = c.value»
113 «IF cValue instanceof List<?>»
114 «val cValues = cValue as List<?>»
115 private static final List<Pattern> «Constants.MEMBER_PATTERN_LIST» = new ArrayList<Pattern>();
116 public static final List<String> «TypeConstants.PATTERN_CONSTANT_NAME» = Arrays.asList(«
117 FOR v : cValues SEPARATOR ", "»«
118 IF v instanceof String»"«
123 «generateStaticInicializationBlock»
126 public static final «c.type.resolveName» «c.name» = «c.value»;
132 def private generateStaticInicializationBlock() '''
134 for (String regEx : «TypeConstants.PATTERN_CONSTANT_NAME») {
135 «Constants.MEMBER_PATTERN_LIST».add(Pattern.compile(regEx));
139 def private generateFields() '''
142 private «f.returnType.resolveName» «f.name»;
147 def private generateConstructor() '''
148 «val genTOTopParent = GeneratorUtil.getTopParrentTransportObject(genTO)»
149 «val properties = GeneratorUtil.resolveReadOnlyPropertiesFromTO(genTO.properties)»
150 «val propertiesAllParents = GeneratorUtil.getPropertiesOfAllParents(genTO)»
151 «IF !genTO.unionType»
152 ««« create constructor for every parent property
153 «IF genTOTopParent != genTO && genTOTopParent.unionType»
154 «FOR parentProperty : propertiesAllParents SEPARATOR "\n"»
155 «val parentPropertyAndProperties = properties + #[parentProperty]»
156 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«parentPropertyAndProperties.generateParameters») {
157 super(«#[parentProperty].generateParameterNames»);
158 «FOR property : properties»
159 this.«property.name» = «property.name»;
163 ««« create one constructor
165 «val propertiesAll = propertiesAllParents + properties»
166 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertiesAll.generateParameters») {
167 super(«propertiesAllParents.generateParameterNames()»);
168 «FOR property : properties»
169 this.«property.name» = «property.name»;
173 ««« create constructor for every property
175 «FOR property : properties SEPARATOR "\n"»
176 «val propertyAndTopParentProperties = propertiesAllParents + #[property]»
177 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertyAndTopParentProperties.generateParameters») {
178 super(«propertiesAllParents.generateParameterNames()»);
179 this.«property.name» = «property.name»;
185 def private generateGetter(GeneratedProperty field) '''
186 public «field.returnType.resolveName» get«field.name.toFirstUpper»() {
191 def private generateSetter(GeneratedProperty field) '''
192 «val type = field.returnType.resolveName»
193 public void set«field.name.toFirstUpper»(«type» «field.name») {
194 this.«field.name» = «field.name»;
198 def private generateParameters(Iterable<GeneratedProperty> parameters) '''«
199 IF !parameters.empty»«
200 FOR parameter : parameters SEPARATOR ", "»«
201 parameter.returnType.resolveName» «parameter.name»«
206 def private generateParameterNames(Iterable<GeneratedProperty> parameters) '''«
207 IF !parameters.empty»«
208 FOR parameter : parameters SEPARATOR ", "»«
214 def private generateHashCode() '''
215 «IF !genTO.hashCodeIdentifiers.empty»
217 public int hashCode() {
218 final int prime = 31;
220 «FOR property : genTO.hashCodeIdentifiers»
221 result = prime * result + ((«property.name» == null) ? 0 : «property.name».hashCode());
227 def private generateEquals() '''
228 «IF !genTO.equalsIdentifiers.empty»
230 public boolean equals(Object obj) {
237 if (getClass() != obj.getClass()) {
240 «genTO.name» other = («genTO.name») obj;
241 «FOR property : genTO.equalsIdentifiers»
242 «val fieldName = property.name»
243 if («fieldName» == null) {
244 if (other.«fieldName» != null) {
247 } else if(!«fieldName».equals(other.«fieldName»)) {
256 def private generateToString() '''
257 «IF !genTO.toStringIdentifiers.empty»
259 public String toString() {
260 StringBuilder builder = new StringBuilder();
261 «val properties = genTO.toStringIdentifiers»
262 builder.append("«genTO.name» [«properties.get(0).name»=");
263 builder.append(«properties.get(0).name»);
264 «FOR i : 1..<genTO.toStringIdentifiers.size»
265 builder.append(", «properties.get(i).name»=");
266 builder.append(«properties.get(i).name»);
269 return builder.toString();
274 def private generatePkgAndImports() '''
275 package «genTO.packageName»;
279 «FOR entry : imports.entrySet»
280 import «entry.value».«entry.key»;
286 def private resolveName(Type type) {
287 GeneratorUtil.putTypeIntoImports(genTO, type, imports);
288 GeneratorUtil.getExplicitType(genTO, type, imports)