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.type.builder.AnnotationTypeBuilder;
28 import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
29 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
30 import org.opendaylight.yangtools.util.LazyCollections;
31 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
32 import org.opendaylight.yangtools.yang.model.api.Status;
33 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
34 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
36 // FIXME: public because EnumBuilder does not have setters we are exposing
37 public abstract class AbstractEnumerationBuilder extends AbstractType implements EnumBuilder {
38 private List<Enumeration.Pair> values = ImmutableList.of();
39 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
41 AbstractEnumerationBuilder(final JavaTypeName identifier) {
46 public final AnnotationTypeBuilder addAnnotation(final JavaTypeName identifier) {
47 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(identifier);
48 if (!annotationBuilders.contains(builder)) {
49 annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
56 final void addValue(final String name, final String mappedName, final int value, final Status status,
57 final String description, final String reference) {
58 values = LazyCollections.lazyAdd(values,
59 createEnumPair(name, mappedName, value, status, description, reference));
62 public abstract void setReference(String reference);
64 public abstract void setModuleName(String moduleName);
66 public abstract void setSchemaPath(SchemaPath schemaPath);
68 abstract AbstractPair createEnumPair(String name, String mappedName, int value, Status status, String description,
72 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
73 return super.addToStringAttributes(toStringHelper).add("values", values);
77 public final void updateEnumPairsFromEnumTypeDef(final EnumTypeDefinition enumTypeDef) {
78 final List<EnumPair> enums = enumTypeDef.getValues();
79 final Map<String, String> valueIds = BindingMapping.mapEnumAssignedNames(enums.stream().map(EnumPair::getName)
80 .collect(Collectors.toList()));
82 for (EnumPair enumPair : enums) {
83 addValue(enumPair.getName(), valueIds.get(enumPair.getName()), enumPair.getValue(), enumPair.getStatus(),
84 enumPair.getDescription().orElse(null), enumPair.getReference().orElse(null));
88 abstract static class AbstractPair implements Enumeration.Pair {
89 private final String name;
90 private final String mappedName;
91 private final int value;
93 AbstractPair(final String name, final String mappedName, final int value) {
94 this.name = requireNonNull(name);
95 this.mappedName = requireNonNull(mappedName);
100 public final String getName() {
105 public final String getMappedName() {
110 public final int getValue() {
115 public final int hashCode() {
116 return name.hashCode() * 31 + value;
120 public final boolean equals(final Object obj) {
121 return obj == this || obj instanceof AbstractPair other && name.equals(other.name) && value == other.value;
125 public final String toString() {
126 return new StringBuilder().append("EnumPair [name=").append(name)
127 .append(", mappedName=").append(getMappedName())
128 .append(", value=").append(value)
129 .append("]").toString();
133 abstract static class AbstractEnumeration extends AbstractType implements Enumeration {
134 private final List<AnnotationType> annotations;
135 private final List<Pair> values;
137 AbstractEnumeration(final AbstractEnumerationBuilder builder) {
138 super(builder.getIdentifier());
139 values = ImmutableList.copyOf(builder.values);
140 annotations = builder.annotationBuilders.stream()
141 .map(AnnotationTypeBuilder::build)
142 .collect(ImmutableList.toImmutableList());
146 public final List<Pair> getValues() {
151 public final List<AnnotationType> getAnnotations() {
156 public final String toFormattedString() {
157 final var sb = new StringBuilder().append("public enum ").append(getName()).append(" {\n");
160 for (var valPair : values) {
161 sb.append("\t ").append(valPair.getMappedName()).append(" (").append(valPair.getValue()).append(" )")
162 .append(offset == values.size() - 1 ? ';' : ',');
165 return sb.append("\n}").toString();
169 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
170 return super.addToStringAttributes(toStringHelper).add("values", values);
174 public final boolean isAbstract() {
179 public final List<Type> getImplements() {
184 public final List<GeneratedType> getEnclosedTypes() {
189 public final List<Enumeration> getEnumerations() {
194 public final List<Constant> getConstantDefinitions() {
199 public final List<MethodSignature> getMethodDefinitions() {
204 public final List<GeneratedProperty> getProperties() {