This is an automated email from the ASF dual-hosted git repository.

benw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/master by this push:
     new e45fc77dc core: ThrowawayClassLoader extract test logic to actual test
e45fc77dc is described below

commit e45fc77dc8063d5cd7ac428de0f24ba7008baf69
Author: Ben Weidig <[email protected]>
AuthorDate: Sat Aug 30 13:37:42 2025 +0200

    core: ThrowawayClassLoader extract test logic to actual test
---
 .../tapestry5/internal/ThrowawayClassLoader.java   | 83 +++++++---------------
 .../internal/ThrowawayClassLoaderTest.java         | 47 ++++++++++++
 2 files changed, 74 insertions(+), 56 deletions(-)

diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
index 62c133210..7db3c6ff7 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
@@ -1,4 +1,4 @@
-// Copyright 2024 The Apache Software Foundation
+// Copyright 2024, 2025 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,92 +14,63 @@
 
 package org.apache.tapestry5.internal;
 
-import static org.junit.Assert.assertNotEquals;
-
 import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
 
 public class ThrowawayClassLoader extends ClassLoader
 {
+    private final ClassLoader parent;
 
-    final private ClassLoader parent;
-    
-    public ThrowawayClassLoader(ClassLoader parent) 
+    public ThrowawayClassLoader(ClassLoader parent)
     {
         super(parent);
         this.parent = parent;
     }
-    
+
     @Override
-    protected Class<?> loadClass(String name, boolean resolve) throws 
ClassNotFoundException 
+    protected Class<?> loadClass(String name, boolean resolve) throws 
ClassNotFoundException
     {
-        synchronized (getClassLoadingLock(name)) 
-        
+        synchronized (getClassLoadingLock(name))
         {
             // First, check if the class has already been loaded
             Class<?> c = findLoadedClass(name);
-            if (c == null) {
-                if (name.contains(".base.") || name.contains(".pages.") ||
-                        name.contains(".components.") || 
name.contains(".mixins."))
-                {
-                    final byte[] bytes = 
PlasticInternalUtils.readBytecodeForClass(parent, name, true);
-                    c = defineClass(name, bytes, 0, bytes.length);
-                    if (resolve) 
-                    {
-                        resolveClass(c);
-                    }
-                }
-                else
+            if (c != null)
+                return c;
+
+            if (name.contains(".base.") || name.contains(".pages.") || 
name.contains(".components.")
+                    || name.contains(".mixins."))
+            {
+                final byte[] bytes = 
PlasticInternalUtils.readBytecodeForClass(parent, name, true);
+                c = defineClass(name, bytes, 0, bytes.length);
+                if (resolve)
                 {
-                    c = parent.loadClass(name);
+                    resolveClass(c);
                 }
             }
+            else
+            {
+                c = parent.loadClass(name);
+            }
+
             return c;
-        }    
+        }
     }
 
-    public static void main(String[] args) throws Exception 
-    {
-        
-        final String className = 
"org.apache.tapestry5.corelib.components.BeanEditor";
-        
-        final ClassLoader parentClassLoader = 
ThrowawayClassLoader.class.getClassLoader();
-        ClassLoader classLoader1 = create(parentClassLoader);
-        ClassLoader classLoader2 = create(parentClassLoader);
-        
-        System.out.println("Parent class loader 1: " + parentClassLoader);
-        System.out.println("Class loader 1       : " + classLoader1);
-        System.out.println("Class loader 2       : " + classLoader2);
-        
-        Class class1 = classLoader1.loadClass(className);
-        Class class2 = classLoader2.loadClass(className);
-        Class class3 = parentClassLoader.loadClass(className);
-
-        System.out.println("Class 1 : " + class1.getClassLoader());
-        System.out.println("Class 2 : " + class2.getClassLoader());
-        System.out.println("Class 3 : " + class3.getClassLoader());        
-        
-        assertNotEquals(class1, class2);
-        assertNotEquals(class1, class3);
-        assertNotEquals(class2, class3);
-        
-    }
-    
     public static Class<?> load(final String className)
     {
         ThrowawayClassLoader loader = new ThrowawayClassLoader(
                 ThrowawayClassLoader.class.getClassLoader());
-        try 
+        try
         {
             return loader.loadClass(className);
-        } catch (ClassNotFoundException e) 
+        }
+        catch (ClassNotFoundException e)
         {
             throw new RuntimeException(e);
         }
     }
 
-    private static ClassLoader create(final ClassLoader parentClassLoader) {
-//        return 
TapestryInternalUtils.createThrowawayClassloader(parentClassLoader);
+    static ClassLoader create(final ClassLoader parentClassLoader)
+    {
         return new ThrowawayClassLoader(parentClassLoader);
     }
-    
 }
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
new file mode 100644
index 000000000..1b1c6c135
--- /dev/null
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
@@ -0,0 +1,47 @@
+// Copyright 2025 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.internal;
+
+import static org.testng.Assert.assertNotEquals;
+
+import org.testng.annotations.Test;
+
+class ThrowawayClassLoaderTest
+{
+
+    @Test
+    void testClassesArenEqualFromDifferentClassloaders() throws 
ClassNotFoundException
+    {
+        // ARRANGE
+
+        String className = 
"org.apache.tapestry5.corelib.components.BeanEditor";
+
+        ClassLoader parentClassLoader = 
ThrowawayClassLoader.class.getClassLoader();
+        ClassLoader classLoader1 = 
ThrowawayClassLoader.create(parentClassLoader);
+        ClassLoader classLoader2 = 
ThrowawayClassLoader.create(parentClassLoader);
+
+        // ACT
+
+        Class<?> class1 = classLoader1.loadClass(className);
+        Class<?> class2 = classLoader2.loadClass(className);
+        Class<?> class3 = parentClassLoader.loadClass(className);
+
+        // ASSERT
+
+        assertNotEquals(class1, class2);
+        assertNotEquals(class1, class3);
+        assertNotEquals(class2, class3);
+    }
+}

Reply via email to