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.ri.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.List;
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;
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();
42 AbstractEnumerationBuilder(final JavaTypeName identifier) {
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);
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));
63 public abstract void setReference(String reference);
65 public abstract void setModuleName(String moduleName);
67 public abstract void setSchemaPath(SchemaPath schemaPath);
69 public abstract void setYangSourceDefinition(YangSourceDefinition yangSourceDefinition);
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() {
113 public final int getValue() {
118 public final int hashCode() {
119 return name.hashCode() * 31 + value;
123 public final boolean equals(final Object obj) {
124 return obj == this || obj instanceof AbstractPair other && name.equals(other.name) && value == other.value;
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();
136 abstract static class AbstractEnumeration extends AbstractType implements Enumeration {
137 private final List<AnnotationType> annotations;
138 private final List<Pair> values;
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());
149 public final List<Pair> getValues() {
154 public final List<AnnotationType> getAnnotations() {
159 public final String toFormattedString() {
160 final var sb = new StringBuilder().append("public enum ").append(getName()).append(" {\n");
163 for (var valPair : values) {
164 sb.append("\t ").append(valPair.getMappedName()).append(" (").append(valPair.getValue()).append(" )")
165 .append(offset == values.size() - 1 ? ';' : ',');
168 return sb.append("\n}").toString();
172 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
173 return super.addToStringAttributes(toStringHelper).add("values", values);
177 public final boolean isAbstract() {
182 public final List<Type> getImplements() {
187 public final List<GeneratedType> getEnclosedTypes() {
192 public final List<Enumeration> getEnumerations() {
197 public final List<Constant> getConstantDefinitions() {
202 public final List<MethodSignature> getMethodDefinitions() {
207 public final List<GeneratedProperty> getProperties() {