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