2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.mdsal.binding.model.util.generated.type.builder;
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;
24 abstract class AbstractGeneratedTOBuilder extends AbstractGeneratedTypeBuilder<GeneratedTOBuilder>
25 implements GeneratedTOBuilder {
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;
37 AbstractGeneratedTOBuilder(final JavaTypeName identifier) {
43 public final GeneratedTOBuilder setExtendsType(final GeneratedTransferObject genTransObj) {
44 Preconditions.checkArgument(genTransObj != null, "Generated Transfer Object cannot be null!");
45 this.extendsType = genTransObj;
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)}
61 * @return <code>new</code> instance of Method Signature Builder.
64 public final MethodSignatureBuilder addMethod(final String name) {
65 final MethodSignatureBuilder builder = super.addMethod(name);
66 builder.setAbstract(false);
71 public final GeneratedTOBuilder addEqualsIdentity(final GeneratedPropertyBuilder property) {
72 this.equalsProperties = LazyCollections.lazyAdd(this.equalsProperties, property);
77 public final GeneratedTOBuilder addHashIdentity(final GeneratedPropertyBuilder property) {
78 this.hashProperties = LazyCollections.lazyAdd(this.hashProperties, property);
83 public final GeneratedTOBuilder addToStringProperty(final GeneratedPropertyBuilder property) {
84 this.toStringProperties = LazyCollections.lazyAdd(this.toStringProperties, property);
89 protected final GeneratedTOBuilder thisInstance() {
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());
117 return builder.toString();
121 public final void setTypedef(final boolean isTypedef) {
122 this.isTypedef = isTypedef;
126 public final void setBaseType(final TypeDefinition<?> typeDef) {
127 this.baseType = typeDef;
131 public final void setIsUnion(final boolean isUnion) {
132 this.isUnionType = isUnion;
136 public final boolean isUnion() {
141 public final void setIsUnionBuilder(final boolean isUnionTypeBuilder) {
142 this.isUnionTypeBuilder = isUnionTypeBuilder;
145 static abstract class AbstractGeneratedTransferObject extends AbstractGeneratedType implements
146 GeneratedTransferObject {
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;
157 AbstractGeneratedTransferObject(final AbstractGeneratedTOBuilder builder) {
159 this.extendsType = builder.extendsType;
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);
167 this.isTypedef = builder.isTypedef;
168 this.baseType = builder.baseType;
169 this.isUnionType = builder.isUnionType;
170 this.isUnionTypeBuilder = builder.isUnionTypeBuilder;
174 public final boolean isTypedef() {
175 return this.isTypedef;
179 public final TypeDefinition<?> getBaseType() {
180 return this.baseType;
184 public final boolean isUnionType() {
185 return this.isUnionType;
189 public final boolean isUnionTypeBuilder() {
190 return this.isUnionTypeBuilder;
194 public final GeneratedTransferObject getSuperType() {
195 return this.extendsType;
199 public final List<GeneratedProperty> getEqualsIdentifiers() {
200 return this.equalsProperties;
204 public final List<GeneratedProperty> getHashCodeIdentifiers() {
205 return this.hashCodeProperties;
209 public final List<GeneratedProperty> getToStringIdentifiers() {
210 return this.stringProperties;
214 public final String toString() {
215 if (this.isTypedef) {
216 return serializeTypedef(this);
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());
248 return builder.toString();
251 public final String serializeTypedef(final Type type) {
252 if (!(type instanceof ParameterizedType)) {
253 return type.getFullyQualifiedName();
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()) {
266 sb.append(serializeTypedef(parameter));
268 return sb.append('>').toString();