2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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
8 package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
10 import static java.util.Objects.requireNonNull;
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.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
19 import java.util.Objects;
20 import java.util.stream.Collectors;
21 import org.opendaylight.mdsal.binding.model.api.AbstractType;
22 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
23 import org.opendaylight.mdsal.binding.model.api.Constant;
24 import org.opendaylight.mdsal.binding.model.api.Enumeration;
25 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
26 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
27 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
28 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
29 import org.opendaylight.mdsal.binding.model.api.Type;
30 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
31 import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
32 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
33 import org.opendaylight.yangtools.util.LazyCollections;
34 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
35 import org.opendaylight.yangtools.yang.model.api.Status;
36 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
39 // FIXME: public because EnumBuilder does not have setters we are exposing
40 public abstract class AbstractEnumerationBuilder extends AbstractType implements EnumBuilder {
41 private List<Enumeration.Pair> values = ImmutableList.of();
42 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
44 AbstractEnumerationBuilder(final JavaTypeName identifier) {
49 public final AnnotationTypeBuilder addAnnotation(final JavaTypeName identifier) {
50 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(identifier);
51 if (!annotationBuilders.contains(builder)) {
52 annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
59 final void addValue(final String name, final String mappedName, final int value, final Status status,
60 final String description, final String reference) {
61 values = LazyCollections.lazyAdd(values,
62 createEnumPair(name, mappedName, value, status, description, reference));
65 public abstract void setReference(String reference);
67 public abstract void setModuleName(String moduleName);
69 public abstract void setSchemaPath(SchemaPath schemaPath);
71 abstract AbstractPair createEnumPair(String name, String mappedName, int value, Status status, String description,
75 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
76 return super.addToStringAttributes(toStringHelper).add("values", values);
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()));
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));
91 abstract static class AbstractPair implements Enumeration.Pair {
92 private final String name;
93 private final String mappedName;
94 private final int value;
96 AbstractPair(final String name, final String mappedName, final int value) {
97 this.name = requireNonNull(name);
98 this.mappedName = requireNonNull(mappedName);
103 public final String getName() {
108 public final String getMappedName() {
109 return this.mappedName;
113 public final int getValue() {
118 public final int hashCode() {
119 final int prime = 31;
121 result = prime * result + Objects.hashCode(this.name);
122 result = prime * result + Objects.hashCode(this.value);
127 public final boolean equals(final Object obj) {
131 if (!(obj instanceof AbstractPair)) {
134 final AbstractPair other = (AbstractPair) obj;
135 return Objects.equals(this.name, other.name) && Objects.equals(this.value, other.value);
139 public final String toString() {
140 final StringBuilder builder = new StringBuilder();
141 builder.append("EnumPair [name=");
142 builder.append(this.name);
143 builder.append(", mappedName=");
144 builder.append(getMappedName());
145 builder.append(", value=");
146 builder.append(this.value);
148 return builder.toString();
152 abstract static class AbstractEnumeration extends AbstractType implements Enumeration {
153 private final List<AnnotationType> annotations;
154 private final List<Pair> values;
156 AbstractEnumeration(final AbstractEnumerationBuilder builder) {
157 super(builder.getIdentifier());
158 this.values = ImmutableList.copyOf(builder.values);
160 final ArrayList<AnnotationType> a = new ArrayList<>();
161 for (final AnnotationTypeBuilder b : builder.annotationBuilders) {
164 this.annotations = ImmutableList.copyOf(a);
168 public final List<Pair> getValues() {
173 public final List<AnnotationType> getAnnotations() {
174 return this.annotations;
178 public final String toFormattedString() {
179 final StringBuilder builder = new StringBuilder();
180 builder.append("public enum");
182 builder.append(getName());
183 builder.append(" {");
184 builder.append("\n");
187 for (final Enumeration.Pair valPair : this.values) {
188 builder.append("\t ");
189 builder.append(valPair.getMappedName());
190 builder.append(" (");
191 builder.append(valPair.getValue());
193 if (offset == this.values.size() - 1) {
194 builder.append(" );");
196 builder.append(" ),");
200 builder.append("\n}");
201 return builder.toString();
205 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
206 return super.addToStringAttributes(toStringHelper).add("values", values);
210 public final boolean isAbstract() {
215 public final List<Type> getImplements() {
216 return Collections.emptyList();
220 public final List<GeneratedType> getEnclosedTypes() {
221 return Collections.emptyList();
225 public final List<Enumeration> getEnumerations() {
226 return Collections.emptyList();
230 public final List<Constant> getConstantDefinitions() {
231 return Collections.emptyList();
235 public final List<MethodSignature> getMethodDefinitions() {
236 return Collections.emptyList();
240 public final List<GeneratedProperty> getProperties() {
241 return Collections.emptyList();