Integrate JavaTypeName as Identifier
[mdsal.git] / binding / mdsal-binding-generator-util / src / main / java / org / opendaylight / mdsal / binding / model / util / generated / type / builder / AbstractEnumerationBuilder.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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 package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.VisibleForTesting;
13 import com.google.common.collect.ImmutableList;
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Objects;
19 import java.util.stream.Collectors;
20 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
21 import org.opendaylight.mdsal.binding.model.api.Constant;
22 import org.opendaylight.mdsal.binding.model.api.Enumeration;
23 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
24 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
25 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
26 import org.opendaylight.mdsal.binding.model.api.Type;
27 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
28 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
29 import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
30 import org.opendaylight.mdsal.binding.model.util.AbstractBaseType;
31 import org.opendaylight.yangtools.util.LazyCollections;
32 import org.opendaylight.yangtools.yang.binding.BindingMapping;
33 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
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 // FIXME: public because EnumBuilder does not have setters we are exposing
39 public abstract class AbstractEnumerationBuilder extends AbstractBaseType implements EnumBuilder {
40     private List<Enumeration.Pair> values = ImmutableList.of();
41     private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
42
43     AbstractEnumerationBuilder(final JavaTypeName identifier) {
44         super(identifier);
45     }
46
47     @Override
48     public final AnnotationTypeBuilder addAnnotation(final JavaTypeName identifier) {
49         final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(identifier);
50         if (!annotationBuilders.contains(builder)) {
51             annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
52             return builder;
53         }
54         return null;
55     }
56
57     @VisibleForTesting
58     final void addValue(final String name, final String mappedName, final int value, final Status status,
59             final String description, final String reference) {
60         values = LazyCollections.lazyAdd(values,
61             createEnumPair(name, mappedName, value, status, description, reference));
62     }
63
64     public abstract void setReference(String reference);
65
66     public abstract void setModuleName(String moduleName);
67
68     public abstract void setSchemaPath(SchemaPath schemaPath);
69
70     abstract AbstractPair createEnumPair(String name, String mappedName, int value, Status status, String description,
71             final String reference);
72
73     /*
74      * (non-Javadoc)
75      *
76      * @see java.lang.Object#toString()
77      */
78     @Override
79     public final String toString() {
80         final StringBuilder builder = new StringBuilder();
81         builder.append("EnumerationBuilderImpl [packageName=");
82         builder.append(getPackageName());
83         builder.append(", name=");
84         builder.append(getName());
85         builder.append(", values=");
86         builder.append(values);
87         builder.append("]");
88         return builder.toString();
89     }
90
91     @Override
92     public final void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
93         final List<EnumPair> enums = enumTypeDef.getValues();
94         final Map<String, String> valueIds = BindingMapping.mapEnumAssignedNames(enums.stream().map(EnumPair::getName)
95             .collect(Collectors.toList()));
96
97         for (EnumPair enumPair : enums) {
98             addValue(enumPair.getName(), valueIds.get(enumPair.getName()), enumPair.getValue(), enumPair.getStatus(),
99                 enumPair.getDescription().orElse(null), enumPair.getReference().orElse(null));
100         }
101     }
102
103     abstract static class AbstractPair implements Enumeration.Pair {
104         private final String name;
105         private final String mappedName;
106         private final int value;
107
108         AbstractPair(final String name, final String mappedName, final int value) {
109             this.name = requireNonNull(name);
110             this.mappedName = requireNonNull(mappedName);
111             this.value = value;
112         }
113
114         @Override
115         public final String getName() {
116             return this.name;
117         }
118
119         @Override
120         public final String getMappedName() {
121             return this.mappedName;
122         }
123
124         @Override
125         public final int getValue() {
126             return this.value;
127         }
128
129         @Override
130         public final int hashCode() {
131             final int prime = 31;
132             int result = 1;
133             result = prime * result + Objects.hashCode(this.name);
134             result = prime * result + Objects.hashCode(this.value);
135             return result;
136         }
137
138         @Override
139         public final boolean equals(final Object obj) {
140             if (this == obj) {
141                 return true;
142             }
143             if (!(obj instanceof AbstractPair)) {
144                 return false;
145             }
146             final AbstractPair other = (AbstractPair) obj;
147             return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
148         }
149
150         @Override
151         public final String toString() {
152             final StringBuilder builder = new StringBuilder();
153             builder.append("EnumPair [name=");
154             builder.append(this.name);
155             builder.append(", mappedName=");
156             builder.append(getMappedName());
157             builder.append(", value=");
158             builder.append(this.value);
159             builder.append("]");
160             return builder.toString();
161         }
162     }
163
164     abstract static class AbstractEnumeration extends AbstractBaseType implements Enumeration {
165
166         private final Type definingType;
167         private final List<Pair> values;
168         private final List<AnnotationType> annotations;
169
170         AbstractEnumeration(final AbstractEnumerationBuilder builder, final Type definingType) {
171             super(builder.getIdentifier());
172             this.definingType = definingType;
173             this.values = ImmutableList.copyOf(builder.values);
174
175             final ArrayList<AnnotationType> a = new ArrayList<>();
176             for (final AnnotationTypeBuilder b : builder.annotationBuilders) {
177                 a.add(b.build());
178             }
179             this.annotations = ImmutableList.copyOf(a);
180         }
181
182         @Override
183         public final Type getParentType() {
184             return this.definingType;
185         }
186
187         @Override
188         public final List<Pair> getValues() {
189             return this.values;
190         }
191
192         @Override
193         public final List<AnnotationType> getAnnotations() {
194             return this.annotations;
195         }
196
197         @Override
198         public final String toFormattedString() {
199             final StringBuilder builder = new StringBuilder();
200             builder.append("public enum");
201             builder.append(" ");
202             builder.append(getName());
203             builder.append(" {");
204             builder.append("\n");
205
206             int i = 0;
207             for (final Enumeration.Pair valPair : this.values) {
208                 builder.append("\t");
209                 builder.append(" ");
210                 builder.append(valPair.getMappedName());
211                 builder.append(" (");
212                 builder.append(valPair.getValue());
213
214                 if (i == this.values.size() - 1) {
215                     builder.append(" );");
216                 } else {
217                     builder.append(" ),");
218                 }
219                 ++i;
220             }
221             builder.append("\n}");
222             return builder.toString();
223         }
224
225         @Override
226         public final String toString() {
227             final StringBuilder builder = new StringBuilder();
228             builder.append("Enumeration [packageName=");
229             builder.append(getPackageName());
230             if (this.definingType != null) {
231                 builder.append(", definingType=");
232                 builder.append(this.definingType.getPackageName());
233                 builder.append(".");
234                 builder.append(this.definingType.getName());
235             } else {
236                 builder.append(", definingType= null");
237             }
238             builder.append(", name=");
239             builder.append(getName());
240             builder.append(", values=");
241             builder.append(this.values);
242             builder.append("]");
243             return builder.toString();
244         }
245
246         @Override
247         public final boolean isAbstract() {
248             return false;
249         }
250
251         @Override
252         public final List<Type> getImplements() {
253             return Collections.emptyList();
254         }
255
256         @Override
257         public final List<GeneratedType> getEnclosedTypes() {
258             return Collections.emptyList();
259         }
260
261         @Override
262         public final List<Enumeration> getEnumerations() {
263             return Collections.emptyList();
264         }
265
266         @Override
267         public final List<Constant> getConstantDefinitions() {
268             return Collections.emptyList();
269         }
270
271         @Override
272         public final List<MethodSignature> getMethodDefinitions() {
273             return Collections.emptyList();
274         }
275
276         @Override
277         public final List<GeneratedProperty> getProperties() {
278             return Collections.emptyList();
279         }
280     }
281 }