View Javadoc
1   /*
2    *    Copyright 2006-2023 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.generator.codegen.mybatis3;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  
21  import org.mybatis.generator.api.GeneratedJavaFile;
22  import org.mybatis.generator.api.GeneratedKotlinFile;
23  import org.mybatis.generator.api.GeneratedXmlFile;
24  import org.mybatis.generator.api.IntrospectedTable;
25  import org.mybatis.generator.api.ProgressCallback;
26  import org.mybatis.generator.api.dom.java.CompilationUnit;
27  import org.mybatis.generator.api.dom.kotlin.KotlinFile;
28  import org.mybatis.generator.api.dom.xml.Document;
29  import org.mybatis.generator.codegen.AbstractGenerator;
30  import org.mybatis.generator.codegen.AbstractJavaClientGenerator;
31  import org.mybatis.generator.codegen.AbstractJavaGenerator;
32  import org.mybatis.generator.codegen.AbstractKotlinGenerator;
33  import org.mybatis.generator.codegen.AbstractXmlGenerator;
34  import org.mybatis.generator.codegen.mybatis3.javamapper.AnnotatedClientGenerator;
35  import org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator;
36  import org.mybatis.generator.codegen.mybatis3.javamapper.MixedClientGenerator;
37  import org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator;
38  import org.mybatis.generator.codegen.mybatis3.model.ExampleGenerator;
39  import org.mybatis.generator.codegen.mybatis3.model.PrimaryKeyGenerator;
40  import org.mybatis.generator.codegen.mybatis3.model.RecordWithBLOBsGenerator;
41  import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator;
42  import org.mybatis.generator.config.PropertyRegistry;
43  import org.mybatis.generator.internal.ObjectFactory;
44  import org.mybatis.generator.internal.util.StringUtility;
45  
46  /**
47   * Introspected table implementation for generating MyBatis3 artifacts.
48   *
49   * @author Jeff Butler
50   */
51  public class IntrospectedTableMyBatis3Impl extends IntrospectedTable {
52  
53      protected final List<AbstractJavaGenerator> javaGenerators = new ArrayList<>();
54  
55      protected final List<AbstractKotlinGenerator> kotlinGenerators = new ArrayList<>();
56  
57      protected AbstractXmlGenerator xmlMapperGenerator;
58  
59      public IntrospectedTableMyBatis3Impl() {
60          super(TargetRuntime.MYBATIS3);
61      }
62  
63      @Override
64      public void calculateGenerators(List<String> warnings,
65              ProgressCallback progressCallback) {
66          calculateJavaModelGenerators(warnings, progressCallback);
67  
68          AbstractJavaClientGenerator javaClientGenerator =
69                  calculateClientGenerators(warnings, progressCallback);
70  
71          calculateXmlMapperGenerator(javaClientGenerator, warnings, progressCallback);
72      }
73  
74      protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator,
75              List<String> warnings,
76              ProgressCallback progressCallback) {
77          if (javaClientGenerator == null) {
78              if (context.getSqlMapGeneratorConfiguration() != null) {
79                  xmlMapperGenerator = new XMLMapperGenerator();
80              }
81          } else {
82              xmlMapperGenerator = javaClientGenerator.getMatchedXMLGenerator();
83          }
84  
85          initializeAbstractGenerator(xmlMapperGenerator, warnings,
86                  progressCallback);
87      }
88  
89      protected AbstractJavaClientGenerator calculateClientGenerators(List<String> warnings,
90              ProgressCallback progressCallback) {
91          if (!rules.generateJavaClient()) {
92              return null;
93          }
94  
95          AbstractJavaClientGenerator javaGenerator = createJavaClientGenerator();
96          if (javaGenerator == null) {
97              return null;
98          }
99  
100         initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
101         javaGenerators.add(javaGenerator);
102 
103         return javaGenerator;
104     }
105 
106     protected AbstractJavaClientGenerator createJavaClientGenerator() {
107         if (context.getJavaClientGeneratorConfiguration() == null) {
108             return null;
109         }
110 
111         String type = context.getJavaClientGeneratorConfiguration()
112                 .getConfigurationType();
113 
114         AbstractJavaClientGenerator javaGenerator;
115         if ("XMLMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
116             javaGenerator = new JavaMapperGenerator(getClientProject());
117         } else if ("MIXEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
118             javaGenerator = new MixedClientGenerator(getClientProject());
119         } else if ("ANNOTATEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
120             javaGenerator = new AnnotatedClientGenerator(getClientProject());
121         } else if ("MAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
122             javaGenerator = new JavaMapperGenerator(getClientProject());
123         } else {
124             javaGenerator = (AbstractJavaClientGenerator) ObjectFactory.createInternalObject(type);
125         }
126 
127         return javaGenerator;
128     }
129 
130     protected void calculateJavaModelGenerators(List<String> warnings,
131             ProgressCallback progressCallback) {
132         if (getRules().generateExampleClass()) {
133             AbstractJavaGenerator javaGenerator = new ExampleGenerator(getExampleProject());
134             initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
135             javaGenerators.add(javaGenerator);
136         }
137 
138         if (getRules().generatePrimaryKeyClass()) {
139             AbstractJavaGenerator javaGenerator = new PrimaryKeyGenerator(getModelProject());
140             initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
141             javaGenerators.add(javaGenerator);
142         }
143 
144         if (getRules().generateBaseRecordClass()) {
145             AbstractJavaGenerator javaGenerator = new BaseRecordGenerator(getModelProject());
146             initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
147             javaGenerators.add(javaGenerator);
148         }
149 
150         if (getRules().generateRecordWithBLOBsClass()) {
151             AbstractJavaGenerator javaGenerator = new RecordWithBLOBsGenerator(getModelProject());
152             initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
153             javaGenerators.add(javaGenerator);
154         }
155     }
156 
157     protected void initializeAbstractGenerator(AbstractGenerator abstractGenerator, List<String> warnings,
158                                                ProgressCallback progressCallback) {
159         if (abstractGenerator == null) {
160             return;
161         }
162 
163         abstractGenerator.setContext(context);
164         abstractGenerator.setIntrospectedTable(this);
165         abstractGenerator.setProgressCallback(progressCallback);
166         abstractGenerator.setWarnings(warnings);
167     }
168 
169     @Override
170     public List<GeneratedJavaFile> getGeneratedJavaFiles() {
171         List<GeneratedJavaFile> answer = new ArrayList<>();
172 
173         for (AbstractJavaGenerator javaGenerator : javaGenerators) {
174             List<CompilationUnit> compilationUnits = javaGenerator.getCompilationUnits();
175             for (CompilationUnit compilationUnit : compilationUnits) {
176                 GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit,
177                                 javaGenerator.getProject(),
178                                 context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING),
179                                 context.getJavaFormatter());
180                 answer.add(gjf);
181             }
182         }
183 
184         return answer;
185     }
186 
187     @Override
188     public List<GeneratedKotlinFile> getGeneratedKotlinFiles() {
189         List<GeneratedKotlinFile> answer = new ArrayList<>();
190 
191         for (AbstractKotlinGenerator kotlinGenerator : kotlinGenerators) {
192             List<KotlinFile> kotlinFiles = kotlinGenerator.getKotlinFiles();
193             for (KotlinFile kotlinFile : kotlinFiles) {
194                 GeneratedKotlinFile gjf = new GeneratedKotlinFile(kotlinFile,
195                                 kotlinGenerator.getProject(),
196                                 context.getProperty(PropertyRegistry.CONTEXT_KOTLIN_FILE_ENCODING),
197                                 context.getKotlinFormatter());
198                 answer.add(gjf);
199             }
200         }
201 
202         return answer;
203     }
204 
205     protected String getClientProject() {
206         return context.getJavaClientGeneratorConfiguration().getTargetProject();
207     }
208 
209     protected String getModelProject() {
210         return context.getJavaModelGeneratorConfiguration().getTargetProject();
211     }
212 
213     protected String getExampleProject() {
214         String project = context.getJavaModelGeneratorConfiguration().getProperty(
215                 PropertyRegistry.MODEL_GENERATOR_EXAMPLE_PROJECT);
216 
217         if (StringUtility.stringHasValue(project)) {
218             return project;
219         } else {
220             return getModelProject();
221         }
222     }
223 
224     @Override
225     public List<GeneratedXmlFile> getGeneratedXmlFiles() {
226         List<GeneratedXmlFile> answer = new ArrayList<>();
227 
228         if (xmlMapperGenerator != null) {
229             Document document = xmlMapperGenerator.getDocument();
230             GeneratedXmlFile gxf = new GeneratedXmlFile(document,
231                     getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(),
232                     context.getSqlMapGeneratorConfiguration().getTargetProject(),
233                     true, context.getXmlFormatter());
234             if (context.getPlugins().sqlMapGenerated(gxf, this)) {
235                 answer.add(gxf);
236             }
237         }
238 
239         return answer;
240     }
241 
242     @Override
243     public int getGenerationSteps() {
244         return javaGenerators.size() + (xmlMapperGenerator == null ? 0 : 1);
245     }
246 
247     @Override
248     public boolean requiresXMLGenerator() {
249         AbstractJavaClientGenerator javaClientGenerator = createJavaClientGenerator();
250 
251         if (javaClientGenerator == null) {
252             return false;
253         } else {
254             return javaClientGenerator.requiresXMLGenerator();
255         }
256     }
257 }