2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
10 import static java.util.Objects.requireNonNull;
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;
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.Enumeration.Pair;
24 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
25 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
26 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
27 import org.opendaylight.mdsal.binding.model.api.Type;
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.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;
38 public final class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
39 private final String packageName;
40 private final String name;
41 private List<Enumeration.Pair> values = Collections.emptyList();
42 private List<AnnotationTypeBuilder> annotationBuilders = Collections.emptyList();
43 private List<Pair> unmodifiableValues = Collections.emptyList();
44 private String description;
45 private String reference;
46 private String moduleName;
47 private Iterable<QName> schemaPath;
49 public EnumerationBuilderImpl(final String packageName, final String name) {
50 super(packageName, name);
51 this.packageName = packageName;
55 public void setReference(final String reference) {
56 this.reference = reference;
59 public void setModuleName(final String moduleName) {
60 this.moduleName = moduleName;
63 public void setSchemaPath(final Iterable<QName> schemaPath) {
64 this.schemaPath = schemaPath;
68 public void setDescription(final String description) {
69 this.description = description;
74 public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
75 if (packageName != null && name != null) {
76 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
77 if (!this.annotationBuilders.contains(builder)) {
78 this.annotationBuilders = LazyCollections.lazyAdd(this.annotationBuilders, builder);
86 void addValue(final String name, final String mappedName, final int value, final String description) {
87 final EnumPairImpl p = new EnumPairImpl(name, mappedName, value, description);
88 this.values = LazyCollections.lazyAdd(this.values, p);
89 this.unmodifiableValues = Collections.unmodifiableList(this.values);
93 public Enumeration toInstance(final Type definingType) {
94 return new EnumerationImpl(definingType, this.annotationBuilders, this.packageName, this.name,
95 this.unmodifiableValues, this.description, this.reference, this.moduleName, this.schemaPath);
101 * @see java.lang.Object#toString()
104 public String toString() {
105 final StringBuilder builder = new StringBuilder();
106 builder.append("EnumerationBuilderImpl [packageName=");
107 builder.append(this.packageName);
108 builder.append(", name=");
109 builder.append(this.name);
110 builder.append(", values=");
111 builder.append(this.values);
113 return builder.toString();
117 public void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
118 final List<EnumPair> enums = enumTypeDef.getValues();
119 final Map<String, String> valueIds = BindingMapping.mapEnumAssignedNames(enums.stream().map(EnumPair::getName)
120 .collect(Collectors.toList()));
122 for (EnumPair enumPair : enums) {
123 addValue(enumPair.getName(), valueIds.get(enumPair.getName()), enumPair.getValue(),
124 enumPair.getDescription());
128 private static final class EnumPairImpl implements Enumeration.Pair {
130 private final String name;
131 private final String mappedName;
132 private final int value;
133 private final String description;
135 EnumPairImpl(final String name, final String mappedName, final int value, final String description) {
136 this.name = requireNonNull(name);
137 this.mappedName = requireNonNull(mappedName);
139 this.description = description;
143 public String getName() {
148 public String getMappedName() {
149 return this.mappedName;
153 public int getValue() {
160 * @see java.lang.Object#hashCode()
163 public int hashCode() {
164 final int prime = 31;
166 result = prime * result + Objects.hashCode(this.name);
167 result = prime * result + Objects.hashCode(this.value);
174 * @see java.lang.Object#equals(java.lang.Object)
177 public boolean equals(final Object obj) {
184 if (getClass() != obj.getClass()) {
187 final EnumPairImpl other = (EnumPairImpl) obj;
188 return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
194 * @see java.lang.Object#toString()
197 public String toString() {
198 final StringBuilder builder = new StringBuilder();
199 builder.append("EnumPair [name=");
200 builder.append(this.name);
201 builder.append(", mappedName=");
202 builder.append(getMappedName());
203 builder.append(", value=");
204 builder.append(this.value);
206 return builder.toString();
210 public String getDescription() {
211 return this.description;
215 public String getReference() {
220 public Status getStatus() {
221 // TODO Auto-generated method stub
227 private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
229 private final Type definingType;
230 private final String description;
231 private final String reference;
232 private final String moduleName;
233 private final Iterable<QName> schemaPath;
234 private final List<Pair> values;
235 private final List<AnnotationType> annotations;
237 public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
238 final String packageName, final String name, final List<Pair> values, final String description,
239 final String reference, final String moduleName, final Iterable<QName> schemaPath) {
240 super(packageName, name);
241 this.definingType = definingType;
242 this.values = values;
243 this.description = description;
244 this.moduleName = moduleName;
245 this.schemaPath = schemaPath;
246 this.reference = reference;
248 final ArrayList<AnnotationType> a = new ArrayList<>();
249 for (final AnnotationTypeBuilder builder : annotationBuilders) {
250 a.add(builder.toInstance());
252 this.annotations = ImmutableList.copyOf(a);
256 public Type getParentType() {
257 return this.definingType;
261 public List<Pair> getValues() {
266 public List<AnnotationType> getAnnotations() {
267 return this.annotations;
271 public String toFormattedString() {
272 final StringBuilder builder = new StringBuilder();
273 builder.append("public enum");
275 builder.append(getName());
276 builder.append(" {");
277 builder.append("\n");
280 for (final Enumeration.Pair valPair : this.values) {
281 builder.append("\t");
283 builder.append(valPair.getMappedName());
284 builder.append(" (");
285 builder.append(valPair.getValue());
287 if (i == this.values.size() - 1) {
288 builder.append(" );");
290 builder.append(" ),");
294 builder.append("\n}");
295 return builder.toString();
301 * @see java.lang.Object#toString()
304 public String toString() {
305 final StringBuilder builder = new StringBuilder();
306 builder.append("Enumeration [packageName=");
307 builder.append(getPackageName());
308 if (this.definingType != null) {
309 builder.append(", definingType=");
310 builder.append(this.definingType.getPackageName());
312 builder.append(this.definingType.getName());
314 builder.append(", definingType= null");
316 builder.append(", name=");
317 builder.append(getName());
318 builder.append(", values=");
319 builder.append(this.values);
321 return builder.toString();
325 public String getComment() {
330 public boolean isAbstract() {
335 public List<Type> getImplements() {
336 return Collections.emptyList();
340 public List<GeneratedType> getEnclosedTypes() {
341 return Collections.emptyList();
345 public List<Enumeration> getEnumerations() {
346 return Collections.emptyList();
350 public List<Constant> getConstantDefinitions() {
351 return Collections.emptyList();
355 public List<MethodSignature> getMethodDefinitions() {
356 return Collections.emptyList();
360 public List<GeneratedProperty> getProperties() {
361 return Collections.emptyList();
365 public String getDescription() {
366 return this.description;
370 public String getReference() {
371 return this.reference;
375 public Iterable<QName> getSchemaPath() {
376 return this.schemaPath;
380 public String getModuleName() {
381 return this.moduleName;