From a1a5ccbfe8409e72488eee7595bd2cc53f025665 Mon Sep 17 00:00:00 2001 From: huangjy Date: Tue, 7 Feb 2023 11:13:40 +0800 Subject: [PATCH] =?UTF-8?q?extension=20=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81=E9=80=9A=E9=85=8D?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=EF=BC=8C=E5=8F=AF=E9=85=8D=E7=BD=AE=E6=AD=A3?= =?UTF-8?q?=E5=88=99=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=BF=9B=E8=A1=8C=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/easyes/annotation/Signature.java | 6 +++ .../cn/easyes/extension/plugins/Plugin.java | 29 ++++++++++--- .../TenantLineInnerInterceptor.java | 43 +++++++++++++++++++ 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 easy-es-test/src/main/java/cn/easyes/test/interceptor/TenantLineInnerInterceptor.java 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(); + } +}