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