2 * Copyright (c) 2017 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.binding.javav2.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.binding.javav2.generator.util.AbstractBaseType;
20 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
21 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
22 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
23 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
24 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration.Pair;
25 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
26 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
27 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
28 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
29 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.AnnotationTypeBuilder;
30 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
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 List<Pair> values = ImmutableList.of();
41 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
42 private String description;
43 private String reference;
44 private String moduleName;
45 private List<QName> schemaPath;
47 public EnumerationBuilderImpl(final String packageName, final String name) {
48 super(packageName, name);
51 public void setReference(final String reference) {
52 this.reference = reference;
55 public void setModuleName(final String moduleName) {
56 this.moduleName = moduleName;
59 public void setSchemaPath(final List<QName> schemaPath) {
60 this.schemaPath = schemaPath;
64 public void setDescription(final String description) {
65 this.description = description;
69 public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
70 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
71 if (!this.annotationBuilders.contains(builder)) {
72 this.annotationBuilders = LazyCollections.lazyAdd(this.annotationBuilders, builder);
78 public void addValue(final String name, final int value, final String description, final String reference, final Status status) {
79 final EnumPairImpl p = new EnumPairImpl(name, value, description, reference, status, this.values);
80 this.values = LazyCollections.lazyAdd(this.values, p);
84 public Enumeration toInstance(final Type definingType) {
85 return new EnumerationImpl(definingType, this.annotationBuilders, this.packageName, this.name, this.values, this.description,
86 this.reference, this.moduleName, this.schemaPath);
90 public String toString() {
91 final StringBuilder builder = new StringBuilder();
92 builder.append("EnumerationBuilderImpl [packageName=");
93 builder.append(this.packageName);
94 builder.append(", name=");
95 builder.append(this.name);
96 builder.append(", values=");
97 builder.append(this.values);
99 return builder.toString();
103 public void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
104 final List<EnumPair> enums = enumTypeDef.getValues();
106 enums.stream().filter(enumPair -> enumPair != null).forEach(enumPair -> this.addValue(enumPair.getName(),
107 enumPair.getValue(), enumPair.getDescription(), enumPair.getReference(), enumPair.getStatus()));
111 private static final class EnumPairImpl implements Enumeration.Pair {
113 private final String name;
114 private final String mappedName;
115 private final int value;
116 private final String description;
117 private final String reference;
118 private final Status status;
120 public EnumPairImpl(final String name, final int value, final String description,
121 final String reference, final Status status, final List<Pair> values) {
124 this.mappedName = JavaIdentifierNormalizer.normalizeEnumValueIdentifier(name, values);
126 this.description = description;
127 this.reference = reference;
128 this.status = status;
132 public String getName() {
137 public String getMappedName() {
138 return this.mappedName;
142 public int getValue() {
148 public String getDescription() {
149 return this.description;
154 public String getReference() {
155 return this.reference;
160 public Status getStatus() {
165 public int hashCode() {
166 return Objects.hash(this.name, this.value);
170 public boolean equals(final Object obj) {
179 if (getClass() != obj.getClass()) {
183 if (!(obj instanceof EnumPairImpl)) {
187 final EnumPairImpl other = (EnumPairImpl) obj;
189 return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
193 public String toString() {
194 final StringBuilder builder = new StringBuilder();
195 builder.append("EnumPair [name=");
196 builder.append(this.name);
197 builder.append(", mappedName=");
198 builder.append(getMappedName());
199 builder.append(", value=");
200 builder.append(this.value);
202 return builder.toString();
206 private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
208 private final Type definingType;
209 private final String description;
210 private final String reference;
211 private final String moduleName;
212 private final List<QName> schemaPath;
213 private final List<Pair> values;
214 private final List<AnnotationType> annotations;
216 public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
217 final String packageName, final String name, final List<Pair> values, final String description,
218 final String reference, final String moduleName, final List<QName> schemaPath) {
219 super(packageName, name, true);
220 this.definingType = definingType;
221 this.values = values;
222 this.description = description;
223 this.reference = reference;
224 this.moduleName = moduleName;
225 this.schemaPath = schemaPath;
227 final List<AnnotationType> a = annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance)
228 .collect(Collectors.toList());
229 this.annotations = ImmutableList.copyOf(a);
233 public List<AnnotationType> getAnnotations() {
234 return this.annotations;
238 public Type getParentType() {
239 return this.definingType;
243 public Optional<String> getDescription() {
244 return Optional.of(this.description);
248 public List<Pair> getValues() {
253 public String toFormattedString() {
254 final StringBuilder builder = new StringBuilder();
255 builder.append("public enum");
257 builder.append(getName());
258 builder.append(" {");
259 builder.append("\n");
262 for (final Enumeration.Pair valPair : this.values) {
263 builder.append("\t");
265 builder.append(valPair.getMappedName());
266 builder.append(" (");
267 builder.append(valPair.getValue());
269 if (i == (this.values.size() - 1)) {
270 builder.append(" );");
272 builder.append(" ),");
276 builder.append("\n}");
277 return builder.toString();
281 public Optional<String> getReference() {
282 return Optional.of(this.reference);
286 public List<QName> getSchemaPath() {
287 return this.schemaPath;
291 public String getModuleName() {
292 return this.moduleName;
296 public String getComment() {
302 public boolean isAbstract() {
307 public List<Type> getImplements() {
308 return ImmutableList.of();
312 public List<GeneratedType> getEnclosedTypes() {
313 return ImmutableList.of();
317 public List<Enumeration> getEnumerations() {
318 return ImmutableList.of();
322 public List<Constant> getConstantDefinitions() {
323 return ImmutableList.of();
327 public List<MethodSignature> getMethodDefinitions() {
328 return ImmutableList.of();
332 public List<GeneratedProperty> getProperties() {
333 return ImmutableList.of();
337 public Type getParentTypeForBuilder() {