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