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