View Javadoc
1   /**
2    *    Copyright 2006-2016 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    *       http://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.GeneratedXmlFile;
23  import org.mybatis.generator.api.IntrospectedTable;
24  import org.mybatis.generator.api.ProgressCallback;
25  import org.mybatis.generator.api.dom.java.CompilationUnit;
26  import org.mybatis.generator.api.dom.xml.Document;
27  import org.mybatis.generator.codegen.AbstractGenerator;
28  import org.mybatis.generator.codegen.AbstractJavaClientGenerator;
29  import org.mybatis.generator.codegen.AbstractJavaGenerator;
30  import org.mybatis.generator.codegen.AbstractXmlGenerator;
31  import org.mybatis.generator.codegen.mybatis3.javamapper.AnnotatedClientGenerator;
32  import org.mybatis.generator.codegen.mybatis3.javamapper.JavaMapperGenerator;
33  import org.mybatis.generator.codegen.mybatis3.javamapper.MixedClientGenerator;
34  import org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator;
35  import org.mybatis.generator.codegen.mybatis3.model.ExampleGenerator;
36  import org.mybatis.generator.codegen.mybatis3.model.PrimaryKeyGenerator;
37  import org.mybatis.generator.codegen.mybatis3.model.RecordWithBLOBsGenerator;
38  import org.mybatis.generator.codegen.mybatis3.xmlmapper.XMLMapperGenerator;
39  import org.mybatis.generator.config.PropertyRegistry;
40  import org.mybatis.generator.internal.ObjectFactory;
41  
42  /**
43   * The Class IntrospectedTableMyBatis3Impl.
44   *
45   * @author Jeff Butler
46   */
47  public class IntrospectedTableMyBatis3Impl extends IntrospectedTable {
48      
49      /** The java model generators. */
50      protected List<AbstractJavaGenerator> javaModelGenerators;
51      
52      /** The client generators. */
53      protected List<AbstractJavaGenerator> clientGenerators;
54      
55      /** The xml mapper generator. */
56      protected AbstractXmlGenerator xmlMapperGenerator;
57  
58      /**
59       * Instantiates a new introspected table my batis3 impl.
60       */
61      public IntrospectedTableMyBatis3Impl() {
62          super(TargetRuntime.MYBATIS3);
63          javaModelGenerators = new ArrayList<AbstractJavaGenerator>();
64          clientGenerators = new ArrayList<AbstractJavaGenerator>();
65      }
66  
67      /* (non-Javadoc)
68       * @see org.mybatis.generator.api.IntrospectedTable#calculateGenerators(java.util.List, org.mybatis.generator.api.ProgressCallback)
69       */
70      @Override
71      public void calculateGenerators(List<String> warnings,
72              ProgressCallback progressCallback) {
73          calculateJavaModelGenerators(warnings, progressCallback);
74          
75          AbstractJavaClientGenerator javaClientGenerator =
76              calculateClientGenerators(warnings, progressCallback);
77              
78          calculateXmlMapperGenerator(javaClientGenerator, warnings, progressCallback);
79      }
80  
81      /**
82       * Calculate xml mapper generator.
83       *
84       * @param javaClientGenerator
85       *            the java client generator
86       * @param warnings
87       *            the warnings
88       * @param progressCallback
89       *            the progress callback
90       */
91      protected void calculateXmlMapperGenerator(AbstractJavaClientGenerator javaClientGenerator, 
92              List<String> warnings,
93              ProgressCallback progressCallback) {
94          if (javaClientGenerator == null) {
95              if (context.getSqlMapGeneratorConfiguration() != null) {
96                  xmlMapperGenerator = new XMLMapperGenerator();
97              }
98          } else {
99              xmlMapperGenerator = javaClientGenerator.getMatchedXMLGenerator();
100         }
101         
102         initializeAbstractGenerator(xmlMapperGenerator, warnings,
103                 progressCallback);
104     }
105 
106     /**
107      * Calculate client generators.
108      *
109      * @param warnings
110      *            the warnings
111      * @param progressCallback
112      *            the progress callback
113      * @return true if an XML generator is required
114      */
115     protected AbstractJavaClientGenerator calculateClientGenerators(List<String> warnings,
116             ProgressCallback progressCallback) {
117         if (!rules.generateJavaClient()) {
118             return null;
119         }
120         
121         AbstractJavaClientGenerator javaGenerator = createJavaClientGenerator();
122         if (javaGenerator == null) {
123             return null;
124         }
125 
126         initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
127         clientGenerators.add(javaGenerator);
128         
129         return javaGenerator;
130     }
131     
132     /**
133      * Creates the java client generator.
134      *
135      * @return the abstract java client generator
136      */
137     protected AbstractJavaClientGenerator createJavaClientGenerator() {
138         if (context.getJavaClientGeneratorConfiguration() == null) {
139             return null;
140         }
141         
142         String type = context.getJavaClientGeneratorConfiguration()
143                 .getConfigurationType();
144 
145         AbstractJavaClientGenerator javaGenerator;
146         if ("XMLMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
147             javaGenerator = new JavaMapperGenerator();
148         } else if ("MIXEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
149             javaGenerator = new MixedClientGenerator();
150         } else if ("ANNOTATEDMAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
151             javaGenerator = new AnnotatedClientGenerator();
152         } else if ("MAPPER".equalsIgnoreCase(type)) { //$NON-NLS-1$
153             javaGenerator = new JavaMapperGenerator();
154         } else {
155             javaGenerator = (AbstractJavaClientGenerator) ObjectFactory
156                     .createInternalObject(type);
157         }
158         
159         return javaGenerator;
160     }
161 
162     /**
163      * Calculate java model generators.
164      *
165      * @param warnings
166      *            the warnings
167      * @param progressCallback
168      *            the progress callback
169      */
170     protected void calculateJavaModelGenerators(List<String> warnings,
171             ProgressCallback progressCallback) {
172         if (getRules().generateExampleClass()) {
173             AbstractJavaGenerator javaGenerator = new ExampleGenerator();
174             initializeAbstractGenerator(javaGenerator, warnings,
175                     progressCallback);
176             javaModelGenerators.add(javaGenerator);
177         }
178 
179         if (getRules().generatePrimaryKeyClass()) {
180             AbstractJavaGenerator javaGenerator = new PrimaryKeyGenerator();
181             initializeAbstractGenerator(javaGenerator, warnings,
182                     progressCallback);
183             javaModelGenerators.add(javaGenerator);
184         }
185 
186         if (getRules().generateBaseRecordClass()) {
187             AbstractJavaGenerator javaGenerator = new BaseRecordGenerator();
188             initializeAbstractGenerator(javaGenerator, warnings,
189                     progressCallback);
190             javaModelGenerators.add(javaGenerator);
191         }
192 
193         if (getRules().generateRecordWithBLOBsClass()) {
194             AbstractJavaGenerator javaGenerator = new RecordWithBLOBsGenerator();
195             initializeAbstractGenerator(javaGenerator, warnings,
196                     progressCallback);
197             javaModelGenerators.add(javaGenerator);
198         }
199     }
200 
201     /**
202      * Initialize abstract generator.
203      *
204      * @param abstractGenerator
205      *            the abstract generator
206      * @param warnings
207      *            the warnings
208      * @param progressCallback
209      *            the progress callback
210      */
211     protected void initializeAbstractGenerator(
212             AbstractGenerator abstractGenerator, List<String> warnings,
213             ProgressCallback progressCallback) {
214         if (abstractGenerator == null) {
215             return;
216         }
217         
218         abstractGenerator.setContext(context);
219         abstractGenerator.setIntrospectedTable(this);
220         abstractGenerator.setProgressCallback(progressCallback);
221         abstractGenerator.setWarnings(warnings);
222     }
223 
224     /* (non-Javadoc)
225      * @see org.mybatis.generator.api.IntrospectedTable#getGeneratedJavaFiles()
226      */
227     @Override
228     public List<GeneratedJavaFile> getGeneratedJavaFiles() {
229         List<GeneratedJavaFile> answer = new ArrayList<GeneratedJavaFile>();
230 
231         for (AbstractJavaGenerator javaGenerator : javaModelGenerators) {
232             List<CompilationUnit> compilationUnits = javaGenerator
233                     .getCompilationUnits();
234             for (CompilationUnit compilationUnit : compilationUnits) {
235                 GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit,
236                         context.getJavaModelGeneratorConfiguration()
237                                 .getTargetProject(),
238                                 context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING),
239                                 context.getJavaFormatter());
240                 answer.add(gjf);
241             }
242         }
243 
244         for (AbstractJavaGenerator javaGenerator : clientGenerators) {
245             List<CompilationUnit> compilationUnits = javaGenerator
246                     .getCompilationUnits();
247             for (CompilationUnit compilationUnit : compilationUnits) {
248                 GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit,
249                         context.getJavaClientGeneratorConfiguration()
250                                 .getTargetProject(),
251                                 context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING),
252                                 context.getJavaFormatter());
253                 answer.add(gjf);
254             }
255         }
256 
257         return answer;
258     }
259 
260     /* (non-Javadoc)
261      * @see org.mybatis.generator.api.IntrospectedTable#getGeneratedXmlFiles()
262      */
263     @Override
264     public List<GeneratedXmlFile> getGeneratedXmlFiles() {
265         List<GeneratedXmlFile> answer = new ArrayList<GeneratedXmlFile>();
266 
267         if (xmlMapperGenerator != null) {
268             Document document = xmlMapperGenerator.getDocument();
269             GeneratedXmlFile gxf = new GeneratedXmlFile(document,
270                 getMyBatis3XmlMapperFileName(), getMyBatis3XmlMapperPackage(),
271                 context.getSqlMapGeneratorConfiguration().getTargetProject(),
272                 true, context.getXmlFormatter());
273             if (context.getPlugins().sqlMapGenerated(gxf, this)) {
274                 answer.add(gxf);
275             }
276         }
277 
278         return answer;
279     }
280 
281     /* (non-Javadoc)
282      * @see org.mybatis.generator.api.IntrospectedTable#getGenerationSteps()
283      */
284     @Override
285     public int getGenerationSteps() {
286         return javaModelGenerators.size() + clientGenerators.size() +
287             (xmlMapperGenerator == null ? 0 : 1);
288     }
289 
290     /* (non-Javadoc)
291      * @see org.mybatis.generator.api.IntrospectedTable#isJava5Targeted()
292      */
293     @Override
294     public boolean isJava5Targeted() {
295         return true;
296     }
297 
298     /* (non-Javadoc)
299      * @see org.mybatis.generator.api.IntrospectedTable#requiresXMLGenerator()
300      */
301     @Override
302     public boolean requiresXMLGenerator() {
303         AbstractJavaClientGenerator javaClientGenerator =
304             createJavaClientGenerator();
305         
306         if (javaClientGenerator == null) {
307             return false;
308         } else {
309             return javaClientGenerator.requiresXMLGenerator();
310         }
311     }
312 }