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