Code refactoring
[yangtools.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.Enumeration;
19 import org.opendaylight.yangtools.sal.binding.model.api.Type;
20 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder;
21 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder;
22 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
24
25 public final class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
26     private final String packageName;
27     private final String name;
28     private final List<Enumeration.Pair> values;
29     private final List<AnnotationTypeBuilder> annotationBuilders = new ArrayList<>();
30
31     public EnumerationBuilderImpl(final String packageName, final String name) {
32         super(packageName, name);
33         this.packageName = packageName;
34         this.name = name;
35         values = new ArrayList<>();
36     }
37
38     @Override
39     public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
40         if (packageName != null && name != null) {
41             final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
42             if (annotationBuilders.add(builder)) {
43                 return builder;
44             }
45         }
46         return null;
47     }
48
49     @Override
50     public void addValue(final String name, final Integer value) {
51         values.add(new EnumPairImpl(name, value));
52     }
53
54     @Override
55     public Enumeration toInstance(final Type definingType) {
56         return new EnumerationImpl(definingType, annotationBuilders, packageName, name, values);
57     }
58
59     /*
60      * (non-Javadoc)
61      * 
62      * @see java.lang.Object#hashCode()
63      */
64     @Override
65     public int hashCode() {
66         final int prime = 31;
67         int result = 1;
68         result = prime * result + ((name == null) ? 0 : name.hashCode());
69         result = prime * result + ((packageName == null) ? 0 : packageName.hashCode());
70         return result;
71     }
72
73     /*
74      * (non-Javadoc)
75      * 
76      * @see java.lang.Object#equals(java.lang.Object)
77      */
78     @Override
79     public boolean equals(Object obj) {
80         if (this == obj) {
81             return true;
82         }
83         if (obj == null) {
84             return false;
85         }
86         if (getClass() != obj.getClass()) {
87             return false;
88         }
89         EnumerationBuilderImpl other = (EnumerationBuilderImpl) obj;
90         if (name == null) {
91             if (other.name != null) {
92                 return false;
93             }
94         } else if (!name.equals(other.name)) {
95             return false;
96         }
97         if (packageName == null) {
98             if (other.packageName != null) {
99                 return false;
100             }
101         } else if (!packageName.equals(other.packageName)) {
102             return false;
103         }
104         return true;
105     }
106
107     /*
108      * (non-Javadoc)
109      * 
110      * @see java.lang.Object#toString()
111      */
112     @Override
113     public String toString() {
114         StringBuilder builder = new StringBuilder();
115         builder.append("EnumerationBuilderImpl [packageName=");
116         builder.append(packageName);
117         builder.append(", name=");
118         builder.append(name);
119         builder.append(", values=");
120         builder.append(values);
121         builder.append("]");
122         return builder.toString();
123     }
124
125     @Override
126     public void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
127         final List<EnumPair> enums = enumTypeDef.getValues();
128         if (enums != null) {
129             int listIndex = 0;
130             for (final EnumPair enumPair : enums) {
131                 if (enumPair != null) {
132                     final String enumPairName = parseToClassName(enumPair.getName());
133                     Integer enumPairValue = enumPair.getValue();
134
135                     if (enumPairValue == null) {
136                         enumPairValue = listIndex;
137                     }
138                     this.addValue(enumPairName, enumPairValue);
139                     listIndex++;
140                 }
141             }
142         }
143
144     }
145
146     private static final class EnumPairImpl implements Enumeration.Pair {
147
148         private final String name;
149         private final Integer value;
150
151         public EnumPairImpl(String name, Integer value) {
152             super();
153             this.name = name;
154             this.value = value;
155         }
156
157         @Override
158         public String getName() {
159             return name;
160         }
161
162         @Override
163         public Integer getValue() {
164             return value;
165         }
166
167         /*
168          * (non-Javadoc)
169          * 
170          * @see java.lang.Object#hashCode()
171          */
172         @Override
173         public int hashCode() {
174             final int prime = 31;
175             int result = 1;
176             result = prime * result + ((name == null) ? 0 : name.hashCode());
177             result = prime * result + ((value == null) ? 0 : value.hashCode());
178             return result;
179         }
180
181         /*
182          * (non-Javadoc)
183          * 
184          * @see java.lang.Object#equals(java.lang.Object)
185          */
186         @Override
187         public boolean equals(Object obj) {
188             if (this == obj) {
189                 return true;
190             }
191             if (obj == null) {
192                 return false;
193             }
194             if (getClass() != obj.getClass()) {
195                 return false;
196             }
197             EnumPairImpl other = (EnumPairImpl) obj;
198             if (name == null) {
199                 if (other.name != null) {
200                     return false;
201                 }
202             } else if (!name.equals(other.name)) {
203                 return false;
204             }
205             if (value == null) {
206                 if (other.value != null) {
207                     return false;
208                 }
209             } else if (!value.equals(other.value)) {
210                 return false;
211             }
212             return true;
213         }
214
215         /*
216          * (non-Javadoc)
217          * 
218          * @see java.lang.Object#toString()
219          */
220         @Override
221         public String toString() {
222             StringBuilder builder = new StringBuilder();
223             builder.append("EnumPair [name=");
224             builder.append(name);
225             builder.append(", value=");
226             builder.append(value);
227             builder.append("]");
228             return builder.toString();
229         }
230     }
231
232     private static final class EnumerationImpl implements Enumeration {
233
234         private final Type definingType;
235         private final String packageName;
236         private final String name;
237         private final List<Pair> values;
238         private List<AnnotationType> annotations = new ArrayList<>();
239
240         public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
241                 final String packageName, final String name, final List<Pair> values) {
242             super();
243             this.definingType = definingType;
244             for (final AnnotationTypeBuilder builder : annotationBuilders) {
245                 annotations.add(builder.toInstance());
246             }
247             this.annotations = Collections.unmodifiableList(annotations);
248             this.packageName = packageName;
249             this.name = name;
250             this.values = Collections.unmodifiableList(values);
251         }
252
253         @Override
254         public Type getDefiningType() {
255             return definingType;
256         }
257
258         @Override
259         public String getPackageName() {
260             return packageName;
261         }
262
263         @Override
264         public String getName() {
265             return name;
266         }
267
268         @Override
269         public String getFullyQualifiedName() {
270             return packageName + "." + name;
271         }
272
273         @Override
274         public List<Pair> getValues() {
275             return values;
276         }
277
278         @Override
279         public List<AnnotationType> getAnnotations() {
280             return annotations;
281         }
282
283         @Override
284         public String toFormattedString() {
285             StringBuilder builder = new StringBuilder();
286             builder.append("public enum");
287             builder.append(" ");
288             builder.append(name);
289             builder.append(" {");
290             builder.append("\n");
291
292             int i = 0;
293             for (final Enumeration.Pair valPair : values) {
294                 builder.append("\t");
295                 builder.append(" ");
296                 builder.append(valPair.getName());
297                 builder.append(" (");
298                 builder.append(valPair.getValue());
299
300                 if (i == (values.size() - 1)) {
301                     builder.append(" );");
302                 } else {
303                     builder.append(" ),");
304                 }
305                 ++i;
306             }
307             builder.append("\n}");
308             return builder.toString();
309         }
310
311         /*
312          * (non-Javadoc)
313          * 
314          * @see java.lang.Object#hashCode()
315          */
316         @Override
317         public int hashCode() {
318             final int prime = 31;
319             int result = 1;
320             result = prime * result + ((name == null) ? 0 : name.hashCode());
321             result = prime * result + ((packageName == null) ? 0 : packageName.hashCode());
322             result = prime * result + ((values == null) ? 0 : values.hashCode());
323
324             return result;
325         }
326
327         /*
328          * (non-Javadoc)
329          * 
330          * @see java.lang.Object#equals(java.lang.Object)
331          */
332         @Override
333         public boolean equals(Object obj) {
334             if (this == obj) {
335                 return true;
336             }
337             if (obj == null) {
338                 return false;
339             }
340             if (getClass() != obj.getClass()) {
341                 return false;
342             }
343             EnumerationImpl other = (EnumerationImpl) obj;
344             if (name == null) {
345                 if (other.name != null) {
346                     return false;
347                 }
348             } else if (!name.equals(other.name)) {
349                 return false;
350             }
351             if (packageName == null) {
352                 if (other.packageName != null) {
353                     return false;
354                 }
355             } else if (!packageName.equals(other.packageName)) {
356                 return false;
357             }
358             if (values == null) {
359                 if (other.values != null) {
360                     return false;
361                 }
362             } else if (!values.equals(other.values)) {
363                 return false;
364             }
365             return true;
366         }
367
368         /*
369          * (non-Javadoc)
370          * 
371          * @see java.lang.Object#toString()
372          */
373         @Override
374         public String toString() {
375             StringBuilder builder = new StringBuilder();
376             builder.append("Enumeration [packageName=");
377             builder.append(packageName);
378             if (definingType != null) {
379                 builder.append(", definingType=");
380                 builder.append(definingType.getPackageName());
381                 builder.append(".");
382                 builder.append(definingType.getName());
383             } else {
384                 builder.append(", definingType= null");
385             }
386             builder.append(", name=");
387             builder.append(name);
388             builder.append(", values=");
389             builder.append(values);
390             builder.append("]");
391             return builder.toString();
392         }
393     }
394 }