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