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