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