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.List;
15 import java.util.Objects;
16 import java.util.stream.Collectors;
17 import javax.annotation.Nonnull;
18 import javax.annotation.Nullable;
19 import org.opendaylight.mdsal.binding2.generator.util.AbstractBaseType;
20 import org.opendaylight.mdsal.binding2.model.api.AnnotationType;
21 import org.opendaylight.mdsal.binding2.model.api.Constant;
22 import org.opendaylight.mdsal.binding2.model.api.Enumeration;
23 import org.opendaylight.mdsal.binding2.model.api.Enumeration.Pair;
24 import org.opendaylight.mdsal.binding2.model.api.GeneratedProperty;
25 import org.opendaylight.mdsal.binding2.model.api.GeneratedType;
26 import org.opendaylight.mdsal.binding2.model.api.MethodSignature;
27 import org.opendaylight.mdsal.binding2.model.api.Type;
28 import org.opendaylight.mdsal.binding2.model.api.type.builder.AnnotationTypeBuilder;
29 import org.opendaylight.mdsal.binding2.model.api.type.builder.EnumBuilder;
30 import org.opendaylight.mdsal.binding2.util.BindingMapping;
31 import org.opendaylight.yangtools.util.LazyCollections;
32 import org.opendaylight.yangtools.yang.common.QName;
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;
38 public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
40 private final String packageName;
41 private final String name;
42 private List<Pair> values = ImmutableList.of();
43 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
44 private String description;
45 private String reference;
46 private String moduleName;
47 private List<QName> schemaPath;
49 public EnumerationBuilderImpl(String packageName, 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 List<QName> schemaPath) {
64 this.schemaPath = schemaPath;
68 public void setDescription(String description) {
69 this.description = description;
73 public AnnotationTypeBuilder addAnnotation(String packageName, String name) {
74 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
75 if (!annotationBuilders.contains(builder)) {
76 annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
82 public void addValue(String name, int value, String description, String reference, Status status) {
83 final EnumPairImpl p = new EnumPairImpl(name, value, description, reference, status);
84 values = LazyCollections.lazyAdd(values, p);
88 public Enumeration toInstance(Type definingType) {
89 return new EnumerationImpl(definingType, annotationBuilders, packageName, name, values, description,
90 reference, moduleName, schemaPath);
94 public String toString() {
95 StringBuilder builder = new StringBuilder();
96 builder.append("EnumerationBuilderImpl [packageName=");
97 builder.append(packageName);
98 builder.append(", name=");
100 builder.append(", values=");
101 builder.append(values);
103 return builder.toString();
107 public void updateEnumPairsFromEnumTypeDef(EnumTypeDefinition enumTypeDef) {
108 final List<EnumPair> enums = enumTypeDef.getValues();
110 enums.stream().filter(enumPair -> enumPair != null).forEach(enumPair -> this.addValue(enumPair.getName(),
111 enumPair.getValue(), enumPair.getDescription(), enumPair.getReference(), enumPair.getStatus()));
115 private static final class EnumPairImpl implements Enumeration.Pair {
117 private final String name;
118 private final String mappedName;
119 private final int value;
120 private final String description;
121 private final String reference;
122 private final Status status;
124 public EnumPairImpl(final String name, final int value, final String description,
125 final String reference, final Status status) {
128 this.mappedName = BindingMapping.getClassName(name);
130 this.description = description;
131 this.reference = reference;
132 this.status = status;
136 public String getName() {
141 public String getMappedName() {
146 public int getValue() {
152 public String getDescription() {
158 public String getReference() {
164 public Status getStatus() {
169 public int hashCode() {
170 return Objects.hash(name, value);
174 public boolean equals(Object obj) {
183 if (getClass() != obj.getClass()) {
187 if (!(obj instanceof EnumPairImpl)) {
191 EnumPairImpl other = (EnumPairImpl) obj;
193 return Objects.equals(name, other.name) && Objects.equals(value, other.value);
197 public String toString() {
198 StringBuilder builder = new StringBuilder();
199 builder.append("EnumPair [name=");
200 builder.append(name);
201 builder.append(", mappedName=");
202 builder.append(getMappedName());
203 builder.append(", value=");
204 builder.append(value);
206 return builder.toString();
210 private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
212 private final Type definingType;
213 private final String description;
214 private final String reference;
215 private final String moduleName;
216 private final List<QName> schemaPath;
217 private final List<Pair> values;
218 private final List<AnnotationType> annotations;
220 public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
221 final String packageName, final String name, final List<Pair> values, final String description,
222 final String reference, final String moduleName, final List<QName> schemaPath) {
223 super(packageName, name);
224 this.definingType = definingType;
225 this.values = values;
226 this.description = description;
227 this.reference = reference;
228 this.moduleName = moduleName;
229 this.schemaPath = schemaPath;
231 final List<AnnotationType> a = annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance)
232 .collect(Collectors.toList());
233 this.annotations = ImmutableList.copyOf(a);
237 public List<AnnotationType> getAnnotations() {
242 public Type getParentType() {
247 public Optional<String> getDescription() {
248 return Optional.of(description);
252 public List<Pair> getValues() {
257 public String toFormattedString() {
258 StringBuilder builder = new StringBuilder();
259 builder.append("public enum");
261 builder.append(getName());
262 builder.append(" {");
263 builder.append("\n");
266 for (final Enumeration.Pair valPair : values) {
267 builder.append("\t");
269 builder.append(valPair.getMappedName());
270 builder.append(" (");
271 builder.append(valPair.getValue());
273 if (i == (values.size() - 1)) {
274 builder.append(" );");
276 builder.append(" ),");
280 builder.append("\n}");
281 return builder.toString();
285 public Optional<String> getReference() {
286 return Optional.of(reference);
290 public List<QName> getSchemaPath() {
295 public String getModuleName() {
300 public String getComment() {
306 public boolean isAbstract() {
311 public List<Type> getImplements() {
312 return ImmutableList.of();
316 public List<GeneratedType> getEnclosedTypes() {
317 return ImmutableList.of();
321 public List<Enumeration> getEnumerations() {
322 return ImmutableList.of();
326 public List<Constant> getConstantDefinitions() {
327 return ImmutableList.of();
331 public List<MethodSignature> getMethodDefinitions() {
332 return ImmutableList.of();
336 public List<GeneratedProperty> getProperties() {
337 return ImmutableList.of();