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 <[email protected]>
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);