Extend BindingNamespaceType
[mdsal.git] / binding2 / mdsal-binding2-generator-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / util / generated / type / builder / AbstractGeneratedType.java
1 /*
2  * Copyright (c) 2017 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
9 package org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder;
10
11 import com.google.common.annotations.Beta;
12 import com.google.common.collect.ImmutableList;
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.Objects;
17 import java.util.Optional;
18 import java.util.stream.Collectors;
19 import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType;
20 import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType;
21 import org.opendaylight.mdsal.binding.javav2.model.api.Constant;
22 import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration;
23 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty;
24 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
25 import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
26 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
27 import org.opendaylight.mdsal.binding.javav2.model.api.TypeComment;
28 import org.opendaylight.mdsal.binding.javav2.model.api.YangSourceDefinition;
29 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.AnnotationTypeBuilder;
30 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
31 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
32 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
33 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
34 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
35 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
36
37 @Beta
38 abstract class AbstractGeneratedType extends AbstractBaseType implements GeneratedType {
39
40     private final Type parent;
41     private final Type parentTypeForBuilder;
42     private final TypeComment comment;
43     private final List<AnnotationType> annotations;
44     private final List<Type> implementsTypes;
45     private final List<Enumeration> enumerations;
46     private final List<Constant> constants;
47     private final List<MethodSignature> methodSignatures;
48     private final List<GeneratedType> enclosedTypes;
49     private final List<GeneratedProperty> properties;
50     private final boolean isAbstract;
51     private final YangSourceDefinition definition;
52     private final BindingNamespaceType namespaceType;
53
54     public AbstractGeneratedType(final AbstractGeneratedTypeBuilder<?> builder) {
55         super(builder.getPackageName(), builder.getName(), true, null);
56         this.parent = builder.getParent();
57         this.parentTypeForBuilder = builder.getParentTypeForBuilder();
58         this.comment = builder.getComment();
59         this.annotations = toUnmodifiableAnnotations(builder.getAnnotations());
60         this.implementsTypes = makeUnmodifiable(builder.getImplementsTypes());
61         this.constants = makeUnmodifiable(builder.getConstants());
62         this.enumerations = toUnmodifiableEnumerations(builder.getEnumerations());
63         this.methodSignatures = toUnmodifiableMethods(builder.getMethodDefinitions());
64         this.enclosedTypes = toUnmodifiableEnclosedTypes(builder.getEnclosedTypes(),
65                 builder.getEnclosedTransferObjects());
66         this.properties = toUnmodifiableProperties(builder.getProperties());
67         this.isAbstract = builder.isAbstract();
68         this.definition = builder.getYangSourceDefinition().orElse(null);
69         this.namespaceType = builder.getBindingNamespaceType();
70     }
71
72     protected static final <T> List<T> makeUnmodifiable(final List<T> list) {
73         switch (list.size()) {
74             case 0:
75                 return ImmutableList.of();
76             case 1:
77                 return Collections.singletonList(list.get(0));
78             default:
79                 return Collections.unmodifiableList(list);
80         }
81     }
82
83     private static List<GeneratedType> toUnmodifiableEnclosedTypes(final List<GeneratedTypeBuilder> enclosedGenTypeBuilders,
84                                                                    final List<GeneratedTOBuilder> enclosedGenTOBuilders) {
85         final ArrayList<GeneratedType> enclosedTypesList = new ArrayList<>(enclosedGenTypeBuilders.size() + enclosedGenTOBuilders.size());
86         enclosedTypesList.addAll(enclosedGenTypeBuilders.stream().filter(Objects::nonNull).map(GeneratedTypeBuilder::toInstance).collect(Collectors.toList()));
87
88         enclosedTypesList.addAll(enclosedGenTOBuilders.stream().filter(Objects::nonNull).map(GeneratedTOBuilder::toInstance).collect(Collectors.toList()));
89
90         return makeUnmodifiable(enclosedTypesList);
91     }
92
93     protected static final List<AnnotationType> toUnmodifiableAnnotations(final List<AnnotationTypeBuilder> annotationBuilders) {
94         final List<AnnotationType> annotationList = new ArrayList<>(annotationBuilders.size());
95         annotationList.addAll(annotationBuilders.stream().map(AnnotationTypeBuilder::toInstance).collect(Collectors.toList()));
96         return makeUnmodifiable(annotationList);
97     }
98
99     protected final List<MethodSignature> toUnmodifiableMethods(final List<MethodSignatureBuilder> methodBuilders) {
100         final List<MethodSignature> methods = new ArrayList<>(methodBuilders.size());
101         methods.addAll(methodBuilders.stream().map(methodBuilder -> methodBuilder.toInstance(this)).collect(Collectors.toList()));
102         return makeUnmodifiable(methods);
103     }
104
105     protected final List<Enumeration> toUnmodifiableEnumerations(final List<EnumBuilder> enumBuilders) {
106         final List<Enumeration> enums = new ArrayList<>(enumBuilders.size());
107         enums.addAll(enumBuilders.stream().map(enumBuilder -> enumBuilder.toInstance(this)).collect(Collectors.toList()));
108         return makeUnmodifiable(enums);
109     }
110
111     protected final List<GeneratedProperty> toUnmodifiableProperties(final List<GeneratedPropertyBuilder> methodBuilders) {
112         final List<GeneratedProperty> methods = new ArrayList<>(methodBuilders.size());
113         methods.addAll(methodBuilders.stream().map(methodBuilder -> methodBuilder.toInstance(this)).collect(Collectors.toList()));
114         return makeUnmodifiable(methods);
115     }
116
117     @Override
118     public Type getParentType() {
119         return this.parent;
120     }
121
122     @Override
123     public Type getParentTypeForBuilder() {
124         return this.parentTypeForBuilder;
125     }
126
127     @Override
128     public final TypeComment getComment() {
129         return this.comment;
130     }
131
132     @Override
133     public List<AnnotationType> getAnnotations() {
134         return this.annotations;
135     }
136
137     @Override
138     public boolean isAbstract() {
139         return this.isAbstract;
140     }
141
142     @Override
143     public List<Type> getImplements() {
144         return this.implementsTypes;
145     }
146
147     @Override
148     public List<GeneratedType> getEnclosedTypes() {
149         return this.enclosedTypes;
150     }
151
152     @Override
153     public List<Enumeration> getEnumerations() {
154         return this.enumerations;
155     }
156
157     @Override
158     public List<Constant> getConstantDefinitions() {
159         return this.constants;
160     }
161
162     @Override
163     public List<MethodSignature> getMethodDefinitions() {
164         return this.methodSignatures;
165     }
166
167     @Override
168     public List<GeneratedProperty> getProperties() {
169         return this.properties;
170     }
171
172     @Override
173     public final Optional<YangSourceDefinition> getYangSourceDefinition() {
174         return Optional.ofNullable(definition);
175     }
176
177     @Override
178     public BindingNamespaceType getBindingNamespaceType() {
179         return this.namespaceType;
180     }
181
182     @Override
183     public String toString() {
184         final StringBuilder builder = new StringBuilder();
185         builder.append("GeneratedType [packageName=");
186         builder.append(getPackageName());
187         builder.append(", name=");
188         builder.append(getName());
189         if (this.parent != null) {
190             builder.append(", parent=");
191             builder.append(this.parent.getFullyQualifiedName());
192         } else {
193             builder.append(", parent=null");
194         }
195         final TypeComment comment = getComment();
196         if (comment != null) {
197             builder.append(", comment=");
198             builder.append(comment.getJavadoc());
199         }
200         builder.append(", annotations=");
201         builder.append(this.annotations);
202         builder.append(", enclosedTypes=");
203         builder.append(this.enclosedTypes);
204         builder.append(", enumerations=");
205         builder.append(this.enumerations);
206         builder.append(", constants=");
207         builder.append(this.constants);
208         builder.append(", methodSignatures=");
209         builder.append(this.methodSignatures);
210         builder.append("]");
211         return builder.toString();
212     }
213 }