1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.generator.plugins;
17
18 import java.util.List;
19
20 import org.mybatis.generator.api.IntrospectedColumn;
21 import org.mybatis.generator.api.IntrospectedTable;
22 import org.mybatis.generator.api.PluginAdapter;
23 import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
24 import org.mybatis.generator.api.dom.java.InnerClass;
25 import org.mybatis.generator.api.dom.java.JavaVisibility;
26 import org.mybatis.generator.api.dom.java.Method;
27 import org.mybatis.generator.api.dom.java.Parameter;
28 import org.mybatis.generator.api.dom.java.TopLevelClass;
29 import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
30
31
32
33
34
35
36
37
38
39
40
41
42 public class CaseInsensitiveLikePlugin extends PluginAdapter {
43
44 public CaseInsensitiveLikePlugin() {
45 super();
46 }
47
48 @Override
49 public boolean validate(List<String> warnings) {
50 return true;
51 }
52
53 @Override
54 public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
55 IntrospectedTable introspectedTable) {
56
57 topLevelClass.getInnerClasses().stream()
58 .filter(this::isGeneratedCriteria)
59 .findFirst()
60 .ifPresent(c -> addMethods(introspectedTable, c));
61
62 return true;
63 }
64
65 private boolean isGeneratedCriteria(InnerClass innerClass) {
66 return "GeneratedCriteria".equals(innerClass.getType().getShortName());
67 }
68
69 private void addMethods(IntrospectedTable introspectedTable, InnerClass criteria) {
70 introspectedTable.getNonBLOBColumns().stream()
71 .filter(this::isEligibleColumn)
72 .map(this::toMethod)
73 .forEach(criteria::addMethod);
74 }
75
76 private boolean isEligibleColumn(IntrospectedColumn introspectedColumn) {
77 return introspectedColumn.isJdbcCharacterColumn()
78 && introspectedColumn.isStringColumn();
79 }
80
81 private Method toMethod(IntrospectedColumn introspectedColumn) {
82 StringBuilder sb = new StringBuilder();
83 sb.append(introspectedColumn.getJavaProperty());
84 sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
85 sb.insert(0, "and");
86 sb.append("LikeInsensitive");
87 Method method = new Method(sb.toString());
88 method.setVisibility(JavaVisibility.PUBLIC);
89 method.addParameter(new Parameter(introspectedColumn
90 .getFullyQualifiedJavaType(), "value"));
91
92 method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
93
94 sb.setLength(0);
95 sb.append("addCriterion(\"upper(");
96 sb.append(MyBatis3FormattingUtilities
97 .getAliasedActualColumnName(introspectedColumn));
98 sb.append(") like\", value.toUpperCase(), \"");
99 sb.append(introspectedColumn.getJavaProperty());
100 sb.append("\");");
101 method.addBodyLine(sb.toString());
102 method.addBodyLine("return (Criteria) this;");
103 return method;
104 }
105 }