Adjust to yangtools-2.0.0 changes
[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.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, final ModuleContext context) {
49         super(packageName, name, context);
50     }
51
52     public EnumerationBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized,
53             final boolean isTypeNormalized, final ModuleContext context) {
54         super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
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().orElse(null), enumPair.getReference().orElse(null),
114                     enumPair.getStatus()));
115         }
116     }
117
118     private static final class EnumPairImpl implements Enumeration.Pair {
119
120         private final String name;
121         private final String mappedName;
122         private final int value;
123         private final String description;
124         private final String reference;
125         private final Status status;
126
127         public EnumPairImpl(final String name, final int value, final String description,
128                 final String reference, final Status status, final List<Pair> values) {
129
130             this.name = name;
131             this.mappedName = JavaIdentifierNormalizer.normalizeEnumValueIdentifier(name, values);
132             this.value = value;
133             this.description = description;
134             this.reference = reference;
135             this.status = status;
136         }
137
138         @Override
139         public String getName() {
140             return this.name;
141         }
142
143         @Override
144         public String getMappedName() {
145             return this.mappedName;
146         }
147
148         @Override
149         public int getValue() {
150             return this.value;
151         }
152
153         @Nullable
154         @Override
155         public Optional<String> getDescription() {
156             return Optional.ofNullable(this.description);
157         }
158
159         @Nullable
160         @Override
161         public Optional<String> getReference() {
162             return Optional.ofNullable(this.reference);
163         }
164
165         @Nonnull
166         @Override
167         public Status getStatus() {
168            return this.status;
169         }
170
171         @Override
172         public int hashCode() {
173             return Objects.hash(this.name, this.value);
174         }
175
176         @Override
177         public boolean equals(final Object obj) {
178             if (this == obj) {
179                 return true;
180             }
181
182             if (obj == null) {
183                 return false;
184             }
185
186             if (getClass() != obj.getClass()) {
187                 return false;
188             }
189
190             if (!(obj instanceof EnumPairImpl)) {
191                 return false;
192             }
193
194             final EnumPairImpl other = (EnumPairImpl) obj;
195
196             return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
197         }
198
199         @Override
200         public String toString() {
201             final StringBuilder builder = new StringBuilder();
202             builder.append("EnumPair [name=");
203             builder.append(this.name);
204             builder.append(", mappedName=");
205             builder.append(getMappedName());
206             builder.append(", value=");
207             builder.append(this.value);
208             builder.append(']');
209             return builder.toString();
210         }
211     }
212
213     private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
214
215         private final Type definingType;
216         private final String description;
217         private final String reference;
218         private final String moduleName;
219         private final List<QName> schemaPath;
220         private final List<Pair> values;
221         private final List<AnnotationType> annotations;
222
223         public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
224                                final String packageName, final String name, final List<Pair> values, final String description,
225                 final String reference, final String moduleName, final List<QName> schemaPath) {
226             super(packageName, name, true, null);
227             this.definingType = definingType;
228             this.values = values;
229             this.description = description;
230             this.reference = reference;
231             this.moduleName = moduleName;
232             this.schemaPath = schemaPath;
233
234             final List<AnnotationType> a = annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance)
235                     .collect(Collectors.toList());
236             this.annotations = ImmutableList.copyOf(a);
237         }
238
239         @Override
240         public List<AnnotationType> getAnnotations() {
241             return this.annotations;
242         }
243
244         @Override
245         public Type getParentType() {
246             return this.definingType;
247         }
248
249         @Override
250         public Optional<String> getDescription() {
251             return Optional.ofNullable(this.description);
252         }
253
254         @Override
255         public List<Pair> getValues() {
256             return this.values;
257         }
258
259         @Override
260         public String toFormattedString() {
261             final StringBuilder builder = new StringBuilder();
262             builder.append("public enum");
263             builder.append(' ');
264             builder.append(getName());
265             builder.append(" {");
266             builder.append("\n");
267
268             int i = 0;
269             for (final Enumeration.Pair valPair : this.values) {
270                 builder.append("\t");
271                 builder.append(' ');
272                 builder.append(valPair.getMappedName());
273                 builder.append(" (");
274                 builder.append(valPair.getValue());
275
276                 if (i == this.values.size() - 1) {
277                     builder.append(" );");
278                 } else {
279                     builder.append(" ),");
280                 }
281                 ++i;
282             }
283             builder.append("\n}");
284             return builder.toString();
285         }
286
287         @Override
288         public Optional<String> getReference() {
289             return Optional.ofNullable(this.reference);
290         }
291
292         @Override
293         public List<QName> getSchemaPath() {
294             return this.schemaPath;
295         }
296
297         @Override
298         public String getModuleName() {
299             return this.moduleName;
300         }
301
302         @Override
303         public String getComment() {
304             //noop
305             return null;
306         }
307
308         @Override
309         public boolean isAbstract() {
310             return false;
311         }
312
313         @Override
314         public List<Type> getImplements() {
315             return ImmutableList.of();
316         }
317
318         @Override
319         public List<GeneratedType> getEnclosedTypes() {
320             return ImmutableList.of();
321         }
322
323         @Override
324         public List<Enumeration> getEnumerations() {
325             return ImmutableList.of();
326         }
327
328         @Override
329         public List<Constant> getConstantDefinitions() {
330             return ImmutableList.of();
331         }
332
333         @Override
334         public List<MethodSignature> getMethodDefinitions() {
335             return ImmutableList.of();
336         }
337
338         @Override
339         public List<GeneratedProperty> getProperties() {
340             return ImmutableList.of();
341         }
342
343         @Override
344         public Type getParentTypeForBuilder() {
345             return null;
346         }
347     }
348 }