diff --git a/easy-es-annotation/src/main/java/cn/easyes/annotation/Signature.java b/easy-es-annotation/src/main/java/cn/easyes/annotation/Signature.java index aee198fd..a06fbc5c 100644 --- a/easy-es-annotation/src/main/java/cn/easyes/annotation/Signature.java +++ b/easy-es-annotation/src/main/java/cn/easyes/annotation/Signature.java @@ -39,4 +39,10 @@ public @interface Signature { */ Class[] args(); + /** + * use regexp + * @return java method name is use regexp + */ + boolean useRegexp() default false; + } diff --git a/easy-es-extension/src/main/java/cn/easyes/extension/plugins/Plugin.java b/easy-es-extension/src/main/java/cn/easyes/extension/plugins/Plugin.java index 2b8d4b0b..3a880c0f 100644 --- a/easy-es-extension/src/main/java/cn/easyes/extension/plugins/Plugin.java +++ b/easy-es-extension/src/main/java/cn/easyes/extension/plugins/Plugin.java @@ -3,6 +3,8 @@ package cn.easyes.extension.plugins; import cn.easyes.annotation.Intercepts; import cn.easyes.annotation.Signature; +import cn.easyes.common.exception.EasyEsException; +import cn.easyes.common.utils.CollectionUtils; import cn.easyes.common.utils.ExceptionUtils; import cn.easyes.extension.context.Interceptor; import cn.easyes.extension.context.Invocation; @@ -10,10 +12,13 @@ import cn.easyes.extension.context.Invocation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; /** *

@@ -76,14 +81,26 @@ public class Plugin implements InvocationHandler { // 检查被@Signature标记的方法是否存在 for (Signature sig : sigs) { Set methods = signatureMap.computeIfAbsent(sig.type(), k -> new HashSet<>()); - try { - Method method = sig.type().getMethod(sig.method(), sig.args()); - methods.add(method); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Could not find method on " + sig.type() + " named " + sig.method() + ". Cause: " + e, e); + if (sig.useRegexp()) { + Pattern pattern = Pattern.compile(sig.method()); + Set methodSet = Arrays.stream(sig.type().getMethods()) + .filter(item -> pattern.matcher(item.getName()).matches()) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(methodSet)) { + throw new EasyEsException("This regular expression does not match any methods:" + sig.type() + " named " + sig.method()); + } + methods.addAll(methodSet); + } else { + try { + Method method = sig.type().getMethod(sig.method(), sig.args()); + methods.add(method); + } catch (NoSuchMethodException e) { + throw new EasyEsException("Could not find method on " + sig.type() + " named " + sig.method() + ". Cause: " + e, e); + } } } return signatureMap; } -} \ No newline at end of file +} diff --git a/easy-es-test/src/main/java/cn/easyes/test/interceptor/TenantLineInnerInterceptor.java b/easy-es-test/src/main/java/cn/easyes/test/interceptor/TenantLineInnerInterceptor.java new file mode 100644 index 00000000..8e74e27f --- /dev/null +++ b/easy-es-test/src/main/java/cn/easyes/test/interceptor/TenantLineInnerInterceptor.java @@ -0,0 +1,43 @@ +package cn.easyes.test.interceptor; + + +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.client.RequestOptions; +import org.springframework.stereotype.Component; + +import cn.easyes.annotation.Intercepts; +import cn.easyes.annotation.Signature; +import cn.easyes.core.conditions.LambdaEsQueryWrapper; +import cn.easyes.core.conditions.interfaces.BaseEsMapper; +import cn.easyes.extension.context.Interceptor; +import cn.easyes.extension.context.Invocation; + +/** + * 测试方法使用正则表达式 + * @author huangjy + */ +@Intercepts( + { + @Signature(type = BaseEsMapper.class, method = "select.*", args = {LambdaEsQueryWrapper.class}, useRegexp = true), + @Signature(type = BaseEsMapper.class, method = "search", args = {SearchRequest.class, RequestOptions.class}), + @Signature(type = BaseEsMapper.class, method = "insert|update", args = {Object.class}, useRegexp = true), + @Signature(type = BaseEsMapper.class, method = ".*ById", args = {Object.class}, useRegexp = true), + } +) +// @Component +public class TenantLineInnerInterceptor implements Interceptor { + + + @Override + public Object intercept(Invocation invocation) throws Throwable { + // Object[] args = invocation.getArgs(); + // Object arg = args[0]; + // if (arg instanceof LambdaEsQueryWrapper) { + // LambdaEsQueryWrapper wrapper = ((LambdaEsQueryWrapper) args[0]); + // wrapper.eq("tenantId", "1"); + // return invocation.proceed(); + // } + System.out.println("增则拦截方法"); + return invocation.proceed(); + } +}