You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2021/09/10 09:44:19 UTC
[shardingsphere] branch master updated: Add plugin enabled check
(#12308)
This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new eedc09a Add plugin enabled check (#12308)
eedc09a is described below
commit eedc09a6670e775d2c02572ff82e83251bec2267
Author: Dachuan J <46...@users.noreply.github.com>
AuthorDate: Fri Sep 10 17:43:47 2021 +0800
Add plugin enabled check (#12308)
* Add plugin enabled check
* Refactor code
* Format code style
* Rename and format code style
---
.../api/advice/ClassStaticMethodAroundAdvice.java | 9 +++++++++
.../agent/api/advice/ConstructorAdvice.java | 9 +++++++++
.../agent/api/advice/InstanceMethodAroundAdvice.java | 9 +++++++++
.../agent/core/plugin/PluginContext.java} | 18 +++++++++++-------
.../ClassStaticMethodAroundInterceptor.java | 16 +++++++++++++---
.../plugin/interceptor/ConstructorInterceptor.java | 10 ++++++++--
.../interceptor/InstanceMethodAroundInterceptor.java | 18 ++++++++++++++----
7 files changed, 73 insertions(+), 16 deletions(-)
diff --git a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ClassStaticMethodAroundAdvice.java b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ClassStaticMethodAroundAdvice.java
index fac9bd0..21908a0 100644
--- a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ClassStaticMethodAroundAdvice.java
+++ b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ClassStaticMethodAroundAdvice.java
@@ -27,6 +27,15 @@ import java.lang.reflect.Method;
public interface ClassStaticMethodAroundAdvice {
/**
+ * Check if disable the check process when interceptor are trying to call the advice. Then the advice will be called by skipping checks.
+ *
+ * @return disable or not
+ */
+ default boolean disableCheck() {
+ return false;
+ }
+
+ /**
* Intercept the target method and weave the method before origin method. It will invoke before the origin calling.
*
* @param clazz the target class
diff --git a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java
index 20f9c6b..3e9c397 100644
--- a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java
+++ b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java
@@ -23,6 +23,15 @@ package org.apache.shardingsphere.agent.api.advice;
public interface ConstructorAdvice {
/**
+ * Check if disable the check process when interceptor are trying to call the advice. Then the advice will be called by skipping checks.
+ *
+ * @return disable or not
+ */
+ default boolean disableCheck() {
+ return false;
+ }
+
+ /**
* Intercept the target's constructor. This method is weaved after the constructor execution.
*
* @param target intercepted target object
diff --git a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/InstanceMethodAroundAdvice.java b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/InstanceMethodAroundAdvice.java
index f0518b4..18a6243 100644
--- a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/InstanceMethodAroundAdvice.java
+++ b/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/InstanceMethodAroundAdvice.java
@@ -27,6 +27,15 @@ import java.lang.reflect.Method;
public interface InstanceMethodAroundAdvice {
/**
+ * Check if disable the check process when interceptor are trying to call the advice. Then the advice will be called by skipping checks.
+ *
+ * @return disable or not
+ */
+ default boolean disableCheck() {
+ return false;
+ }
+
+ /**
* Intercept the target method and weave the method before origin method. It will invoke before the origin calling.
*
* @param target the target object
diff --git a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginContext.java
similarity index 64%
copy from shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java
copy to shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginContext.java
index 20f9c6b..6e2dfb1 100644
--- a/shardingsphere-agent/shardingsphere-agent-api/src/main/java/org/apache/shardingsphere/agent/api/advice/ConstructorAdvice.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginContext.java
@@ -13,20 +13,24 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
+ *
*/
-package org.apache.shardingsphere.agent.api.advice;
+package org.apache.shardingsphere.agent.core.plugin;
/**
- * Weaving the advice around the constructor of target class.
+ * Plugin Context.
*/
-public interface ConstructorAdvice {
+public final class PluginContext {
+
+ private static final String PLUGIN_ENABLED_KEY = "AGENT_PLUGINS_ENABLED";
/**
- * Intercept the target's constructor. This method is weaved after the constructor execution.
+ * Check if the plugin is enabled.
*
- * @param target intercepted target object
- * @param args all arguments of the intercepted constructor
+ * @return the plugin enable value
*/
- void onConstructor(AdviceTargetObject target, Object[] args);
+ public static boolean isPluginEnabled() {
+ return !"false".equalsIgnoreCase(System.getProperty(PLUGIN_ENABLED_KEY)) && !"0".equalsIgnoreCase(System.getProperty(PLUGIN_ENABLED_KEY));
+ }
}
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ClassStaticMethodAroundInterceptor.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ClassStaticMethodAroundInterceptor.java
index b8fee6d..4318949 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ClassStaticMethodAroundInterceptor.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ClassStaticMethodAroundInterceptor.java
@@ -27,6 +27,7 @@ import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import org.apache.shardingsphere.agent.api.advice.ClassStaticMethodAroundAdvice;
import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
+import org.apache.shardingsphere.agent.core.plugin.PluginContext;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
@@ -40,6 +41,8 @@ public class ClassStaticMethodAroundInterceptor {
private final ClassStaticMethodAroundAdvice classStaticMethodAroundAdvice;
+ private boolean needCall = true;
+
/**
* Only intercept static method.
*
@@ -54,8 +57,11 @@ public class ClassStaticMethodAroundInterceptor {
public Object intercept(@Origin final Class<?> klass, @Origin final Method method, @AllArguments final Object[] args, @SuperCall final Callable<?> callable) {
MethodInvocationResult invocationResult = new MethodInvocationResult();
Object result;
+ needCall = classStaticMethodAroundAdvice.disableCheck() || PluginContext.isPluginEnabled();
try {
- classStaticMethodAroundAdvice.beforeMethod(klass, method, args, invocationResult);
+ if (needCall) {
+ classStaticMethodAroundAdvice.beforeMethod(klass, method, args, invocationResult);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ex) {
// CHECKSTYLE:ON
@@ -72,7 +78,9 @@ public class ClassStaticMethodAroundInterceptor {
} catch (final Throwable ex) {
// CHECKSTYLE:ON
try {
- classStaticMethodAroundAdvice.onThrowing(klass, method, args, ex);
+ if (needCall) {
+ classStaticMethodAroundAdvice.onThrowing(klass, method, args, ex);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ignored) {
// CHECKSTYLE:ON
@@ -81,7 +89,9 @@ public class ClassStaticMethodAroundInterceptor {
throw ex;
} finally {
try {
- classStaticMethodAroundAdvice.afterMethod(klass, method, args, invocationResult);
+ if (needCall) {
+ classStaticMethodAroundAdvice.afterMethod(klass, method, args, invocationResult);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ex) {
// CHECKSTYLE:ON
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ConstructorInterceptor.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ConstructorInterceptor.java
index e2d55c4..9d0f72c 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ConstructorInterceptor.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/ConstructorInterceptor.java
@@ -23,8 +23,9 @@ import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.This;
-import org.apache.shardingsphere.agent.api.advice.ConstructorAdvice;
import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.api.advice.ConstructorAdvice;
+import org.apache.shardingsphere.agent.core.plugin.PluginContext;
/**
* Proxy class for ByteBuddy to intercept methods of target and weave post-method after constructor.
@@ -35,6 +36,8 @@ public class ConstructorInterceptor {
private final ConstructorAdvice constructorAdvice;
+ private boolean needCall = true;
+
/**
* Intercept constructor.
*
@@ -44,7 +47,10 @@ public class ConstructorInterceptor {
@RuntimeType
public void intercept(@This final AdviceTargetObject target, @AllArguments final Object[] args) {
try {
- constructorAdvice.onConstructor(target, args);
+ needCall = constructorAdvice.disableCheck() || PluginContext.isPluginEnabled();
+ if (needCall) {
+ constructorAdvice.onConstructor(target, args);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable throwable) {
// CHECKSTYLE:ON
diff --git a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/InstanceMethodAroundInterceptor.java b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/InstanceMethodAroundInterceptor.java
index 269b0d1..405e868 100644
--- a/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/InstanceMethodAroundInterceptor.java
+++ b/shardingsphere-agent/shardingsphere-agent-core/src/main/java/org/apache/shardingsphere/agent/core/plugin/interceptor/InstanceMethodAroundInterceptor.java
@@ -26,9 +26,10 @@ import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.implementation.bind.annotation.This;
-import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
import org.apache.shardingsphere.agent.api.advice.AdviceTargetObject;
+import org.apache.shardingsphere.agent.api.advice.InstanceMethodAroundAdvice;
import org.apache.shardingsphere.agent.api.result.MethodInvocationResult;
+import org.apache.shardingsphere.agent.core.plugin.PluginContext;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
@@ -42,6 +43,8 @@ public class InstanceMethodAroundInterceptor {
private final InstanceMethodAroundAdvice instanceMethodAroundAdvice;
+ private boolean needCall = true;
+
/**
* Only intercept instance method.
*
@@ -57,8 +60,11 @@ public class InstanceMethodAroundInterceptor {
AdviceTargetObject instance = (AdviceTargetObject) target;
MethodInvocationResult methodResult = new MethodInvocationResult();
Object result;
+ needCall = instanceMethodAroundAdvice.disableCheck() || PluginContext.isPluginEnabled();
try {
- instanceMethodAroundAdvice.beforeMethod(instance, method, args, methodResult);
+ if (needCall) {
+ instanceMethodAroundAdvice.beforeMethod(instance, method, args, methodResult);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ex) {
// CHECKSTYLE:ON
@@ -75,7 +81,9 @@ public class InstanceMethodAroundInterceptor {
} catch (final Throwable ex) {
// CHECKSTYLE:ON
try {
- instanceMethodAroundAdvice.onThrowing(instance, method, args, ex);
+ if (needCall) {
+ instanceMethodAroundAdvice.onThrowing(instance, method, args, ex);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ignored) {
// CHECKSTYLE:ON
@@ -84,7 +92,9 @@ public class InstanceMethodAroundInterceptor {
throw ex;
} finally {
try {
- instanceMethodAroundAdvice.afterMethod(instance, method, args, methodResult);
+ if (needCall) {
+ instanceMethodAroundAdvice.afterMethod(instance, method, args, methodResult);
+ }
// CHECKSTYLE:OFF
} catch (final Throwable ex) {
// CHECKSTYLE:ON