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);