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