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 / GeneratedTOBuilderImpl.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.Optional;
16 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
17 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
18 import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType;
19 import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions;
20 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
21 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
22 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
23 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
24 import org.opendaylight.yangtools.util.LazyCollections;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
27
28 @Beta
29 public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder> implements
30         GeneratedTOBuilder {
31
32     private GeneratedTransferObject extendsType;
33     private List<GeneratedPropertyBuilder> equalsProperties = ImmutableList.of();
34     private List<GeneratedPropertyBuilder> hashProperties = ImmutableList.of();
35     private List<GeneratedPropertyBuilder> toStringProperties = ImmutableList.of();
36     private boolean isTypedef = false;
37     private boolean isUnionType = false;
38     private boolean isUnionTypeBuilder = false;
39     private TypeDefinition<?> baseType = null;
40     private Restrictions restrictions;
41     private GeneratedPropertyBuilder suid;
42     private String reference;
43     private String description;
44     private String moduleName;
45     private List<QName> schemaPath;
46
47     public GeneratedTOBuilderImpl(final String packageName, final String name) {
48         super(packageName, name);
49         setAbstract(false);
50     }
51
52     public GeneratedTOBuilderImpl(final String packageName, final String name, final boolean isNormalized) {
53         super(packageName, name, true);
54     }
55
56     @Override
57     public GeneratedTOBuilder setExtendsType(GeneratedTransferObject genTransObj) {
58         Preconditions.checkArgument(genTransObj != null, "Generated Transfer Object cannot be null!");
59         extendsType = genTransObj;
60         return this;
61     }
62
63     /**
64      * Add new MethodSignature definition for GeneratedTypeBuilder and
65      * returns MethodSignatureBuilder for specifying all Method parameters. <br>
66      * Name of Method cannot be <code>null</code>, if it is <code>null</code>
67      * the method SHOULD throw {@link IllegalArgumentException} <br>
68      * By <i>Default</i> the MethodSignatureBuilder SHOULD be pre-set as
69      * {@link MethodSignatureBuilder#setAbstract(boolean)},
70      * {TypeMemberBuilder#setFinal(boolean)} and
71      * {TypeMemberBuilder#setAccessModifier(boolean)}
72      *
73      * @param name
74      *            Name of Method
75      * @return <code>new</code> instance of Method Signature Builder.
76      */
77     @Override
78     public MethodSignatureBuilder addMethod(final String name) {
79         final MethodSignatureBuilder builder = super.addMethod(name);
80         builder.setAbstract(false);
81         return builder;
82     }
83
84     @Override
85     public GeneratedTOBuilder addEqualsIdentity(GeneratedPropertyBuilder property) {
86         equalsProperties = LazyCollections.lazyAdd(equalsProperties, property);
87         return this;
88     }
89
90     @Override
91     public GeneratedTOBuilder addHashIdentity(GeneratedPropertyBuilder property) {
92         hashProperties = LazyCollections.lazyAdd(hashProperties, property);
93         return this;
94     }
95
96     @Override
97     public GeneratedTOBuilder addToStringProperty(GeneratedPropertyBuilder property) {
98         toStringProperties = LazyCollections.lazyAdd(toStringProperties, property);
99         return this;
100     }
101
102     @Override
103     public void setRestrictions(Restrictions restrictions) {
104         this.restrictions = restrictions;
105     }
106
107     @Override
108     public GeneratedTransferObject toInstance() {
109         return new GeneratedTransferObjectImpl(this);
110     }
111
112     @Override
113     public void setTypedef(boolean isTypedef) {
114         this.isTypedef = isTypedef;
115     }
116
117     @Override
118     public void setBaseType(TypeDefinition<?> typeDef) {
119         this.baseType = typeDef;
120     }
121
122     @Override
123     public void setIsUnion(boolean isUnion) {
124         this.isUnionType = isUnion;
125     }
126
127     @Override
128     public void setIsUnionBuilder(boolean isUnionTypeBuilder) {
129         this.isUnionTypeBuilder = isUnionTypeBuilder;
130     }
131
132     @Override
133     public void setSUID(GeneratedPropertyBuilder suid) {
134         this.suid = suid;
135     }
136
137     @Override
138     public void setDescription(String description) {
139         this.description = description;
140     }
141
142     @Override
143     public void setModuleName(String moduleName) {
144         this.moduleName = moduleName;
145     }
146
147     @Override
148     public void setSchemaPath(List<QName> schemaPath) {
149         this.schemaPath = schemaPath;
150     }
151
152     @Override
153     public void setReference(String reference) {
154         this.reference = reference;
155     }
156
157     @Override
158     protected GeneratedTOBuilderImpl thisInstance() {
159         return this;
160     }
161
162     @Override
163     public String toString() {
164         StringBuilder builder = new StringBuilder();
165         builder.append("GeneratedTransferObject [packageName=");
166         builder.append(getPackageName());
167         builder.append(", name=");
168         builder.append(getName());
169         builder.append(", comment=");
170         builder.append(getComment());
171         builder.append(", constants=");
172         builder.append(getConstants());
173         builder.append(", enumerations=");
174         builder.append(getEnumerations());
175         builder.append(", equalsProperties=");
176         builder.append(equalsProperties);
177         builder.append(", hashCodeProperties=");
178         builder.append(hashProperties);
179         builder.append(", stringProperties=");
180         builder.append(toStringProperties);
181         builder.append(", annotations=");
182         builder.append(getAnnotations());
183         builder.append(", methods=");
184         builder.append(getMethodDefinitions());
185         builder.append("]");
186         return builder.toString();
187     }
188
189     private static final class GeneratedTransferObjectImpl extends AbstractGeneratedType implements GeneratedTransferObject {
190
191         private final List<GeneratedProperty> equalsProperties;
192         private final List<GeneratedProperty> hashCodeProperties;
193         private final List<GeneratedProperty> stringProperties;
194         private final GeneratedTransferObject extendsType;
195         private final boolean isTypedef;
196         private final TypeDefinition<?> baseType;
197         private final boolean isUnionType;
198         private final boolean isUnionTypeBuilder;
199         private final Restrictions restrictions;
200         private final GeneratedProperty innerSuid;
201         private final String reference;
202         private final String description;
203         private final String moduleName;
204         private final List<QName> schemaPath;
205
206         public GeneratedTransferObjectImpl(final GeneratedTOBuilderImpl builder) {
207             super(builder);
208
209             this.extendsType = builder.extendsType;
210             this.equalsProperties = toUnmodifiableProperties(builder.equalsProperties);
211             this.hashCodeProperties = toUnmodifiableProperties(builder.hashProperties);
212             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);
213
214             this.isTypedef = builder.isTypedef;
215             this.baseType = builder.baseType;
216             this.isUnionType = builder.isUnionType;
217             this.isUnionTypeBuilder = builder.isUnionTypeBuilder;
218             this.restrictions = builder.restrictions;
219             this.reference = builder.reference;
220             this.description = builder.description;
221             this.moduleName = builder.moduleName;
222             this.schemaPath = builder.schemaPath;
223
224             if (builder.suid == null) {
225                 this.innerSuid = null;
226             } else {
227                 this.innerSuid = builder.suid.toInstance(GeneratedTransferObjectImpl.this);
228             }
229         }
230
231         @Override
232         public GeneratedProperty getSUID() {
233             return innerSuid;
234         }
235
236         @Override
237         public GeneratedTransferObject getSuperType() {
238             return extendsType;
239         }
240
241         @Override
242         public List<GeneratedProperty> getEqualsIdentifiers() {
243             return equalsProperties;
244         }
245
246         @Override
247         public List<GeneratedProperty> getHashCodeIdentifiers() {
248             return hashCodeProperties;
249         }
250
251         @Override
252         public List<GeneratedProperty> getToStringIdentifiers() {
253             return stringProperties;
254         }
255
256         @Override
257         public boolean isTypedef() {
258             return isTypedef;
259         }
260
261         @Override
262         public TypeDefinition<?> getBaseType() {
263             return baseType;
264         }
265
266         @Override
267         public boolean isUnionType() {
268             return isUnionType;
269         }
270
271         @Override
272         public boolean isUnionTypeBuilder() {
273             return isUnionTypeBuilder;
274         }
275
276         @Override
277         public Restrictions getRestrictions() {
278             return restrictions;
279         }
280
281         @Override
282         public Optional<String> getDescription() {
283             return Optional.ofNullable(this.description);
284         }
285
286         @Override
287         public Optional<String> getReference() {
288             return Optional.ofNullable(this.reference);
289         }
290
291         @Override
292         public List<QName> getSchemaPath() {
293             return schemaPath;
294         }
295
296         @Override
297         public String getModuleName() {
298             return moduleName;
299         }
300
301         @Override
302         public String toString() {
303             if (isTypedef) {
304                 return serializeTypedef(this);
305             }
306             StringBuilder builder = new StringBuilder();
307             builder.append("GeneratedTransferObject [packageName=");
308             builder.append(getPackageName());
309             builder.append(", name=");
310             builder.append(getName());
311             builder.append(", comment=");
312             builder.append(", annotations=");
313             builder.append(getAnnotations());
314             builder.append(getComment());
315             builder.append(", extends=");
316             builder.append(getSuperType());
317             builder.append(", implements=");
318             builder.append(getImplements());
319             builder.append(", enclosedTypes=");
320             builder.append(getEnclosedTypes());
321             builder.append(", constants=");
322             builder.append(getConstantDefinitions());
323             builder.append(", enumerations=");
324             builder.append(getEnumerations());
325             builder.append(", properties=");
326             builder.append(getProperties());
327             builder.append(", equalsProperties=");
328             builder.append(equalsProperties);
329             builder.append(", hashCodeProperties=");
330             builder.append(hashCodeProperties);
331             builder.append(", stringProperties=");
332             builder.append(stringProperties);
333             builder.append(", methods=");
334             builder.append(getMethodDefinitions());
335             builder.append("]");
336             return builder.toString();
337         }
338
339         private String serializeTypedef(final Type type) {
340             if (type instanceof ParameterizedType) {
341                 ParameterizedType parameterizedType = (ParameterizedType) type;
342                 StringBuilder sb = new StringBuilder();
343                 sb.append(parameterizedType.getRawType().getFullyQualifiedName());
344                 sb.append('<');
345                 boolean first = true;
346                 for (Type parameter : parameterizedType.getActualTypeArguments()) {
347                     if (first) {
348                         first = false;
349                     } else {
350                         sb.append(',');
351                     }
352                     sb.append(serializeTypedef(parameter));
353                 }
354                 sb.append('>');
355                 return sb.toString();
356             } else {
357                 return type.getFullyQualifiedName();
358             }
359         }
360     }
361 }