1 package org.opendaylight.yangtools.sal.java.api.generator
5 import org.opendaylight.yangtools.binding.generator.util.TypeConstants
6 import org.opendaylight.yangtools.sal.binding.model.api.Constant
7 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
8 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
9 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
10 import org.opendaylight.yangtools.sal.binding.model.api.Type
11 import org.opendaylight.yangtools.binding.generator.util.Types
15 val GeneratedTransferObject genTO
16 val Map<String, String> imports
17 val List<GeneratedProperty> fields
18 val List<Enumeration> enums
19 val List<Constant> consts
21 new(GeneratedTransferObject genTO) {
23 throw new IllegalArgumentException("Generated transfer object reference cannot be NULL!")
27 this.imports = GeneratorUtil.createImports(genTO)
28 this.fields = genTO.properties
29 this.enums = genTO.enumerations
30 this.consts = genTO.constantDefinitions
33 def String generate() {
34 val body = generateBody(false)
35 val pkgAndImports = generatePkgAndImports
36 return pkgAndImports.toString + body.toString
39 def generateAsInnerClass() {
40 return generateBody(true)
43 def private generateBody(boolean isInnerClass) '''
44 «genTO.comment.generateComment»
45 «generateClassDeclaration(isInnerClass)» {
55 «FOR field : fields SEPARATOR "\n"»
56 «field.generateGetter»
59 «field.generateSetter»
72 def private generateComment(String comment) '''
73 «IF comment != null && !comment.empty»
80 def private generateClassDeclaration(boolean isInnerClass) '''
84 ELSEIF (genTO.abstract)»«
88 ENDIF»class «genTO.name»«
89 IF (genTO.extends != null)»«
90 " extends "»«genTO.extends.resolveName»«
92 IF (!genTO.implements.empty)»«
94 FOR type : genTO.implements SEPARATOR ", "»«
100 def private generateEnums() '''
102 «FOR e : enums SEPARATOR "\n"»
103 «val enumTemplate = new EnumTemplate(e)»
104 «enumTemplate.generateAsInnerClass»
109 def private generateConstants() '''
112 «IF c.name == TypeConstants.PATTERN_CONSTANT_NAME»
113 «val cValue = c.value»
114 «IF cValue instanceof List<?>»
115 «val cValues = cValue as List<?>»
116 private static final List<Pattern> «Constants.MEMBER_PATTERN_LIST» = new ArrayList<Pattern>();
117 public static final List<String> «TypeConstants.PATTERN_CONSTANT_NAME» = Arrays.asList(«
118 FOR v : cValues SEPARATOR ", "»«
119 IF v instanceof String»"«
124 «generateStaticInicializationBlock»
127 public static final «c.type.resolveName» «c.name» = «c.value»;
133 def private generateStaticInicializationBlock() '''
135 for (String regEx : «TypeConstants.PATTERN_CONSTANT_NAME») {
136 «Constants.MEMBER_PATTERN_LIST».add(Pattern.compile(regEx));
140 def private generateFields() '''
143 private «f.returnType.resolveName» «f.fieldName»;
148 def private generateConstructor() '''
149 «val genTOTopParent = GeneratorUtil.getTopParrentTransportObject(genTO)»
150 «val properties = GeneratorUtil.resolveReadOnlyPropertiesFromTO(genTO.properties)»
151 «val propertiesAllParents = GeneratorUtil.getPropertiesOfAllParents(genTO)»
152 «IF !genTO.unionType»
153 ««« create constructor for every parent property
154 «IF genTOTopParent != genTO && genTOTopParent.unionType»
155 «FOR parentProperty : propertiesAllParents SEPARATOR "\n"»
156 «val parentPropertyAndProperties = properties + #[parentProperty]»
157 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«parentPropertyAndProperties.generateParameters») {
158 super(«#[parentProperty].generateParameterNames»);
159 «FOR property : properties»
160 this.«property.fieldName» = «property.name»;
164 ««« create one constructor
166 «val propertiesAll = propertiesAllParents + properties»
167 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertiesAll.generateParameters») {
168 super(«propertiesAllParents.generateParameterNames()»);
169 «FOR property : properties»
170 this.«property.fieldName» = «property.fieldName»;
174 ««« create constructor for every property
176 «FOR property : properties SEPARATOR "\n"»
177 «val propertyAndTopParentProperties = propertiesAllParents + #[property]»
178 «if (genTO.abstract) "protected" else "public"» «genTO.name»(«propertyAndTopParentProperties.generateParameters») {
179 super(«propertiesAllParents.generateParameterNames()»);
180 this.«property.fieldName» = «property.fieldName»;
186 def private generateGetter(GeneratedProperty field) {
187 val prefix = if(field.returnType.equals(Types.typeForClass(Boolean))) "is" else "get"
189 public «field.returnType.resolveName» «prefix»«field.name.toFirstUpper»() {
190 return «field.fieldName»;
194 def private generateSetter(GeneratedProperty field) '''
195 «val type = field.returnType.resolveName»
196 public void set«field.name.toFirstUpper»(«type» «field.fieldName») {
197 this.«field.fieldName» = «field.fieldName»;
201 def private generateParameters(Iterable<GeneratedProperty> parameters) '''«
202 IF !parameters.empty»«
203 FOR parameter : parameters SEPARATOR ", "»«
204 parameter.returnType.resolveName» «parameter.fieldName»«
209 def private generateParameterNames(Iterable<GeneratedProperty> parameters) '''«
210 IF !parameters.empty»«
211 FOR parameter : parameters SEPARATOR ", "»«
212 parameter.fieldName»«
217 def private generateHashCode() '''
218 «IF !genTO.hashCodeIdentifiers.empty»
220 public int hashCode() {
221 final int prime = 31;
223 «FOR property : genTO.hashCodeIdentifiers»
224 result = prime * result + ((«property.fieldName» == null) ? 0 : «property.fieldName».hashCode());
230 def private generateEquals() '''
231 «IF !genTO.equalsIdentifiers.empty»
233 public boolean equals(java.lang.Object obj) {
240 if (getClass() != obj.getClass()) {
243 «genTO.name» other = («genTO.name») obj;
244 «FOR property : genTO.equalsIdentifiers»
245 «val fieldName = property.fieldName»
246 if («fieldName» == null) {
247 if (other.«fieldName» != null) {
250 } else if(!«fieldName».equals(other.«fieldName»)) {
259 def private generateToString() '''
260 «IF !genTO.toStringIdentifiers.empty»
262 public String toString() {
263 StringBuilder builder = new StringBuilder();
264 «val properties = genTO.toStringIdentifiers»
265 builder.append("«genTO.name» [«properties.get(0).fieldName»=");
266 builder.append(«properties.get(0).fieldName»);
267 «FOR i : 1..<genTO.toStringIdentifiers.size»
268 builder.append(", «properties.get(i).fieldName»=");
269 builder.append(«properties.get(i).fieldName»);
272 return builder.toString();
277 def private generatePkgAndImports() '''
278 package «genTO.packageName»;
282 «FOR entry : imports.entrySet»
283 import «entry.value».«entry.key»;
289 def private resolveName(Type type) {
290 GeneratorUtil.putTypeIntoImports(genTO, type, imports);
291 GeneratorUtil.getExplicitType(genTO, type, imports)
294 def private fieldName(GeneratedProperty property) {
295 '''_«property.name»'''