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