Bug 7759 - TEST - Getter of BA object fails to construct class instance
[mdsal.git] / binding / mdsal-binding-generator-util / src / main / java / org / opendaylight / mdsal / binding / generator / util / generated / type / builder / AnnotationTypeBuilderImpl.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.generator.util.generated.type.builder;
9
10 import com.google.common.collect.ImmutableList;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.Objects;
15 import org.opendaylight.mdsal.binding.generator.util.AbstractBaseType;
16 import org.opendaylight.mdsal.binding.model.api.AnnotationType;
17 import org.opendaylight.mdsal.binding.model.api.type.builder.AnnotationTypeBuilder;
18 import org.opendaylight.yangtools.util.LazyCollections;
19
20 final class AnnotationTypeBuilderImpl extends AbstractBaseType implements AnnotationTypeBuilder {
21
22     private final String packageName;
23     private final String name;
24     private List<AnnotationTypeBuilder> annotationBuilders = Collections.emptyList();
25     private List<AnnotationType.Parameter> parameters = Collections.emptyList();
26
27     public AnnotationTypeBuilderImpl(final String packageName, final String name) {
28         super(packageName, name);
29         this.packageName = packageName;
30         this.name = name;
31     }
32
33     @Override
34     public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
35         if ((packageName != null) && (name != null)) {
36             final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
37             if (!this.annotationBuilders.contains(builder)) {
38                 this.annotationBuilders = LazyCollections.lazyAdd(this.annotationBuilders, builder);
39                 return builder;
40             }
41         }
42         return null;
43     }
44
45     private boolean addParameter(final ParameterImpl param) {
46         if (!this.parameters.contains(param)) {
47             this.parameters = LazyCollections.lazyAdd(this.parameters, param);
48             return true;
49         } else {
50             return false;
51         }
52     }
53
54     @Override
55     public boolean addParameter(final String paramName, final String value) {
56         if ((paramName != null) && (value != null)) {
57             final ParameterImpl param = new ParameterImpl(paramName, value);
58             return addParameter(param);
59         }
60         return false;
61     }
62
63     @Override
64     public boolean addParameters(final String paramName, final List<String> values) {
65         if ((paramName != null) && (values != null)) {
66             final ParameterImpl param = new ParameterImpl(paramName, values);
67             return addParameter(param);
68         }
69         return false;
70     }
71
72     @Override
73     public AnnotationType toInstance() {
74         return new AnnotationTypeImpl(this.packageName, this.name, this.annotationBuilders, this.parameters);
75     }
76
77     @Override
78     public int hashCode() {
79         final int prime = 31;
80         int result = 1;
81         result = (prime * result) + Objects.hashCode(this.name);
82         result = (prime * result) + Objects.hashCode(this.packageName);
83         return result;
84     }
85
86     @Override
87     public boolean equals(final Object obj) {
88         if (this == obj) {
89             return true;
90         }
91         if (obj == null) {
92             return false;
93         }
94         if (getClass() != obj.getClass()) {
95             return false;
96         }
97         final AnnotationTypeBuilderImpl other = (AnnotationTypeBuilderImpl) obj;
98         return Objects.equals(this.name, other.name) && Objects.equals(this.packageName, other.packageName);
99     }
100
101     @Override
102     public String toString() {
103         final StringBuilder builder = new StringBuilder();
104         builder.append("AnnotationTypeBuilder [packageName=");
105         builder.append(this.packageName);
106         builder.append(", name=");
107         builder.append(this.name);
108         builder.append(", annotationBuilders=");
109         builder.append(this.annotationBuilders);
110         builder.append(", parameters=");
111         builder.append(this.parameters);
112         builder.append("]");
113         return builder.toString();
114     }
115
116     private static final class AnnotationTypeImpl implements AnnotationType {
117
118         private final String packageName;
119         private final String name;
120         private final List<AnnotationType> annotations;
121         private final List<AnnotationType.Parameter> parameters;
122         private final List<String> paramNames;
123
124         public AnnotationTypeImpl(final String packageName, final String name,
125                 final List<AnnotationTypeBuilder> annotationBuilders,
126                 final List<AnnotationType.Parameter> parameters) {
127             super();
128             this.packageName = packageName;
129             this.name = name;
130
131             final List<AnnotationType> a = new ArrayList<>();
132             for (final AnnotationTypeBuilder builder : annotationBuilders) {
133                 a.add(builder.toInstance());
134             }
135             this.annotations = ImmutableList.copyOf(a);
136
137             final List<String> p = new ArrayList<>();
138             for (final AnnotationType.Parameter parameter : parameters) {
139                 p.add(parameter.getName());
140             }
141             this.paramNames = ImmutableList.copyOf(p);
142
143             this.parameters = parameters.isEmpty() ? Collections.<AnnotationType.Parameter>emptyList()
144                     : Collections.unmodifiableList(parameters);
145         }
146
147         @Override
148         public String getPackageName() {
149             return this.packageName;
150         }
151
152         @Override
153         public String getName() {
154             return this.name;
155         }
156
157         @Override
158         public String getFullyQualifiedName() {
159             return this.packageName + "." + this.name;
160         }
161
162         @Override
163         public List<AnnotationType> getAnnotations() {
164             return this.annotations;
165         }
166
167         @Override
168         public Parameter getParameter(final String paramName) {
169             if (paramName != null) {
170                 for (final AnnotationType.Parameter parameter : this.parameters) {
171                     if (parameter.getName().equals(paramName)) {
172                         return parameter;
173                     }
174                 }
175             }
176             return null;
177         }
178
179         @Override
180         public List<Parameter> getParameters() {
181             return this.parameters;
182         }
183
184         @Override
185         public List<String> getParameterNames() {
186             return this.paramNames;
187         }
188
189         @Override
190         public boolean containsParameters() {
191             return !this.parameters.isEmpty();
192         }
193
194         @Override
195         public int hashCode() {
196             final int prime = 31;
197             int result = 1;
198             result = (prime * result) + Objects.hashCode(this.name);
199             result = (prime * result) + Objects.hashCode(this.packageName);
200             return result;
201         }
202
203         @Override
204         public boolean equals(final Object obj) {
205             if (this == obj) {
206                 return true;
207             }
208             if (obj == null) {
209                 return false;
210             }
211             if (getClass() != obj.getClass()) {
212                 return false;
213             }
214             final AnnotationTypeImpl other = (AnnotationTypeImpl) obj;
215             return Objects.equals(this.name, other.name) && Objects.equals(this.packageName, other.packageName);
216         }
217
218         @Override
219         public String toString() {
220             final StringBuilder builder = new StringBuilder();
221             builder.append("AnnotationType [packageName=");
222             builder.append(this.packageName);
223             builder.append(", name=");
224             builder.append(this.name);
225             builder.append(", annotations=");
226             builder.append(this.annotations);
227             builder.append(", parameters=");
228             builder.append(this.parameters);
229             builder.append("]");
230             return builder.toString();
231         }
232     }
233
234     private static final class ParameterImpl implements AnnotationType.Parameter {
235
236         private final String name;
237         private final String value;
238         private final List<String> values;
239
240         public ParameterImpl(final String name, final String value) {
241             super();
242             this.name = name;
243             this.value = value;
244             this.values = Collections.emptyList();
245         }
246
247         public ParameterImpl(final String name, final List<String> values) {
248             super();
249             this.name = name;
250             this.values = values;
251             this.value = null;
252         }
253
254         @Override
255         public String getName() {
256             return this.name;
257         }
258
259         @Override
260         public String getValue() {
261             return this.value;
262         }
263
264         @Override
265         public List<String> getValues() {
266             return this.values;
267         }
268
269         @Override
270         public int hashCode() {
271             final int prime = 31;
272             int result = 1;
273             result = (prime * result) + Objects.hashCode(this.name);
274             return result;
275         }
276
277         @Override
278         public boolean equals(final Object obj) {
279             if (this == obj) {
280                 return true;
281             }
282             if (obj == null) {
283                 return false;
284             }
285             if (getClass() != obj.getClass()) {
286                 return false;
287             }
288             final ParameterImpl other = (ParameterImpl) obj;
289             return Objects.equals(this.name, other.name);
290         }
291
292         @Override
293         public String toString() {
294             final StringBuilder builder = new StringBuilder();
295             builder.append("ParameterImpl [name=");
296             builder.append(this.name);
297             builder.append(", value=");
298             builder.append(this.value);
299             builder.append(", values=");
300             builder.append(this.values);
301             builder.append("]");
302             return builder.toString();
303         }
304     }
305 }