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