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