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