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