2 * Copyright (c) 2016 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
9 package org.opendaylight.mdsal.binding2.generator.util.generated.type.builder;
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.Collections;
15 import java.util.List;
16 import java.util.Objects;
17 import java.util.stream.Collectors;
18 import javax.annotation.Nonnull;
19 import javax.annotation.Nullable;
20 import org.opendaylight.mdsal.binding2.generator.util.AbstractBaseType;
21 import org.opendaylight.mdsal.binding2.generator.util.Binding2Mapping;
22 import org.opendaylight.mdsal.binding2.model.api.AnnotationType;
23 import org.opendaylight.mdsal.binding2.model.api.Constant;
24 import org.opendaylight.mdsal.binding2.model.api.Enumeration;
25 import org.opendaylight.mdsal.binding2.model.api.Enumeration.Pair;
26 import org.opendaylight.mdsal.binding2.model.api.GeneratedProperty;
27 import org.opendaylight.mdsal.binding2.model.api.GeneratedType;
28 import org.opendaylight.mdsal.binding2.model.api.MethodSignature;
29 import org.opendaylight.mdsal.binding2.model.api.Type;
30 import org.opendaylight.mdsal.binding2.model.api.type.builder.AnnotationTypeBuilder;
31 import org.opendaylight.mdsal.binding2.model.api.type.builder.EnumBuilder;
32 import org.opendaylight.yangtools.util.LazyCollections;
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;
39 public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
41 private final String packageName;
42 private final String name;
43 private List<Pair> values = ImmutableList.of();
44 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
45 private List<Pair> unmodifiableValues = ImmutableList.of();
46 private String description;
47 private String reference;
48 private Status status;
49 private String moduleName;
50 private List<QName> schemaPath;
52 public EnumerationBuilderImpl(String packageName, String name) {
53 super(packageName, name);
54 this.packageName = packageName;
58 public void setReference(final String reference) {
59 this.reference = reference;
62 public void setModuleName(final String moduleName) {
63 this.moduleName = moduleName;
66 public void setSchemaPath(final List<QName> schemaPath) {
67 this.schemaPath = schemaPath;
70 public void setStatus(final Status status) {
75 public void setDescription(String description) {
76 this.description = description;
80 public AnnotationTypeBuilder addAnnotation(String packageName, String name) {
81 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
82 if (!annotationBuilders.contains(builder)) {
83 annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
89 public void addValue(String name, int value, String description, String reference, Status status) {
90 final EnumPairImpl p = new EnumPairImpl(name, value, description, reference, status);
91 values = LazyCollections.lazyAdd(values, p);
92 unmodifiableValues = Collections.unmodifiableList(values);
96 public Enumeration toInstance(Type definingType) {
97 return new EnumerationImpl(definingType, annotationBuilders, packageName, name, values, description,
98 reference, status, moduleName, schemaPath);
102 public String toString() {
103 StringBuilder builder = new StringBuilder();
104 builder.append("EnumerationBuilderImpl [packageName=");
105 builder.append(packageName);
106 builder.append(", name=");
107 builder.append(name);
108 builder.append(", values=");
109 builder.append(values);
111 return builder.toString();
115 public void updateEnumPairsFromEnumTypeDef(EnumTypeDefinition enumTypeDef) {
116 final List<EnumPair> enums = enumTypeDef.getValues();
118 enums.stream().filter(enumPair -> enumPair != null).forEach(enumPair -> this.addValue(enumPair.getName(),
119 enumPair.getValue(), enumPair.getDescription(), enumPair.getReference(), enumPair.getStatus()));
123 private static final class EnumPairImpl implements Enumeration.Pair {
125 private final String name;
126 private final String mappedName;
127 private final int value;
128 private final String description;
129 private final String reference;
130 private final Status status;
132 public EnumPairImpl(final String name, final int value, final String description,
133 final String reference, final Status status) {
136 this.mappedName = Binding2Mapping.getClassName(name);
138 this.description = description;
139 this.reference = reference;
140 this.status = status;
144 public String getName() {
149 public String getMappedName() {
154 public int getValue() {
160 public String getDescription() {
166 public String getReference() {
172 public Status getStatus() {
177 public int hashCode() {
178 return Objects.hash(name, value);
182 public boolean equals(Object obj) {
191 if (getClass() != obj.getClass()) {
195 if (!(obj instanceof EnumPairImpl)) {
199 EnumPairImpl other = (EnumPairImpl) obj;
201 return Objects.equals(name, other.name) && Objects.equals(value, other.value);
205 public String toString() {
206 StringBuilder builder = new StringBuilder();
207 builder.append("EnumPair [name=");
208 builder.append(name);
209 builder.append(", mappedName=");
210 builder.append(getMappedName());
211 builder.append(", value=");
212 builder.append(value);
214 return builder.toString();
218 private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
220 private final Type definingType;
221 private final String description;
222 private final String reference;
223 private final Status status;
224 private final String moduleName;
225 private final List<QName> schemaPath;
226 private final List<Pair> values;
227 private final List<AnnotationType> annotations;
229 public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
230 final String packageName, final String name, final List<Pair> values, final String description,
231 final String reference, final Status status, final String moduleName, final
232 List<QName> schemaPath) {
233 super(packageName, name);
234 this.definingType = definingType;
235 this.values = values;
236 this.description = description;
237 this.reference = reference;
238 this.status = status;
239 this.moduleName = moduleName;
240 this.schemaPath = schemaPath;
242 final List<AnnotationType> a = annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance)
243 .collect(Collectors.toList());
244 this.annotations = ImmutableList.copyOf(a);
248 public List<AnnotationType> getAnnotations() {
253 public Type getParentType() {
258 public Optional<String> getDescription() {
259 return Optional.of(description);
263 public List<Pair> getValues() {
268 public String toFormattedString() {
269 StringBuilder builder = new StringBuilder();
270 builder.append("public enum");
272 builder.append(getName());
273 builder.append(" {");
274 builder.append("\n");
277 for (final Enumeration.Pair valPair : values) {
278 builder.append("\t");
280 builder.append(valPair.getMappedName());
281 builder.append(" (");
282 builder.append(valPair.getValue());
284 if (i == (values.size() - 1)) {
285 builder.append(" );");
287 builder.append(" ),");
291 builder.append("\n}");
292 return builder.toString();
296 public Optional<String> getReference() {
297 return Optional.of(reference);
301 public List<QName> getSchemaPath() {
306 public String getModuleName() {
311 public String getComment() {
317 public boolean isAbstract() {
322 public List<Type> getImplements() {
323 return ImmutableList.of();
327 public List<GeneratedType> getEnclosedTypes() {
328 return ImmutableList.of();
332 public List<Enumeration> getEnumerations() {
333 return ImmutableList.of();
337 public List<Constant> getConstantDefinitions() {
338 return ImmutableList.of();
342 public List<MethodSignature> getMethodDefinitions() {
343 return ImmutableList.of();
347 public List<GeneratedProperty> getProperties() {
348 return ImmutableList.of();
351 public Status getStatus() {