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

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


The following commit(s) were added to refs/heads/master by this push:
     new f61b87d  TOMEE-3802 Consistent proxy creation between TomEE and OWB
f61b87d is described below

commit f61b87d0928caa948f8273514a2df9ff59727381
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Tue Oct 5 14:53:31 2021 +0200

    TOMEE-3802 Consistent proxy creation between TomEE and OWB
---
 .../java/org/apache/openejb/assembler/classic/Assembler.java   | 10 ++++++++++
 .../org/apache/openejb/cdi/ThreadSingletonServiceImpl.java     | 10 ++++++++++
 .../main/java/org/apache/openejb/util/proxy/ClassDefiner.java  | 10 +++++++---
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index f9e33b0..ea85561 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -145,6 +145,7 @@ import org.apache.openejb.util.URISupport;
 import org.apache.openejb.util.URLs;
 import org.apache.openejb.util.classloader.ClassLoaderAwareHandler;
 import org.apache.openejb.util.classloader.URLClassLoaderFirst;
+import org.apache.openejb.util.proxy.ClassDefiner;
 import org.apache.openejb.util.proxy.ProxyFactory;
 import org.apache.openejb.util.proxy.ProxyManager;
 import org.apache.webbeans.component.ResourceBean;
@@ -152,9 +153,11 @@ import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.inject.OWBInjector;
 import org.apache.webbeans.logger.JULLoggerFactory;
+import org.apache.webbeans.service.ClassLoaderProxyService;
 import org.apache.webbeans.spi.BeanArchiveService;
 import org.apache.webbeans.spi.ContainerLifecycle;
 import org.apache.webbeans.spi.ContextsService;
+import org.apache.webbeans.spi.DefiningClassService;
 import org.apache.webbeans.spi.JNDIService;
 import org.apache.webbeans.spi.LoaderService;
 import org.apache.webbeans.spi.ResourceInjectionService;
@@ -1794,6 +1797,13 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
             properties.setProperty(ResourceInjectionService.class.getName(), 
CdiResourceInjectionService.class.getName());
             properties.setProperty(TransactionService.class.getName(), 
OpenEJBTransactionService.class.getName());
 
+            // for Java 9 and above, using Unsafe does not work well to create 
proxies
+            // OWB has support for classloader defineClass but this isn't done 
automagically
+            // like in ClassDefiner. We need to explicitly set the Proxy 
service
+            if (ClassDefiner.isClassLoaderDefineClass()) {
+                properties.setProperty(DefiningClassService.class.getName(), 
ClassLoaderProxyService.class.getName());
+            }
+
             webBeansContext = new WebBeansContext(services, properties);
 
             appContext.setCdiEnabled(false);
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index 325da56..8cc38bd 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -33,6 +33,7 @@ import org.apache.openejb.util.ExecutorBuilder;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.classloader.MultipleClassLoader;
+import org.apache.openejb.util.proxy.ClassDefiner;
 import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
@@ -41,11 +42,13 @@ import 
org.apache.webbeans.intercept.ApplicationScopedBeanInterceptorHandler;
 import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler;
 import org.apache.webbeans.intercept.RequestScopedBeanInterceptorHandler;
 import org.apache.webbeans.intercept.SessionScopedBeanInterceptorHandler;
+import org.apache.webbeans.service.ClassLoaderProxyService;
 import org.apache.webbeans.spi.ApplicationBoundaryService;
 import org.apache.webbeans.spi.BeanArchiveService;
 import org.apache.webbeans.spi.ContainerLifecycle;
 import org.apache.webbeans.spi.ContextsService;
 import org.apache.webbeans.spi.ConversationService;
+import org.apache.webbeans.spi.DefiningClassService;
 import org.apache.webbeans.spi.JNDIService;
 import org.apache.webbeans.spi.LoaderService;
 import org.apache.webbeans.spi.ResourceInjectionService;
@@ -148,6 +151,13 @@ public class ThreadSingletonServiceImpl implements 
ThreadSingletonService {
         properties.put(TransactionService.class.getName(), 
OpenEJBTransactionService.class.getName());
         properties.put("org.apache.webbeans.component.PrincipalBean.proxy", 
"false");
 
+        // for Java 9 and above, using Unsafe does not work well to create 
proxies
+        // OWB has support for classloader defineClass but this isn't done 
automagically
+        // like in ClassDefiner. We need to explicitly set the Proxy service
+        if (ClassDefiner.isClassLoaderDefineClass()) {
+            properties.setProperty(DefiningClassService.class.getName(), 
ClassLoaderProxyService.class.getName());
+        }
+
 
         // NOTE: ensure user can extend/override all the services = set it 
only if not present in properties, see WebBeansContext#getService()
         final Map<Class<?>, Object> services = new HashMap<>();
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ClassDefiner.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ClassDefiner.java
index 554917e..b27bf87 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ClassDefiner.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ClassDefiner.java
@@ -65,15 +65,19 @@ public class ClassDefiner {
     }
 
     private ClassDefiner() {
+        // no-op
+    }
 
+    public static boolean isClassLoaderDefineClass() {
+        return CLASS_LOADER_DEFINE_CLASS != null;
     }
 
     public static Class<?> defineClass(final ClassLoader loader, final String 
className, final byte[] b,
                                        final Class<?> originalClass, final 
ProtectionDomain protectionDomain) {
-        if (CLASS_LOADER_DEFINE_CLASS == null) {
-            return defineClassMethodHandles(loader, className, b, 
originalClass, protectionDomain);
-        } else {
+        if (isClassLoaderDefineClass()) {
             return defineClassClassLoader(loader, className, b, originalClass, 
protectionDomain);
+        } else {
+            return defineClassMethodHandles(loader, className, b, 
originalClass, protectionDomain);
         }
     }
 

Reply via email to