7a86e731ba38ca028480be5a12702736686d9e00
[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 Integer 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             int listIndex = 0;
116             for (final EnumPair enumPair : enums) {
117                 if (enumPair != null) {
118                     final String enumPairName = enumPair.getName();
119                     Integer enumPairValue = enumPair.getValue();
120
121                     if (enumPairValue == null) {
122                         enumPairValue = listIndex;
123                     }
124                     else {
125                         listIndex = enumPairValue;
126                     }
127
128                     this.addValue(enumPairName, enumPairValue, enumPair.getDescription());
129                     listIndex++;
130                 }
131             }
132         }
133
134     }
135
136     private static final class EnumPairImpl implements Enumeration.Pair {
137
138         private final String name;
139         private final String mappedName;
140         private final Integer value;
141         private final String description;
142
143         public EnumPairImpl(final String name, final Integer value, final String description) {
144             super();
145             this.name = name;
146             this.mappedName = BindingMapping.getClassName(name);
147             this.value = value;
148             this.description = description;
149         }
150
151         @Override
152         public String getName() {
153             return name;
154         }
155
156         @Override
157         public String getMappedName() {
158             return mappedName;
159         }
160
161         @Override
162         public Integer getValue() {
163             return value;
164         }
165
166         /*
167          * (non-Javadoc)
168          *
169          * @see java.lang.Object#hashCode()
170          */
171         @Override
172         public int hashCode() {
173             final int prime = 31;
174             int result = 1;
175             result = prime * result + Objects.hashCode(name);
176             result = prime * result + Objects.hashCode(value);
177             return result;
178         }
179
180         /*
181          * (non-Javadoc)
182          *
183          * @see java.lang.Object#equals(java.lang.Object)
184          */
185         @Override
186         public boolean equals(final Object obj) {
187             if (this == obj) {
188                 return true;
189             }
190             if (obj == null) {
191                 return false;
192             }
193             if (getClass() != obj.getClass()) {
194                 return false;
195             }
196             EnumPairImpl other = (EnumPairImpl) obj;
197             return Objects.equals(name, other.name) && Objects.equals(value, other.value);
198         }
199
200         /*
201          * (non-Javadoc)
202          *
203          * @see java.lang.Object#toString()
204          */
205         @Override
206         public String toString() {
207             StringBuilder builder = new StringBuilder();
208             builder.append("EnumPair [name=");
209             builder.append(name);
210             builder.append(", mappedName=");
211             builder.append(getMappedName());
212             builder.append(", value=");
213             builder.append(value);
214             builder.append("]");
215             return builder.toString();
216         }
217
218         @Override
219         public String getDescription() {
220             return description;
221         }
222
223         @Override
224         public String getReference() {
225             return null;
226         }
227
228         @Override
229         public Status getStatus() {
230             // TODO Auto-generated method stub
231             return null;
232         }
233
234     }
235
236     private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
237
238         private final Type definingType;
239         private final String description;
240         private final String reference;
241         private final String moduleName;
242         private final Iterable<QName> schemaPath;
243         private final List<Pair> values;
244         private final List<AnnotationType> annotations;
245
246         public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
247                 final String packageName, final String name, final List<Pair> values, final String description,
248                 final String reference, final String moduleName, final Iterable<QName> schemaPath) {
249             super(packageName, name);
250             this.definingType = definingType;
251             this.values = values;
252             this.description = description;
253             this.moduleName = moduleName;
254             this.schemaPath = schemaPath;
255             this.reference = reference;
256
257             final ArrayList<AnnotationType> a = new ArrayList<>();
258             for (final AnnotationTypeBuilder builder : annotationBuilders) {
259                 a.add(builder.toInstance());
260             }
261             this.annotations = ImmutableList.copyOf(a);
262         }
263
264         @Override
265         public Type getParentType() {
266             return definingType;
267         }
268
269         @Override
270         public List<Pair> getValues() {
271             return values;
272         }
273
274         @Override
275         public List<AnnotationType> getAnnotations() {
276             return annotations;
277         }
278
279         @Override
280         public String toFormattedString() {
281             StringBuilder builder = new StringBuilder();
282             builder.append("public enum");
283             builder.append(" ");
284             builder.append(getName());
285             builder.append(" {");
286             builder.append("\n");
287
288             int i = 0;
289             for (final Enumeration.Pair valPair : values) {
290                 builder.append("\t");
291                 builder.append(" ");
292                 builder.append(valPair.getMappedName());
293                 builder.append(" (");
294                 builder.append(valPair.getValue());
295
296                 if (i == (values.size() - 1)) {
297                     builder.append(" );");
298                 } else {
299                     builder.append(" ),");
300                 }
301                 ++i;
302             }
303             builder.append("\n}");
304             return builder.toString();
305         }
306
307         /*
308          * (non-Javadoc)
309          *
310          * @see java.lang.Object#toString()
311          */
312         @Override
313         public String toString() {
314             StringBuilder builder = new StringBuilder();
315             builder.append("Enumeration [packageName=");
316             builder.append(getPackageName());
317             if (definingType != null) {
318                 builder.append(", definingType=");
319                 builder.append(definingType.getPackageName());
320                 builder.append(".");
321                 builder.append(definingType.getName());
322             } else {
323                 builder.append(", definingType= null");
324             }
325             builder.append(", name=");
326             builder.append(getName());
327             builder.append(", values=");
328             builder.append(values);
329             builder.append("]");
330             return builder.toString();
331         }
332
333         @Override
334         public String getComment() {
335             return null;
336         }
337
338         @Override
339         public boolean isAbstract() {
340             return false;
341         }
342
343         @Override
344         public List<Type> getImplements() {
345             return Collections.emptyList();
346         }
347
348         @Override
349         public List<GeneratedType> getEnclosedTypes() {
350             return Collections.emptyList();
351         }
352
353         @Override
354         public List<Enumeration> getEnumerations() {
355             return Collections.emptyList();
356         }
357
358         @Override
359         public List<Constant> getConstantDefinitions() {
360             return Collections.emptyList();
361         }
362
363         @Override
364         public List<MethodSignature> getMethodDefinitions() {
365             // TODO Auto-generated method stub
366             return Collections.emptyList();
367         }
368
369         @Override
370         public List<GeneratedProperty> getProperties() {
371             return Collections.emptyList();
372         }
373
374         @Override
375         public String getDescription() {
376             return description;
377         }
378
379         @Override
380         public String getReference() {
381             return reference;
382         }
383
384         @Override
385         public Iterable<QName> getSchemaPath() {
386             return schemaPath;
387         }
388
389         @Override
390         public String getModuleName() {
391             return moduleName;
392         }
393     }
394 }