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 2023/01/20 04:59:04 UTC

[shardingsphere] branch master updated: Add AgentLoggerClassLoader and AgentPluginClassLoader (#23672)

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 efebe70f7e8 Add AgentLoggerClassLoader and AgentPluginClassLoader (#23672)
efebe70f7e8 is described below

commit efebe70f7e84e6e33fe5e8bbf1d105f40cc42486
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Jan 20 12:58:57 2023 +0800

    Add AgentLoggerClassLoader and AgentPluginClassLoader (#23672)
---
 .../advisor/config/AdvisorConfigurationLoader.java | 20 ++++++------
 .../agent/core/advisor/executor/AdviceFactory.java |  2 +-
 .../agent/core/builder/AgentTransformer.java       |  2 +-
 ...ClassLoader.java => AgentExtraClassLoader.java} | 12 +++----
 .../agent/core/classloader/ClassLoaderContext.java | 11 ++++---
 .../AgentLoggerClassLoader.java}                   | 32 +++++++-----------
 .../agent/core/log/AgentLoggerFactory.java         | 38 ++++++++++++----------
 .../classloader/AgentPluginClassLoader.java}       | 29 ++++-------------
 8 files changed, 63 insertions(+), 83 deletions(-)

diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
index 2a4603a76ee..9c2fb07a466 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/config/AdvisorConfigurationLoader.java
@@ -19,13 +19,13 @@ package org.apache.shardingsphere.agent.core.advisor.config;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
+import org.apache.shardingsphere.agent.core.advisor.config.yaml.loader.YamlAdvisorsConfigurationLoader;
+import org.apache.shardingsphere.agent.core.advisor.config.yaml.swapper.YamlAdvisorsConfigurationSwapper;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory;
 import org.apache.shardingsphere.agent.core.log.AgentLoggerFactory.Logger;
+import org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJar;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJarLoader;
-import org.apache.shardingsphere.agent.core.advisor.config.yaml.loader.YamlAdvisorsConfigurationLoader;
-import org.apache.shardingsphere.agent.core.advisor.config.yaml.swapper.YamlAdvisorsConfigurationSwapper;
 
 import java.io.InputStream;
 import java.util.Collection;
@@ -50,9 +50,9 @@ 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 agentClassLoader = new AgentClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
+        AgentPluginClassLoader agentPluginClassLoader = new AgentPluginClassLoader(AdvisorConfigurationLoader.class.getClassLoader(), pluginJars);
         for (String each : pluginTypes) {
-            InputStream advisorsResourceStream = getResourceStream(agentClassLoader, each, isEnhancedForProxy);
+            InputStream advisorsResourceStream = getResourceStream(agentPluginClassLoader, each, isEnhancedForProxy);
             if (null == advisorsResourceStream) {
                 LOGGER.info("No configuration of advisor for type `{}`.", each);
             } else {
@@ -62,13 +62,13 @@ public final class AdvisorConfigurationLoader {
         return result;
     }
     
-    private static InputStream getResourceStream(final ClassLoader agentClassLoader, final String pluginType, final boolean isEnhancedForProxy) {
-        InputStream accurateResourceStream = getResourceStream(agentClassLoader, getFileName(pluginType, isEnhancedForProxy));
-        return null == accurateResourceStream ? getResourceStream(agentClassLoader, getFileName(pluginType)) : accurateResourceStream;
+    private static InputStream getResourceStream(final ClassLoader pluginClassLoader, final String pluginType, final boolean isEnhancedForProxy) {
+        InputStream accurateResourceStream = getResourceStream(pluginClassLoader, getFileName(pluginType, isEnhancedForProxy));
+        return null == accurateResourceStream ? getResourceStream(pluginClassLoader, getFileName(pluginType)) : accurateResourceStream;
     }
     
-    private static InputStream getResourceStream(final ClassLoader agentClassLoader, final String fileName) {
-        return agentClassLoader.getResourceAsStream(String.join("/", "META-INF", "conf", fileName));
+    private static InputStream getResourceStream(final ClassLoader pluginClassLoader, final String fileName) {
+        return pluginClassLoader.getResourceAsStream(String.join("/", "META-INF", "conf", fileName));
     }
     
     private static String getFileName(final String pluginType, final boolean isEnhancedForProxy) {
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
index a7826433ec9..d3803897c13 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/advisor/executor/AdviceFactory.java
@@ -49,6 +49,6 @@ public final class AdviceFactory {
     
     @SneakyThrows(ReflectiveOperationException.class)
     private AgentAdvice createAdvice(final String adviceClassName) {
-        return (AgentAdvice) Class.forName(adviceClassName, true, classLoaderContext.getAgentClassLoader()).getDeclaredConstructor().newInstance();
+        return (AgentAdvice) Class.forName(adviceClassName, true, classLoaderContext.getPluginClassLoader()).getDeclaredConstructor().newInstance();
     }
 }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
index 201b9fc6d61..91c0ba9cc5f 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/builder/AgentTransformer.java
@@ -55,7 +55,7 @@ public final class AgentTransformer implements Transformer {
             return builder;
         }
         ClassLoaderContext classLoaderContext = new ClassLoaderContext(classLoader, pluginJars);
-        PluginLifecycleServiceManager.init(pluginConfigs, pluginJars, classLoaderContext.getAgentClassLoader(), isEnhancedForProxy);
+        PluginLifecycleServiceManager.init(pluginConfigs, pluginJars, classLoaderContext.getPluginClassLoader(), isEnhancedForProxy);
         return AgentBuilderInterceptChainEngine.intercept(builder,
                 new TargetAdviceObjectBuilderInterceptor(), new MethodAdvisorBuilderInterceptor(typeDescription, classLoaderContext, advisorConfigs.get(typeDescription.getTypeName())));
     }
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/AgentExtraClassLoader.java
similarity index 91%
rename from agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentClassLoader.java
rename to agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/AgentExtraClassLoader.java
index 933137082c4..10d37107b55 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/AgentExtraClassLoader.java
@@ -36,9 +36,9 @@ import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 
 /**
- * Agent class loader.
+ * Agent extra class loader.
  */
-public final class AgentClassLoader extends ClassLoader {
+public abstract class AgentExtraClassLoader extends ClassLoader {
     
     static {
         registerAsParallelCapable();
@@ -48,11 +48,11 @@ public final class AgentClassLoader extends ClassLoader {
     
     private final Collection<File> resourcePaths;
     
-    public AgentClassLoader(final ClassLoader appClassLoader, final Collection<PluginJar> pluginJars) {
+    public AgentExtraClassLoader(final ClassLoader appClassLoader, final Collection<PluginJar> pluginJars) {
         this(appClassLoader, pluginJars, Collections.emptyList());
     }
     
-    public AgentClassLoader(final ClassLoader appClassLoader, final Collection<PluginJar> pluginJars, final Collection<File> resourcePaths) {
+    public AgentExtraClassLoader(final ClassLoader appClassLoader, final Collection<PluginJar> pluginJars, final Collection<File> resourcePaths) {
         super(appClassLoader);
         this.pluginJars = pluginJars;
         this.resourcePaths = resourcePaths;
@@ -102,8 +102,8 @@ public final class AgentClassLoader extends ClassLoader {
         definePackage(packageName, specTitle, specVersion, specVendor, implTitle, implVersion, implVendor, null);
     }
     
-    private Class<?> defineClass(final String name, final PluginJar each, final ZipEntry entry) throws IOException {
-        byte[] data = ByteStreams.toByteArray(each.getJarFile().getInputStream(entry));
+    private Class<?> defineClass(final String name, final PluginJar pluginJar, final ZipEntry entry) throws IOException {
+        byte[] data = ByteStreams.toByteArray(pluginJar.getJarFile().getInputStream(entry));
         return defineClass(name, data, 0, data.length);
     }
     
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 9f7193d805a..f4d411c6c9f 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
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.agent.core.classloader;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.agent.core.plugin.classloader.AgentPluginClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJar;
 
 import java.util.Collection;
@@ -31,7 +32,7 @@ import java.util.concurrent.ConcurrentHashMap;
 @RequiredArgsConstructor
 public final class ClassLoaderContext {
     
-    private static final Map<ClassLoader, AgentClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
+    private static final Map<ClassLoader, AgentExtraClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
     
     @Getter
     private final ClassLoader appClassLoader;
@@ -39,11 +40,11 @@ public final class ClassLoaderContext {
     private final Collection<PluginJar> pluginJars;
     
     /**
-     * Get agent class loader.
+     * Get plugin class loader.
      *
-     * @return agent class loader
+     * @return plugin class loader
      */
-    public AgentClassLoader getAgentClassLoader() {
-        return AGENT_CLASS_LOADERS.computeIfAbsent(appClassLoader, key -> new AgentClassLoader(key, pluginJars));
+    public AgentExtraClassLoader getPluginClassLoader() {
+        return AGENT_CLASS_LOADERS.computeIfAbsent(appClassLoader, key -> new AgentPluginClassLoader(key, pluginJars));
     }
 }
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/log/AgentLoggerClassLoader.java
similarity index 54%
copy from agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
copy to agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerClassLoader.java
index 9f7193d805a..dd54efa21ef 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/log/AgentLoggerClassLoader.java
@@ -15,35 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.classloader;
+package org.apache.shardingsphere.agent.core.log;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJar;
 
+import java.io.File;
 import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collections;
 
 /**
- * Class loader context.
+ * Agent logger class loader.
  */
-@RequiredArgsConstructor
-public final class ClassLoaderContext {
+public final class AgentLoggerClassLoader extends AgentExtraClassLoader {
     
-    private static final Map<ClassLoader, AgentClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
-    
-    @Getter
-    private final ClassLoader appClassLoader;
-    
-    private final Collection<PluginJar> pluginJars;
+    public AgentLoggerClassLoader(final Collection<PluginJar> pluginJars, final File resourcePath) {
+        super(AgentLoggerFactory.class.getClassLoader().getParent(), pluginJars, Collections.singleton(resourcePath));
+    }
     
-    /**
-     * Get agent class loader.
-     *
-     * @return agent class loader
-     */
-    public AgentClassLoader getAgentClassLoader() {
-        return AGENT_CLASS_LOADERS.computeIfAbsent(appClassLoader, key -> new AgentClassLoader(key, pluginJars));
+    public AgentLoggerClassLoader() {
+        super(AgentLoggerFactory.class.getClassLoader(), Collections.emptyList());
     }
 }
diff --git a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
index bd089937bea..4b63321b0f2 100644
--- a/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
+++ b/agent/core/src/main/java/org/apache/shardingsphere/agent/core/log/AgentLoggerFactory.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.agent.core.log;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.agent.core.classloader.AgentClassLoader;
 import org.apache.shardingsphere.agent.core.path.AgentPath;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJar;
 
@@ -32,9 +31,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
-import java.security.CodeSource;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedList;
 import java.util.jar.JarFile;
 
@@ -43,12 +40,12 @@ import java.util.jar.JarFile;
  */
 public final class AgentLoggerFactory {
     
-    private static AgentClassLoader classLoader;
+    private static AgentLoggerClassLoader classLoader;
     
     /**
      * Get logger.
      * 
-     * @param clazz Class
+     * @param clazz class
      * @return logger
      */
     @SneakyThrows(ReflectiveOperationException.class)
@@ -58,28 +55,35 @@ public final class AgentLoggerFactory {
         return new Logger(method.invoke(null, clazz));
     }
     
-    private static AgentClassLoader getClassLoader() {
+    private static AgentLoggerClassLoader getClassLoader() {
         if (null != classLoader) {
             return classLoader;
         }
-        classLoader = getLoggerClassLoader();
+        synchronized (AgentLoggerFactory.class) {
+            if (null == classLoader) {
+                classLoader = getAgentLoggerClassLoader();
+            }
+        }
         return classLoader;
     }
     
     @SneakyThrows({URISyntaxException.class, IOException.class})
-    private static AgentClassLoader getLoggerClassLoader() {
-        CodeSource codeSource = AgentLoggerFactory.class.getProtectionDomain().getCodeSource();
-        File agentFle = new File(codeSource.getLocation().toURI());
+    private static AgentLoggerClassLoader getAgentLoggerClassLoader() {
+        File agentFle = new File(AgentLoggerFactory.class.getProtectionDomain().getCodeSource().getLocation().toURI());
         if (agentFle.isFile() && agentFle.getName().endsWith(".jar")) {
-            Collection<File> jarFiles = new LinkedList<>(getJarFiles(new File(String.join(File.separator, AgentPath.getRootPath().getPath(), "lib"))));
-            Collection<PluginJar> pluginJars = new LinkedList<>();
-            for (File each : jarFiles) {
-                pluginJars.add(new PluginJar(new JarFile(each, true), each));
-            }
+            Collection<PluginJar> pluginJars = getPluginJars(getJarFiles(new File(String.join(File.separator, AgentPath.getRootPath().getPath(), "lib"))));
             File resourcePath = new File(String.join(File.separator, AgentPath.getRootPath().getPath(), "conf"));
-            return new AgentClassLoader(AgentLoggerFactory.class.getClassLoader().getParent(), pluginJars, Collections.singleton(resourcePath));
+            return new AgentLoggerClassLoader(pluginJars, resourcePath);
         }
-        return new AgentClassLoader(AgentLoggerFactory.class.getClassLoader(), Collections.emptyList());
+        return new AgentLoggerClassLoader();
+    }
+    
+    private static Collection<PluginJar> getPluginJars(final Collection<File> jarFiles) throws IOException {
+        Collection<PluginJar> result = new LinkedList<>();
+        for (File each : jarFiles) {
+            result.add(new PluginJar(new JarFile(each, true), each));
+        }
+        return result;
     }
     
     @SneakyThrows(IOException.class)
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/plugin/classloader/AgentPluginClassLoader.java
similarity index 54%
copy from agent/core/src/main/java/org/apache/shardingsphere/agent/core/classloader/ClassLoaderContext.java
copy to agent/core/src/main/java/org/apache/shardingsphere/agent/core/plugin/classloader/AgentPluginClassLoader.java
index 9f7193d805a..87e0fae995b 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/plugin/classloader/AgentPluginClassLoader.java
@@ -15,35 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.agent.core.classloader;
+package org.apache.shardingsphere.agent.core.plugin.classloader;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.agent.core.classloader.AgentExtraClassLoader;
 import org.apache.shardingsphere.agent.core.plugin.jar.PluginJar;
 
 import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collections;
 
 /**
- * Class loader context.
+ * Agent plugin class loader.
  */
-@RequiredArgsConstructor
-public final class ClassLoaderContext {
+public final class AgentPluginClassLoader extends AgentExtraClassLoader {
     
-    private static final Map<ClassLoader, AgentClassLoader> AGENT_CLASS_LOADERS = new ConcurrentHashMap<>();
-    
-    @Getter
-    private final ClassLoader appClassLoader;
-    
-    private final Collection<PluginJar> pluginJars;
-    
-    /**
-     * Get agent class loader.
-     *
-     * @return agent class loader
-     */
-    public AgentClassLoader getAgentClassLoader() {
-        return AGENT_CLASS_LOADERS.computeIfAbsent(appClassLoader, key -> new AgentClassLoader(key, pluginJars));
+    public AgentPluginClassLoader(final ClassLoader classLoader, final Collection<PluginJar> pluginJars) {
+        super(classLoader, pluginJars, Collections.emptyList());
     }
 }