You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2020/06/03 16:47:27 UTC

[openwebbeans] branch master updated: [OWB-1325] adding ClassLoaderProxyService.LoadFirst, companion of Spy flavor which behaves exactly as ClassLoaderProxyService but trying first to load the class in the proxied class or TCCL

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

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 1f83552  [OWB-1325] adding ClassLoaderProxyService.LoadFirst, companion of Spy flavor which behaves exactly as ClassLoaderProxyService but trying first to load the class in the proxied class or TCCL
1f83552 is described below

commit 1f83552e74c7966fc1009a3a7417900e7ce42b32
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Jun 3 18:47:21 2020 +0200

    [OWB-1325] adding ClassLoaderProxyService.LoadFirst, companion of Spy flavor which behaves exactly as ClassLoaderProxyService but trying first to load the class in the proxied class or TCCL
---
 .../webbeans/proxy/AbstractProxyFactory.java       |  8 ++++++
 .../webbeans/service/ClassLoaderProxyService.java  | 29 ++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
index 2ec4daa..42ccb69 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
@@ -58,6 +58,8 @@ public abstract class AbstractProxyFactory
 
     private final DefiningClassService definingService;
 
+    private final boolean useStaticNames;
+
     protected WebBeansContext webBeansContext;
 
     private final int javaVersion;
@@ -76,6 +78,8 @@ public abstract class AbstractProxyFactory
         this.webBeansContext = webBeansContext;
         javaVersion = determineDefaultJavaVersion();
         definingService = webBeansContext.getService(DefiningClassService.class);
+        useStaticNames = Boolean.parseBoolean(webBeansContext.getOpenWebBeansConfiguration()
+                .getProperty("org.apache.webbeans.proxy.useStaticNames"));
         unsafe = definingService == null ? new Unsafe() : null;
     }
 
@@ -192,6 +196,10 @@ public abstract class AbstractProxyFactory
         proxyClassName = fixPreservedPackages(proxyClassName);
 
         String finalName = proxyClassName;
+        if (useStaticNames)  // todo: refine
+        {
+            return proxyClassName + 0;
+        }
 
         for (int i = 0; i < MAX_CLASSLOAD_TRIES; i++)
         {
diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java b/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
index 9946850..9a564ec 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.DefiningClassService;
 
 public class ClassLoaderProxyService implements DefiningClassService
@@ -80,6 +81,34 @@ public class ClassLoaderProxyService implements DefiningClassService
         }
     }
 
+    // runtim companion of Spy - @Experimental
+    public static class LoadFirst extends ClassLoaderProxyService
+    {
+        public LoadFirst(final WebBeansContext context)
+        {
+            super(context);
+        }
+
+        @Override
+        public <T> Class<T> defineAndLoad(final String name, final byte[] bytecode, final Class<T> proxiedClass)
+        {
+            ClassLoader proxyClassLoader = getProxyClassLoader(proxiedClass);
+            if (proxyClassLoader == null)
+            {
+                proxyClassLoader = Thread.currentThread().getContextClassLoader();
+            }
+            try
+            {
+                return (Class<T>) proxyClassLoader.loadClass(name);
+            }
+            catch (final ClassNotFoundException e)
+            {
+                WebBeansLoggerFacade.getLogger(getClass()).warning(e.getMessage());
+                return super.defineAndLoad(name, bytecode, proxiedClass);
+            }
+        }
+    }
+
     private static class ProxiesClassLoader extends ClassLoader
     {
         private final boolean skipPackages;