e2ca93bbe49db64bf874195c08d584a4edd4c40f
[mdsal.git] / code-generator / binding-generator-util / src / main / java / org / opendaylight / yangtools / binding / generator / util / generated / type / builder / EnumerationBuilderImpl.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.binding.generator.util.generated.type.builder;
9
10 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToClassName;
11
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15
16 import org.opendaylight.yangtools.binding.generator.util.AbstractBaseType;
17 import org.opendaylight.yangtools.sal.binding.model.api.AnnotationType;
18 import org.opendaylight.yangtools.sal.binding.model.api.Constant;
19 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;
20 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;
21 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
22 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature;
23 import org.opendaylight.yangtools.sal.binding.model.api.Type;
24 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder;
25 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder;
26 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
27 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
28
29 public final class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
30     private final String packageName;
31     private final String name;
32     private final List<Enumeration.Pair> values;
33     private final List<AnnotationTypeBuilder> annotationBuilders = new ArrayList<>();
34
35     public EnumerationBuilderImpl(final String packageName, final String name) {
36         super(packageName, name);
37         this.packageName = packageName;
38         this.name = name;
39         values = new ArrayList<>();
40     }
41
42     @Override
43     public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
44         if (packageName != null && name != null) {
45             final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
46             if (annotationBuilders.add(builder)) {
47                 return builder;
48             }
49         }
50         return null;
51     }
52
53     @Override
54     public void addValue(final String name, final Integer value) {
55         values.add(new EnumPairImpl(name, value));
56     }
57
58     @Override
59     public Enumeration toInstance(final Type definingType) {
60         return new EnumerationImpl(definingType, annotationBuilders, packageName, name, values);
61     }
62
63     /*
64      * (non-Javadoc)
65      * 
66      * @see java.lang.Object#hashCode()
67      */
68     @Override
69     public int hashCode() {
70         final int prime = 31;
71         int result = 1;
72         result = prime * result + ((name == null) ? 0 : name.hashCode());
73         result = prime * result + ((packageName == null) ? 0 : packageName.hashCode());
74         return result;
75     }
76
77     /*
78      * (non-Javadoc)
79      * 
80      * @see java.lang.Object#equals(java.lang.Object)
81      */
82     @Override
83     public boolean equals(Object obj) {
84         if (this == obj) {
85             return true;
86         }
87         if (obj == null) {
88             return false;
89         }
90         if (getClass() != obj.getClass()) {
91             return false;
92         }
93         EnumerationBuilderImpl other = (EnumerationBuilderImpl) obj;
94         if (name == null) {
95             if (other.name != null) {
96                 return false;
97             }
98         } else if (!name.equals(other.name)) {
99             return false;
100         }
101         if (packageName == null) {
102             if (other.packageName != null) {
103                 return false;
104             }
105         } else if (!packageName.equals(other.packageName)) {
106             return false;
107         }
108         return true;
109     }
110
111     /*
112      * (non-Javadoc)
113      * 
114      * @see java.lang.Object#toString()
115      */
116     @Override
117     public String toString() {
118         StringBuilder builder = new StringBuilder();
119         builder.append("EnumerationBuilderImpl [packageName=");
120         builder.append(packageName);
121         builder.append(", name=");
122         builder.append(name);
123         builder.append(", values=");
124         builder.append(values);
125         builder.append("]");
126         return builder.toString();
127     }
128
129     @Override
130     public void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
131         final List<EnumPair> enums = enumTypeDef.getValues();
132         if (enums != null) {
133             int listIndex = 0;
134             for (final EnumPair enumPair : enums) {
135                 if (enumPair != null) {
136                     final String enumPairName = parseToClassName(enumPair.getName());
137                     Integer enumPairValue = enumPair.getValue();
138
139                     if (enumPairValue == null) {
140                         enumPairValue = listIndex;
141                     }
142                     this.addValue(enumPairName, enumPairValue);
143                     listIndex++;
144                 }
145             }
146         }
147
148     }
149
150     private static final class EnumPairImpl implements Enumeration.Pair {
151
152         private final String name;
153         private final Integer value;
154
155         public EnumPairImpl(String name, Integer value) {
156             super();
157             this.name = name;
158             this.value = value;
159         }
160
161         @Override
162         public String getName() {
163             return name;
164         }
165
166         @Override
167         public Integer getValue() {
168             return value;
169         }
170
171         /*
172          * (non-Javadoc)
173          * 
174          * @see java.lang.Object#hashCode()
175          */
176         @Override
177         public int hashCode() {
178             final int prime = 31;
179             int result = 1;
180             result = prime * result + ((name == null) ? 0 : name.hashCode());
181             result = prime * result + ((value == null) ? 0 : value.hashCode());
182             return result;
183         }
184
185         /*
186          * (non-Javadoc)
187          * 
188          * @see java.lang.Object#equals(java.lang.Object)
189          */
190         @Override
191         public boolean equals(Object obj) {
192             if (this == obj) {
193                 return true;
194             }
195             if (obj == null) {
196                 return false;
197             }
198             if (getClass() != obj.getClass()) {
199                 return false;
200             }
201             EnumPairImpl other = (EnumPairImpl) obj;
202             if (name == null) {
203                 if (other.name != null) {
204                     return false;
205                 }
206             } else if (!name.equals(other.name)) {
207                 return false;
208             }
209             if (value == null) {
210                 if (other.value != null) {
211                     return false;
212                 }
213             } else if (!value.equals(other.value)) {
214                 return false;
215             }
216             return true;
217         }
218
219         /*
220          * (non-Javadoc)
221          * 
222          * @see java.lang.Object#toString()
223          */
224         @Override
225         public String toString() {
226             StringBuilder builder = new StringBuilder();
227             builder.append("EnumPair [name=");
228             builder.append(name);
229             builder.append(", value=");
230             builder.append(value);
231             builder.append("]");
232             return builder.toString();
233         }
234     }
235
236     private static final class EnumerationImpl implements Enumeration {
237
238         private final Type definingType;
239         private final String packageName;
240         private final String name;
241         private final List<Pair> values;
242         private List<AnnotationType> annotations = new ArrayList<>();
243
244         public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
245                 final String packageName, final String name, final List<Pair> values) {
246             super();
247             this.definingType = definingType;
248             for (final AnnotationTypeBuilder builder : annotationBuilders) {
249                 annotations.add(builder.toInstance());
250             }
251             this.annotations = Collections.unmodifiableList(annotations);
252             this.packageName = packageName;
253             this.name = name;
254             this.values = Collections.unmodifiableList(values);
255         }
256
257         @Override
258         public Type getParentType() {
259             return definingType;
260         }
261
262         @Override
263         public String getPackageName() {
264             return packageName;
265         }
266
267         @Override
268         public String getName() {
269             return name;
270         }
271
272         @Override
273         public String getFullyQualifiedName() {
274             return packageName + "." + name;
275         }
276
277         @Override
278         public List<Pair> getValues() {
279             return values;
280         }
281
282         @Override
283         public List<AnnotationType> getAnnotations() {
284             return annotations;
285         }
286
287         @Override
288         public String toFormattedString() {
289             StringBuilder builder = new StringBuilder();
290             builder.append("public enum");
291             builder.append(" ");
292             builder.append(name);
293             builder.append(" {");
294             builder.append("\n");
295
296             int i = 0;
297             for (final Enumeration.Pair valPair : values) {
298                 builder.append("\t");
299                 builder.append(" ");
300                 builder.append(valPair.getName());
301                 builder.append(" (");
302                 builder.append(valPair.getValue());
303
304                 if (i == (values.size() - 1)) {
305                     builder.append(" );");
306                 } else {
307                     builder.append(" ),");
308                 }
309                 ++i;
310             }
311             builder.append("\n}");
312             return builder.toString();
313         }
314
315         /*
316          * (non-Javadoc)
317          * 
318          * @see java.lang.Object#hashCode()
319          */
320         @Override
321         public int hashCode() {
322             final int prime = 31;
323             int result = 1;
324             result = prime * result + ((name == null) ? 0 : name.hashCode());
325             result = prime * result + ((packageName == null) ? 0 : packageName.hashCode());
326             result = prime * result + ((values == null) ? 0 : values.hashCode());
327
328             return result;
329         }
330
331         /*
332          * (non-Javadoc)
333          * 
334          * @see java.lang.Object#equals(java.lang.Object)
335          */
336         @Override
337         public boolean equals(Object obj) {
338             if (this == obj) {
339                 return true;
340             }
341             if (obj == null) {
342                 return false;
343             }
344             if (getClass() != obj.getClass()) {
345                 return false;
346             }
347             EnumerationImpl other = (EnumerationImpl) obj;
348             if (name == null) {
349                 if (other.name != null) {
350                     return false;
351                 }
352             } else if (!name.equals(other.name)) {
353                 return false;
354             }
355             if (packageName == null) {
356                 if (other.packageName != null) {
357                     return false;
358                 }
359             } else if (!packageName.equals(other.packageName)) {
360                 return false;
361             }
362             if (values == null) {
363                 if (other.values != null) {
364                     return false;
365                 }
366             } else if (!values.equals(other.values)) {
367                 return false;
368             }
369             return true;
370         }
371
372         /*
373          * (non-Javadoc)
374          * 
375          * @see java.lang.Object#toString()
376          */
377         @Override
378         public String toString() {
379             StringBuilder builder = new StringBuilder();
380             builder.append("Enumeration [packageName=");
381             builder.append(packageName);
382             if (definingType != null) {
383                 builder.append(", definingType=");
384                 builder.append(definingType.getPackageName());
385                 builder.append(".");
386                 builder.append(definingType.getName());
387             } else {
388                 builder.append(", definingType= null");
389             }
390             builder.append(", name=");
391             builder.append(name);
392             builder.append(", values=");
393             builder.append(values);
394             builder.append("]");
395             return builder.toString();
396         }
397
398         @Override
399         public String getComment() {
400             return null;
401         }
402
403         @Override
404         public boolean isAbstract() {
405             return false;
406         }
407
408         @Override
409         public List<Type> getImplements() {
410             return Collections.emptyList();
411         }
412
413         @Override
414         public List<GeneratedType> getEnclosedTypes() {
415             return Collections.emptyList();
416         }
417
418         @Override
419         public List<Enumeration> getEnumerations() {
420             return Collections.emptyList();
421         }
422
423         @Override
424         public List<Constant> getConstantDefinitions() {
425             return Collections.emptyList();
426         }
427
428         @Override
429         public List<MethodSignature> getMethodDefinitions() {
430             // TODO Auto-generated method stub
431             return Collections.emptyList();
432         }
433         
434         @Override
435         public List<GeneratedProperty> getProperties() {
436             return Collections.emptyList();
437         }
438     }
439 }