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