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