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