Generate javadoc for TypeObjects
[mdsal.git] / binding / mdsal-binding-model-ri / src / main / java / org / opendaylight / mdsal / binding / model / ri / generated / type / builder / AbstractEnumerationBuilder.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.model.ri.generated.type.builder;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.VisibleForTesting;
13 import com.google.common.base.MoreObjects.ToStringHelper;
14 import com.google.common.collect.ImmutableList;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.stream.Collectors;
18 import org.opendaylight.mdsal.binding.model.api.AbstractType;
19 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
20 import org.opendaylight.mdsal.binding.model.api.Constant;
21 import org.opendaylight.mdsal.binding.model.api.Enumeration;
22 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
23 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
24 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
25 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
26 import org.opendaylight.mdsal.binding.model.api.Type;
27 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
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.spec.naming.BindingMapping;
31 import org.opendaylight.yangtools.util.LazyCollections;
32 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
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;
36
37 // FIXME: public because EnumBuilder does not have setters we are exposing
38 public abstract class AbstractEnumerationBuilder extends AbstractType implements EnumBuilder {
39     private List<Enumeration.Pair> values = ImmutableList.of();
40     private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
41
42     AbstractEnumerationBuilder(final JavaTypeName identifier) {
43         super(identifier);
44     }
45
46     @Override
47     public final AnnotationTypeBuilder addAnnotation(final JavaTypeName identifier) {
48         final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(identifier);
49         if (!annotationBuilders.contains(builder)) {
50             annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
51             return builder;
52         }
53         return null;
54     }
55
56     @VisibleForTesting
57     final void addValue(final String name, final String mappedName, final int value, final Status status,
58             final String description, final String reference) {
59         values = LazyCollections.lazyAdd(values,
60             createEnumPair(name, mappedName, value, status, description, reference));
61     }
62
63     public abstract void setReference(String reference);
64
65     public abstract void setModuleName(String moduleName);
66
67     public abstract void setSchemaPath(SchemaPath schemaPath);
68
69     public abstract void setYangSourceDefinition(YangSourceDefinition yangSourceDefinition);
70
71     abstract AbstractPair createEnumPair(String name, String mappedName, int value, Status status, String description,
72             String reference);
73
74     @Override
75     protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
76         return super.addToStringAttributes(toStringHelper).add("values", values);
77     }
78
79     @Override
80     public final void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
81         final List<EnumPair> enums = enumTypeDef.getValues();
82         final Map<String, String> valueIds = BindingMapping.mapEnumAssignedNames(enums.stream().map(EnumPair::getName)
83             .collect(Collectors.toList()));
84
85         for (EnumPair enumPair : enums) {
86             addValue(enumPair.getName(), valueIds.get(enumPair.getName()), enumPair.getValue(), enumPair.getStatus(),
87                 enumPair.getDescription().orElse(null), enumPair.getReference().orElse(null));
88         }
89     }
90
91     abstract static class AbstractPair implements Enumeration.Pair {
92         private final String name;
93         private final String mappedName;
94         private final int value;
95
96         AbstractPair(final String name, final String mappedName, final int value) {
97             this.name = requireNonNull(name);
98             this.mappedName = requireNonNull(mappedName);
99             this.value = value;
100         }
101
102         @Override
103         public final String getName() {
104             return name;
105         }
106
107         @Override
108         public final String getMappedName() {
109             return mappedName;
110         }
111
112         @Override
113         public final int getValue() {
114             return value;
115         }
116
117         @Override
118         public final int hashCode() {
119             return name.hashCode() * 31 + value;
120         }
121
122         @Override
123         public final boolean equals(final Object obj) {
124             return obj == this || obj instanceof AbstractPair other && name.equals(other.name) && value == other.value;
125         }
126
127         @Override
128         public final String toString() {
129             return new StringBuilder().append("EnumPair [name=").append(name)
130                 .append(", mappedName=").append(getMappedName())
131                 .append(", value=").append(value)
132                 .append("]").toString();
133         }
134     }
135
136     abstract static class AbstractEnumeration extends AbstractType implements Enumeration {
137         private final List<AnnotationType> annotations;
138         private final List<Pair> values;
139
140         AbstractEnumeration(final AbstractEnumerationBuilder builder) {
141             super(builder.getIdentifier());
142             values = ImmutableList.copyOf(builder.values);
143             annotations = builder.annotationBuilders.stream()
144                 .map(AnnotationTypeBuilder::build)
145                 .collect(ImmutableList.toImmutableList());
146         }
147
148         @Override
149         public final List<Pair> getValues() {
150             return values;
151         }
152
153         @Override
154         public final List<AnnotationType> getAnnotations() {
155             return annotations;
156         }
157
158         @Override
159         public final String toFormattedString() {
160             final var sb = new StringBuilder().append("public enum ").append(getName()).append(" {\n");
161
162             int offset = 0;
163             for (var valPair : values) {
164                 sb.append("\t ").append(valPair.getMappedName()).append(" (").append(valPair.getValue()).append(" )")
165                     .append(offset == values.size() - 1 ? ';' : ',');
166                 ++offset;
167             }
168             return sb.append("\n}").toString();
169         }
170
171         @Override
172         protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
173             return super.addToStringAttributes(toStringHelper).add("values", values);
174         }
175
176         @Override
177         public final boolean isAbstract() {
178             return false;
179         }
180
181         @Override
182         public final List<Type> getImplements() {
183             return List.of();
184         }
185
186         @Override
187         public final List<GeneratedType> getEnclosedTypes() {
188             return List.of();
189         }
190
191         @Override
192         public final List<Enumeration> getEnumerations() {
193             return List.of();
194         }
195
196         @Override
197         public final List<Constant> getConstantDefinitions() {
198             return List.of();
199         }
200
201         @Override
202         public final List<MethodSignature> getMethodDefinitions() {
203             return List.of();
204         }
205
206         @Override
207         public final List<GeneratedProperty> getProperties() {
208             return List.of();
209         }
210     }
211 }