Bug 509: Improve logging in InMemoryDataStore.
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / resources / freeMarker / module_abs_template_new.ftl
1 <@headerD header=header/>
2 package ${packageName};
3
4 <@javadocD object=javadoc/>
5 <@annotationsD object=annotations/>
6 <@typeDeclarationD object=typeDeclaration/>
7 {
8     // attributes
9     <@moduleFieldsD moduleFields=moduleFields/>
10     //attributes end
11
12     private static final ${loggerType} logger = ${loggerFactoryType}.getLogger(${typeDeclaration.name}.class);
13
14     private final ${typeDeclaration.name} oldModule;
15     private final ${instanceType} oldInstance;
16     private ${instanceType} instance;
17     private final ${dependencyResolverType} dependencyResolver;
18     private final ${moduleNameType} identifier;
19     <#if runtime=true>
20     private ${registratorType} rootRuntimeBeanRegistratorWrapper;
21     </#if>
22
23     public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver) {
24         this.identifier = identifier;
25         this.dependencyResolver = dependencyResolver;
26         this.oldInstance = null;
27         this.oldModule = null;
28     }
29
30     public ${typeDeclaration.name}(${moduleNameType} identifier, ${dependencyResolverType} dependencyResolver, ${typeDeclaration.name} oldModule, ${instanceType} oldInstance) {
31         this.identifier = identifier;
32         this.dependencyResolver = dependencyResolver;
33         this.oldInstance = oldInstance;
34         this.oldModule = oldModule;
35     }
36
37     // getters and setters exported into MXBean
38     <@methodsD object=methods/>
39
40     <#if runtime=true>
41     public ${registratorType} getRootRuntimeBeanRegistratorWrapper(){
42         return rootRuntimeBeanRegistratorWrapper;
43     }
44
45     @Override
46     public void setRuntimeBeanRegistrator(${rootRuntimeRegistratorType} rootRuntimeRegistrator){
47         this.rootRuntimeBeanRegistratorWrapper = new ${registratorType}(rootRuntimeRegistrator);
48     }
49     </#if>
50
51     @Override
52     public void validate(){
53     <#list moduleFields as field>
54         <#if field.dependent==true && field.dependency.mandatory==true>
55         <#if field.type?starts_with("java.util.List")>
56         for(javax.management.ObjectName dep : ${field.name}) {
57             dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, dep, ${field.name}JmxAttribute);
58         }
59         <#else>
60         dependencyResolver.validateDependency(${field.dependency.sie.fullyQualifiedName}.class, ${field.name}, ${field.name}JmxAttribute);
61         </#if>
62         </#if>
63     </#list>
64         customValidation();
65     }
66
67     protected void customValidation(){
68
69     }
70
71     // caches of resolved dependencies
72     <#list moduleFields as field>
73     <#if field.dependent==true>
74         <#if field.type?starts_with("java.util.List")>
75         private java.util.List<${field.dependency.sie.exportedOsgiClassName}> ${field.name}Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>();
76         protected final java.util.List<${field.dependency.sie.exportedOsgiClassName}> get${field.attributeName}Dependency(){
77             return ${field.name}Dependency;
78         }
79         <#else>
80         private ${field.dependency.sie.exportedOsgiClassName} ${field.name}Dependency;
81         protected final ${field.dependency.sie.exportedOsgiClassName} get${field.attributeName}Dependency(){
82             return ${field.name}Dependency;
83         }
84         </#if>
85     </#if>
86     </#list>
87
88     // caches of resolved IdentityRefs
89     <#list moduleFields as field>
90     <#if field.identityRef==true>
91         private ${field.identityClassType} ${field.identityClassName};
92     </#if>
93     </#list>
94
95     @Override
96     public final ${instanceType} getInstance(){
97         if(instance==null) {
98
99             <#list moduleFields as field>
100                 <#if field.dependent==true>
101                     <#if field.dependency.mandatory==false>
102                         if(${field.name}!=null) {
103                     </#if>
104
105                     <#if field.type?starts_with("java.util.List")>
106             ${field.name}Dependency = new java.util.ArrayList<${field.dependency.sie.exportedOsgiClassName}>();
107             for(javax.management.ObjectName dep : ${field.name}) {
108                 ${field.name}Dependency.add(dependencyResolver.resolveInstance(${field.dependency.sie.exportedOsgiClassName}.class, dep, ${field.name}JmxAttribute));
109             }
110                     <#else>
111             ${field.name}Dependency = dependencyResolver.resolveInstance(${field.dependency.sie.exportedOsgiClassName}.class, ${field.name}, ${field.name}JmxAttribute);
112                     </#if>
113
114                     <#if field.dependency.mandatory==false>
115                         }
116                     </#if>
117                 </#if>
118
119                 <#if field.needsDepResolver==true>
120             if(${field.name} != null) {
121                     <#if field.type?starts_with("java.util.List")>
122                 for(${field.type?substring(field.type?index_of("<") + 1, field.type?index_of(">"))} candidate : ${field.name}) {
123                     candidate.injectDependencyResolver(dependencyResolver);
124                 }
125                     <#else>
126                 ${field.name}.injectDependencyResolver(dependencyResolver);
127                     </#if>
128             }
129                 </#if>
130
131                 <#if field.identityRef==true>
132             if(${field.name} != null) {
133                 set${field.attributeName}(${field.name}.resolveIdentity(dependencyResolver, ${field.identityBaseClass}.class));
134             }
135                 </#if>
136             </#list>
137
138             if(oldInstance!=null && canReuseInstance(oldModule)) {
139                 instance = reuseInstance(oldInstance);
140             } else {
141                 if(oldInstance!=null) {
142                     try {
143                         oldInstance.close();
144                     } catch(Exception e) {
145                         logger.error("An error occurred while closing old instance " + oldInstance, e);
146                     }
147                 }
148                 instance = createInstance();
149             }
150         }
151         return instance;
152     }
153
154     @Override
155     public ${moduleNameType} getIdentifier() {
156         return identifier;
157     }
158
159     public boolean canReuseInstance(${typeDeclaration.name} oldModule){
160         // allow reusing of old instance if no parameters was changed
161         return isSame(oldModule);
162     }
163
164     public ${instanceType} reuseInstance(${instanceType} oldInstance){
165         // implement if instance reuse should be supported. Override canReuseInstance to change the criteria.
166         return oldInstance;
167     }
168
169     public abstract ${instanceType} createInstance();
170
171     public boolean isSame(${typeDeclaration.name} other) {
172         if (other == null) {
173             throw new IllegalArgumentException("Parameter 'other' is null");
174         }
175         <#list moduleFields as field>
176         <#if field.dependent==true && field.listOfDependencies == false>
177         if (${field.name}Dependency != other.${field.name}Dependency) { // reference to dependency must be same
178             return false;
179         }
180         <#elseif field.listOfDependencies>
181         if (${field.name}Dependency.equals(other.${field.name}Dependency) == false) {
182             return false;
183         }
184         for (int idx = 0; idx < ${field.name}Dependency.size(); idx++) {
185             if (${field.name}Dependency.get(idx) != other.${field.name}Dependency.get(idx)) {
186                 return false;
187             }
188         }
189         <#else>
190         if (${field.name} == null) {
191             if (other.${field.name} != null) {
192                 return false;
193             }
194         } else if
195             <#if field.array == false>
196                 (${field.name}.equals(other.${field.name}) == false)
197             <#else>
198                 (java.util.Arrays.equals(${field.name},other.${field.name}) == false)
199             </#if>
200                  {
201             return false;
202         }
203         </#if>
204         </#list>
205
206         return true;
207     }
208
209     @Override
210     public boolean equals(Object o) {
211         if (this == o) return true;
212         if (o == null || getClass() != o.getClass()) return false;
213
214         ${typeDeclaration.name} that = (${typeDeclaration.name}) o;
215
216         return identifier.equals(that.identifier);
217     }
218
219     @Override
220     public int hashCode() {
221         return identifier.hashCode();
222     }
223 }