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