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