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