1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.codegen.mybatis3.model;
17
18 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansField;
19 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansGetter;
20 import static org.mybatis.generator.internal.util.JavaBeansUtil.getJavaBeansSetter;
21 import static org.mybatis.generator.internal.util.messages.Messages.getString;
22
23 import java.util.ArrayList;
24 import java.util.LinkedList;
25 import java.util.List;
26
27 import org.mybatis.generator.api.CommentGenerator;
28 import org.mybatis.generator.api.FullyQualifiedTable;
29 import org.mybatis.generator.api.IntrospectedColumn;
30 import org.mybatis.generator.api.Plugin;
31 import org.mybatis.generator.api.dom.java.CompilationUnit;
32 import org.mybatis.generator.api.dom.java.Field;
33 import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
34 import org.mybatis.generator.api.dom.java.JavaVisibility;
35 import org.mybatis.generator.api.dom.java.Method;
36 import org.mybatis.generator.api.dom.java.Parameter;
37 import org.mybatis.generator.api.dom.java.TopLevelClass;
38 import org.mybatis.generator.codegen.AbstractJavaGenerator;
39 import org.mybatis.generator.codegen.RootClassInfo;
40
41 public class BaseRecordGenerator extends AbstractJavaGenerator {
42
43 public BaseRecordGenerator(String project) {
44 super(project);
45 }
46
47 @Override
48 public List<CompilationUnit> getCompilationUnits() {
49 FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
50 progressCallback.startTask(getString("Progress.8", table.toString()));
51 Plugin plugins = context.getPlugins();
52 CommentGenerator commentGenerator = context.getCommentGenerator();
53
54 FullyQualifiedJavaType type = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
55 TopLevelClass topLevelClass = new TopLevelClass(type);
56 topLevelClass.setVisibility(JavaVisibility.PUBLIC);
57 commentGenerator.addJavaFileComment(topLevelClass);
58
59 FullyQualifiedJavaType superClass = getSuperClass();
60 if (superClass != null) {
61 topLevelClass.setSuperClass(superClass);
62 topLevelClass.addImportedType(superClass);
63 }
64 commentGenerator.addModelClassComment(topLevelClass, introspectedTable);
65
66 List<IntrospectedColumn> introspectedColumns = getColumnsInThisClass();
67
68 if (introspectedTable.isConstructorBased()) {
69 addParameterizedConstructor(topLevelClass, introspectedTable.getNonBLOBColumns());
70
71 if (includeBLOBColumns()) {
72 addParameterizedConstructor(topLevelClass, introspectedTable.getAllColumns());
73 }
74
75 if (!introspectedTable.isImmutable()) {
76 addDefaultConstructor(topLevelClass);
77 }
78 }
79
80 String rootClass = getRootClass();
81 for (IntrospectedColumn introspectedColumn : introspectedColumns) {
82 if (RootClassInfo.getInstance(rootClass, warnings).containsProperty(introspectedColumn)) {
83 continue;
84 }
85
86 Field field = getJavaBeansField(introspectedColumn, context, introspectedTable);
87 if (plugins.modelFieldGenerated(field, topLevelClass, introspectedColumn, introspectedTable,
88 Plugin.ModelClassType.BASE_RECORD)) {
89 topLevelClass.addField(field);
90 topLevelClass.addImportedType(field.getType());
91 }
92
93 Method method = getJavaBeansGetter(introspectedColumn, context, introspectedTable);
94 if (plugins.modelGetterMethodGenerated(method, topLevelClass, introspectedColumn, introspectedTable,
95 Plugin.ModelClassType.BASE_RECORD)) {
96 topLevelClass.addMethod(method);
97 }
98
99 if (!introspectedTable.isImmutable()) {
100 method = getJavaBeansSetter(introspectedColumn, context, introspectedTable);
101 if (plugins.modelSetterMethodGenerated(method, topLevelClass, introspectedColumn, introspectedTable,
102 Plugin.ModelClassType.BASE_RECORD)) {
103 topLevelClass.addMethod(method);
104 }
105 }
106 }
107
108 List<CompilationUnit> answer = new ArrayList<>();
109 if (context.getPlugins().modelBaseRecordClassGenerated(topLevelClass, introspectedTable)) {
110 answer.add(topLevelClass);
111 }
112 return answer;
113 }
114
115 private FullyQualifiedJavaType getSuperClass() {
116 FullyQualifiedJavaType superClass;
117 if (introspectedTable.getRules().generatePrimaryKeyClass()) {
118 superClass = new FullyQualifiedJavaType(introspectedTable.getPrimaryKeyType());
119 } else {
120 String rootClass = getRootClass();
121 if (rootClass != null) {
122 superClass = new FullyQualifiedJavaType(rootClass);
123 } else {
124 superClass = null;
125 }
126 }
127
128 return superClass;
129 }
130
131 private boolean includePrimaryKeyColumns() {
132 return !introspectedTable.getRules().generatePrimaryKeyClass() && introspectedTable.hasPrimaryKeyColumns();
133 }
134
135 private boolean includeBLOBColumns() {
136 return !introspectedTable.getRules().generateRecordWithBLOBsClass() && introspectedTable.hasBLOBColumns();
137 }
138
139 private void addParameterizedConstructor(TopLevelClass topLevelClass, List<IntrospectedColumn> constructorColumns) {
140 Method method = new Method(topLevelClass.getType().getShortName());
141 method.setVisibility(JavaVisibility.PUBLIC);
142 method.setConstructor(true);
143 context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable);
144
145 for (IntrospectedColumn introspectedColumn : constructorColumns) {
146 method.addParameter(new Parameter(introspectedColumn.getFullyQualifiedJavaType(),
147 introspectedColumn.getJavaProperty()));
148 topLevelClass.addImportedType(introspectedColumn.getFullyQualifiedJavaType());
149 }
150
151 StringBuilder sb = new StringBuilder();
152 List<String> superColumns = new LinkedList<>();
153 if (introspectedTable.getRules().generatePrimaryKeyClass()) {
154 boolean comma = false;
155 sb.append("super(");
156 for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {
157 if (comma) {
158 sb.append(", ");
159 } else {
160 comma = true;
161 }
162 sb.append(introspectedColumn.getJavaProperty());
163 superColumns.add(introspectedColumn.getActualColumnName());
164 }
165 sb.append(");");
166 method.addBodyLine(sb.toString());
167 }
168
169 for (IntrospectedColumn introspectedColumn : constructorColumns) {
170 if (!superColumns.contains(introspectedColumn.getActualColumnName())) {
171 sb.setLength(0);
172 sb.append("this.");
173 sb.append(introspectedColumn.getJavaProperty());
174 sb.append(" = ");
175 sb.append(introspectedColumn.getJavaProperty());
176 sb.append(';');
177 method.addBodyLine(sb.toString());
178 }
179 }
180
181 topLevelClass.addMethod(method);
182 }
183
184 private List<IntrospectedColumn> getColumnsInThisClass() {
185 List<IntrospectedColumn> introspectedColumns;
186 if (includePrimaryKeyColumns()) {
187 if (includeBLOBColumns()) {
188 introspectedColumns = introspectedTable.getAllColumns();
189 } else {
190 introspectedColumns = introspectedTable.getNonBLOBColumns();
191 }
192 } else {
193 if (includeBLOBColumns()) {
194 introspectedColumns = introspectedTable.getNonPrimaryKeyColumns();
195 } else {
196 introspectedColumns = introspectedTable.getBaseColumns();
197 }
198 }
199
200 return introspectedColumns;
201 }
202 }