diff --git a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/Table.java b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/Table.java index 6dcc563..40fd263 100644 --- a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/Table.java +++ b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/Table.java @@ -18,12 +18,17 @@ import java.lang.annotation.Target; *
  • 加APT后缀并且大写 %SAPT
  • * *

    - * 支持Ognl语法字段说明
    + * 支持Ognl语法,字段说明
    * Ognl上下文 *

    * 指定开头 Ognl# 这不是ognl语法,这是MPJ规定的 用于区分 ognl还是String.format *

    diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/apt/matedata/OgnlRoot.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/apt/matedata/OgnlRoot.java deleted file mode 100644 index baca2cf..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/extension/apt/matedata/OgnlRoot.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.github.yulichang.extension.apt.matedata; - -import lombok.Getter; - -import java.util.Objects; - -/** - * apt ognl表达式上下文 - * - * @author yulichang - * @since 1.5.0 - */ -@Getter -public class OgnlRoot { - - /** - * 类名 - */ - private final String className; - - /** - * 包名 - */ - private final String classPackage; - - private final StringHelper util = new StringHelper(); - - public OgnlRoot(String className, String classPackage) { - this.className = className; - this.classPackage = classPackage; - } - - @SuppressWarnings("unused") - public static final class StringHelper { - /** - * 移除后缀 - * - * @param str 原字符串 - * @param suffix 指定后缀 - */ - public String removeSuffix(String str, String suffix) { - if (isBlank(str) || isBlank(suffix)) { - return str; - } - if (str.endsWith(suffix)) { - return str.substring(0, str.length() - suffix.length()); - } - return str; - } - - /** - * 替换后缀 - * - * @param str 原字符串 - * @param suffix 指定后缀 - * @param replacement 新后缀 - */ - public String replaceSuffix(String str, String suffix, String replacement) { - if (isBlank(str)) { - return str; - } - String rep = Objects.isNull(replacement) ? "" : replacement; - if (isBlank(suffix)) { - return str + rep; - } - if (str.endsWith(suffix)) { - return str.substring(0, str.length() - suffix.length()) + rep; - } - return str; - } - - /** - * 获取上级包名 - * - * @param pk 报名 - * @return 上级报名 - */ - public String getParentPackage(String pk) { - if (pk.lastIndexOf(".") > -1) { - return pk; - } - return pk.substring(0, pk.lastIndexOf('.')); - } - - private boolean isBlank(String str) { - return str == null || str.trim().isEmpty(); - } - } -} diff --git a/mybatis-plus-join-test/test-join/pom.xml b/mybatis-plus-join-test/test-join/pom.xml index a7c4945..1f9133f 100644 --- a/mybatis-plus-join-test/test-join/pom.xml +++ b/mybatis-plus-join-test/test-join/pom.xml @@ -34,11 +34,29 @@ com.fasterxml.jackson.core jackson-core - - - com.github.yulichang - mybatis-plus-join-processor - ${revision} - + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + com.github.yulichang + mybatis-plus-join-processor + ${revision} + + + org.projectlombok + lombok + 1.18.34 + + + + + + diff --git a/plugin/mybatis-plus-join-processor/pom.xml b/plugin/mybatis-plus-join-processor/pom.xml index f6db487..6ec0127 100644 --- a/plugin/mybatis-plus-join-processor/pom.xml +++ b/plugin/mybatis-plus-join-processor/pom.xml @@ -16,14 +16,17 @@ - com.github.yulichang - mybatis-plus-join-core - ${revision} + ognl + ognl + 3.4.3 + compile + true - com.baomidou - mybatis-plus-extension - ${mybatis.plus.version} + org.javassist + javassist + 3.30.2-GA + compile true @@ -48,6 +51,7 @@ + org.apache.maven.plugins maven-compiler-plugin 3.13.0 @@ -56,6 +60,55 @@ 1.8 + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + + + shade + + package + + false + true + + + ognl:ognl + org.javassist:javassist + + + + + ognl:ognl + + META-INF/MANIFEST.MF + + + + org.javassist:javassist + + META-INF/MANIFEST.MF + + + + + + ognl + com.github.yulichang.processor.ognl + + + javassist + com.github.yulichang.processor.javassist + + + true + + + + \ No newline at end of file diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/EntityProcessor.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/EntityProcessor.java index 7820dbb..804dcfa 100644 --- a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/EntityProcessor.java +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/EntityProcessor.java @@ -1,9 +1,5 @@ package com.github.yulichang.processor; -import com.baomidou.mybatisplus.annotation.TableField; -import com.github.yulichang.annotation.Table; -import com.github.yulichang.extension.apt.matedata.BaseColumn; -import com.github.yulichang.extension.apt.matedata.Column; import com.github.yulichang.processor.matedata.Conf; import com.github.yulichang.processor.matedata.FieldInfo; import com.github.yulichang.processor.matedata.TableInfo; @@ -31,6 +27,13 @@ import java.util.stream.Collectors; */ public class EntityProcessor extends AbstractProcessor { + private static final String TABLE = "com.github.yulichang.annotation.Table"; + private static final String TABLE_FIELD = "com.baomidou.mybatisplus.annotation.TableField"; + private static final String TABLE_FIELD_EXIST = "exist"; + + private static final String BASE_COLUMN = "com.github.yulichang.extension.apt.matedata.BaseColumn"; + private static final String COLUMN = "com.github.yulichang.extension.apt.matedata.Column"; + private Elements elementUtils; private Types typeUtils; private Messager messager; @@ -53,13 +56,38 @@ public class EntityProcessor extends AbstractProcessor { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { if (!roundEnv.processingOver()) { - TypeElement table = annotations.stream().filter(i -> i.toString().equals(Table.class.getName())).findFirst().orElse(null); - if (table != null) { + if (!globalConf.isEnable()) { + return false; + } + Set tables = roundEnv.getRootElements().stream().filter(i -> { + List mirrors = i.getAnnotationMirrors(); + if (mirrors != null && !mirrors.isEmpty()) { + if (mirrors.stream().anyMatch(m -> m.getAnnotationType().toString().equals(TABLE))) { + return true; + } + if (StringUtil.isNotEmpty(globalConf.getScanAnno())) { + if (mirrors.stream().anyMatch(m -> m.getAnnotationType().toString().equals(globalConf.getScanAnno()))) { + return true; + } + } + } + if (StringUtil.isNotEmpty(globalConf.getScanPackage())) { + if (i.getKind() != ElementKind.CLASS) { + return false; + } + if (i.getModifiers().contains(Modifier.ABSTRACT)) { + return false; + } + String pkg = elementUtils.getPackageOf(i).getQualifiedName().toString(); + String[] scanPackages = globalConf.getScanPackage().split(","); + return Arrays.stream(scanPackages).anyMatch(s -> StringUtil.matches(pkg, s)); + } + return false; + }).collect(Collectors.toSet()); + if (!tables.isEmpty()) { note("mybatis plus join processor start"); - Set tables = roundEnv.getElementsAnnotatedWith(table); tables.stream().filter(f -> f instanceof TypeElement) - .map(f -> (TypeElement) f).map(this::createColumn) - .filter(Objects::nonNull).filter(TableInfo::isGenTables) + .map(f -> (TypeElement) f).map(this::createColumn).filter(TableInfo::isGenTables) .collect(Collectors.groupingBy(TableInfo::getTagTablesPackageName)) .forEach(this::createTables); } @@ -71,7 +99,10 @@ public class EntityProcessor extends AbstractProcessor { @Override public Set getSupportedAnnotationTypes() { Set supportedAnnotationTypes = new HashSet<>(); - supportedAnnotationTypes.add(Table.class.getCanonicalName()); + supportedAnnotationTypes.add(TABLE); + if (StringUtil.isNotEmpty(globalConf.getScanAnno())) { + supportedAnnotationTypes.add(globalConf.getScanAnno()); + } return supportedAnnotationTypes; } @@ -85,19 +116,13 @@ public class EntityProcessor extends AbstractProcessor { */ private TableInfo createColumn(TypeElement element) { AnnotationMirror tb = element.getAnnotationMirrors().stream().filter(a -> - a.getAnnotationType().asElement().toString().equals(Table.class.getName())).findFirst().orElse(null); - Table table = element.getAnnotation(Table.class); - if (tb == null) { - return null; - } - Set keySet = tb.getElementValues().keySet().stream().map(k -> - k.getSimpleName().toString()).collect(Collectors.toSet()); - Conf conf = Conf.getConf(globalConf, table, keySet); + a.getAnnotationType().asElement().toString().equals(TABLE)).findFirst().orElse(null); + Conf conf = Optional.ofNullable(tb).map(t -> Conf.getConf(globalConf, t.getElementValues())).orElse(globalConf); TableInfo tableInfo = new TableInfo(conf, element.toString(), element.getSimpleName().toString()); tableInfo.setClassPackage(elementUtils.getPackageOf(element).getQualifiedName().toString()); tableInfo.setClassComment(elementUtils.getDocComment(element)); - Set fieldInfos = new HashSet<>(); + List fieldInfos = new ArrayList<>(); TypeElement currElement = element; do { @@ -106,8 +131,15 @@ public class EntityProcessor extends AbstractProcessor { e.getKind() == ElementKind.FIELD && !e.getModifiers().contains(Modifier.STATIC)) .filter(e -> { // 过滤 exist = false 的字段 - TableField tableField = e.getAnnotation(TableField.class); - return tableField == null || tableField.exist(); + AnnotationMirror tableField = e.getAnnotationMirrors().stream().filter(f -> + TABLE_FIELD.equals(f.getAnnotationType().toString())).findFirst().orElse(null); + if (tableField != null) { + Map propMap = tableField.getElementValues().entrySet().stream() + .collect(Collectors.toMap(entry -> entry.getKey().getSimpleName().toString(), entry -> entry.getValue().getValue())); + Object exist = propMap.get(TABLE_FIELD_EXIST); + return exist == null || (boolean) exist; + } + return true; }) .map(e -> new FieldInfo(e.toString(), elementUtils.getDocComment(e))).collect(Collectors.toList())); currElement = (TypeElement) typeUtils.asElement(currElement.getSuperclass()); @@ -118,8 +150,8 @@ public class EntityProcessor extends AbstractProcessor { StringBuilderHelper content = new StringBuilderHelper(tableInfo) .addPackage(tableInfo.getTagClassPackage()) .newLine() - .addImport(true, BaseColumn.class.getName()) - .addImport(true, Column.class.getName()) + .addImport(true, BASE_COLUMN) + .addImport(true, COLUMN) .addImport(true, tableInfo.getClassName()) .newLine(tableInfo.isCache()) .addImport(tableInfo.isCache(), Map.class.getName()) @@ -127,7 +159,7 @@ public class EntityProcessor extends AbstractProcessor { .addImport(tableInfo.isCache(), ConcurrentHashMap.class.getName()) .newLine() .addClass(tableInfo.getClassComment(), tableInfo.getTagClassName(), - BaseColumn.class.getSimpleName() + "<" + tableInfo.getSimpleClassName() + ">", + StringUtil.getSimpleName(BASE_COLUMN) + "<" + tableInfo.getSimpleClassName() + ">", c -> c .addConstructor() .addFields() diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/Conf.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/Conf.java index 3f2f4c6..5dce1e6 100644 --- a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/Conf.java +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/Conf.java @@ -1,19 +1,18 @@ package com.github.yulichang.processor.matedata; -import com.github.yulichang.annotation.Table; - import javax.annotation.processing.Filer; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.ExecutableElement; import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Arrays; -import java.util.Collection; +import java.util.Map; import java.util.Properties; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Function; public class Conf { @@ -24,6 +23,10 @@ public class Conf { private String tablesClassName = "%S"; private boolean cache = true; + private boolean enable = true; + private String scanAnno = ""; + private String scanPackage = ""; + private boolean initFlag = false; private Conf(Conf conf) { @@ -34,6 +37,10 @@ public class Conf { this.tablesClassName = conf.tablesClassName; this.initFlag = conf.initFlag; this.cache = conf.cache; + + this.enable = conf.enable; + this.scanAnno = conf.scanAnno; + this.scanPackage = conf.scanPackage; } @@ -76,14 +83,17 @@ public class Conf { this.tablasClassPackage = properties.getOrDefault("tablasClassPackage", this.tablasClassPackage).toString(); this.tablesClassName = properties.getOrDefault("tablesClassName", this.tablesClassName).toString(); this.cache = Boolean.parseBoolean(properties.getOrDefault("cache", this.cache).toString()); + this.enable = Boolean.parseBoolean(properties.getOrDefault("enable", this.enable).toString()); + this.scanAnno = properties.getOrDefault("scanAnno", this.scanAnno).toString(); + this.scanPackage = properties.getOrDefault("scanPackage", this.scanPackage).toString(); } - public static Conf getConf(Conf globalConf, Table table, Collection keys) { - if (keys == null || keys.isEmpty()) { + public static Conf getConf(Conf globalConf, Map elementMap) { + if (elementMap == null || elementMap.isEmpty()) { return globalConf; } Conf conf = new Conf(globalConf); - keys.forEach(key -> ConfItem.doIt(conf, key, table)); + elementMap.forEach((k, v) -> ConfItem.doIt(conf, k.getSimpleName().toString(), v)); return conf; } @@ -135,29 +145,38 @@ public class Conf { this.cache = cache; } + public String getScanAnno() { + return scanAnno; + } + + public String getScanPackage() { + return scanPackage; + } + + public boolean isEnable() { + return enable; + } + public enum ConfItem { - className("value", Table::value, (c, v) -> c.setClassName(v.toString())), - packageName("classPackage", Table::classPackage, (c, v) -> c.setClassPackage(v.toString())), - genTables("genTables", Table::genTables, (c, v) -> c.setGenTables((boolean) v)), - tablasPackageName("tablesClassPackage", Table::tablesClassPackage, (c, v) -> c.setTablasClassPackage(v.toString())), - tablesName("tablesClassName", Table::tablesClassName, (c, v) -> c.setTablesClassName(v.toString())), - cache("cache", Table::cache, (c, v) -> c.setCache((boolean) v)); + className("value", (c, v) -> c.setClassName(v.toString())), + packageName("classPackage", (c, v) -> c.setClassPackage(v.toString())), + genTables("genTables", (c, v) -> c.setGenTables((boolean) v)), + tablasPackageName("tablesClassPackage", (c, v) -> c.setTablasClassPackage(v.toString())), + tablesName("tablesClassName", (c, v) -> c.setTablesClassName(v.toString())), + cache("cache", (c, v) -> c.setCache((boolean) v)); private final String action; - private final Function annoVal; - private final BiConsumer doIt; - ConfItem(String action, Function annoVal, BiConsumer doIt) { + ConfItem(String action, BiConsumer doIt) { this.action = action; - this.annoVal = annoVal; this.doIt = doIt; } - public static void doIt(Conf tableConf, String act, Table anno) { - Arrays.stream(ConfItem.values()).filter(f -> f.action.equals(act)).findFirst() - .ifPresent(item -> item.doIt.accept(tableConf, item.annoVal.apply(anno))); + public static void doIt(Conf tableConf, String key, AnnotationValue value) { + Arrays.stream(ConfItem.values()).filter(f -> f.action.equals(key)).findFirst() + .ifPresent(item -> item.doIt.accept(tableConf, value.getValue())); } } @@ -169,6 +188,9 @@ public class Conf { ", genTables=" + genTables + ", tablasClassPackage='" + tablasClassPackage + '\'' + ", tablesClassName='" + tablesClassName + '\'' + + ", cache=" + cache + + ", scanAnno='" + scanAnno + '\'' + + ", scanPackage='" + scanPackage + '\'' + ", initFlag=" + initFlag + '}'; } diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/OgnlRoot.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/OgnlRoot.java new file mode 100644 index 0000000..f295620 --- /dev/null +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/OgnlRoot.java @@ -0,0 +1,42 @@ +package com.github.yulichang.processor.matedata; + +import com.github.yulichang.processor.utils.OgnlUtil; + +/** + * apt ognl表达式上下文 + * + * @author yulichang + * @since 1.5.0 + */ +@SuppressWarnings("unused") +public class OgnlRoot { + + /** + * 类名 + */ + private final String className; + + /** + * 包名 + */ + private final String classPackage; + + private final static OgnlUtil util = new OgnlUtil(); + + public OgnlRoot(String className, String classPackage) { + this.className = className; + this.classPackage = classPackage; + } + + public String getClassName() { + return className; + } + + public String getClassPackage() { + return classPackage; + } + + public OgnlUtil getUtil() { + return util; + } +} diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/TableInfo.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/TableInfo.java index d7ee8a4..c9d9e02 100644 --- a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/TableInfo.java +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/matedata/TableInfo.java @@ -1,12 +1,10 @@ package com.github.yulichang.processor.matedata; -import com.github.yulichang.extension.apt.matedata.OgnlRoot; -import org.apache.ibatis.builder.BuilderException; -import org.apache.ibatis.ognl.Ognl; -import org.apache.ibatis.ognl.OgnlContext; -import org.apache.ibatis.ognl.OgnlException; +import ognl.Ognl; +import ognl.OgnlContext; +import ognl.OgnlException; -import java.util.Set; +import java.util.List; /** * @author yulichang @@ -28,7 +26,7 @@ public class TableInfo { private final Conf conf; - private Set fields; + private List fields; private String tagClassName; private String tagPackageName; @@ -90,7 +88,7 @@ public class TableInfo { try { return Ognl.getValue(ognl, context, context.getRoot()).toString(); } catch (OgnlException e) { - throw new BuilderException("Error evaluating expression '" + ognl + "'. Cause: " + e, e); + throw new RuntimeException("Error evaluating expression '" + ognl + "'. Cause: " + e, e); } } else { tag = String.format(expression, source); @@ -130,11 +128,11 @@ public class TableInfo { return this.conf.isCache(); } - public Set getFields() { + public List getFields() { return fields; } - public void setFields(Set fields) { + public void setFields(List fields) { this.fields = fields; } diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/OgnlUtil.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/OgnlUtil.java new file mode 100644 index 0000000..f52717e --- /dev/null +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/OgnlUtil.java @@ -0,0 +1,60 @@ +package com.github.yulichang.processor.utils; + +import java.util.Objects; + +@SuppressWarnings("unused") +public final class OgnlUtil { + /** + * 移除后缀 + * + * @param str 原字符串 + * @param suffix 指定后缀 + */ + public String removeSuffix(String str, String suffix) { + if (isBlank(str) || isBlank(suffix)) { + return str; + } + if (str.endsWith(suffix)) { + return str.substring(0, str.length() - suffix.length()); + } + return str; + } + + /** + * 替换后缀 + * + * @param str 原字符串 + * @param suffix 指定后缀 + * @param replacement 新后缀 + */ + public String replaceSuffix(String str, String suffix, String replacement) { + if (isBlank(str)) { + return str; + } + String rep = Objects.isNull(replacement) ? "" : replacement; + if (isBlank(suffix)) { + return str + rep; + } + if (str.endsWith(suffix)) { + return str.substring(0, str.length() - suffix.length()) + rep; + } + return str; + } + + /** + * 获取上级包名 + * + * @param pk 报名 + * @return 上级报名 + */ + public String getParentPackage(String pk) { + if (pk.lastIndexOf(".") > -1) { + return pk; + } + return pk.substring(0, pk.lastIndexOf('.')); + } + + private boolean isBlank(String str) { + return str == null || str.trim().isEmpty(); + } +} diff --git a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/StringUtil.java b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/StringUtil.java index f8d9f81..ca0ebfa 100644 --- a/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/StringUtil.java +++ b/plugin/mybatis-plus-join-processor/src/main/java/com/github/yulichang/processor/utils/StringUtil.java @@ -1,5 +1,8 @@ package com.github.yulichang.processor.utils; +import java.util.Arrays; +import java.util.stream.Collectors; + public final class StringUtil { public static boolean isEmpty(String str) { @@ -9,4 +12,27 @@ public final class StringUtil { public static boolean isNotEmpty(String str) { return !isEmpty(str); } + + public static String getSimpleName(String fullName) { + if (isEmpty(fullName) && fullName.lastIndexOf(".") == -1) { + return fullName; + } + return fullName.substring(fullName.lastIndexOf(".") + 1); + } + + public static boolean matches(String packageName, String packageRegex) { + if (packageRegex.lastIndexOf("*") != -1) { + String regex = Arrays.stream(packageRegex.split("\\.")).map(r -> { + if (r.equals("**")) { + return "[A-Za-z0-9_.]*"; + } else if (r.equals("*")) { + return "\\w*"; + } else { + return r; + } + }).collect(Collectors.joining("\\.")); + return packageName.matches(regex); + } + return packageRegex.equals(packageName); + } }