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/openwebbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 2428122  OWB-1392 Use a different service to avoid breaking users by 
adding a new method. It also allows a clear separation of concerns
2428122 is described below

commit 24281227289cd7477e9a384fe6e7ea98126162f2
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Wed Oct 6 16:28:17 2021 +0200

    OWB-1392 Use a different service to avoid breaking users by adding a new 
method.
    It also allows a clear separation of concerns
---
 .../webbeans/proxy/AbstractProxyFactory.java       | 16 +++++++++++---
 .../webbeans/service/ClassLoaderProxyService.java  |  5 +++--
 .../service/ClassLoaderProxyServiceTest.java       | 16 --------------
 .../apache/webbeans/spi/DefiningClassService.java  |  8 -------
 ...Service.java => InstantiatingClassService.java} | 25 ++++------------------
 5 files changed, 20 insertions(+), 50 deletions(-)

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 040226d..34f3ee9 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
@@ -36,6 +36,7 @@ import org.apache.webbeans.exception.ProxyGenerationException;
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.hash.XxHash64;
 import org.apache.webbeans.spi.DefiningClassService;
+import org.apache.webbeans.spi.InstantiatingClassService;
 import org.apache.xbean.asm9.ClassReader;
 import org.apache.xbean.asm9.ClassWriter;
 import org.apache.xbean.asm9.MethodVisitor;
@@ -62,6 +63,7 @@ public abstract class AbstractProxyFactory
     protected final Unsafe unsafe;
 
     private final DefiningClassService definingService;
+    private final InstantiatingClassService instantiatingService;
 
     private final boolean useStaticNames;
     private final boolean useXXhash64;
@@ -84,11 +86,19 @@ public abstract class AbstractProxyFactory
         this.webBeansContext = webBeansContext;
         javaVersion = determineDefaultJavaVersion();
         definingService = 
webBeansContext.getService(DefiningClassService.class);
+
+        // if defining service implements both, we don't need to lookup the 
second service
+        instantiatingService = (definingService instanceof 
InstantiatingClassService)
+                               ? (InstantiatingClassService) definingService
+                               : 
webBeansContext.getService(InstantiatingClassService.class);
+
         useStaticNames = 
Boolean.parseBoolean(webBeansContext.getOpenWebBeansConfiguration()
                 .getProperty("org.apache.webbeans.proxy.useStaticNames"));
         useXXhash64 = 
Boolean.parseBoolean(webBeansContext.getOpenWebBeansConfiguration()
                 
.getProperty("org.apache.webbeans.proxy.staticNames.useXxHash64"));
-        unsafe = definingService == null ? new Unsafe() : null;
+
+        // we have fallbacks bellow to try Unsafe anyways if we can't do 
otherwise
+        unsafe = definingService == null || instantiatingService == null ? new 
Unsafe() : null;
     }
 
     private int determineDefaultJavaVersion()
@@ -338,9 +348,9 @@ public abstract class AbstractProxyFactory
 
     protected <T> T newInstance(final Class<? extends T> proxyClass)
     {
-        if (definingService != null)
+        if (instantiatingService != null)
         {
-            return definingService.newInstance(proxyClass);
+            return instantiatingService.newInstance(proxyClass);
         }
         return unsafe.unsafeNewInstance(proxyClass);
     }
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 632da45..9aeb00d 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
@@ -28,8 +28,9 @@ import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.spi.DefiningClassService;
+import org.apache.webbeans.spi.InstantiatingClassService;
 
-public class ClassLoaderProxyService implements DefiningClassService
+public class ClassLoaderProxyService implements DefiningClassService, 
InstantiatingClassService
 {
     private final ProxiesClassLoader loader;
 
@@ -124,7 +125,7 @@ public class ClassLoaderProxyService implements 
DefiningClassService
     }
 
     // strict load only impl, it changes LoadFirst by not creating a 
classloader at all (nice in graalvm) -@Experimental
-    public static class LoadOnly implements DefiningClassService
+    public static class LoadOnly implements DefiningClassService, 
InstantiatingClassService
     {
         @Override
         public ClassLoader getProxyClassLoader(final Class<?> forClass)
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
index be6fcd3..0b4f5f4 100644
--- 
a/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
@@ -44,29 +44,13 @@ public class ClassLoaderProxyServiceTest
         final ClassLoader proxyLoader = 
context.getService(DefiningClassService.class).getProxyClassLoader(proxyClass);
         assertEquals(proxyLoader, proxyClass.getClassLoader());
         proxyClass.getMethod("ok", String.class); // this line would fail if 
not here, no assert needed
-
-        // when using ClassLoaderProxyService, we don't use Unsafe to allocate 
the instance
-        // the regular reflection method newInstance is called and therefore 
the constructor gets called
-        // final Bean<MyBean> bean =
-        // final MyBean beanInstance = factory.createProxyInstance(proxyClass, 
factory.getInstanceProvider(proxyLoader, bean));
-        // assertTrue(beanInstance.isConstructorInvoked);
     }
 
     public static class MyBean
     {
-        private final boolean constructorInvoked;
-
-        public MyBean() {
-            this.constructorInvoked = true;
-        }
-
         public String ok(final String value)
         {
             return ">" + value + "<";
         }
-
-        public boolean isConstructorInvoked() {
-            return constructorInvoked;
-        }
     }
 }
diff --git 
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java 
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
index 3312b01..3bda2cd 100644
--- 
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
+++ 
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
@@ -40,12 +40,4 @@ public interface DefiningClassService
      * @return the proxy class
      */
     <T> Class<T> defineAndLoad(String name, byte[] bytecode, Class<T> 
proxiedClass);
-
-    /**
-     * Create a new instance for a given proxy class.
-     * @param proxyClass the proxy class
-     * @param <T> type of the class to proxy
-     * @return the proxy instance
-     */
-    <T> T newInstance(final Class<? extends T> proxyClass); // maybe a default 
method would make sense here
 }
diff --git 
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java 
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/InstantiatingClassService.java
similarity index 54%
copy from 
webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
copy to 
webbeans-spi/src/main/java/org/apache/webbeans/spi/InstantiatingClassService.java
index 3312b01..383da5d 100644
--- 
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
+++ 
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/InstantiatingClassService.java
@@ -19,33 +19,16 @@
 package org.apache.webbeans.spi;
 
 /**
- * SPI interface to implement the proxy defining logic.
- * It enables to switch from unsafe to classloader logic for instance for java 
>= 9.
+ * SPI interface to define the logic to allocate/instantiate proxy instances.
+ * We used to do that using Unsafe.allocateInstance, but better to give the 
choice
  */
-public interface DefiningClassService
+public interface InstantiatingClassService
 {
     /**
-     * Returns the classloader to use to define the given class.
-     * @param forClass the proxied class
-     * @return the classloader to use to define the class
-     */
-    ClassLoader getProxyClassLoader(Class<?> forClass);
-
-    /**
-     * Register the proxy class from its bytecode.
-     * @param name the proxy name
-     * @param bytecode the bytecode to "define"
-     * @param proxiedClass the original class
-     * @param <T> type of the class to proxy
-     * @return the proxy class
-     */
-    <T> Class<T> defineAndLoad(String name, byte[] bytecode, Class<T> 
proxiedClass);
-
-    /**
      * Create a new instance for a given proxy class.
      * @param proxyClass the proxy class
      * @param <T> type of the class to proxy
      * @return the proxy instance
      */
-    <T> T newInstance(final Class<? extends T> proxyClass); // maybe a default 
method would make sense here
+    <T> T newInstance(final Class<? extends T> proxyClass);
 }

Reply via email to