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.collect.ImmutableList;
13 import java.util.List;
14 import java.util.Objects;
15 import java.util.Optional;
16 import java.util.stream.Collectors;
17 import javax.annotation.Nonnull;
18 import javax.annotation.Nullable;
19 import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
20 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
21 import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer;
22 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
23 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
24 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
25 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration.Pair;
26 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
27 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
28 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
29 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
30 import org.opendaylight.mdsal.binding.javav2.model.api.TypeComment;
31 import org.opendaylight.mdsal.binding.javav2.model.api.YangSourceDefinition;
32 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.AnnotationTypeBuilder;
33 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
34 import org.opendaylight.yangtools.util.LazyCollections;
35 import org.opendaylight.yangtools.yang.common.QName;
36 import org.opendaylight.yangtools.yang.model.api.Status;
37 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
38 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
41 public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuilder {
43 private List<Pair> values = ImmutableList.of();
44 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
45 private String description;
46 private String reference;
47 private String moduleName;
48 private List<QName> schemaPath;
50 public EnumerationBuilderImpl(final String packageName, final String name, final ModuleContext context) {
51 super(packageName, name, context);
54 public EnumerationBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized,
55 final boolean isTypeNormalized, final ModuleContext context) {
56 super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
59 public void setReference(final String reference) {
60 this.reference = reference;
63 public void setModuleName(final String moduleName) {
64 this.moduleName = moduleName;
67 public void setSchemaPath(final List<QName> schemaPath) {
68 this.schemaPath = schemaPath;
72 public void setDescription(final String description) {
73 this.description = description;
77 public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
78 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
79 if (!this.annotationBuilders.contains(builder)) {
80 this.annotationBuilders = LazyCollections.lazyAdd(this.annotationBuilders, builder);
86 public void addValue(final String name, final int value, final String description, final String reference, final Status status) {
87 final EnumPairImpl p = new EnumPairImpl(name, value, description, reference, status, this.values);
88 this.values = LazyCollections.lazyAdd(this.values, p);
92 public Enumeration toInstance(final Type definingType) {
93 return new EnumerationImpl(definingType, this.annotationBuilders, this.packageName, this.name, this.values, this.description,
94 this.reference, this.moduleName, this.schemaPath);
98 public String toString() {
99 final StringBuilder builder = new StringBuilder();
100 builder.append("EnumerationBuilderImpl [packageName=");
101 builder.append(this.packageName);
102 builder.append(", name=");
103 builder.append(this.name);
104 builder.append(", values=");
105 builder.append(this.values);
107 return builder.toString();
111 public void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
112 final List<EnumPair> enums = enumTypeDef.getValues();
114 enums.stream().filter(enumPair -> enumPair != null).forEach(enumPair -> this.addValue(enumPair.getName(),
115 enumPair.getValue(), enumPair.getDescription().orElse(null), enumPair.getReference().orElse(null),
116 enumPair.getStatus()));
120 private static final class EnumPairImpl implements Enumeration.Pair {
122 private final String name;
123 private final String mappedName;
124 private final int value;
125 private final String description;
126 private final String reference;
127 private final Status status;
129 public EnumPairImpl(final String name, final int value, final String description,
130 final String reference, final Status status, final List<Pair> values) {
133 this.mappedName = JavaIdentifierNormalizer.normalizeEnumValueIdentifier(name, values);
135 this.description = description;
136 this.reference = reference;
137 this.status = status;
141 public String getName() {
146 public String getMappedName() {
147 return this.mappedName;
151 public int getValue() {
157 public Optional<String> getDescription() {
158 return Optional.ofNullable(this.description);
163 public Optional<String> getReference() {
164 return Optional.ofNullable(this.reference);
169 public Status getStatus() {
174 public int hashCode() {
175 return Objects.hash(this.name, this.value);
179 public boolean equals(final Object obj) {
188 if (getClass() != obj.getClass()) {
192 if (!(obj instanceof EnumPairImpl)) {
196 final EnumPairImpl other = (EnumPairImpl) obj;
198 return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
202 public String toString() {
203 final StringBuilder builder = new StringBuilder();
204 builder.append("EnumPair [name=");
205 builder.append(this.name);
206 builder.append(", mappedName=");
207 builder.append(getMappedName());
208 builder.append(", value=");
209 builder.append(this.value);
211 return builder.toString();
215 private static final class EnumerationImpl extends AbstractBaseType implements Enumeration {
217 private final Type definingType;
218 private final String description;
219 private final String reference;
220 private final String moduleName;
221 private final List<QName> schemaPath;
222 private final List<Pair> values;
223 private final List<AnnotationType> annotations;
225 public EnumerationImpl(final Type definingType, final List<AnnotationTypeBuilder> annotationBuilders,
226 final String packageName, final String name, final List<Pair> values, final String description,
227 final String reference, final String moduleName, final List<QName> schemaPath) {
228 super(packageName, name, true, null);
229 this.definingType = definingType;
230 this.values = values;
231 this.description = description;
232 this.reference = reference;
233 this.moduleName = moduleName;
234 this.schemaPath = schemaPath;
236 final List<AnnotationType> a = annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance)
237 .collect(Collectors.toList());
238 this.annotations = ImmutableList.copyOf(a);
242 public List<AnnotationType> getAnnotations() {
243 return this.annotations;
247 public Type getParentType() {
248 return this.definingType;
252 public Optional<String> getDescription() {
253 return Optional.ofNullable(this.description);
257 public List<Pair> getValues() {
262 public String toFormattedString() {
263 final StringBuilder builder = new StringBuilder();
264 builder.append("public enum");
266 builder.append(getName());
267 builder.append(" {");
268 builder.append("\n");
271 for (final Enumeration.Pair valPair : this.values) {
272 builder.append("\t");
274 builder.append(valPair.getMappedName());
275 builder.append(" (");
276 builder.append(valPair.getValue());
278 if (i == this.values.size() - 1) {
279 builder.append(" );");
281 builder.append(" ),");
285 builder.append("\n}");
286 return builder.toString();
290 public Optional<String> getReference() {
291 return Optional.ofNullable(this.reference);
295 public List<QName> getSchemaPath() {
296 return this.schemaPath;
300 public String getModuleName() {
301 return this.moduleName;
305 public TypeComment getComment() {
311 public boolean isAbstract() {
316 public List<Type> getImplements() {
317 return ImmutableList.of();
321 public List<GeneratedType> getEnclosedTypes() {
322 return ImmutableList.of();
326 public List<Enumeration> getEnumerations() {
327 return ImmutableList.of();
331 public List<Constant> getConstantDefinitions() {
332 return ImmutableList.of();
336 public List<MethodSignature> getMethodDefinitions() {
337 return ImmutableList.of();
341 public List<GeneratedProperty> getProperties() {
342 return ImmutableList.of();
346 public Type getParentTypeForBuilder() {
351 public Optional<YangSourceDefinition> getYangSourceDefinition() {
352 // TODO Auto-generated method stub
353 return Optional.empty();