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 / AbstractGeneratedTypeBuilder.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.base.Preconditions;
13 import com.google.common.collect.ImmutableList;
14 import java.util.List;
15 import java.util.Objects;
16 import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
17 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
18 import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier;
19 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
20 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
21 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.AnnotationTypeBuilder;
22 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
23 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
24 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
25 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
26 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilderBase;
27 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
28 import org.opendaylight.yangtools.util.LazyCollections;
29
30 @Beta
31 abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T>> extends AbstractBaseType
32         implements GeneratedTypeBuilderBase<T> {
33
34     private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
35     private List<Type> implementsTypes = ImmutableList.of();
36     private List<EnumBuilder> enumDefinitions = ImmutableList.of();
37     private List<Constant> constants = ImmutableList.of();
38     private List<MethodSignatureBuilder> methodDefinitions = ImmutableList.of();
39     private final List<GeneratedTypeBuilder> enclosedTypes = ImmutableList.of();
40     private List<GeneratedTOBuilder> enclosedTransferObjects = ImmutableList.of();
41     private List<GeneratedPropertyBuilder> properties = ImmutableList.of();
42     private String comment = "";
43     private boolean isAbstract;
44     private Type parentTypeForBuilder;
45
46     protected AbstractGeneratedTypeBuilder(final String packageName, final String name, ModuleContext context) {
47         super(packageName, name, context);
48     }
49
50     protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isNormalized,
51             ModuleContext context) {
52         super(packageName, name, true, null);
53     }
54
55     protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isPkNameNormalized,
56             final boolean isTypeNormalized, ModuleContext context) {
57         super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
58     }
59
60     protected String getComment() {
61         return comment;
62     }
63
64     protected List<AnnotationTypeBuilder> getAnnotations() {
65         return annotationBuilders;
66     }
67
68     @Override
69     public boolean isAbstract() {
70         return isAbstract;
71     }
72
73     @Override
74     public List<Type> getImplementsTypes() {
75         return implementsTypes;
76     }
77
78     protected List<EnumBuilder> getEnumerations() {
79         return enumDefinitions;
80     }
81
82     protected List<Constant> getConstants() {
83         return constants;
84     }
85
86     @Override
87     public List<MethodSignatureBuilder> getMethodDefinitions() {
88         return methodDefinitions;
89     }
90
91     protected List<GeneratedTypeBuilder> getEnclosedTypes() {
92         return enclosedTypes;
93     }
94
95     protected List<GeneratedTOBuilder> getEnclosedTransferObjects() {
96         return enclosedTransferObjects;
97     }
98
99     protected abstract T thisInstance();
100
101     @Override
102     public GeneratedTOBuilder addEnclosingTransferObject(final String name) {
103         Preconditions.checkArgument(name != null, "Name for Enclosing Generated Transfer Object cannot be null!");
104         GeneratedTOBuilder builder = new GeneratedTOBuilderImpl(getFullyQualifiedName(), name, true);
105
106         Preconditions.checkArgument(!enclosedTransferObjects.contains(builder), "This generated type already contains equal enclosing transfer object.");
107         enclosedTransferObjects = LazyCollections.lazyAdd(enclosedTransferObjects, builder);
108         return builder;
109     }
110
111     @Override
112     public T addEnclosingTransferObject(final GeneratedTOBuilder genTOBuilder) {
113         Preconditions.checkArgument(genTOBuilder != null, "Parameter genTOBuilder cannot be null!");
114         Preconditions.checkArgument(!enclosedTransferObjects.contains(genTOBuilder), "This generated type already contains equal enclosing transfer object.");
115         enclosedTransferObjects = LazyCollections.lazyAdd(enclosedTransferObjects, genTOBuilder);
116         return thisInstance();
117     }
118
119     @Override
120     public T addComment(final String comment) {
121         this.comment = comment;
122         return thisInstance();
123     }
124
125     @Override
126     public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
127         Preconditions.checkArgument(packageName != null, "Package Name for Annotation Type cannot be null!");
128         Preconditions.checkArgument(name != null, "Name of Annotation Type cannot be null!");
129
130         final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
131
132         Preconditions.checkArgument(!annotationBuilders.contains(builder), "This generated type already contains equal annotation.");
133         annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
134         return builder;
135     }
136
137     @Override
138     public T setAbstract(final boolean isAbstract) {
139         this.isAbstract = isAbstract;
140         return thisInstance();
141     }
142
143     @Override
144     public T addImplementsType(final Type genType) {
145         Preconditions.checkArgument(genType != null, "Type cannot be null");
146         Preconditions.checkArgument(!implementsTypes.contains(genType), "This generated type already contains equal implements type.");
147         implementsTypes = LazyCollections.lazyAdd(implementsTypes, genType);
148         return thisInstance();
149     }
150
151     @Override
152     public Constant addConstant(final Type type, final String name, final Object value) {
153         Preconditions.checkArgument(type != null, "Returning Type for Constant cannot be null!");
154         Preconditions.checkArgument(name != null, "Name of constant cannot be null!");
155         Preconditions.checkArgument(!containsConstant(name), "This generated type already contains constant with the same name.");
156
157         final Constant constant = new ConstantImpl(this, type, name, value);
158         constants = LazyCollections.lazyAdd(constants, constant);
159         return constant;
160     }
161
162     @Override
163     public Type setParentTypeForBuilder(Type type) {
164         return this.parentTypeForBuilder = type;
165     }
166
167     public boolean containsConstant(final String name) {
168         Preconditions.checkArgument(name != null, "Parameter name can't be null");
169         for (Constant constant : constants) {
170             if (name.equals(constant.getName())) {
171                 return true;
172             }
173         }
174         return false;
175     }
176
177     @Override
178     public EnumBuilder addEnumeration(final String name, ModuleContext context) {
179         Preconditions.checkArgument(name != null, "Name of enumeration cannot be null!");
180         final EnumBuilder builder = new EnumerationBuilderImpl(getFullyQualifiedName(), name, true, false,
181                 context);
182
183         Preconditions.checkArgument(!enumDefinitions.contains(builder), "This generated type already contains equal enumeration.");
184         enumDefinitions = LazyCollections.lazyAdd(enumDefinitions, builder);
185         return builder;
186     }
187
188     @Override
189     public MethodSignatureBuilder addMethod(final String name) {
190         Preconditions.checkArgument(name != null, "Name of method cannot be null!");
191         final MethodSignatureBuilder builder = new MethodSignatureBuilderImpl(name);
192         builder.setAccessModifier(AccessModifier.PUBLIC);
193         builder.setAbstract(true);
194         methodDefinitions = LazyCollections.lazyAdd(methodDefinitions, builder);
195         return builder;
196     }
197
198     @Override
199     public boolean containsMethod(final String name) {
200         Preconditions.checkArgument(name != null, "Parameter name can't be null");
201         for (MethodSignatureBuilder methodDefinition : methodDefinitions) {
202             if (name.equals(methodDefinition.getName())) {
203                 return true;
204             }
205         }
206         return false;
207     }
208
209     @Override
210     public GeneratedPropertyBuilder addProperty(final String name) {
211         Preconditions.checkArgument(name != null, "Parameter name can't be null");
212         Preconditions.checkArgument(!containsProperty(name), "This generated type already contains property with the same name.");
213
214         final GeneratedPropertyBuilder builder = new GeneratedPropertyBuilderImpl(name);
215         builder.setAccessModifier(AccessModifier.PUBLIC);
216         properties = LazyCollections.lazyAdd(properties, builder);
217         return builder;
218     }
219
220     @Override
221     public boolean containsProperty(final String name) {
222         Preconditions.checkArgument(name != null, "Parameter name can't be null");
223         for (GeneratedPropertyBuilder property : properties) {
224             if (name.equals(property.getName())) {
225                 return true;
226             }
227         }
228         return false;
229     }
230
231     @Override
232     public int hashCode() {
233         return Objects.hash(getName(), getPackageName());
234     }
235
236     @Override
237     public boolean equals(final Object obj) {
238         if (this == obj) {
239             return true;
240         }
241         if (obj == null) {
242             return false;
243         }
244         if (getClass() != obj.getClass()) {
245             return false;
246         }
247
248         if (!(obj instanceof AbstractGeneratedTypeBuilder)) {
249             return false;
250         }
251
252         AbstractGeneratedTypeBuilder<?> other = (AbstractGeneratedTypeBuilder<?>) obj;
253         return Objects.equals(getFullyQualifiedName(), other.getFullyQualifiedName());
254     }
255
256     public Type getParent() {
257         return null;
258     }
259
260     public Type getParentTypeForBuilder() {
261         return parentTypeForBuilder;
262     }
263
264     @Override
265     public List<GeneratedPropertyBuilder> getProperties() {
266         return properties;
267     }
268
269 }