You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2022/12/16 08:28:03 UTC

[shardingsphere] branch master updated: Split proxy and JDBC of AdviceFactory (#22909)

This is an automated email from the ASF dual-hosted git repository.

sunnianjun 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 1a2a599794e Split proxy and JDBC of AdviceFactory (#22909)
1a2a599794e is described below

commit 1a2a599794e1ff29106f9cf5084d7bdd9073cc3f
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Dec 16 16:27:54 2022 +0800

    Split proxy and JDBC of AdviceFactory (#22909)
---
 .../builder/ConstructorAdvisorBuilder.java         |  1 +
 .../builder/InstanceMethodAdvisorBuilder.java      |  1 +
 .../builder/StaticMethodAdvisorBuilder.java        |  1 +
 .../transformer/builder/advise/AdviceFactory.java  | 51 ++++++++++++++++++++++
 .../JDBCAdviceFactory.java}                        | 24 ++--------
 .../builder/advise/ProxyAdviceFactory.java         | 51 ++++++++++++++++++++++
 .../core/transformer/AgentTransformerTest.java     |  8 ----
 7 files changed, 109 insertions(+), 28 deletions(-)

diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java
index 1e079dea3c3..f7c0e534bc6 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/ConstructorAdvisorBuilder.java
@@ -31,6 +31,7 @@ import org.apache.shardingsphere.agent.core.plugin.advice.ConstructorAdvice;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.ConstructorInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedConstructorInterceptor;
 import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
 
 import java.util.Collection;
 import java.util.List;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java
index f788d40beb6..db7e485dc38 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/InstanceMethodAdvisorBuilder.java
@@ -33,6 +33,7 @@ import org.apache.shardingsphere.agent.core.plugin.interceptor.InstanceMethodInt
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedInstanceMethodAroundInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedInstanceMethodInterceptorArgsOverride;
 import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
 
 import java.util.Collection;
 import java.util.LinkedList;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java
index cbb637b6569..17cbb48b997 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/StaticMethodAdvisorBuilder.java
@@ -33,6 +33,7 @@ import org.apache.shardingsphere.agent.core.plugin.interceptor.StaticMethodInter
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodAroundInterceptor;
 import org.apache.shardingsphere.agent.core.plugin.interceptor.composed.ComposedStaticMethodInterceptorArgsOverride;
 import org.apache.shardingsphere.agent.core.transformer.MethodAdvisor;
+import org.apache.shardingsphere.agent.core.transformer.builder.advise.AdviceFactory;
 
 import java.util.Collection;
 import java.util.LinkedList;
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
new file mode 100644
index 00000000000..f43e1205122
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/AdviceFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.core.transformer.builder.advise;
+
+import org.apache.shardingsphere.agent.config.plugin.PluginConfiguration;
+
+import java.util.Map;
+
+/**
+ * Advice factory.
+ */
+public final class AdviceFactory {
+    
+    private final ProxyAdviceFactory proxyAdviceFactory;
+    
+    private final JDBCAdviceFactory jdbcAdviceFactory;
+    
+    private final boolean isEnhancedForProxy;
+    
+    public AdviceFactory(final ClassLoader classLoader, final Map<String, PluginConfiguration> pluginConfigs, final boolean isEnhancedForProxy) {
+        proxyAdviceFactory = new ProxyAdviceFactory();
+        jdbcAdviceFactory = new JDBCAdviceFactory(classLoader, pluginConfigs);
+        this.isEnhancedForProxy = isEnhancedForProxy;
+    }
+    
+    /**
+     * Get advice.
+     *
+     * @param adviceClassName advice class name
+     * @param <T> type of advice
+     * @return got advance
+     */
+    public <T> T getAdvice(final String adviceClassName) {
+        return isEnhancedForProxy ? proxyAdviceFactory.getAdvice(adviceClassName) : jdbcAdviceFactory.getAdvice(adviceClassName);
+    }
+}
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java
similarity index 80%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/AdviceFactory.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java
index 15dac5d78cf..dc5cc55b540 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/JDBCAdviceFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.transformer.builder;
+package org.apache.shardingsphere.agent.core.transformer.builder.advise;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
@@ -29,10 +29,10 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Advice factory.
+ * JDBC advice factory.
  */
 @RequiredArgsConstructor
-public final class AdviceFactory {
+public final class JDBCAdviceFactory {
     
     private static final Map<String, Object> CACHED_ADVICES = new ConcurrentHashMap<>();
     
@@ -44,8 +44,6 @@ public final class AdviceFactory {
     
     private final Map<String, PluginConfiguration> pluginConfigs;
     
-    private final boolean isEnhancedForProxy;
-    
     /**
      * Get advice.
      *
@@ -53,22 +51,8 @@ public final class AdviceFactory {
      * @param <T> type of advice
      * @return got advance
      */
-    public <T> T getAdvice(final String adviceClassName) {
-        return isEnhancedForProxy ? getAdviceForProxy(adviceClassName) : getAdviceForJDBC(adviceClassName);
-    }
-    
     @SuppressWarnings("unchecked")
-    private <T> T getAdviceForProxy(final String adviceClassName) {
-        return (T) CACHED_ADVICES.computeIfAbsent(adviceClassName, this::createAdviceForProxy);
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private Object createAdviceForProxy(final String adviceClassName) {
-        return Class.forName(adviceClassName, true, AgentClassLoader.getClassLoader()).getDeclaredConstructor().newInstance();
-    }
-    
-    @SuppressWarnings("unchecked")
-    private <T> T getAdviceForJDBC(final String adviceClassName) {
+    public <T> T getAdvice(final String adviceClassName) {
         String adviceInstanceCacheKey = String.format("%s_%s@%s", adviceClassName, classLoader.getClass().getName(), Integer.toHexString(classLoader.hashCode()));
         return (T) CACHED_ADVICES.computeIfAbsent(adviceInstanceCacheKey, key -> createAdviceForJDBC(adviceClassName));
     }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java
new file mode 100644
index 00000000000..737398454f6
--- /dev/null
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/builder/advise/ProxyAdviceFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.core.transformer.builder.advise;
+
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Proxy Advice factory.
+ */
+@RequiredArgsConstructor
+public final class ProxyAdviceFactory {
+    
+    private static final Map<String, Object> CACHED_ADVICES = new ConcurrentHashMap<>();
+    
+    /**
+     * Get advice.
+     *
+     * @param adviceClassName advice class name
+     * @param <T> type of advice
+     * @return got advance
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T getAdvice(final String adviceClassName) {
+        return (T) CACHED_ADVICES.computeIfAbsent(adviceClassName, this::createAdviceForProxy);
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private Object createAdviceForProxy(final String adviceClassName) {
+        return Class.forName(adviceClassName, true, AgentClassLoader.getClassLoader()).getDeclaredConstructor().newInstance();
+    }
+}
diff --git a/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java b/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
index 01bb54416d3..01e6476db71 100644
--- a/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
+++ b/agent/core/src/test/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformerTest.java
@@ -35,12 +35,10 @@ import org.apache.shardingsphere.agent.core.mock.advice.MockInstanceMethodAround
 import org.apache.shardingsphere.agent.core.mock.advice.MockStaticMethodAroundAdvice;
 import org.apache.shardingsphere.agent.core.mock.material.Material;
 import org.apache.shardingsphere.agent.core.mock.material.RepeatedAdviceMaterial;
-import org.apache.shardingsphere.agent.core.transformer.builder.AdviceFactory;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.mockito.internal.util.reflection.FieldReader;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -59,15 +57,9 @@ public final class AgentTransformerTest {
     private final List<String> queue = new LinkedList<>();
     
     @BeforeClass
-    @SuppressWarnings("unchecked")
     public static void setup() throws ReflectiveOperationException {
         ByteBuddyAgent.install();
         AgentClassLoader.init(Collections.emptyList());
-        FieldReader objectPoolReader = new FieldReader(AdviceFactory.class, AdviceFactory.class.getDeclaredField("CACHED_ADVICES"));
-        Map<String, Object> objectPool = (Map<String, Object>) objectPoolReader.read();
-        objectPool.put(MockConstructorAdvice.class.getTypeName(), new MockConstructorAdvice());
-        objectPool.put(MockInstanceMethodAroundAdvice.class.getTypeName(), new MockInstanceMethodAroundAdvice());
-        objectPool.put(MockStaticMethodAroundAdvice.class.getTypeName(), new MockStaticMethodAroundAdvice());
         Map<String, AdvisorConfiguration> advisorConfigs = new HashMap<>(2, 1);
         AdvisorConfiguration advisorConfig = createAdvisorConfiguration();
         advisorConfigs.put(advisorConfig.getTargetClassName(), advisorConfig);