78ff3a60c9edf26066249afb19fee92cb5b10829
[mdsal.git] / binding2 / mdsal-binding2-generator-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / util / generated / type / builder / GeneratedTypeBuilderImpl.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 java.util.List;
13 import java.util.Optional;
14 import com.google.common.base.Preconditions;
15 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
16 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
17 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder;
18 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
19 import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
20 import org.opendaylight.yangtools.yang.common.QName;
21
22 @Beta
23 public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder<GeneratedTypeBuilder> implements
24         GeneratedTypeBuilder {
25
26     private String description;
27     private String reference;
28     private String moduleName;
29     private List<QName> schemaPath;
30     private boolean isWithBuilder = false;
31     private String basePackageName = null;
32
33     public GeneratedTypeBuilderImpl(final String packageName, final String name) {
34         super(packageName, name);
35         setAbstract(true);
36     }
37
38     public GeneratedTypeBuilderImpl(final String packageName, final String name,
39                                     final boolean isPkNameNormalized,
40                                     final boolean isTypeNormalized) {
41         super(packageName, name, isPkNameNormalized, isTypeNormalized);
42         setAbstract(true);
43     }
44
45     @Override
46     public GeneratedType toInstance() {
47         if (this.isWithBuilder()) {
48             return new GeneratedTypeWithBuilderImpl(this);
49         } else {
50             return new GeneratedTypeImpl(this);
51         }
52     }
53
54     @Override
55     public void setDescription(String description) {
56         this.description = description;
57     }
58
59     @Override
60     public void setModuleName(String moduleName) {
61         this.moduleName = moduleName;
62     }
63
64     @Override
65     public void setSchemaPath(List<QName> schemaPath) {
66         this.schemaPath = schemaPath;
67     }
68
69     @Override
70     public void setReference(String reference) {
71         this.reference = reference;
72     }
73
74     @Override
75     public String toString() {
76         StringBuilder builder = new StringBuilder();
77         builder.append("GeneratedTransferObject [packageName=");
78         builder.append(getPackageName());
79         builder.append(", name=");
80         builder.append(getName());
81         builder.append(", comment=");
82         builder.append(getComment());
83         builder.append(", annotations=");
84         builder.append(getAnnotations());
85         builder.append(", implements=");
86         builder.append(getImplementsTypes());
87         builder.append(", enclosedTypes=");
88         builder.append(getEnclosedTypes());
89         builder.append(", constants=");
90         builder.append(getConstants());
91         builder.append(", enumerations=");
92         builder.append(getEnumerations());
93         builder.append(", properties=");
94         builder.append(", methods=");
95         builder.append(getMethodDefinitions());
96         builder.append("]");
97         return builder.toString();
98     }
99
100     @Override
101     protected GeneratedTypeBuilderImpl thisInstance() {
102         return this;
103     }
104
105     public boolean isWithBuilder() {
106         return isWithBuilder;
107     }
108
109     public void setWithBuilder(boolean withBuilder) {
110         isWithBuilder = withBuilder;
111     }
112
113     public String getBasePackageName() {
114         return basePackageName;
115     }
116
117     public void setBasePackageName(String basePackageName) {
118         this.basePackageName = basePackageName;
119     }
120
121     private static class GeneratedTypeImpl extends AbstractGeneratedType {
122
123         private final String description;
124         private final String reference;
125         private final String moduleName;
126         private final List<QName> schemaPath;
127
128         public GeneratedTypeImpl(final GeneratedTypeBuilderImpl builder) {
129             super(builder);
130
131             this.description = builder.description;
132             this.reference = builder.reference;
133             this.moduleName = builder.moduleName;
134             this.schemaPath = builder.schemaPath;
135         }
136
137         @Override
138         public Optional<String> getDescription() {
139             return Optional.ofNullable(this.description);
140         }
141
142         @Override
143         public Optional<String> getReference() {
144             return Optional.ofNullable(this.reference);
145         }
146
147         @Override
148         public List<QName> getSchemaPath() {
149             return schemaPath;
150         }
151
152         @Override
153         public String getModuleName() {
154             return moduleName;
155         }
156     }
157
158     private static final class GeneratedTypeWithBuilderImpl extends GeneratedTypeImpl
159             implements GeneratedTypeForBuilder {
160
161         private final String basePackageName;
162         private final String builderPackageName;
163
164         public GeneratedTypeWithBuilderImpl(GeneratedTypeBuilderImpl builder) {
165             super(builder);
166             Preconditions.checkState(builder.getBasePackageName() != null,
167                     "Base package name can not be null for type with builder!");
168             this.basePackageName = builder.getBasePackageName();
169             this.builderPackageName = generatePackageNameForBuilder();
170         }
171
172         private String generatePackageNameForBuilder() {
173             return BindingGeneratorUtil.replacePackageTopNamespace(this.basePackageName, this.getPackageName(),
174                     BindingNamespaceType.Data, BindingNamespaceType.Builder);
175         }
176
177         @Override
178         public String getPackageNameForBuilder() {
179             return this.builderPackageName;
180         }
181     }
182 }