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