2 * Copyright (c) 2017 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
9 package org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.annotations.Beta;
14 import com.google.common.base.Preconditions;
15 import com.google.common.collect.ImmutableList;
17 import java.util.List;
18 import java.util.Objects;
19 import java.util.Optional;
21 import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
22 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
23 import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier;
24 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
25 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
26 import org.opendaylight.mdsal.binding.javav2.model.api.TypeComment;
27 import org.opendaylight.mdsal.binding.javav2.model.api.YangSourceDefinition;
28 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.AnnotationTypeBuilder;
29 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
30 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
31 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
32 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
33 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilderBase;
34 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
35 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
36 import org.opendaylight.yangtools.util.LazyCollections;
39 abstract class AbstractGeneratedTypeBuilder<T extends GeneratedTypeBuilderBase<T>> extends AbstractBaseType
40 implements GeneratedTypeBuilderBase<T> {
42 private List<AnnotationTypeBuilder> annotationBuilders = ImmutableList.of();
43 private List<Type> implementsTypes = ImmutableList.of();
44 private List<EnumBuilder> enumDefinitions = ImmutableList.of();
45 private List<Constant> constants = ImmutableList.of();
46 private List<MethodSignatureBuilder> methodDefinitions = ImmutableList.of();
47 private final List<GeneratedTypeBuilder> enclosedTypes = ImmutableList.of();
48 private List<GeneratedTOBuilder> enclosedTransferObjects = ImmutableList.of();
49 private List<GeneratedPropertyBuilder> properties = ImmutableList.of();
50 private TypeComment comment;
51 private boolean isAbstract;
52 private Type parentTypeForBuilder;
53 private YangSourceDefinition yangSourceDefinition;
54 private BindingNamespaceType namespaceType;
56 protected AbstractGeneratedTypeBuilder(final String packageName, final String name, ModuleContext context) {
57 super(packageName, name, context);
60 protected AbstractGeneratedTypeBuilder(final String packageName, final String name, final boolean isNormalized,
61 ModuleContext context) {
62 super(packageName, name, true, null);
65 protected AbstractGeneratedTypeBuilder(final String packageName, final String name,
66 final boolean isPkNameNormalized, final boolean isTypeNormalized, ModuleContext context) {
67 super(packageName, name, isPkNameNormalized, isTypeNormalized, context);
70 protected TypeComment getComment() {
74 protected List<AnnotationTypeBuilder> getAnnotations() {
75 return annotationBuilders;
79 public boolean isAbstract() {
84 public List<Type> getImplementsTypes() {
85 return implementsTypes;
88 protected List<EnumBuilder> getEnumerations() {
89 return enumDefinitions;
92 protected List<Constant> getConstants() {
97 public List<MethodSignatureBuilder> getMethodDefinitions() {
98 return methodDefinitions;
101 protected List<GeneratedTypeBuilder> getEnclosedTypes() {
102 return enclosedTypes;
105 protected List<GeneratedTOBuilder> getEnclosedTransferObjects() {
106 return enclosedTransferObjects;
109 protected abstract T thisInstance();
112 public GeneratedTOBuilder addEnclosingTransferObject(final String name) {
113 Preconditions.checkArgument(name != null, "Name for Enclosing Generated Transfer Object cannot be null!");
114 GeneratedTOBuilder builder = new GeneratedTOBuilderImpl(getFullyQualifiedName(), name, true);
116 Preconditions.checkArgument(!enclosedTransferObjects.contains(builder),
117 "This generated type already contains equal enclosing transfer object.");
118 enclosedTransferObjects = LazyCollections.lazyAdd(enclosedTransferObjects, builder);
123 public T addEnclosingTransferObject(final GeneratedTOBuilder genTOBuilder) {
124 Preconditions.checkArgument(genTOBuilder != null, "Parameter genTOBuilder cannot be null!");
125 Preconditions.checkArgument(!enclosedTransferObjects.contains(genTOBuilder),
126 "This generated type already contains equal enclosing transfer object.");
127 enclosedTransferObjects = LazyCollections.lazyAdd(enclosedTransferObjects, genTOBuilder);
128 return thisInstance();
132 public T addComment(final TypeComment typeComment) {
133 this.comment = requireNonNull(typeComment);
134 return thisInstance();
138 public AnnotationTypeBuilder addAnnotation(final String packageName, final String name) {
139 Preconditions.checkArgument(packageName != null, "Package Name for Annotation Type cannot be null!");
140 Preconditions.checkArgument(name != null, "Name of Annotation Type cannot be null!");
142 final AnnotationTypeBuilder builder = new AnnotationTypeBuilderImpl(packageName, name);
144 Preconditions.checkArgument(!annotationBuilders.contains(builder),
145 "This generated type already contains equal annotation.");
146 annotationBuilders = LazyCollections.lazyAdd(annotationBuilders, builder);
151 public T setAbstract(final boolean isabstract) {
152 this.isAbstract = isabstract;
153 return thisInstance();
157 public T addImplementsType(final Type genType) {
158 Preconditions.checkArgument(genType != null, "Type cannot be null");
159 Preconditions.checkArgument(!implementsTypes.contains(genType),
160 "This generated type already contains equal implements type.");
161 implementsTypes = LazyCollections.lazyAdd(implementsTypes, genType);
162 return thisInstance();
166 public Constant addConstant(final Type type, final String name, final Object value) {
167 Preconditions.checkArgument(type != null, "Returning Type for Constant cannot be null!");
168 Preconditions.checkArgument(name != null, "Name of constant cannot be null!");
169 Preconditions.checkArgument(!containsConstant(name),
170 "This generated type already contains constant with the same name.");
172 final Constant constant = new ConstantImpl(this, type, name, value);
173 constants = LazyCollections.lazyAdd(constants, constant);
179 public Type setParentTypeForBuilder(Type type) {
180 return this.parentTypeForBuilder = type;
184 public BindingNamespaceType getBindingNamespaceType() {
185 return namespaceType;
189 public void setBindingNamespaceType(BindingNamespaceType type) {
190 this.namespaceType = type;
193 public boolean containsConstant(final String name) {
194 Preconditions.checkArgument(name != null, "Parameter name can't be null");
195 for (Constant constant : constants) {
196 if (name.equals(constant.getName())) {
204 public EnumBuilder addEnumeration(final String name, ModuleContext context) {
205 Preconditions.checkArgument(name != null, "Name of enumeration cannot be null!");
206 final EnumBuilder builder = new EnumerationBuilderImpl(getFullyQualifiedName(), name, true, false,
209 Preconditions.checkArgument(!enumDefinitions.contains(builder),
210 "This generated type already contains equal enumeration.");
211 enumDefinitions = LazyCollections.lazyAdd(enumDefinitions, builder);
216 public MethodSignatureBuilder addMethod(final String name) {
217 Preconditions.checkArgument(name != null, "Name of method cannot be null!");
218 final MethodSignatureBuilder builder = new MethodSignatureBuilderImpl(name);
219 builder.setAccessModifier(AccessModifier.PUBLIC);
220 builder.setAbstract(true);
221 methodDefinitions = LazyCollections.lazyAdd(methodDefinitions, builder);
226 public boolean containsMethod(final String name) {
227 Preconditions.checkArgument(name != null, "Parameter name can't be null");
228 for (MethodSignatureBuilder methodDefinition : methodDefinitions) {
229 if (name.equals(methodDefinition.getName())) {
237 public GeneratedPropertyBuilder addProperty(final String name) {
238 Preconditions.checkArgument(name != null, "Parameter name can't be null");
239 Preconditions.checkArgument(!containsProperty(name),
240 "This generated type already contains property with the same name.");
242 final GeneratedPropertyBuilder builder = new GeneratedPropertyBuilderImpl(name);
243 builder.setAccessModifier(AccessModifier.PUBLIC);
244 properties = LazyCollections.lazyAdd(properties, builder);
249 public boolean containsProperty(final String name) {
250 Preconditions.checkArgument(name != null, "Parameter name can't be null");
251 for (GeneratedPropertyBuilder property : properties) {
252 if (name.equals(property.getName())) {
260 public Optional<YangSourceDefinition> getYangSourceDefinition() {
261 return Optional.ofNullable(yangSourceDefinition);
266 public void setYangSourceDefinition(final YangSourceDefinition definition) {
267 yangSourceDefinition = requireNonNull(definition);
271 public int hashCode() {
272 return Objects.hash(getName(), getPackageName());
276 public boolean equals(final Object obj) {
283 if (getClass() != obj.getClass()) {
287 if (!(obj instanceof AbstractGeneratedTypeBuilder)) {
291 AbstractGeneratedTypeBuilder<?> other = (AbstractGeneratedTypeBuilder<?>) obj;
292 return Objects.equals(getFullyQualifiedName(), other.getFullyQualifiedName());
295 public Type getParent() {
300 public Type getParentTypeForBuilder() {
301 return parentTypeForBuilder;
305 public List<GeneratedPropertyBuilder> getProperties() {