package com.freetmp.mbg.plugin; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.*; import org.mybatis.generator.api.dom.xml.Attribute; import org.mybatis.generator.api.dom.xml.Element; import org.mybatis.generator.api.dom.xml.TextElement; import org.mybatis.generator.api.dom.xml.XmlElement; import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities; import java.util.List; /** * Created by LiuPin on 2015/5/19. */ public abstract class AbstractXmbgPlugin extends PluginAdapter { /*--------------------- * Generate Helper Method For Xml Mapper *---------------------*/ protected void generateTextBlock(String text, XmlElement parent) { parent.addElement(new TextElement(text)); } protected void generateTextBlockAppendTableName(String text, IntrospectedTable introspectedTable, XmlElement parent) { StringBuilder sb = new StringBuilder(); sb.append(text); sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()); parent.addElement(new TextElement(sb.toString())); } protected void generateParameterForSet(List<IntrospectedColumn> columns, XmlElement parent) { generateParameterForSet("", false, columns, parent); } protected void generateParameterForSet(String fieldPrefix, List<IntrospectedColumn> columns, XmlElement parent) { generateParameterForSet(fieldPrefix, false, columns, parent); } protected void generateParameterForSet(String fieldPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement dynamicElement) { XmlElement trimElement = new XmlElement("trim"); trimElement.addAttribute(new Attribute("suffixOverrides", ",")); StringBuilder sb = new StringBuilder(); for (IntrospectedColumn introspectedColumn : columns) { sb.setLength(0); sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(introspectedColumn)); sb.append(" = "); sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, fieldPrefix)); sb.append(','); doIfNullCheck(fieldPrefix, ifNullCheck, trimElement, sb, introspectedColumn); } dynamicElement.addElement(trimElement); } protected void doIfNullCheck(String fieldPrefix, boolean ifNullCheck, XmlElement trimElement, StringBuilder sb, IntrospectedColumn introspectedColumn) { Element content; if (ifNullCheck) { content = wrapIfNullCheckForJavaProperty(fieldPrefix, new TextElement(sb.toString()), introspectedColumn); } else { content = new TextElement(sb.toString()); } trimElement.addElement(content); } protected XmlElement wrapIfNullCheckForJavaProperty(String fieldPrefix, Element content, IntrospectedColumn introspectedColumn) { StringBuilder sb = new StringBuilder(); XmlElement isNotNullElement = new XmlElement("if"); sb.setLength(0); sb.append(introspectedColumn.getJavaProperty(fieldPrefix)); sb.append(" != null"); isNotNullElement.addAttribute(new Attribute("test", sb.toString())); isNotNullElement.addElement(content); return isNotNullElement; } protected void generateParametersSeparateByComma(List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByComma("", false, columns, parent); } protected void generateParametersSeparateByComma(String fieldPrefix, List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByComma(fieldPrefix, false, columns, parent); } protected void generateParametersSeparateByComma(String fieldPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByComma(fieldPrefix, ifNullCheck, false, columns, parent); } protected void generateParametersSeparateByComma(String fieldPrefix, boolean ifNullCheck, boolean withParenthesis, List<IntrospectedColumn> columns, XmlElement parent) { XmlElement trimElement = new XmlElement("trim"); trimElement.addAttribute(new Attribute("suffixOverrides", ",")); if (withParenthesis) { trimElement.addAttribute(new Attribute("prefix", "(")); trimElement.addAttribute(new Attribute("suffix", ")")); } StringBuilder sb = new StringBuilder(); for (IntrospectedColumn introspectedColumn : columns) { sb.setLength(0); sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, fieldPrefix)); sb.append(","); doIfNullCheck(fieldPrefix, ifNullCheck, trimElement, sb, introspectedColumn); } parent.addElement(trimElement); } protected void generateParametersSeparateByCommaWithParenthesis(List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByCommaWithParenthesis("", false, columns, parent); } protected void generateParametersSeparateByCommaWithParenthesis(String fieldPrefix, List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByCommaWithParenthesis(fieldPrefix, false, columns, parent); } protected void generateParametersSeparateByCommaWithParenthesis(String fieldPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { generateParametersSeparateByComma(fieldPrefix, ifNullCheck, true, columns, parent); } protected void generateActualColumnNamesWithParenthesis(List<IntrospectedColumn> columns, XmlElement parent) { generateActualColumnNamesWithParenthesis("", false, columns, parent); } protected void generateActualColumnNamesWithParenthesis(String fieldPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { generateActualColumnNamesWithParenthesis(fieldPrefix, null, ifNullCheck, columns, parent); } protected void generateActualColumnNamesWithParenthesis(String fieldPrefix, String columnPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { XmlElement trimElement = new XmlElement("trim"); trimElement.addAttribute(new Attribute("suffixOverrides", ",")); trimElement.addAttribute(new Attribute("prefix", "(")); trimElement.addAttribute(new Attribute("suffix", ")")); StringBuilder sb = new StringBuilder(); for (IntrospectedColumn introspectedColumn : columns) { sb.setLength(0); sb.append((columnPrefix == null ? "" : columnPrefix) + MyBatis3FormattingUtilities.getAliasedEscapedColumnName(introspectedColumn)); sb.append(","); doIfNullCheck(fieldPrefix, ifNullCheck, trimElement, sb, introspectedColumn); } parent.addElement(trimElement); } protected void generateWhereConditions(String fieldPrefix, List<IntrospectedColumn> columns, XmlElement parent) { generateWhereConditions(fieldPrefix, false, columns, parent); } protected void generateWhereConditions(String fieldPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { generateWhereConditions(fieldPrefix, null, ifNullCheck, columns, parent); } protected void generateWhereConditions(String fieldPrefix, String columnPrefix, boolean ifNullCheck, List<IntrospectedColumn> columns, XmlElement parent) { XmlElement trimElement = new XmlElement("trim"); trimElement.addAttribute(new Attribute("suffixOverrides", ",")); StringBuilder sb = new StringBuilder(); for (IntrospectedColumn introspectedColumn : columns) { sb.setLength(0); sb.append((columnPrefix == null ? "" : columnPrefix) + MyBatis3FormattingUtilities.getAliasedEscapedColumnName(introspectedColumn)); sb.append(" = "); sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, fieldPrefix)); sb.append(","); doIfNullCheck(fieldPrefix, ifNullCheck, trimElement, sb, introspectedColumn); } XmlElement where = new XmlElement("where"); where.addElement(trimElement); parent.addElement(where); } /*--------------- * Generate Helper Method For Java Source **--------------*/ protected void generateGetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setName("get" + capitalize(field)); method.setReturnType(type); method.addBodyLine("return this." + field + ";"); innerClass.addMethod(method); } protected void generateSetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setName("set" + capitalize(field)); method.addParameter(new Parameter(type, field)); method.addBodyLine("this." + field + " = " + field + ";"); innerClass.addMethod(method); } protected void generateGetterSetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { generateSetterFor(field, type, innerClass); generateGetterFor(field, type, innerClass); } protected Field generateFieldDeclarationFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { Field ff = new Field(); ff.setVisibility(JavaVisibility.PROTECTED); ff.setType(type); ff.setName(field); innerClass.addField(ff); return ff; } protected Field generateFieldDeclarationWithGetterSetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { generateGetterSetterFor(field, type, innerClass); return generateFieldDeclarationFor(field, type, innerClass); } protected Field generateFieldDeclarationWithFluentApiFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { generateFluentGetterFor(field, type, innerClass); generateFluentSetterFor(field, type, innerClass); return generateFieldDeclarationFor(field, type, innerClass); } protected void generateFluentSetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setName(field); method.addParameter(new Parameter(type, field)); method.addBodyLine("this." + field + " = " + field + ";"); method.addBodyLine("return this;"); method.setReturnType(innerClass.getType()); innerClass.addMethod(method); } protected void generateFluentGetterFor(String field, FullyQualifiedJavaType type, InnerClass innerClass) { Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.setName(field); method.addBodyLine("return this." + field + ";"); method.setReturnType(type); innerClass.addMethod(method); } protected void generateBuilderFor(TopLevelClass topLevelClass) { if (topLevelClass == null || topLevelClass.getFields() == null || topLevelClass.getFields().isEmpty()) return; generateBuilderFor(topLevelClass.getType().getShortName(), topLevelClass, topLevelClass.getFields()); } protected void generateBuilderFor(String builderName, TopLevelClass topLevelClass, List<Field> fields) { if (fields == null || fields.isEmpty()) return; FullyQualifiedJavaType builderType = new FullyQualifiedJavaType(builderName); InnerClass builder = new InnerClass(builderType); builder.setVisibility(JavaVisibility.PUBLIC); builder.setStatic(false); // build method and builder field Method method = new Method(); method.setName("build"); method.setVisibility(JavaVisibility.PUBLIC); for (Field field : fields) { generateFieldDeclarationWithFluentApiFor(field.getName(), field.getType(), builder); method.addBodyLine(topLevelClass.getType().getShortName() + ".this." + field.getName() + " = " + field.getName() + ";"); } method.addBodyLine("return " + topLevelClass.getType().getShortName() + ".this;"); method.setReturnType(topLevelClass.getType()); builder.addMethod(method); // builder owner's builder() method = new Method(); method.setName(uncapitalize(builderName)); method.setVisibility(JavaVisibility.PUBLIC); method.addBodyLine("return new " + builderName + "();"); method.setReturnType(builderType); topLevelClass.addMethod(method); topLevelClass.addInnerClass(builder); } public String capitalize(final String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return str; } char firstChar = str.charAt(0); if (Character.isTitleCase(firstChar)) { // already capitalized return str; } return new StringBuilder(strLen) .append(Character.toTitleCase(firstChar)) .append(str.substring(1)) .toString(); } public static String uncapitalize(final String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return str; } char firstChar = str.charAt(0); if (Character.isLowerCase(firstChar)) { // already uncapitalized return str; } return new StringBuilder(strLen) .append(Character.toLowerCase(firstChar)) .append(str.substring(1)) .toString(); } }