Remove parent type references
[mdsal.git] / binding / mdsal-binding-generator-util / src / main / java / org / opendaylight / mdsal / binding / model / util / 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.mdsal.binding.model.util.generated.type.builder;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Optional;
15 import java.util.Set;
16 import org.opendaylight.mdsal.binding.model.api.AbstractBaseType;
17 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
18 import org.opendaylight.mdsal.binding.model.api.Constant;
19 import org.opendaylight.mdsal.binding.model.api.Enumeration;
20 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
21 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
22 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
23 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
24 import org.opendaylight.mdsal.binding.model.api.Type;
25 import org.opendaylight.mdsal.binding.model.api.TypeComment;
26 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
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.model.api.type.builder.GeneratedPropertyBuilder;
30 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
31 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
32 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
33
34 abstract class AbstractGeneratedType extends AbstractBaseType implements GeneratedType {
35
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         this.comment = builder.getComment();
50         this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
51         this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
52         this.constants = makeUnmodifiable(builder.getConstants());
53         this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations());
54         this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
55         this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(),
56                 builder.getEnclosedTransferObjects());
57         this.properties = toUnmodifiableProperties(builder.getProperties());
58         this.isAbstract = builder.isAbstract();
59         this.definition = builder.getYangSourceDefinition().orElse(null);
60     }
61
62     AbstractGeneratedType(final JavaTypeName identifier, final TypeComment comment,
63             final List<AnnotationTypeBuilder> annotationBuilders, final boolean isAbstract,
64             final List<Type> implementsTypes, final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
65             final List<GeneratedTOBuilder> enclosedGenTOBuilders, final List<EnumBuilder> enumBuilders,
66             final List<Constant> constants, final List<MethodSignatureBuilder> methodBuilders,
67             final List<GeneratedPropertyBuilder> propertyBuilders) {
68         super(identifier);
69         this.comment = comment;
70         this.annotations = toUnmodifiableAnnotations(annotationBuilders);
71         this.implementsTypes = makeUnmodifiable(implementsTypes);
72         this.constants = makeUnmodifiable(constants);
73         this.enumerations = toUnmodifiableEnumerations(enumBuilders);
74         this.methodSignatures = toUnmodifiableMethods(methodBuilders);
75         this.enclosedTypes = toUnmodifiableEnclosedTypes(enclosedGenTypeBuilders, enclosedGenTOBuilders);
76         this.properties = toUnmodifiableProperties(propertyBuilders);
77         this.isAbstract = isAbstract;
78         this.definition = null;
79     }
80
81     protected static final <T> List<T> makeUnmodifiable(final List<T> list) {
82         switch (list.size()) {
83             case 0:
84                 return Collections.emptyList();
85             case 1:
86                 return Collections.singletonList(list.get(0));
87             default:
88                 return Collections.unmodifiableList(list);
89         }
90     }
91
92     protected static <T> Set<T> makeUnmodifiable(final Set<T> set) {
93         switch (set.size()) {
94             case 0:
95                 return Collections.emptySet();
96             case 1:
97                 return Collections.singleton(set.iterator().next());
98             default:
99                 return Collections.unmodifiableSet(set);
100         }
101     }
102
103     private static List<GeneratedType> toUnmodifiableEnclosedTypes(
104             final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
105             final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
106         final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size()
107                 + enclosedGenTOBuilders.size());
108         for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
109             if (builder != null) {
110                 enclosedTypesList.add(builder.build());
111             }
112         }
113
114         for (final GeneratedTOBuilder builder : enclosedGenTOBuilders) {
115             if (builder != null) {
116                 enclosedTypesList.add(builder.build());
117             }
118         }
119
120         return makeUnmodifiable(enclosedTypesList);
121     }
122
123     protected static final List<AnnotationType> toUnmodifiableAnnotations(
124             final List<AnnotationTypeBuilder> annotationBuilders) {
125         final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
126         for (final AnnotationTypeBuilder builder : annotationBuilders) {
127             annotationList.add(builder.build());
128         }
129         return makeUnmodifiable(annotationList);
130     }
131
132     protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
133         final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
134         for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
135             methods.add(methodBuilder.toInstance(this));
136         }
137         return makeUnmodifiable(methods);
138     }
139
140     protected final Set<MethodSignature> toUnmodifiableMethods(final Set<MethodSignatureBuilder> getters) {
141         final Set<MethodSignature> methods = new HashSet<>(getters.size());
142         for (final MethodSignatureBuilder methodBuilder : getters) {
143             methods.add(methodBuilder.toInstance(this));
144         }
145         return makeUnmodifiable(methods);
146     }
147
148     protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
149         final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
150         for (final EnumBuilder enumBuilder : enumBuilders) {
151             enums.add(enumBuilder.toInstance());
152         }
153         return makeUnmodifiable(enums);
154     }
155
156     protected final List<GeneratedProperty> toUnmodifiableProperties(
157             final List<GeneratedPropertyBuilder> methodBuilders) {
158         final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
159         for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) {
160             methods.add(methodBuilder.toInstance());
161         }
162         return makeUnmodifiable(methods);
163     }
164
165     @Override
166     public final TypeComment getComment() {
167         return this.comment;
168     }
169
170     @Override
171     public final List<AnnotationType> getAnnotations() {
172         return this.annotations;
173     }
174
175     @Override
176     public final boolean isAbstract() {
177         return this.isAbstract;
178     }
179
180     @Override
181     public final List<Type> getImplements() {
182         return this.implementsTypes;
183     }
184
185     @Override
186     public final List<GeneratedType> getEnclosedTypes() {
187         return this.enclosedTypes;
188     }
189
190     @Override
191     public final List<Enumeration> getEnumerations() {
192         return this.enumerations;
193     }
194
195     @Override
196     public final List<Constant> getConstantDefinitions() {
197         return this.constants;
198     }
199
200     @Override
201     public final List<MethodSignature> getMethodDefinitions() {
202         return this.methodSignatures;
203     }
204
205     @Override
206     public final List<GeneratedProperty> getProperties() {
207         return this.properties;
208     }
209
210     @Override
211     public final Optional<YangSourceDefinition> getYangSourceDefinition() {
212         return Optional.ofNullable(definition);
213     }
214
215     @Override
216     public String toString() {
217         final StringBuilder builder = new StringBuilder();
218         builder.append("GeneratedType [packageName=");
219         builder.append(getPackageName());
220         builder.append(", name=");
221         builder.append(getName());
222         builder.append(", comment=");
223         builder.append(this.comment);
224         builder.append(", annotations=");
225         builder.append(this.annotations);
226         builder.append(", enclosedTypes=");
227         builder.append(this.enclosedTypes);
228         builder.append(", enumerations=");
229         builder.append(this.enumerations);
230         builder.append(", constants=");
231         builder.append(this.constants);
232         builder.append(", methodSignatures=");
233         builder.append(this.methodSignatures);
234         builder.append("]");
235         return builder.toString();
236     }
237 }