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