Merge "Fix for Bug 241."
[yangtools.git] / code-generator / binding-generator-util / src / main / java / org / opendaylight / yangtools / binding / generator / util / generated / type / builder / GeneratedTOBuilderImpl.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.yangtools.binding.generator.util.generated.type.builder;\r
9 \r
10 import java.util.ArrayList;\r
11 import java.util.List;\r
12 \r
13 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;\r
14 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
15 import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;\r
16 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions;\r
17 import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
18 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder;\r
19 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder;\r
20 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder;\r
21 \r
22 public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder> implements\r
23         GeneratedTOBuilder {\r
24 \r
25     private GeneratedTransferObject extendsType;\r
26     private final List<GeneratedPropertyBuilder> equalsProperties = new ArrayList<>();\r
27     private final List<GeneratedPropertyBuilder> hashProperties = new ArrayList<>();\r
28     private final List<GeneratedPropertyBuilder> toStringProperties = new ArrayList<>();\r
29     private boolean isTypedef = false;\r
30     private boolean isUnionType = false;\r
31     private boolean isUnionTypeBuilder = false;\r
32     private Restrictions restrictions;\r
33     private GeneratedPropertyBuilder SUID;\r
34 \r
35     public GeneratedTOBuilderImpl(String packageName, String name) {\r
36         super(packageName, name);\r
37         setAbstract(false);\r
38     }\r
39 \r
40     @Override\r
41     public GeneratedTOBuilder setExtendsType(final GeneratedTransferObject genTransObj) {\r
42         if (genTransObj == null) {\r
43             throw new IllegalArgumentException("Generated Transfer Object cannot be null!");\r
44         }\r
45         extendsType = genTransObj;\r
46         return this;\r
47     }\r
48 \r
49     /**\r
50      * Add new Method Signature definition for Generated Type Builder and\r
51      * returns Method Signature Builder for specifying all Method parameters. <br>\r
52      * Name of Method cannot be <code>null</code>, if it is <code>null</code>\r
53      * the method SHOULD throw {@link IllegalArgumentException} <br>\r
54      * By <i>Default</i> the MethodSignatureBuilder SHOULD be pre-set as\r
55      * {@link MethodSignatureBuilder#setAbstract(boolean)},\r
56      * {TypeMemberBuilder#setFinal(boolean)} and\r
57      * {TypeMemberBuilder#setAccessModifier(boolean)}\r
58      *\r
59      * @param name\r
60      *            Name of Method\r
61      * @return <code>new</code> instance of Method Signature Builder.\r
62      */\r
63     @Override\r
64     public MethodSignatureBuilder addMethod(String name) {\r
65         final MethodSignatureBuilder builder = super.addMethod(name);\r
66         builder.setAbstract(false);\r
67         return builder;\r
68     }\r
69 \r
70     @Override\r
71     public GeneratedTOBuilder addEqualsIdentity(GeneratedPropertyBuilder property) {\r
72         equalsProperties.add(property);\r
73         return this;\r
74     }\r
75 \r
76     @Override\r
77     public GeneratedTOBuilder addHashIdentity(GeneratedPropertyBuilder property) {\r
78         hashProperties.add(property);\r
79         return this;\r
80     }\r
81 \r
82     @Override\r
83     public GeneratedTOBuilder addToStringProperty(GeneratedPropertyBuilder property) {\r
84         toStringProperties.add(property);\r
85         return this;\r
86     }\r
87 \r
88     @Override\r
89     protected GeneratedTOBuilder thisInstance() {\r
90         return this;\r
91     }\r
92 \r
93     @Override\r
94     public void setRestrictions(Restrictions restrictions) {\r
95         this.restrictions = restrictions;\r
96     }\r
97 \r
98     @Override\r
99     public void setSUID(GeneratedPropertyBuilder suid) {\r
100         this.SUID = suid;\r
101     }\r
102 \r
103     @Override\r
104     public GeneratedTransferObject toInstance() {\r
105         return new GeneratedTransferObjectImpl(this);\r
106     }\r
107 \r
108     @Override\r
109     public String toString() {\r
110         StringBuilder builder = new StringBuilder();\r
111         builder.append("GeneratedTransferObject [packageName=");\r
112         builder.append(getPackageName());\r
113         builder.append(", name=");\r
114         builder.append(getName());\r
115         builder.append(", comment=");\r
116         builder.append(getComment());\r
117         builder.append(", constants=");\r
118         builder.append(getConstants());\r
119         builder.append(", enumerations=");\r
120         builder.append(getEnumerations());\r
121         builder.append(", equalsProperties=");\r
122         builder.append(equalsProperties);\r
123         builder.append(", hashCodeProperties=");\r
124         builder.append(hashProperties);\r
125         builder.append(", stringProperties=");\r
126         builder.append(toStringProperties);\r
127         builder.append(", annotations=");\r
128         builder.append(getAnnotations());\r
129         builder.append(", methods=");\r
130         builder.append(getMethodDefinitions());\r
131         builder.append("]");\r
132         return builder.toString();\r
133     }\r
134 \r
135     @Override\r
136     public void setTypedef(boolean isTypedef) {\r
137         this.isTypedef = isTypedef;\r
138     }\r
139 \r
140     @Override\r
141     public void setIsUnion(boolean isUnion) {\r
142         this.isUnionType = isUnion;\r
143     }\r
144 \r
145     @Override\r
146     public void setIsUnionBuilder(boolean isUnionTypeBuilder) {\r
147         this.isUnionTypeBuilder = isUnionTypeBuilder;\r
148     }\r
149 \r
150     private static final class GeneratedTransferObjectImpl extends AbstractGeneratedType implements\r
151             GeneratedTransferObject {\r
152 \r
153         private final List<GeneratedProperty> equalsProperties;\r
154         private final List<GeneratedProperty> hashCodeProperties;\r
155         private final List<GeneratedProperty> stringProperties;\r
156         private final GeneratedTransferObject extendsType;\r
157         private final boolean isTypedef;\r
158         private final boolean isUnionType;\r
159         private final boolean isUnionTypeBuilder;\r
160         private final Restrictions restrictions;\r
161         private final GeneratedProperty SUID;\r
162 \r
163         public GeneratedTransferObjectImpl(GeneratedTOBuilderImpl builder) {\r
164             super(builder);\r
165             this.extendsType = builder.extendsType;\r
166             this.equalsProperties = toUnmodifiableProperties(builder.equalsProperties);\r
167             this.hashCodeProperties = toUnmodifiableProperties(builder.hashProperties);\r
168             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);\r
169             this.isTypedef = builder.isTypedef;\r
170             this.isUnionType = builder.isUnionType;\r
171             this.isUnionTypeBuilder = builder.isUnionTypeBuilder;\r
172             this.restrictions = builder.restrictions;\r
173             if (builder.SUID == null) {\r
174                 this.SUID = null;\r
175             } else {\r
176                 this.SUID = builder.SUID.toInstance(GeneratedTransferObjectImpl.this);\r
177             }\r
178         }\r
179 \r
180         @Override\r
181         public boolean isTypedef() {\r
182             return isTypedef;\r
183         }\r
184 \r
185         @Override\r
186         public boolean isUnionType() {\r
187             return isUnionType;\r
188         }\r
189 \r
190         @Override\r
191         public boolean isUnionTypeBuilder() {\r
192             return isUnionTypeBuilder;\r
193         }\r
194 \r
195         @Override\r
196         public GeneratedTransferObject getSuperType() {\r
197             return extendsType;\r
198         }\r
199 \r
200         @Override\r
201         public List<GeneratedProperty> getEqualsIdentifiers() {\r
202             return equalsProperties;\r
203         }\r
204 \r
205         @Override\r
206         public List<GeneratedProperty> getHashCodeIdentifiers() {\r
207             return hashCodeProperties;\r
208         }\r
209 \r
210         @Override\r
211         public List<GeneratedProperty> getToStringIdentifiers() {\r
212             return stringProperties;\r
213         }\r
214 \r
215         @Override\r
216         public Restrictions getRestrictions() {\r
217             return restrictions;\r
218         }\r
219 \r
220         @Override\r
221         public GeneratedProperty getSUID() {\r
222             return SUID;\r
223         }\r
224 \r
225         @Override\r
226         public String toString() {\r
227             if(isTypedef) {\r
228                 return serializeTypedef(this);\r
229             }\r
230             StringBuilder builder = new StringBuilder();\r
231             builder.append("GeneratedTransferObject [packageName=");\r
232             builder.append(getPackageName());\r
233             builder.append(", name=");\r
234             builder.append(getName());\r
235             builder.append(", comment=");\r
236             builder.append(", annotations=");\r
237             builder.append(getAnnotations());\r
238             builder.append(getComment());\r
239             builder.append(", extends=");\r
240             builder.append(getSuperType());\r
241             builder.append(", implements=");\r
242             builder.append(getImplements());\r
243             builder.append(", enclosedTypes=");\r
244             builder.append(getEnclosedTypes());\r
245             builder.append(", constants=");\r
246             builder.append(getConstantDefinitions());\r
247             builder.append(", enumerations=");\r
248             builder.append(getEnumerations());\r
249             builder.append(", properties=");\r
250             builder.append(getProperties());\r
251             builder.append(", equalsProperties=");\r
252             builder.append(equalsProperties);\r
253             builder.append(", hashCodeProperties=");\r
254             builder.append(hashCodeProperties);\r
255             builder.append(", stringProperties=");\r
256             builder.append(stringProperties);\r
257             builder.append(", methods=");\r
258             builder.append(getMethodDefinitions());\r
259             builder.append("]");\r
260             return builder.toString();\r
261         }\r
262 \r
263         public String serializeTypedef(Type type) {\r
264             if (type instanceof ParameterizedType) {\r
265                 ParameterizedType parameterizedType = (ParameterizedType) type;\r
266                 StringBuffer sb = new StringBuffer();\r
267                 sb.append(parameterizedType.getRawType().getFullyQualifiedName());\r
268                 sb.append("<");\r
269                 boolean first = true;\r
270                 for (Type parameter : parameterizedType.getActualTypeArguments()) {\r
271                     if (first) {\r
272                         first = false;\r
273                     } else {\r
274                         sb.append(",");\r
275                     }\r
276                     sb.append(serializeTypedef(parameter));\r
277                 }\r
278                 sb.append(">");\r
279                 return sb.toString();\r
280             } else {\r
281                 return type.getFullyQualifiedName();\r
282             }\r
283         }\r
284 \r
285     }\r
286 }\r