Rename binding-parent to binding-bundle-parent
[yangtools.git] / binding / binding-model-ri / src / main / java / org / opendaylight / yangtools / binding / model / ri / generated / type / builder / AbstractGeneratedType.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. 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.yangtools.binding.model.ri.generated.type.builder;
9
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;
16 import java.util.Set;
17 import org.opendaylight.yangtools.binding.model.api.AbstractType;
18 import org.opendaylight.yangtools.binding.model.api.AnnotationType;
19 import org.opendaylight.yangtools.binding.model.api.Constant;
20 import org.opendaylight.yangtools.binding.model.api.Enumeration;
21 import org.opendaylight.yangtools.binding.model.api.GeneratedProperty;
22 import org.opendaylight.yangtools.binding.model.api.GeneratedType;
23 import org.opendaylight.yangtools.binding.model.api.JavaTypeName;
24 import org.opendaylight.yangtools.binding.model.api.MethodSignature;
25 import org.opendaylight.yangtools.binding.model.api.Type;
26 import org.opendaylight.yangtools.binding.model.api.TypeComment;
27 import org.opendaylight.yangtools.binding.model.api.YangSourceDefinition;
28 import org.opendaylight.yangtools.binding.model.api.type.builder.AnnotationTypeBuilder;
29 import org.opendaylight.yangtools.binding.model.api.type.builder.EnumBuilder;
30 import org.opendaylight.yangtools.binding.model.api.type.builder.GeneratedPropertyBuilder;
31 import org.opendaylight.yangtools.binding.model.api.type.builder.GeneratedTOBuilder;
32 import org.opendaylight.yangtools.binding.model.api.type.builder.GeneratedTypeBuilder;
33 import org.opendaylight.yangtools.binding.model.api.type.builder.MethodSignatureBuilder;
34
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;
46
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);
59     }
60
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) {
67         super(identifier);
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;
77         definition = null;
78     }
79
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);
85         };
86     }
87
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);
93         };
94     }
95
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());
104             }
105         }
106
107         for (final GeneratedTOBuilder builder : enclosedGenTOBuilders) {
108             if (builder != null) {
109                 enclosedTypesList.add(builder.build());
110             }
111         }
112
113         return makeUnmodifiable(enclosedTypesList);
114     }
115
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());
121         }
122         return makeUnmodifiable(annotationList);
123     }
124
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));
129         }
130         return makeUnmodifiable(methods);
131     }
132
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));
137         }
138         return makeUnmodifiable(methods);
139     }
140
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());
145         }
146         return makeUnmodifiable(enums);
147     }
148
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());
154         }
155         return makeUnmodifiable(methods);
156     }
157
158     @Override
159     public final TypeComment getComment() {
160         return comment;
161     }
162
163     @Override
164     public final List<AnnotationType> getAnnotations() {
165         return annotations;
166     }
167
168     @Override
169     public final boolean isAbstract() {
170         return isAbstract;
171     }
172
173     @Override
174     public final List<Type> getImplements() {
175         return implementsTypes;
176     }
177
178     @Override
179     public final List<GeneratedType> getEnclosedTypes() {
180         return enclosedTypes;
181     }
182
183     @Override
184     public final List<Enumeration> getEnumerations() {
185         return enumerations;
186     }
187
188     @Override
189     public final List<Constant> getConstantDefinitions() {
190         return constants;
191     }
192
193     @Override
194     public final List<MethodSignature> getMethodDefinitions() {
195         return methodSignatures;
196     }
197
198     @Override
199     public final List<GeneratedProperty> getProperties() {
200         return properties;
201     }
202
203     @Override
204     public final Optional<YangSourceDefinition> getYangSourceDefinition() {
205         return Optional.ofNullable(definition);
206     }
207
208     @Override
209     protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
210         return super.addToStringAttributes(toStringHelper)
211             .omitNullValues()
212             .add("comment", comment)
213             .add("annotations", annotations)
214             .add("enclosedTypes", enclosedTypes)
215             .add("enumerations", enumerations)
216             .add("constants", constants)
217             .add("methodSignatures", methodSignatures);
218     }
219 }