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 d964a9f9003 Refactor ClassLoaderContext (#23221)
d964a9f9003 is described below

commit d964a9f900364b7e3c8b841b6fa90aac5263cb0b
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Dec 31 15:46:50 2022 +0800

    Refactor ClassLoaderContext (#23221)
    
    * Refactor pom of agent-core
    
    * Refactor AdvisorConfigurationLoader
    
    * Refactor ClassLoaderContext
    
    * Refactor AgentTransformer
    
    * Refactor AgentClassLoader
---
 agent/core/pom.xml                                 | 12 ++++------
 .../agent/core/classloader/AgentClassLoader.java   |  6 ++---
 .../agent/core/classloader/ClassLoaderContext.java |  2 +-
 .../core/plugin/PluginBootServiceManager.java      |  6 ++---
 .../plugin/loader/AdvisorConfigurationLoader.java  | 26 ++++++++++------------
 .../agent/core/transformer/AgentTransformer.java   |  9 ++++----
 .../transformer/builder/advise/AdviceFactory.java  |  6 ++---
 7 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/agent/core/pom.xml b/agent/core/pom.xml
index 6487628585d..1bf64318a0c 100644
--- a/agent/core/pom.xml
+++ b/agent/core/pom.xml
@@ -93,6 +93,10 @@
                                 </excludes>
                             </artifactSet>
                             <relocations>
+                                <relocation>
+                                    <pattern>com.google</pattern>
+                                    
<shadedPattern>${shade.package}.com.google</shadedPattern>
+                                </relocation>
                                 <relocation>
                                     <pattern>net.bytebuddy</pattern>
                                     
<shadedPattern>${shade.package}.net.bytebuddy</shadedPattern>
@@ -101,14 +105,6 @@
                                     <pattern>org.yaml</pattern>
                                     
<shadedPattern>${shade.package}.org.yaml</shadedPattern>
                                 </relocation>
-                                <relocation>
-                                    <pattern>com.google</pattern>
-                                    
<shadedPattern>${shade.package}.com.google</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.commons</pattern>
-                                    
<shadedPattern>${shade.package}.org.apache.commons</shadedPattern>
-                                </relocation>
                                 <relocation>
                                     <pattern>org.slf4j</pattern>
                                     
<shadedPattern>${shade.package}.org.slf4j</shadedPattern>
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
index e3f370bbaa6..15792386ee5 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
@@ -44,8 +44,8 @@ public final class AgentClassLoader extends ClassLoader {
     
     private final Collection<PluginJar> pluginJars;
     
-    public AgentClassLoader(final ClassLoader classLoader, final 
Collection<PluginJar> pluginJars) {
-        super(classLoader);
+    public AgentClassLoader(final ClassLoader appClassLoader, final 
Collection<PluginJar> pluginJars) {
+        super(appClassLoader);
         this.pluginJars = pluginJars;
     }
     
@@ -120,7 +120,7 @@ public final class AgentClassLoader extends ClassLoader {
         try {
             return Optional.of(new URL(String.format("jar:file:%s!/%s", 
pluginJar.getSourcePath().getAbsolutePath(), name)));
         } catch (final MalformedURLException ignored) {
+            return Optional.empty();
         }
-        return Optional.empty();
     }
 }
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
index fb2d1a5efa4..491de60796b 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
@@ -29,11 +29,11 @@ import java.util.concurrent.ConcurrentHashMap;
  * Class loader context.
  */
 @RequiredArgsConstructor
-@Getter
 public final class ClassLoaderContext {
     
     private static final Map<ClassLoader, AgentClassLoader> 
AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
     
+    @Getter
     private final ClassLoader appClassLoader;
     
     private final Collection<PluginJar> pluginJars;
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
index dc6501d6fd9..bde5ea9a84f 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/PluginBootServiceManager.java
@@ -41,13 +41,13 @@ public final class PluginBootServiceManager {
      * Start all services.
      *
      * @param pluginConfigs plugin configuration map
-     * @param classLoader class loader
+     * @param agentClassLoader agent class loader
      * @param isEnhancedForProxy is enhanced for proxy
      */
-    public static void startAllServices(final Map<String, PluginConfiguration> 
pluginConfigs, final ClassLoader classLoader, final boolean isEnhancedForProxy) 
{
+    public static void startAllServices(final Map<String, PluginConfiguration> 
pluginConfigs, final ClassLoader agentClassLoader, final boolean 
isEnhancedForProxy) {
         ClassLoader originalClassLoader = 
Thread.currentThread().getContextClassLoader();
         try {
-            Thread.currentThread().setContextClassLoader(classLoader);
+            Thread.currentThread().setContextClassLoader(agentClassLoader);
             for (Entry<String, PluginConfiguration> entry : 
pluginConfigs.entrySet()) {
                 
PluginBootServiceRegistry.getRegisteredService(entry.getKey()).ifPresent(optional
 -> {
                     try {
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
index ed3a2836bdc..e47264f341f 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/loader/AdvisorConfigurationLoader.java
@@ -17,16 +17,15 @@
 
 package org.apache.shardingsphere.agent.core.plugin.loader;
 
-import com.google.common.collect.ImmutableMap;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
 import org.apache.shardingsphere.agent.core.logging.LoggerFactory;
 import org.apache.shardingsphere.agent.core.logging.LoggerFactory.Logger;
 import org.apache.shardingsphere.agent.core.plugin.PluginJar;
+import 
org.apache.shardingsphere.agent.core.plugin.advisor.AdvisorConfiguration;
 import 
org.apache.shardingsphere.agent.core.plugin.yaml.loader.YamlAdvisorsConfigurationLoader;
 import 
org.apache.shardingsphere.agent.core.plugin.yaml.swapper.YamlAdvisorsConfigurationSwapper;
-import 
org.apache.shardingsphere.agent.core.plugin.advisor.AdvisorConfiguration;
 
 import java.io.InputStream;
 import java.util.Collection;
@@ -51,26 +50,25 @@ public final class AdvisorConfigurationLoader {
      */
     public static Map<String, AdvisorConfiguration> load(final 
Collection<PluginJar> pluginJars, final Collection<String> pluginTypes, final 
boolean isEnhancedForProxy) {
         Map<String, AdvisorConfiguration> result = new HashMap<>();
-        AgentClassLoader classLoader = new 
AgentClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
+        AgentClassLoader agentClassLoader = new 
AgentClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
         for (String each : pluginTypes) {
-            InputStream advisorsResourceStream = 
getAdvisorsResourceStream(classLoader, each, isEnhancedForProxy);
+            InputStream advisorsResourceStream = 
getAdvisorsResourceStream(agentClassLoader, each, isEnhancedForProxy);
             if (null == advisorsResourceStream) {
-                LOGGER.error("No configuration of advisor for type `{}`", 
each);
-                continue;
+                LOGGER.info("No configuration of advisor for type `{}`.", 
each);
+            } else {
+                mergeAdvisorConfigurations(result, 
YamlAdvisorsConfigurationSwapper.swapToObject(YamlAdvisorsConfigurationLoader.load(advisorsResourceStream),
 each));
             }
-            Collection<AdvisorConfiguration> advisorConfigs = 
YamlAdvisorsConfigurationSwapper.swapToObject(YamlAdvisorsConfigurationLoader.load(advisorsResourceStream),
 each);
-            mergeAdvisorConfigurations(result, advisorConfigs);
         }
-        return ImmutableMap.<String, 
AdvisorConfiguration>builder().putAll(result).build();
+        return result;
     }
     
-    private static InputStream getAdvisorsResourceStream(final ClassLoader 
classLoader, final String type, final boolean isEnhancedForProxy) {
-        InputStream result = 
classLoader.getResourceAsStream(getAdvisorsResourceFile(type, 
(isEnhancedForProxy ? "proxy" : "jdbc") + "-advisors.yaml"));
-        return null == result ? 
classLoader.getResourceAsStream(getAdvisorsResourceFile(type, "advisors.yaml")) 
: result;
+    private static InputStream getAdvisorsResourceStream(final ClassLoader 
agentClassLoader, final String pluginType, final boolean isEnhancedForProxy) {
+        InputStream accurateResourceStream = 
getAdvisorsResourceStream(agentClassLoader, pluginType, (isEnhancedForProxy ? 
"proxy" : "jdbc") + "-advisors.yaml");
+        return null == accurateResourceStream ? 
getAdvisorsResourceStream(agentClassLoader, pluginType, "advisors.yaml") : 
accurateResourceStream;
     }
     
-    private static String getAdvisorsResourceFile(final String type, final 
String fileName) {
-        return String.join("/", type.toLowerCase(), fileName);
+    private static InputStream getAdvisorsResourceStream(final ClassLoader 
agentClassLoader, final String pluginType, final String fileName) {
+        return agentClassLoader.getResourceAsStream(String.join("/", 
pluginType.toLowerCase(), fileName));
     }
     
     private static void mergeAdvisorConfigurations(final Map<String, 
AdvisorConfiguration> advisorConfigMap, final Collection<AdvisorConfiguration> 
advisorConfigs) {
diff --git 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
index 17ab5c99cb5..5b0e42f7aa8 100644
--- 
a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
+++ 
b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/transformer/AgentTransformer.java
@@ -63,13 +63,14 @@ public final class AgentTransformer implements Transformer {
         }
         ClassLoaderContext classLoaderContext = new 
ClassLoaderContext(classLoader, pluginJars);
         startAllServices(classLoaderContext.getAgentClassLoader());
-        return new MethodAdvisorBuilder(new AdviceFactory(classLoaderContext), 
advisorConfigs.get(typeDescription.getTypeName()), typeDescription)
-                .build(builder.defineField(EXTRA_DATA, Object.class, 
Opcodes.ACC_PRIVATE | 
Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA)));
+        Builder<?> targetAdviceObjectBuilder = builder.defineField(EXTRA_DATA,
+                Object.class, Opcodes.ACC_PRIVATE | 
Opcodes.ACC_VOLATILE).implement(TargetAdviceObject.class).intercept(FieldAccessor.ofField(EXTRA_DATA));
+        return new MethodAdvisorBuilder(new AdviceFactory(classLoaderContext), 
advisorConfigs.get(typeDescription.getTypeName()), 
typeDescription).build(targetAdviceObjectBuilder);
     }
     
-    private void startAllServices(final ClassLoader classLoader) {
+    private void startAllServices(final ClassLoader agentClassLoader) {
         if (STARTED_FLAG.compareAndSet(false, true)) {
-            PluginBootServiceManager.startAllServices(pluginConfigs, 
classLoader, isEnhancedForProxy);
+            PluginBootServiceManager.startAllServices(pluginConfigs, 
agentClassLoader, isEnhancedForProxy);
             Runtime.getRuntime().addShutdownHook(new Thread(() -> 
PluginBootServiceManager.closeAllServices(pluginJars)));
         }
     }
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
index 8ec861f8368..8156ff74ecb 100644
--- 
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
@@ -42,9 +42,9 @@ public final class AdviceFactory {
      * @return got advance
      */
     public AgentAdvice getAdvice(final String adviceClassName) {
-        String adviceInstanceCacheKey = String.format("%s_%s@%s", 
adviceClassName, classLoaderContext.getAppClassLoader().getClass().getName(),
-                
Integer.toHexString(classLoaderContext.getAppClassLoader().hashCode()));
-        return CACHED_ADVICES.computeIfAbsent(adviceInstanceCacheKey, key -> 
createAdvice(adviceClassName));
+        ClassLoader appClassLoader = classLoaderContext.getAppClassLoader();
+        String cacheKey = String.format("%s_%s@%s", adviceClassName, 
appClassLoader.getClass().getName(), 
Integer.toHexString(appClassLoader.hashCode()));
+        return CACHED_ADVICES.computeIfAbsent(cacheKey, key -> 
createAdvice(adviceClassName));
     }
     
     @SneakyThrows(ReflectiveOperationException.class)

Reply via email to