Use concepts.Builder in binding-generator-api
[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.List;
13 import java.util.Optional;
14 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
15 import org.opendaylight.mdsal.binding.model.api.Constant;
16 import org.opendaylight.mdsal.binding.model.api.Enumeration;
17 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
18 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
19 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
20 import org.opendaylight.mdsal.binding.model.api.Type;
21 import org.opendaylight.mdsal.binding.model.api.TypeComment;
22 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
23 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
24 import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
25 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
26 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
27 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
28 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
29 import org.opendaylight.mdsal.binding.model.util.AbstractBaseType;
30
31 abstract class AbstractGeneratedType extends AbstractBaseType implements GeneratedType {
32
33     private final Type parent;
34     private final TypeComment comment;
35     private final List<AnnotationType> annotations;
36     private final List<Type> implementsTypes;
37     private final List<Enumeration> enumerations;
38     private final List<Constant> constants;
39     private final List<MethodSignature> methodSignatures;
40     private final List<GeneratedType> enclosedTypes;
41     private final List<GeneratedProperty> properties;
42     private final boolean isAbstract;
43     private final YangSourceDefinition definition;
44
45     public AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
46         super(builder.getPackageName(), builder.getName());
47         this.parent = builder.getParent();
48         this.comment = builder.getComment();
49         this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
50         this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
51         this.constants = makeUnmodifiable(builder.getConstants());
52         this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations());
53         this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
54         this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(),
55                 builder.getEnclosedTransferObjects());
56         this.properties = toUnmodifiableProperties(builder.getProperties());
57         this.isAbstract = builder.isAbstract();
58         this.definition = builder.getYangSourceDefinition().orElse(null);
59     }
60
61     public AbstractGeneratedType(final Type parent, final String packageName, final String name,
62             final TypeComment comment, 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(packageName, name);
68         this.parent = parent;
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     private static List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
93             final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
94         final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size() + enclosedGenTOBuilders.size());
95         for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
96             if (builder != null) {
97                 enclosedTypesList.add(builder.build());
98             }
99         }
100
101         for (final GeneratedTOBuilder builder : enclosedGenTOBuilders) {
102             if (builder != null) {
103                 enclosedTypesList.add(builder.build());
104             }
105         }
106
107         return makeUnmodifiable(enclosedTypesList);
108     }
109
110     protected static final List<AnnotationType> toUnmodifiableAnnotations(
111             final List<AnnotationTypeBuilder> annotationBuilders) {
112         final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
113         for (final AnnotationTypeBuilder builder : annotationBuilders) {
114             annotationList.add(builder.build());
115         }
116         return makeUnmodifiable(annotationList);
117     }
118
119     protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
120         final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
121         for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
122             methods.add(methodBuilder.toInstance(this));
123         }
124         return makeUnmodifiable(methods);
125     }
126
127     protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
128         final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
129         for (final EnumBuilder enumBuilder : enumBuilders) {
130             enums.add(enumBuilder.toInstance(this));
131         }
132         return makeUnmodifiable(enums);
133     }
134
135     protected final List<GeneratedProperty> toUnmodifiableProperties(final List<GeneratedPropertyBuilder> methodBuilders) {
136         final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
137         for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) {
138             methods.add(methodBuilder.toInstance(this));
139         }
140         return makeUnmodifiable(methods);
141     }
142
143     @Override
144     public final Type getParentType() {
145         return this.parent;
146     }
147
148     @Override
149     public final TypeComment getComment() {
150         return this.comment;
151     }
152
153     @Override
154     public final List<AnnotationType> getAnnotations() {
155         return this.annotations;
156     }
157
158     @Override
159     public final boolean isAbstract() {
160         return this.isAbstract;
161     }
162
163     @Override
164     public final List<Type> getImplements() {
165         return this.implementsTypes;
166     }
167
168     @Override
169     public final List<GeneratedType> getEnclosedTypes() {
170         return this.enclosedTypes;
171     }
172
173     @Override
174     public final List<Enumeration> getEnumerations() {
175         return this.enumerations;
176     }
177
178     @Override
179     public final List<Constant> getConstantDefinitions() {
180         return this.constants;
181     }
182
183     @Override
184     public final List<MethodSignature> getMethodDefinitions() {
185         return this.methodSignatures;
186     }
187
188     @Override
189     public final List<GeneratedProperty> getProperties() {
190         return this.properties;
191     }
192
193     @Override
194     public final Optional<YangSourceDefinition> getYangSourceDefinition() {
195         return Optional.ofNullable(definition);
196     }
197
198     @Override
199     public String toString() {
200         final StringBuilder builder = new StringBuilder();
201         builder.append("GeneratedType [packageName=");
202         builder.append(getPackageName());
203         builder.append(", name=");
204         builder.append(getName());
205         if (this.parent != null) {
206             builder.append(", parent=");
207             builder.append(this.parent.getFullyQualifiedName());
208         } else {
209             builder.append(", parent=null");
210         }
211         builder.append(", comment=");
212         builder.append(this.comment);
213         builder.append(", annotations=");
214         builder.append(this.annotations);
215         builder.append(", enclosedTypes=");
216         builder.append(this.enclosedTypes);
217         builder.append(", enumerations=");
218         builder.append(this.enumerations);
219         builder.append(", constants=");
220         builder.append(this.constants);
221         builder.append(", methodSignatures=");
222         builder.append(this.methodSignatures);
223         builder.append("]");
224         return builder.toString();
225     }
226 }