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