This is an automated email from the ASF dual-hosted git repository.
mivanac pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new de7834a03f GEODE-10407: check if class allready loaded (#7832)
de7834a03f is described below
commit de7834a03fb638401ce1f7c95a14e42febae8d9b
Author: Mario Ivanac <[email protected]>
AuthorDate: Wed Aug 24 10:14:18 2022 +0200
GEODE-10407: check if class allready loaded (#7832)
* GEODE-10407: check if class allready loaded
---
.../internal/classloader/ClassPathLoader.java | 6 +++
.../internal/classloader/ClasspathService.java | 3 ++
.../DeployJarChildFirstClassLoader.java | 7 +++
.../deployment/JarDeployerIntegrationTest.java | 54 ++++++++++++++++++++++
.../internal/LegacyClasspathServiceImpl.java | 4 ++
5 files changed, 74 insertions(+)
diff --git
a/geode-core/src/main/java/org/apache/geode/internal/classloader/ClassPathLoader.java
b/geode-core/src/main/java/org/apache/geode/internal/classloader/ClassPathLoader.java
index 3059cc3f15..2d503c02f4 100755
---
a/geode-core/src/main/java/org/apache/geode/internal/classloader/ClassPathLoader.java
+++
b/geode-core/src/main/java/org/apache/geode/internal/classloader/ClassPathLoader.java
@@ -196,4 +196,10 @@ public class ClassPathLoader {
public JarDeploymentService getJarDeploymentService() {
return jarDeploymentService;
}
+
+ public ClassLoader getClassloaderForArtifact(String artifactId) {
+ return classPathService.getClassloaderForArtifact(artifactId);
+ }
+
+
}
diff --git
a/geode-core/src/main/java/org/apache/geode/internal/classloader/ClasspathService.java
b/geode-core/src/main/java/org/apache/geode/internal/classloader/ClasspathService.java
index 047b20980b..de10cfd845 100644
---
a/geode-core/src/main/java/org/apache/geode/internal/classloader/ClasspathService.java
+++
b/geode-core/src/main/java/org/apache/geode/internal/classloader/ClasspathService.java
@@ -55,4 +55,7 @@ public interface ClasspathService {
InputStream getResourceAsStream(final String name);
Enumeration<URL> getResources(final String name) throws IOException;
+
+ ClassLoader getClassloaderForArtifact(String artifactId);
+
}
diff --git
a/geode-core/src/main/java/org/apache/geode/internal/classloader/DeployJarChildFirstClassLoader.java
b/geode-core/src/main/java/org/apache/geode/internal/classloader/DeployJarChildFirstClassLoader.java
index 457df4287a..f10974a5f2 100644
---
a/geode-core/src/main/java/org/apache/geode/internal/classloader/DeployJarChildFirstClassLoader.java
+++
b/geode-core/src/main/java/org/apache/geode/internal/classloader/DeployJarChildFirstClassLoader.java
@@ -70,6 +70,13 @@ public class DeployJarChildFirstClassLoader extends
ChildFirstClassLoader {
for (DeployJarChildFirstClassLoader sibling :
artifactIdsToClassLoader.values().stream()
.filter(Objects::nonNull).collect(Collectors.toList())) {
try {
+ if (sibling.thisIsOld()) {
+ continue;
+ }
+ c = sibling.findLoadedClass(name);
+ if (c != null) {
+ break;
+ }
c = sibling.findClass(name);
if (c != null) {
break;
diff --git
a/geode-deployment/geode-deployment-legacy/src/integrationTest/java/org/apache/geode/internal/deployment/JarDeployerIntegrationTest.java
b/geode-deployment/geode-deployment-legacy/src/integrationTest/java/org/apache/geode/internal/deployment/JarDeployerIntegrationTest.java
index c4154db798..044fa9efa1 100644
---
a/geode-deployment/geode-deployment-legacy/src/integrationTest/java/org/apache/geode/internal/deployment/JarDeployerIntegrationTest.java
+++
b/geode-deployment/geode-deployment-legacy/src/integrationTest/java/org/apache/geode/internal/deployment/JarDeployerIntegrationTest.java
@@ -52,6 +52,8 @@ public class JarDeployerIntegrationTest {
private static File plainJarVersion1, plainJarVersion1b, plainJarVersion2,
semanticJarVersion1,
semanticJarVersion2, semanticJarVersion1b, semanticJarVersion1c;
+ private static File baseJar;
+
private File deployedDir;
@BeforeClass
@@ -74,6 +76,10 @@ public class JarDeployerIntegrationTest {
jarBuilder.buildJar(semanticJarVersion1b, createClassContent("version1b",
"Def"));
semanticJarVersion1c = new File(stagedTempDir.newFolder("v1c"), "def.jar");
jarBuilder.buildJar(semanticJarVersion1c, createClassContent("version1c",
"Def"));
+
+ baseJar = new File(stagedDir, "base.jar");
+ jarBuilder.buildJar(baseJar, create1ClassContent("ExceptionA"),
+ create2ClassContent("ExceptionB", "ExceptionA"));
}
@Before
@@ -202,6 +208,31 @@ public class JarDeployerIntegrationTest {
.isInstanceOf(ClassNotFoundException.class);
}
+ @Test
+ public void deploy2JarsSetCurrentClassloaderTo1stAndLoadClassFrom2nd()
throws Exception {
+
+ // deploy def-1.0.jar
+ jarDeployer.deploy(semanticJarVersion1);
+
+ // deploy base.jar
+ DeployedJar deployedJar = jarDeployer.deploy(baseJar);
+
+ assertThat(deployedJar).isNotNull();
+
+ ClassPathLoader oldLoader = ClassPathLoader.getLatest();
+
+ // set current classloader to 1st
+ ClassLoader cl = oldLoader.getClassloaderForArtifact("def");
+
+ // load extended class and base class
+ cl.loadClass("jddunit.function2.ExceptionB");
+
+ // load base class
+ cl.loadClass("jddunit.function1.ExceptionA");
+
+ }
+
+
private String getVersion(String classname) throws Exception {
Class<?> def = ClassPathLoader.getLatest().forName(classname);
assertThat(def).isNotNull();
@@ -216,4 +247,27 @@ public class JarDeployerIntegrationTest {
+ "public void execute(FunctionContext context)
{context.getResultSender().lastResult(\""
+ version + "\");}}";
}
+
+ private static String create1ClassContent(String className1) {
+ return "package jddunit.function1;"
+ + "public class "
+ + className1 + " extends Exception {"
+ + "private static final long serialVersionUID = 1L;"
+ + "public " + className1 + "(String message) {"
+ + " super(message);"
+ + "}"
+ + "}";
+ }
+
+ private static String create2ClassContent(String className1, String
className2) {
+ return "package jddunit.function2;" + "import jddunit.function1." +
className2 + ";"
+ + "public class "
+ + className1 + " extends " + className2 + " {"
+ + "private static final long serialVersionUID = 1L;"
+ + "public " + className1 + "(String message) {"
+ + " super(message);"
+ + "}"
+ + "}";
+ }
+
}
diff --git
a/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java
b/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java
index b09f85e3ba..8bb116dbc3 100644
---
a/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java
+++
b/geode-deployment/geode-deployment-legacy/src/main/java/org/apache/geode/classloader/internal/LegacyClasspathServiceImpl.java
@@ -247,6 +247,10 @@ public class LegacyClasspathServiceImpl implements
ClasspathService {
return null;
}
+ public ClassLoader getClassloaderForArtifact(String artifactId) {
+ return artifactIdsToClassLoader.get(artifactId);
+ }
+
private synchronized void rebuildClassLoaderForDeployedJars() {
leafLoader = null;
List<Deployment> deployments = jarDeploymentService.listDeployed();