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