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.GeneratedTransferObject
9 import org.opendaylight.controller.sal.binding.model.api.GeneratedType
10 import org.opendaylight.controller.sal.binding.model.api.MethodSignature
11 import org.opendaylight.controller.sal.binding.model.api.Type
12 import java.util.LinkedHashMap
14 class InterfaceTemplate {
16 val GeneratedType genType
17 val Map<String, String> imports
18 val List<Constant> consts
19 val List<MethodSignature> methods
20 val List<Enumeration> enums
21 val List<GeneratedType> enclosedGeneratedTypes
23 new(GeneratedType genType) {
24 if (genType == null) {
25 throw new IllegalArgumentException("Generated type reference cannot be NULL!")
28 this.genType = genType
29 imports = GeneratorUtil.createImports(genType)
30 consts = genType.constantDefinitions
31 methods = genType.methodDefinitions
32 enums = genType.enumerations
33 enclosedGeneratedTypes = genType.enclosedTypes
37 val body = generateBody
38 val pkgAndImports = generatePkgAndImports
39 return pkgAndImports.toString + body.toString
42 def private generateBody() '''
43 «genType.comment.generateComment»
44 «generateIfcDeclaration» {
46 «generateInnerClasses»
58 def private generateComment(String comment) '''
59 «IF comment != null && !comment.empty»
66 def private generateIfcDeclaration() '''
67 public interface «genType.name»«
68 IF (!genType.implements.empty)»«
70 FOR type : genType.implements SEPARATOR ", "»«
76 def private generateInnerClasses() '''
77 «IF !enclosedGeneratedTypes.empty»
78 «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»
79 «IF (innerClass instanceof GeneratedTransferObject)»
80 «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»
81 «classTemplate.generateAsInnerClass»
87 def private generateEnums() '''
89 «FOR e : enums SEPARATOR "\n"»
90 «val enumTemplate = new EnumTemplate(e)»
91 «enumTemplate.generateAsInnerClass»
96 def private generateConstants() '''
99 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»
100 public static final «c.type.resolveName» «c.name» = «c.value»;
106 def private generateMethods() '''
108 «FOR m : methods SEPARATOR "\n"»
109 «m.comment.generateComment»
110 «m.returnType.resolveName» «m.name»(«m.parameters.generateParameters»);
115 def private generateParameters(List<MethodSignature.Parameter> parameters) '''«
116 IF !parameters.empty»«
117 FOR parameter : parameters SEPARATOR ", "»«
118 parameter.type.resolveName» «parameter.name»«
123 def private generatePkgAndImports() '''
124 package «genType.packageName»;
128 «FOR entry : resolveImports.entrySet»
129 import «entry.value».«entry.key»;
135 def private Map<String, String> resolveImports() {
136 val innerTypeImports = GeneratorUtil.createChildImports(genType)
137 val Map<String, String> resolvedImports = new LinkedHashMap
138 for (Map.Entry<String, String> entry : imports.entrySet() + innerTypeImports.entrySet) {
139 val typeName = entry.getKey();
140 val packageName = entry.getValue();
141 if (packageName != genType.packageName && packageName != genType.fullyQualifiedName) {
142 resolvedImports.put(typeName, packageName);
145 return resolvedImports
148 def private resolveName(Type type) {
149 GeneratorUtil.putTypeIntoImports(genType, type, imports);
150 GeneratorUtil.getExplicitType(genType, type, imports)