Rework inlined union generation
[mdsal.git] / binding / mdsal-binding-generator-util / src / main / java / org / opendaylight / mdsal / binding / model / util / generated / type / builder / AbstractGeneratedTOBuilder.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.JavaTypeName;
16 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
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.model.api.TypeDefinition;
23
24 abstract class AbstractGeneratedTOBuilder extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder>
25         implements GeneratedTOBuilder {
26
27     // FIXME are these three referenced anywhere at runtime?
28     private List<GeneratedPropertyBuilder> equalsProperties = Collections.emptyList();
29     private List<GeneratedPropertyBuilder> hashProperties = Collections.emptyList();
30     private List<GeneratedPropertyBuilder> toStringProperties = Collections.emptyList();
31     private GeneratedTransferObject extendsType;
32     private boolean isTypedef = false;
33     private boolean isUnionType = false;
34     private boolean isUnionTypeBuilder = false;
35     private TypeDefinition<?> baseType = null;
36
37     AbstractGeneratedTOBuilder(final JavaTypeName identifier) {
38         super(identifier);
39         setAbstract(false);
40     }
41
42     @Override
43     public final GeneratedTOBuilder setExtendsType(final GeneratedTransferObject genTransObj) {
44         Preconditions.checkArgument(genTransObj != null, "Generated Transfer Object cannot be null!");
45         this.extendsType = genTransObj;
46         return this;
47     }
48
49     /**
50      * Add new Method Signature definition for Generated Type Builder and
51      * returns Method Signature Builder for specifying all Method parameters. <br>
52      * Name of Method cannot be <code>null</code>, if it is <code>null</code>
53      * the method SHOULD throw {@link IllegalArgumentException} <br>
54      * By <i>Default</i> the MethodSignatureBuilder SHOULD be pre-set as
55      * {@link MethodSignatureBuilder#setAbstract(boolean)},
56      * {TypeMemberBuilder#setFinal(boolean)} and
57      * {TypeMemberBuilder#setAccessModifier(boolean)}
58      *
59      * @param name
60      *            Name of Method
61      * @return <code>new</code> instance of Method Signature Builder.
62      */
63     @Override
64     public final MethodSignatureBuilder addMethod(final String name) {
65         final MethodSignatureBuilder builder = super.addMethod(name);
66         builder.setAbstract(false);
67         return builder;
68     }
69
70     @Override
71     public final GeneratedTOBuilder addEqualsIdentity(final GeneratedPropertyBuilder property) {
72         this.equalsProperties = LazyCollections.lazyAdd(this.equalsProperties, property);
73         return this;
74     }
75
76     @Override
77     public final GeneratedTOBuilder addHashIdentity(final GeneratedPropertyBuilder property) {
78         this.hashProperties = LazyCollections.lazyAdd(this.hashProperties, property);
79         return this;
80     }
81
82     @Override
83     public final GeneratedTOBuilder addToStringProperty(final GeneratedPropertyBuilder property) {
84         this.toStringProperties = LazyCollections.lazyAdd(this.toStringProperties, property);
85         return this;
86     }
87
88     @Override
89     protected final GeneratedTOBuilder thisInstance() {
90         return this;
91     }
92
93     @Override
94     public final String toString() {
95         final StringBuilder builder = new StringBuilder();
96         builder.append("GeneratedTransferObject [packageName=");
97         builder.append(getPackageName());
98         builder.append(", name=");
99         builder.append(getName());
100         builder.append(", comment=");
101         builder.append(getComment());
102         builder.append(", constants=");
103         builder.append(getConstants());
104         builder.append(", enumerations=");
105         builder.append(getEnumerations());
106         builder.append(", equalsProperties=");
107         builder.append(this.equalsProperties);
108         builder.append(", hashCodeProperties=");
109         builder.append(this.hashProperties);
110         builder.append(", stringProperties=");
111         builder.append(this.toStringProperties);
112         builder.append(", annotations=");
113         builder.append(getAnnotations());
114         builder.append(", methods=");
115         builder.append(getMethodDefinitions());
116         builder.append("]");
117         return builder.toString();
118     }
119
120     @Override
121     public final void setTypedef(final boolean isTypedef) {
122         this.isTypedef = isTypedef;
123     }
124
125     @Override
126     public final void setBaseType(final TypeDefinition<?> typeDef) {
127         this.baseType = typeDef;
128     }
129
130     @Override
131     public final void setIsUnion(final boolean isUnion) {
132         this.isUnionType = isUnion;
133     }
134
135     @Override
136     public final boolean isUnion() {
137         return isUnionType;
138     }
139
140     @Override
141     public final void setIsUnionBuilder(final boolean isUnionTypeBuilder) {
142         this.isUnionTypeBuilder = isUnionTypeBuilder;
143     }
144
145     static abstract class AbstractGeneratedTransferObject extends AbstractGeneratedType implements
146     GeneratedTransferObject {
147
148         private final List<GeneratedProperty> equalsProperties;
149         private final List<GeneratedProperty> hashCodeProperties;
150         private final List<GeneratedProperty> stringProperties;
151         private final GeneratedTransferObject extendsType;
152         private final boolean isTypedef;
153         private final TypeDefinition<?> baseType;
154         private final boolean isUnionType;
155         private final boolean isUnionTypeBuilder;
156
157         AbstractGeneratedTransferObject(final AbstractGeneratedTOBuilder builder) {
158             super(builder);
159             this.extendsType = builder.extendsType;
160
161             // FIXME: if these fields were guaranteed to be constant, we could perhaps
162             //        cache and reuse them between instances...
163             this.equalsProperties = toUnmodifiableProperties(builder.equalsProperties);
164             this.hashCodeProperties = toUnmodifiableProperties(builder.hashProperties);
165             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);
166
167             this.isTypedef = builder.isTypedef;
168             this.baseType = builder.baseType;
169             this.isUnionType = builder.isUnionType;
170             this.isUnionTypeBuilder = builder.isUnionTypeBuilder;
171         }
172
173         @Override
174         public final boolean isTypedef() {
175             return this.isTypedef;
176         }
177
178         @Override
179         public final TypeDefinition<?> getBaseType() {
180             return this.baseType;
181         }
182
183         @Override
184         public final boolean isUnionType() {
185             return this.isUnionType;
186         }
187
188         @Override
189         public final boolean isUnionTypeBuilder() {
190             return this.isUnionTypeBuilder;
191         }
192
193         @Override
194         public final GeneratedTransferObject getSuperType() {
195             return this.extendsType;
196         }
197
198         @Override
199         public final List<GeneratedProperty> getEqualsIdentifiers() {
200             return this.equalsProperties;
201         }
202
203         @Override
204         public final List<GeneratedProperty> getHashCodeIdentifiers() {
205             return this.hashCodeProperties;
206         }
207
208         @Override
209         public final List<GeneratedProperty> getToStringIdentifiers() {
210             return this.stringProperties;
211         }
212
213         @Override
214         public final String toString() {
215             if (this.isTypedef) {
216                 return serializeTypedef(this);
217             }
218             final StringBuilder builder = new StringBuilder();
219             builder.append("GeneratedTransferObject [packageName=");
220             builder.append(getPackageName());
221             builder.append(", name=");
222             builder.append(getName());
223             builder.append(", comment=");
224             builder.append(", annotations=");
225             builder.append(getAnnotations());
226             builder.append(getComment());
227             builder.append(", extends=");
228             builder.append(getSuperType());
229             builder.append(", implements=");
230             builder.append(getImplements());
231             builder.append(", enclosedTypes=");
232             builder.append(getEnclosedTypes());
233             builder.append(", constants=");
234             builder.append(getConstantDefinitions());
235             builder.append(", enumerations=");
236             builder.append(getEnumerations());
237             builder.append(", properties=");
238             builder.append(getProperties());
239             builder.append(", equalsProperties=");
240             builder.append(this.equalsProperties);
241             builder.append(", hashCodeProperties=");
242             builder.append(this.hashCodeProperties);
243             builder.append(", stringProperties=");
244             builder.append(this.stringProperties);
245             builder.append(", methods=");
246             builder.append(getMethodDefinitions());
247             builder.append("]");
248             return builder.toString();
249         }
250
251         public final String serializeTypedef(final Type type) {
252             if (!(type instanceof ParameterizedType)) {
253                 return type.getFullyQualifiedName();
254             }
255
256             final ParameterizedType parameterizedType = (ParameterizedType) type;
257             final StringBuilder sb = new StringBuilder();
258             sb.append(parameterizedType.getRawType().getFullyQualifiedName()).append('<');
259             boolean first = true;
260             for (final Type parameter : parameterizedType.getActualTypeArguments()) {
261                 if (first) {
262                     first = false;
263                 } else {
264                     sb.append(',');
265                 }
266                 sb.append(serializeTypedef(parameter));
267             }
268             return sb.append('>').toString();
269         }
270     }
271 }