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