2 * Copyright (c) 2013 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
8 package org.opendaylight.mdsal.binding.model.ri.generated.type.builder;
10 import com.google.common.base.MoreObjects.ToStringHelper;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Optional;
17 import org.opendaylight.mdsal.binding.model.api.AbstractType;
18 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
19 import org.opendaylight.mdsal.binding.model.api.Constant;
20 import org.opendaylight.mdsal.binding.model.api.Enumeration;
21 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
22 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
23 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
24 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
25 import org.opendaylight.mdsal.binding.model.api.Type;
26 import org.opendaylight.mdsal.binding.model.api.TypeComment;
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.model.api.type.builder.GeneratedPropertyBuilder;
31 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
32 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
33 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
35 abstract class AbstractGeneratedType extends AbstractType implements GeneratedType {
36 private final TypeComment comment;
37 private final List<AnnotationType> annotations;
38 private final List<Type> implementsTypes;
39 private final List<Enumeration> enumerations;
40 private final List<Constant> constants;
41 private final List<MethodSignature> methodSignatures;
42 private final List<GeneratedType> enclosedTypes;
43 private final List<GeneratedProperty> properties;
44 private final boolean isAbstract;
45 private final YangSourceDefinition definition;
47 AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
48 super(builder.getIdentifier());
49 comment = builder.getComment();
50 annotations = toUnmodifiableAnnotations(builder.getAnnotations());
51 implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
52 constants = makeUnmodifiable(builder.getConstants());
53 enumerations = List.copyOf(builder.getEnumerations());
54 methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
55 enclosedTypes = List.copyOf(builder.getEnclosedTransferObjects());
56 properties = toUnmodifiableProperties(builder.getProperties());
57 isAbstract = builder.isAbstract();
58 definition = builder.getYangSourceDefinition().orElse(null);
61 AbstractGeneratedType(final JavaTypeName identifier, final TypeComment comment,
62 final List<AnnotationTypeBuilder> annotationBuilders, final boolean isAbstract,
63 final List<Type> implementsTypes, final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
64 final List<GeneratedTOBuilder> enclosedGenTOBuilders, final List<EnumBuilder> enumBuilders,
65 final List<Constant> constants, final List<MethodSignatureBuilder> methodBuilders,
66 final List<GeneratedPropertyBuilder> propertyBuilders) {
68 this.comment = comment;
69 annotations = toUnmodifiableAnnotations(annotationBuilders);
70 this.implementsTypes = makeUnmodifiable(implementsTypes);
71 this.constants = makeUnmodifiable(constants);
72 enumerations = toUnmodifiableEnumerations(enumBuilders);
73 methodSignatures = toUnmodifiableMethods(methodBuilders);
74 enclosedTypes = toUnmodifiableEnclosedTypes(enclosedGenTypeBuilders, enclosedGenTOBuilders);
75 properties = toUnmodifiableProperties(propertyBuilders);
76 this.isAbstract = isAbstract;
80 protected static final <T> List<T> makeUnmodifiable(final List<T> list) {
81 return switch (list.size()) {
82 case 0 -> Collections.emptyList();
83 case 1 -> Collections.singletonList(list.get(0));
84 default -> Collections.unmodifiableList(list);
88 protected static <T> Set<T> makeUnmodifiable(final Set<T> set) {
89 return switch (set.size()) {
90 case 0 -> Collections.emptySet();
91 case 1 -> Collections.singleton(set.iterator().next());
92 default -> Collections.unmodifiableSet(set);
96 private static List<GeneratedType> toUnmodifiableEnclosedTypes(
97 final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
98 final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
99 final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size()
100 + enclosedGenTOBuilders.size());
101 for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
102 if (builder != null) {
103 enclosedTypesList.add(builder.build());
107 for (final GeneratedTOBuilder builder : enclosedGenTOBuilders) {
108 if (builder != null) {
109 enclosedTypesList.add(builder.build());
113 return makeUnmodifiable(enclosedTypesList);
116 protected static final List<AnnotationType> toUnmodifiableAnnotations(
117 final List<AnnotationTypeBuilder> annotationBuilders) {
118 final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
119 for (final AnnotationTypeBuilder builder : annotationBuilders) {
120 annotationList.add(builder.build());
122 return makeUnmodifiable(annotationList);
125 protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
126 final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
127 for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
128 methods.add(methodBuilder.toInstance(this));
130 return makeUnmodifiable(methods);
133 protected final Set<MethodSignature> toUnmodifiableMethods(final Set<MethodSignatureBuilder> getters) {
134 final Set<MethodSignature> methods = new HashSet<>(getters.size());
135 for (final MethodSignatureBuilder methodBuilder : getters) {
136 methods.add(methodBuilder.toInstance(this));
138 return makeUnmodifiable(methods);
141 protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
142 final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
143 for (final EnumBuilder enumBuilder : enumBuilders) {
144 enums.add(enumBuilder.toInstance());
146 return makeUnmodifiable(enums);
149 protected final List<GeneratedProperty> toUnmodifiableProperties(
150 final List<GeneratedPropertyBuilder> methodBuilders) {
151 final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
152 for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) {
153 methods.add(methodBuilder.toInstance());
155 return makeUnmodifiable(methods);
159 public final TypeComment getComment() {
164 public final List<AnnotationType> getAnnotations() {
169 public final boolean isAbstract() {
174 public final List<Type> getImplements() {
175 return implementsTypes;
179 public final List<GeneratedType> getEnclosedTypes() {
180 return enclosedTypes;
184 public final List<Enumeration> getEnumerations() {
189 public final List<Constant> getConstantDefinitions() {
194 public final List<MethodSignature> getMethodDefinitions() {
195 return methodSignatures;
199 public final List<GeneratedProperty> getProperties() {
204 public final Optional<YangSourceDefinition> getYangSourceDefinition() {
205 return Optional.ofNullable(definition);
209 protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
210 return super.addToStringAttributes(toStringHelper)
212 .add("comment", comment)
213 .add("annotations", annotations)
214 .add("enclosedTypes", enclosedTypes)
215 .add("enumerations", enumerations)
216 .add("constants", constants)
217 .add("methodSignatures", methodSignatures);