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.internal;
17  
18  import static org.mybatis.generator.internal.util.StringUtility.isTrue;
19  
20  import java.util.Date;
21  import java.util.List;
22  import java.util.Properties;
23  
24  import org.mybatis.generator.api.CommentGenerator;
25  import org.mybatis.generator.api.IntrospectedColumn;
26  import org.mybatis.generator.api.IntrospectedTable;
27  import org.mybatis.generator.api.dom.java.CompilationUnit;
28  import org.mybatis.generator.api.dom.java.Field;
29  import org.mybatis.generator.api.dom.java.InnerClass;
30  import org.mybatis.generator.api.dom.java.InnerEnum;
31  import org.mybatis.generator.api.dom.java.JavaElement;
32  import org.mybatis.generator.api.dom.java.Method;
33  import org.mybatis.generator.api.dom.java.Parameter;
34  import org.mybatis.generator.api.dom.java.TopLevelClass;
35  import org.mybatis.generator.api.dom.xml.TextElement;
36  import org.mybatis.generator.api.dom.xml.XmlElement;
37  import org.mybatis.generator.config.MergeConstants;
38  import org.mybatis.generator.config.PropertyRegistry;
39  import org.mybatis.generator.internal.util.StringUtility;
40  
41  /**
42   * The Class DefaultCommentGenerator.
43   *
44   * @author Jeff Butler
45   */
46  public class DefaultCommentGenerator implements CommentGenerator {
47  
48      /** The properties. */
49      private Properties properties;
50      
51      /** The suppress date. */
52      private boolean suppressDate;
53      
54      /** The suppress all comments. */
55      private boolean suppressAllComments;
56  
57      /** The addition of table remark's comments.
58       * If suppressAllComments is true, this option is ignored*/
59      private boolean addRemarkComments;
60  
61      /**
62       * Instantiates a new default comment generator.
63       */
64      public DefaultCommentGenerator() {
65          super();
66          properties = new Properties();
67          suppressDate = false;
68          suppressAllComments = false;
69          addRemarkComments = false;
70      }
71  
72      /* (non-Javadoc)
73       * @see org.mybatis.generator.api.CommentGenerator#addJavaFileComment(org.mybatis.generator.api.dom.java.CompilationUnit)
74       */
75      public void addJavaFileComment(CompilationUnit compilationUnit) {
76          // add no file level comments by default
77      }
78  
79      /**
80       * Adds a suitable comment to warn users that the element was generated, and when it was generated.
81       *
82       * @param xmlElement
83       *            the xml element
84       */
85      public void addComment(XmlElement xmlElement) {
86          if (suppressAllComments) {
87              return;
88          }
89  
90          xmlElement.addElement(new TextElement("<!--")); //$NON-NLS-1$
91  
92          StringBuilder sb = new StringBuilder();
93          sb.append("  WARNING - "); //$NON-NLS-1$
94          sb.append(MergeConstants.NEW_ELEMENT_TAG);
95          xmlElement.addElement(new TextElement(sb.toString()));
96          xmlElement
97                  .addElement(new TextElement(
98                          "  This element is automatically generated by MyBatis Generator, do not modify.")); //$NON-NLS-1$
99  
100         String s = getDateString();
101         if (s != null) {
102             sb.setLength(0);
103             sb.append("  This element was generated on "); //$NON-NLS-1$
104             sb.append(s);
105             sb.append('.');
106             xmlElement.addElement(new TextElement(sb.toString()));
107         }
108 
109         xmlElement.addElement(new TextElement("-->")); //$NON-NLS-1$
110     }
111 
112     /* (non-Javadoc)
113      * @see org.mybatis.generator.api.CommentGenerator#addRootComment(org.mybatis.generator.api.dom.xml.XmlElement)
114      */
115     public void addRootComment(XmlElement rootElement) {
116         // add no document level comments by default
117     }
118 
119     /* (non-Javadoc)
120      * @see org.mybatis.generator.api.CommentGenerator#addConfigurationProperties(java.util.Properties)
121      */
122     public void addConfigurationProperties(Properties properties) {
123         this.properties.putAll(properties);
124 
125         suppressDate = isTrue(properties
126                 .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
127         
128         suppressAllComments = isTrue(properties
129                 .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
130 
131         addRemarkComments = isTrue(properties
132                 .getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
133     }
134 
135     /**
136      * This method adds the custom javadoc tag for. You may do nothing if you do not wish to include the Javadoc tag -
137      * however, if you do not include the Javadoc tag then the Java merge capability of the eclipse plugin will break.
138      *
139      * @param javaElement
140      *            the java element
141      * @param markAsDoNotDelete
142      *            the mark as do not delete
143      */
144     protected void addJavadocTag(JavaElement javaElement,
145             boolean markAsDoNotDelete) {
146         javaElement.addJavaDocLine(" *"); //$NON-NLS-1$
147         StringBuilder sb = new StringBuilder();
148         sb.append(" * "); //$NON-NLS-1$
149         sb.append(MergeConstants.NEW_ELEMENT_TAG);
150         if (markAsDoNotDelete) {
151             sb.append(" do_not_delete_during_merge"); //$NON-NLS-1$
152         }
153         String s = getDateString();
154         if (s != null) {
155             sb.append(' ');
156             sb.append(s);
157         }
158         javaElement.addJavaDocLine(sb.toString());
159     }
160 
161     /**
162      * This method returns a formated date string to include in the Javadoc tag
163      * and XML comments. You may return null if you do not want the date in
164      * these documentation elements.
165      * 
166      * @return a string representing the current timestamp, or null
167      */
168     protected String getDateString() {
169         if (suppressDate) {
170             return null;
171         } else {
172             return new Date().toString();
173         }
174     }
175 
176     /* (non-Javadoc)
177      * @see org.mybatis.generator.api.CommentGenerator#addClassComment(org.mybatis.generator.api.dom.java.InnerClass, org.mybatis.generator.api.IntrospectedTable)
178      */
179     public void addClassComment(InnerClass innerClass,
180             IntrospectedTable introspectedTable) {
181         if (suppressAllComments) {
182             return;
183         }
184         
185         StringBuilder sb = new StringBuilder();
186         System.out.println("innerClass.getClass().getName() = " + innerClass.getType());
187 
188        String shortName =  innerClass.getType().getShortName();
189 
190         innerClass.addJavaDocLine("/**"); //$NON-NLS-1$
191         //        innerClass.addJavaDocLine(" * This class was generated by MyBatis Generator."); //$NON-NLS-1$
192 
193         if("GeneratedCriteria".equals(shortName)){
194             sb.append(" * 基本动态SQL对象,");
195         } else if ("Criterion".equals(shortName)){
196             sb.append(" * 动态SQL对象,");
197         }
198 
199         //$NON-NLS-1$
200         sb.append(introspectedTable.getFullyQualifiedTable());
201         innerClass.addJavaDocLine(sb.toString());
202 
203 //        addJavadocTag(innerClass, false);
204 
205         innerClass.addJavaDocLine(" */"); //$NON-NLS-1$
206     }
207 
208     /* (non-Javadoc)
209      * @see org.mybatis.generator.api.CommentGenerator#addTopLevelClassComment(org.mybatis.generator.api.dom.java.TopLevelClass, org.mybatis.generator.api.IntrospectedTable)
210      */
211     @Override
212     public void addModelClassComment(TopLevelClass topLevelClass,
213             IntrospectedTable introspectedTable) {
214         if (suppressAllComments  || !addRemarkComments) {
215             return;
216         }
217 
218         StringBuilder sb = new StringBuilder();
219 
220         topLevelClass.addJavaDocLine("/**"); //$NON-NLS-1$
221 
222         String remarks = introspectedTable.getRemarks();
223         if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
224             topLevelClass.addJavaDocLine(" * Database Table Remarks:");
225             String[] remarkLines = remarks.split(System.getProperty("line.separator"));  //$NON-NLS-1$
226             for (String remarkLine : remarkLines) {
227                 topLevelClass.addJavaDocLine(" *   " + remarkLine);  //$NON-NLS-1$
228             }
229         }
230         topLevelClass.addJavaDocLine(" *"); //$NON-NLS-1$
231 
232         topLevelClass
233                 .addJavaDocLine(" * This class was generated by MyBatis Generator."); //$NON-NLS-1$
234 
235         sb.append(" * This class corresponds to the database table "); //$NON-NLS-1$
236         sb.append(introspectedTable.getFullyQualifiedTable());
237         topLevelClass.addJavaDocLine(sb.toString());
238 
239         addJavadocTag(topLevelClass, true);
240 
241         topLevelClass.addJavaDocLine(" */"); //$NON-NLS-1$
242     }
243 
244     /* (non-Javadoc)
245      * @see org.mybatis.generator.api.CommentGenerator#addEnumComment(org.mybatis.generator.api.dom.java.InnerEnum, org.mybatis.generator.api.IntrospectedTable)
246      */
247     public void addEnumComment(InnerEnum innerEnum,
248             IntrospectedTable introspectedTable) {
249         if (suppressAllComments) {
250             return;
251         }
252 
253         StringBuilder sb = new StringBuilder();
254 
255         innerEnum.addJavaDocLine("/**"); //$NON-NLS-1$
256         //        innerEnum.addJavaDocLine(" * This enum was generated by MyBatis Generator."); //$NON-NLS-1$
257 
258         sb.append(" * This enum corresponds to the database table "); //$NON-NLS-1$
259         sb.append(introspectedTable.getFullyQualifiedTable());
260         innerEnum.addJavaDocLine(sb.toString());
261 
262 //        addJavadocTag(innerEnum, false);
263 
264         innerEnum.addJavaDocLine(" */"); //$NON-NLS-1$
265     }
266 
267     /* (non-Javadoc)
268      * @see org.mybatis.generator.api.CommentGenerator#addFieldComment(org.mybatis.generator.api.dom.java.Field, org.mybatis.generator.api.IntrospectedTable, org.mybatis.generator.api.IntrospectedColumn)
269      */
270     public void addFieldComment(Field field,
271             IntrospectedTable introspectedTable,
272             IntrospectedColumn introspectedColumn) {
273         if (suppressAllComments) {
274             return;
275         }
276 
277         field.addJavaDocLine("/**"); //$NON-NLS-1$
278         StringBuilder sb = new StringBuilder();
279 
280         sb.append(" * "); //$NON-NLS-1$
281         sb.append(introspectedColumn.getRemarks());
282         sb.append(",所属表字段为");
283         sb.append(introspectedTable.getFullyQualifiedTable());
284         sb.append('.');
285         sb.append(introspectedColumn.getActualColumnName());
286         field.addJavaDocLine(sb.toString());
287 
288         field.addJavaDocLine(" */"); //$NON-NLS-1$
289     }
290 
291     /* (non-Javadoc)
292      * @see org.mybatis.generator.api.CommentGenerator#addFieldComment(org.mybatis.generator.api.dom.java.Field, org.mybatis.generator.api.IntrospectedTable)
293      */
294     public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
295         if (suppressAllComments) {
296             return;
297         }
298 
299         StringBuilder sb = new StringBuilder();
300 
301         field.addJavaDocLine("/**"); //$NON-NLS-1$
302 //        field.addJavaDocLine(" * This field was generated by MyBatis Generator."); //$NON-NLS-1$
303         String field_name = field.getName();
304         sb.append(" * ");
305         if("orderByClause".equals(field_name)){
306             sb.append("排序字段");
307         } else if("distinct".equals(field_name)){
308             sb.append("是否过滤重复数据");
309         } else if( field_name.endsWith(introspectedTable.getExampleType())){
310             sb.append("当前排序条件实例");
311         } else if("serialVersionUID".equals(field_name)){
312             sb.append("序列化ID");
313         }
314         sb.append(",");
315         sb.append(introspectedTable.getFullyQualifiedTable());
316         field.addJavaDocLine(sb.toString());
317 
318 //        addJavadocTag(field, false);
319 
320         field.addJavaDocLine(" */"); //$NON-NLS-1$
321     }
322 
323     /* (non-Javadoc)
324      * @see org.mybatis.generator.api.CommentGenerator#addGeneralMethodComment(org.mybatis.generator.api.dom.java.Method, org.mybatis.generator.api.IntrospectedTable)
325      */
326     public void addGeneralMethodComment(Method method,
327             IntrospectedTable introspectedTable) {
328         if (suppressAllComments) {
329             return;
330         }
331 
332         StringBuilder sb = new StringBuilder();
333 
334         method.addJavaDocLine("/**"); //$NON-NLS-1$
335 //        method.addJavaDocLine(" * This method was generated by MyBatis Generator."); //$NON-NLS-1$
336 
337 //        sb.append(" * This method corresponds to the database table "); //$NON-NLS-1$
338         sb.append(" * ");
339         if (method.isConstructor()) {
340             sb.append(" 构造查询条件");
341         }
342         String method_name = method.getName();
343         if ("setOrderByClause".equals(method_name)) {
344             sb.append(" 设置排序字段");
345         } else if ("setDistinct".equals(method_name)) {
346             sb.append(" 设置过滤重复数据");
347         } else if ("getOredCriteria".equals(method_name)) {
348             sb.append(" 获取当前的查询条件实例");
349         } else if ("isDistinct".equals(method_name)) {
350             sb.append(" 是否过滤重复数据");
351         } else if ("getOrderByClause".equals(method_name)) {
352             sb.append(" 获取排序字段");
353         } else if ("createCriteria".equals(method_name)) {
354             sb.append(" 创建一个查询条件");
355         } else if ("createCriteriaInternal".equals(method_name)) {
356             sb.append(" 内部构建查询条件对象");
357         } else if ("clear".equals(method_name)) {
358             sb.append(" 清除查询条件");
359         } else if ("countByExample".equals(method_name)) {
360             sb.append(" 根据指定的条件获取数据库记录数");
361         } else if ("deleteByExample".equals(method_name)) {
362             sb.append(" 根据指定的条件删除数据库符合条件的记录");
363         } else if ("deleteByPrimaryKey".equals(method_name)) {
364             sb.append(" 根据主键删除数据库的记录");
365         } else if ("insert".equals(method_name)) {
366             sb.append(" 新写入数据库记录");
367         } else if ("insertSelective".equals(method_name)) {
368             sb.append(" 动态字段,写入数据库记录");
369         } else if ("selectByExample".equals(method_name)) {
370             sb.append(" 根据指定的条件查询符合条件的数据库记录");
371         } else if ("selectByPrimaryKey".equals(method_name)) {
372             sb.append(" 根据指定主键获取一条数据库记录");
373         } else if ("updateByExampleSelective".equals(method_name)) {
374             sb.append(" 动态根据指定的条件来更新符合条件的数据库记录");
375         } else if ("updateByExample".equals(method_name)) {
376             sb.append(" 根据指定的条件来更新符合条件的数据库记录");
377         } else if ("updateByPrimaryKeySelective".equals(method_name)) {
378             sb.append(" 动态字段,根据主键来更新符合条件的数据库记录");
379         } else if ("updateByPrimaryKey".equals(method_name)) {
380             sb.append(" 根据主键来更新符合条件的数据库记录");
381         }
382         sb.append(",");
383         sb.append(introspectedTable.getFullyQualifiedTable());
384         method.addJavaDocLine(sb.toString());
385 
386         final List<Parameter> parameterList = method.getParameters();
387         if (!parameterList.isEmpty()) {
388             method.addJavaDocLine(" *");
389             if ("or".equals(method_name)) {
390                 sb.append(" 增加或者的查询条件,用于构建或者查询");
391             }
392         } else {
393             if ("or".equals(method_name)) {
394                 sb.append(" 创建一个新的或者查询条件");
395             }
396         }
397         String paramterName;
398         for (Parameter parameter : parameterList) {
399             sb.setLength(0);
400             sb.append(" * @param "); //$NON-NLS-1$
401             paramterName = parameter.getName();
402             sb.append(paramterName);
403             if ("orderByClause".equals(paramterName)) {
404                 sb.append(" 排序字段"); //$NON-NLS-1$
405             } else if ("distinct".equals(paramterName)) {
406                 sb.append(" 是否过滤重复数据");
407             } else if ("criteria".equals(paramterName)) {
408                 sb.append(" 过滤条件实例");
409             }
410             method.addJavaDocLine(sb.toString());
411         }
412 
413 
414         //        addJavadocTag(method, false);
415 
416         method.addJavaDocLine(" */"); //$NON-NLS-1$
417     }
418 
419     /* (non-Javadoc)
420      * @see org.mybatis.generator.api.CommentGenerator#addGetterComment(org.mybatis.generator.api.dom.java.Method, org.mybatis.generator.api.IntrospectedTable, org.mybatis.generator.api.IntrospectedColumn)
421      */
422     public void addGetterComment(Method method,
423             IntrospectedTable introspectedTable,
424             IntrospectedColumn introspectedColumn) {
425         if (suppressAllComments) {
426             return;
427         }
428 
429         StringBuilder sb = new StringBuilder();
430 
431         method.addJavaDocLine("/**"); //$NON-NLS-1$
432 //        method.addJavaDocLine(" * This method was generated by MyBatis Generator."); //$NON-NLS-1$
433 
434         sb.append(" * 获取 "); //$NON-NLS-1$
435         sb.append(introspectedColumn.getRemarks()).append(" 字段:");
436         sb.append(introspectedTable.getFullyQualifiedTable());
437         sb.append('.');
438         sb.append(introspectedColumn.getActualColumnName());
439         method.addJavaDocLine(sb.toString());
440 
441         method.addJavaDocLine(" *"); //$NON-NLS-1$
442 
443         sb.setLength(0);
444         sb.append(" * @return "); //$NON-NLS-1$
445         sb.append(introspectedTable.getFullyQualifiedTable());
446         sb.append('.');
447         sb.append(introspectedColumn.getActualColumnName());
448         sb.append(", ");
449         sb.append(introspectedColumn.getRemarks());
450         method.addJavaDocLine(sb.toString());
451 
452 //        addJavadocTag(method, false);
453 
454         method.addJavaDocLine(" */"); //$NON-NLS-1$
455     }
456 
457     /* (non-Javadoc)
458      * @see org.mybatis.generator.api.CommentGenerator#addSetterComment(org.mybatis.generator.api.dom.java.Method, org.mybatis.generator.api.IntrospectedTable, org.mybatis.generator.api.IntrospectedColumn)
459      */
460     public void addSetterComment(Method method,
461             IntrospectedTable introspectedTable,
462             IntrospectedColumn introspectedColumn) {
463         if (suppressAllComments) {
464             return;
465         }
466 
467         StringBuilder sb = new StringBuilder();
468 
469         method.addJavaDocLine("/**"); //$NON-NLS-1$
470 //        method.addJavaDocLine(" * This method was generated by MyBatis Generator."); //$NON-NLS-1$
471 
472         sb.append(" * 设置 ");  //$NON-NLS-1$
473         sb.append(introspectedColumn.getRemarks()).append(" 字段:");
474         sb.append(introspectedTable.getFullyQualifiedTable());
475         sb.append('.');
476         sb.append(introspectedColumn.getActualColumnName());
477         method.addJavaDocLine(sb.toString());
478 
479         method.addJavaDocLine(" *"); //$NON-NLS-1$
480 
481         Parameter parm = method.getParameters().get(0);
482         sb.setLength(0);
483         sb.append(" * @param "); //$NON-NLS-1$
484         sb.append(parm.getName());
485         sb.append(" "); //$NON-NLS-1$
486         sb.append(introspectedTable.getFullyQualifiedTable());
487         sb.append('.');
488         sb.append(introspectedColumn.getActualColumnName());
489         sb.append(", ");
490         sb.append(introspectedColumn.getRemarks());
491         method.addJavaDocLine(sb.toString());
492 
493 //        addJavadocTag(method, false);
494 
495         method.addJavaDocLine(" */"); //$NON-NLS-1$
496     }
497 
498     /* (non-Javadoc)
499      * @see org.mybatis.generator.api.CommentGenerator#addClassComment(org.mybatis.generator.api.dom.java.InnerClass, org.mybatis.generator.api.IntrospectedTable, boolean)
500      */
501     public void addClassComment(InnerClass innerClass,
502             IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
503         if (suppressAllComments) {
504             return;
505         }
506 
507         StringBuilder sb = new StringBuilder();
508 
509         innerClass.addJavaDocLine("/**"); //$NON-NLS-1$
510 //        innerClass.addJavaDocLine(" * This class was generated by MyBatis Generator."); //$NON-NLS-1$
511         System.out.println("innerClass.getType().getShortName() = " + innerClass.getType().getShortName());
512         sb.append(" * 数据库表 "); //$NON-NLS-1$
513         sb.append(introspectedTable.getFullyQualifiedTable());
514         sb.append("映射实体");
515         innerClass.addJavaDocLine(sb.toString());
516 
517 //        addJavadocTag(innerClass, markAsDoNotDelete);
518 
519         innerClass.addJavaDocLine(" */"); //$NON-NLS-1$
520     }
521 }