Merge "Bug 735 - Part 1: Update ietf-restconf and ietf-yangtypes to newer versions"
[mdsal.git] / code-generator / binding-generator-util / src / main / java / org / opendaylight / yangtools / binding / generator / util / generated / type / builder / GeneratedTOBuilderImpl.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.yangtools.binding.generator.util.generated.type.builder;
9
10 import java.util.ArrayList;
11 import java.util.List;
12
13 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty;
14 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
15 import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;
16 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions;
17 import org.opendaylight.yangtools.sal.binding.model.api.Type;
18 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder;
19 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder;
20 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.MethodSignatureBuilder;
21
22 public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder> implements
23         GeneratedTOBuilder {
24
25     private GeneratedTransferObject extendsType;
26     private final ArrayList<GeneratedPropertyBuilder> equalsProperties = new ArrayList<>();
27     private final ArrayList<GeneratedPropertyBuilder> hashProperties = new ArrayList<>();
28     private final ArrayList<GeneratedPropertyBuilder> toStringProperties = new ArrayList<>();
29     private boolean isTypedef = false;
30     private boolean isUnionType = false;
31     private boolean isUnionTypeBuilder = false;
32     private Restrictions restrictions;
33     private GeneratedPropertyBuilder SUID;
34
35     public GeneratedTOBuilderImpl(final String packageName, final String name) {
36         super(packageName, name);
37         setAbstract(false);
38     }
39
40     @Override
41     public GeneratedTOBuilder setExtendsType(final GeneratedTransferObject genTransObj) {
42         if (genTransObj == null) {
43             throw new IllegalArgumentException("Generated Transfer Object cannot be null!");
44         }
45         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 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 GeneratedTOBuilder addEqualsIdentity(final GeneratedPropertyBuilder property) {
72         equalsProperties.add(property);
73         return this;
74     }
75
76     @Override
77     public GeneratedTOBuilder addHashIdentity(final GeneratedPropertyBuilder property) {
78         hashProperties.add(property);
79         return this;
80     }
81
82     @Override
83     public GeneratedTOBuilder addToStringProperty(final GeneratedPropertyBuilder property) {
84         toStringProperties.add(property);
85         return this;
86     }
87
88     @Override
89     protected GeneratedTOBuilder thisInstance() {
90         return this;
91     }
92
93     @Override
94     public void setRestrictions(final Restrictions restrictions) {
95         this.restrictions = restrictions;
96     }
97
98     @Override
99     public void setSUID(final GeneratedPropertyBuilder suid) {
100         this.SUID = suid;
101     }
102
103     @Override
104     public GeneratedTransferObject toInstance() {
105         // FIXME: can we compact the arrays now? It needs to be thread-safe, though
106         return new GeneratedTransferObjectImpl(this);
107     }
108
109     @Override
110     public String toString() {
111         StringBuilder builder = new StringBuilder();
112         builder.append("GeneratedTransferObject [packageName=");
113         builder.append(getPackageName());
114         builder.append(", name=");
115         builder.append(getName());
116         builder.append(", comment=");
117         builder.append(getComment());
118         builder.append(", constants=");
119         builder.append(getConstants());
120         builder.append(", enumerations=");
121         builder.append(getEnumerations());
122         builder.append(", equalsProperties=");
123         builder.append(equalsProperties);
124         builder.append(", hashCodeProperties=");
125         builder.append(hashProperties);
126         builder.append(", stringProperties=");
127         builder.append(toStringProperties);
128         builder.append(", annotations=");
129         builder.append(getAnnotations());
130         builder.append(", methods=");
131         builder.append(getMethodDefinitions());
132         builder.append("]");
133         return builder.toString();
134     }
135
136     @Override
137     public void setTypedef(final boolean isTypedef) {
138         this.isTypedef = isTypedef;
139     }
140
141     @Override
142     public void setIsUnion(final boolean isUnion) {
143         this.isUnionType = isUnion;
144     }
145
146     @Override
147     public void setIsUnionBuilder(final boolean isUnionTypeBuilder) {
148         this.isUnionTypeBuilder = isUnionTypeBuilder;
149     }
150
151     private static final class GeneratedTransferObjectImpl extends AbstractGeneratedType implements
152             GeneratedTransferObject {
153
154         private final List<GeneratedProperty> equalsProperties;
155         private final List<GeneratedProperty> hashCodeProperties;
156         private final List<GeneratedProperty> stringProperties;
157         private final GeneratedTransferObject extendsType;
158         private final boolean isTypedef;
159         private final boolean isUnionType;
160         private final boolean isUnionTypeBuilder;
161         private final Restrictions restrictions;
162         private final GeneratedProperty SUID;
163
164         public GeneratedTransferObjectImpl(final GeneratedTOBuilderImpl builder) {
165             super(builder);
166             this.extendsType = builder.extendsType;
167             this.equalsProperties = toUnmodifiableProperties(builder.equalsProperties);
168             this.hashCodeProperties = toUnmodifiableProperties(builder.hashProperties);
169             this.stringProperties = toUnmodifiableProperties(builder.toStringProperties);
170             this.isTypedef = builder.isTypedef;
171             this.isUnionType = builder.isUnionType;
172             this.isUnionTypeBuilder = builder.isUnionTypeBuilder;
173             this.restrictions = builder.restrictions;
174             if (builder.SUID == null) {
175                 this.SUID = null;
176             } else {
177                 this.SUID = builder.SUID.toInstance(GeneratedTransferObjectImpl.this);
178             }
179         }
180
181         @Override
182         public boolean isTypedef() {
183             return isTypedef;
184         }
185
186         @Override
187         public boolean isUnionType() {
188             return isUnionType;
189         }
190
191         @Override
192         public boolean isUnionTypeBuilder() {
193             return isUnionTypeBuilder;
194         }
195
196         @Override
197         public GeneratedTransferObject getSuperType() {
198             return extendsType;
199         }
200
201         @Override
202         public List<GeneratedProperty> getEqualsIdentifiers() {
203             return equalsProperties;
204         }
205
206         @Override
207         public List<GeneratedProperty> getHashCodeIdentifiers() {
208             return hashCodeProperties;
209         }
210
211         @Override
212         public List<GeneratedProperty> getToStringIdentifiers() {
213             return stringProperties;
214         }
215
216         @Override
217         public Restrictions getRestrictions() {
218             return restrictions;
219         }
220
221         @Override
222         public GeneratedProperty getSUID() {
223             return SUID;
224         }
225
226         @Override
227         public String toString() {
228             if(isTypedef) {
229                 return serializeTypedef(this);
230             }
231             StringBuilder builder = new StringBuilder();
232             builder.append("GeneratedTransferObject [packageName=");
233             builder.append(getPackageName());
234             builder.append(", name=");
235             builder.append(getName());
236             builder.append(", comment=");
237             builder.append(", annotations=");
238             builder.append(getAnnotations());
239             builder.append(getComment());
240             builder.append(", extends=");
241             builder.append(getSuperType());
242             builder.append(", implements=");
243             builder.append(getImplements());
244             builder.append(", enclosedTypes=");
245             builder.append(getEnclosedTypes());
246             builder.append(", constants=");
247             builder.append(getConstantDefinitions());
248             builder.append(", enumerations=");
249             builder.append(getEnumerations());
250             builder.append(", properties=");
251             builder.append(getProperties());
252             builder.append(", equalsProperties=");
253             builder.append(equalsProperties);
254             builder.append(", hashCodeProperties=");
255             builder.append(hashCodeProperties);
256             builder.append(", stringProperties=");
257             builder.append(stringProperties);
258             builder.append(", methods=");
259             builder.append(getMethodDefinitions());
260             builder.append("]");
261             return builder.toString();
262         }
263
264         public String serializeTypedef(final Type type) {
265             if (type instanceof ParameterizedType) {
266                 ParameterizedType parameterizedType = (ParameterizedType) type;
267                 StringBuffer sb = new StringBuffer();
268                 sb.append(parameterizedType.getRawType().getFullyQualifiedName());
269                 sb.append("<");
270                 boolean first = true;
271                 for (Type parameter : parameterizedType.getActualTypeArguments()) {
272                     if (first) {
273                         first = false;
274                     } else {
275                         sb.append(",");
276                     }
277                     sb.append(serializeTypedef(parameter));
278                 }
279                 sb.append(">");
280                 return sb.toString();
281             } else {
282                 return type.getFullyQualifiedName();
283             }
284         }
285
286     }
287 }