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