Integrate JavaTypeName as Identifier
[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.JavaTypeName;
23 import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition;
24 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
25 import org.opendaylight.mdsal.binding.model.api.type.builder.EnumBuilder;
26 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
27 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
28 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
29 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
30 import org.opendaylight.mdsal.binding.model.util.AbstractBaseType;
31
32 abstract class AbstractGeneratedType extends AbstractBaseType implements GeneratedType {
33
34     private final Type parent;
35     private final TypeComment comment;
36     private final List<AnnotationType> annotations;
37     private final List<Type> implementsTypes;
38     private final List<Enumeration> enumerations;
39     private final List<Constant> constants;
40     private final List<MethodSignature> methodSignatures;
41     private final List<GeneratedType> enclosedTypes;
42     private final List<GeneratedProperty> properties;
43     private final boolean isAbstract;
44     private final YangSourceDefinition definition;
45
46     AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
47         super(builder.getIdentifier());
48         this.parent = builder.getParent();
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 Type parent, 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.parent = parent;
70         this.comment = comment;
71         this.annotations = toUnmodifiableAnnotations(annotationBuilders);
72         this.implementsTypes = makeUnmodifiable(implementsTypes);
73         this.constants = makeUnmodifiable(constants);
74         this.enumerations = toUnmodifiableEnumerations(enumBuilders);
75         this.methodSignatures = toUnmodifiableMethods(methodBuilders);
76         this.enclosedTypes = toUnmodifiableEnclosedTypes(enclosedGenTypeBuilders, enclosedGenTOBuilders);
77         this.properties = toUnmodifiableProperties(propertyBuilders);
78         this.isAbstract = isAbstract;
79         this.definition = null;
80     }
81
82     protected static final <T> List<T> makeUnmodifiable(final List<T> list) {
83         switch (list.size()) {
84         case 0:
85             return Collections.emptyList();
86         case 1:
87             return Collections.singletonList(list.get(0));
88         default:
89             return Collections.unmodifiableList(list);
90         }
91     }
92
93     private static List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
94             final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
95         final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size() + enclosedGenTOBuilders.size());
96         for (final GeneratedTypeBuilder builder : enclosedGenTypeBuilders) {
97             if (builder != null) {
98                 enclosedTypesList.add(builder.build());
99             }
100         }
101
102         for (final GeneratedTOBuilder builder : enclosedGenTOBuilders) {
103             if (builder != null) {
104                 enclosedTypesList.add(builder.build());
105             }
106         }
107
108         return makeUnmodifiable(enclosedTypesList);
109     }
110
111     protected static final List<AnnotationType> toUnmodifiableAnnotations(
112             final List<AnnotationTypeBuilder> annotationBuilders) {
113         final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
114         for (final AnnotationTypeBuilder builder : annotationBuilders) {
115             annotationList.add(builder.build());
116         }
117         return makeUnmodifiable(annotationList);
118     }
119
120     protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
121         final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
122         for (final MethodSignatureBuilder methodBuilder : methodBuilders) {
123             methods.add(methodBuilder.toInstance(this));
124         }
125         return makeUnmodifiable(methods);
126     }
127
128     protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
129         final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
130         for (final EnumBuilder enumBuilder : enumBuilders) {
131             enums.add(enumBuilder.toInstance(this));
132         }
133         return makeUnmodifiable(enums);
134     }
135
136     protected final List<GeneratedProperty> toUnmodifiableProperties(final List<GeneratedPropertyBuilder> methodBuilders) {
137         final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
138         for (final GeneratedPropertyBuilder methodBuilder : methodBuilders) {
139             methods.add(methodBuilder.toInstance(this));
140         }
141         return makeUnmodifiable(methods);
142     }
143
144     @Override
145     public final Type getParentType() {
146         return this.parent;
147     }
148
149     @Override
150     public final TypeComment getComment() {
151         return this.comment;
152     }
153
154     @Override
155     public final List<AnnotationType> getAnnotations() {
156         return this.annotations;
157     }
158
159     @Override
160     public final boolean isAbstract() {
161         return this.isAbstract;
162     }
163
164     @Override
165     public final List<Type> getImplements() {
166         return this.implementsTypes;
167     }
168
169     @Override
170     public final List<GeneratedType> getEnclosedTypes() {
171         return this.enclosedTypes;
172     }
173
174     @Override
175     public final List<Enumeration> getEnumerations() {
176         return this.enumerations;
177     }
178
179     @Override
180     public final List<Constant> getConstantDefinitions() {
181         return this.constants;
182     }
183
184     @Override
185     public final List<MethodSignature> getMethodDefinitions() {
186         return this.methodSignatures;
187     }
188
189     @Override
190     public final List<GeneratedProperty> getProperties() {
191         return this.properties;
192     }
193
194     @Override
195     public final Optional<YangSourceDefinition> getYangSourceDefinition() {
196         return Optional.ofNullable(definition);
197     }
198
199     @Override
200     public String toString() {
201         final StringBuilder builder = new StringBuilder();
202         builder.append("GeneratedType [packageName=");
203         builder.append(getPackageName());
204         builder.append(", name=");
205         builder.append(getName());
206         if (this.parent != null) {
207             builder.append(", parent=");
208             builder.append(this.parent.getFullyQualifiedName());
209         } else {
210             builder.append(", parent=null");
211         }
212         builder.append(", comment=");
213         builder.append(this.comment);
214         builder.append(", annotations=");
215         builder.append(this.annotations);
216         builder.append(", enclosedTypes=");
217         builder.append(this.enclosedTypes);
218         builder.append(", enumerations=");
219         builder.append(this.enumerations);
220         builder.append(", constants=");
221         builder.append(this.constants);
222         builder.append(", methodSignatures=");
223         builder.append(this.methodSignatures);
224         builder.append("]");
225         return builder.toString();
226     }
227 }