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