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