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 a6e6e40  [OWB-1325] adding ClassLoaderProxyService.Spy 
DefiningClassService for toolings
a6e6e40 is described below

commit a6e6e40782f082655097d7f84338293e6d7f5fae
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
AuthorDate: Wed Jun 3 18:26:17 2020 +0200

    [OWB-1325] adding ClassLoaderProxyService.Spy DefiningClassService for 
toolings
---
 .../webbeans/service/ClassLoaderProxyService.java  | 46 ++++++++++++++++++++--
 1 file changed, 42 insertions(+), 4 deletions(-)

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 618a898..9946850 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
@@ -19,6 +19,8 @@
 package org.apache.webbeans.service;
 
 import java.security.ProtectionDomain;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -31,7 +33,15 @@ public class ClassLoaderProxyService implements 
DefiningClassService
 
     public ClassLoaderProxyService(final WebBeansContext context)
     {
-        this.loader = new 
ProxiesClassLoader(context.getApplicationBoundaryService().getApplicationClassLoader());
+        this.loader = new ProxiesClassLoader(
+                context,
+                Boolean.parseBoolean(context.getOpenWebBeansConfiguration()
+                        .getProperty(getClass().getName() + ".skipPackages")));
+    }
+
+    protected ClassLoaderProxyService(final ProxiesClassLoader loader)
+    {
+        this.loader = loader;
     }
 
     @Override
@@ -47,13 +57,38 @@ public class ClassLoaderProxyService implements 
DefiningClassService
                 name, bytecode, proxiedClass.getPackage(), 
proxiedClass.getProtectionDomain());
     }
 
+    // for build tools - @Experimental
+    public static class Spy extends ClassLoaderProxyService
+    {
+        private final Map<String, byte[]> proxies = new HashMap<>();
+
+        public Spy(final WebBeansContext context)
+        {
+            super(new ProxiesClassLoader(context, true));
+        }
+
+        public Map<String, byte[]> getProxies()
+        {
+            return proxies;
+        }
+
+        @Override
+        public <T> Class<T> defineAndLoad(final String name, final byte[] 
bytecode, final Class<T> proxiedClass)
+        {
+            proxies.put(name, bytecode);
+            return super.defineAndLoad(name, bytecode, proxiedClass);
+        }
+    }
+
     private static class ProxiesClassLoader extends ClassLoader
     {
+        private final boolean skipPackages;
         private final ConcurrentMap<String, Class<?>> classes = new 
ConcurrentHashMap<>();
 
-        private ProxiesClassLoader(final ClassLoader applicationClassLoader)
+        private ProxiesClassLoader(final WebBeansContext context, boolean 
skipPackages)
         {
-            super(applicationClassLoader);
+            
super(context.getApplicationBoundaryService().getApplicationClassLoader());
+            this.skipPackages = skipPackages;
         }
 
 
@@ -80,7 +115,10 @@ public class ClassLoaderProxyService implements 
DefiningClassService
                     existing = classes.get(key);
                     if (existing == null)
                     {
-                        definePackageFor(pck, protectionDomain);
+                        if (!skipPackages)
+                        {
+                            definePackageFor(pck, protectionDomain);
+                        }
                         existing = super.defineClass(proxyClassName, 
proxyBytes, 0, proxyBytes.length);
                         resolveClass(existing);
                         classes.put(key, existing);

Reply via email to