ARIES-2052 ProxyServices#supportsClassDefining() in weld 3.1.7 breaks aries-cdi

Signed-off-by: Raymond Augé <rotty3000@apache.org>
diff --git a/.gitignore b/.gitignore
index dddad45..6f59cd9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 target
 *.iml
 .idea
+.vscode
\ No newline at end of file
diff --git a/cdi-executable/weld-executable.bndrun b/cdi-executable/weld-executable.bndrun
index 792d4a5..e2b99cb 100644
--- a/cdi-executable/weld-executable.bndrun
+++ b/cdi-executable/weld-executable.bndrun
@@ -11,12 +11,25 @@
 #    limitations under the License.
 
 -include: base.bndrun
+
 #-runjdb: 8000
 
+_runee.version: ${substring;${-runee};7}
+_java.opens: "--add-opens", "java.base/java.lang=ALL-UNNAMED"
+
+-runvm.weld: ${if;${ncompare;${_runee.version};1.8};${list;_java.opens}}
+-runsystemcapabilities.weld: \
+	osgi.contract;\
+		osgi.contract=JavaAnnotation;\
+		uses:="javax.annotation,javax.annotation.sql,javax.annotation.security";\
+		version:List<Version>="1.3,1.2,1.1,1.0"
+-runpath.weld: \
+	org.apache.geronimo.specs.geronimo-annotation_1.3_spec,\
+	org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec
+
 -runrequires: \
 	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.weld)',\
-	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
-	osgi.identity;filter:='(osgi.identity=org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec)'
+	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)'
 
 -runblacklist: \
 	osgi.identity;filter:='(osgi.identity=*owb*)'
@@ -33,15 +46,12 @@
 	org.apache.felix.gogo.command;version='[1.1.0,1.1.1)',\
 	org.apache.felix.gogo.runtime;version='[1.1.2,1.1.3)',\
 	org.apache.felix.gogo.shell;version='[1.1.2,1.1.3)',\
-	org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
-	org.apache.geronimo.specs.geronimo-annotation_1.3_spec;version='[1.3.0,1.3.1)',\
 	org.apache.geronimo.specs.geronimo-atinject_1.0_spec;version='[1.1.0,1.1.1)',\
 	org.apache.geronimo.specs.geronimo-el_2.2_spec;version='[1.1.0,1.1.1)',\
 	org.apache.geronimo.specs.geronimo-interceptor_1.2_spec;version='[1.2.0,1.2.1)',\
 	org.apache.geronimo.specs.geronimo-jcdi_2.0_spec;version='[1.1.0,1.1.1)',\
 	org.jboss.logging.jboss-logging;version='[3.4.1,3.4.2)',\
-	org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec;version='[2.0.0,2.0.1)',\
-	org.jboss.weld.osgi-bundle;version='[3.1.3,3.1.4)',\
+	org.jboss.weld.osgi-bundle;version='[3.1.7,3.1.8)',\
 	org.osgi.service.cdi;version='[1.0.0,1.0.1)',\
 	org.osgi.util.function;version='[1.1.0,1.1.1)',\
 	org.osgi.util.promise;version='[1.1.0,1.1.1)'
diff --git a/cdi-itests/owb-itest.bndrun b/cdi-itests/owb-itest.bndrun
index 263b2c9..a0accb4 100644
--- a/cdi-itests/owb-itest.bndrun
+++ b/cdi-itests/owb-itest.bndrun
@@ -20,6 +20,7 @@
 	osgi.identity;filter:='(osgi.identity=*weld*)'
 -runbundles: \
 	assertj-core;version='[3.17.2,3.17.3)',\
+	jakarta.xml.bind-api;version='[2.3.2,2.3.3)',\
 	javax.servlet.jsp-api;version='[2.3.3,2.3.4)',\
 	jcl.over.slf4j;version='[1.7.30,1.7.31)',\
 	openwebbeans-impl;version='[2.0.13,2.0.14)',\
@@ -35,7 +36,7 @@
 	org.apache.aries.cdi.itests;version='[1.1.4,1.1.5)',\
 	org.apache.aries.cdi.owb;version='[1.1.4,1.1.5)',\
 	org.apache.aries.cdi.spi;version='[1.1.4,1.1.5)',\
-	org.apache.aries.jax.rs.whiteboard;version='[1.0.6,1.0.7)',\
+	org.apache.aries.jax.rs.whiteboard;version='[1.1.0,1.1.1)',\
 	org.apache.aries.jndi.api;version='[1.1.0,1.1.1)',\
 	org.apache.aries.jndi.core;version='[1.0.2,1.0.3)',\
 	org.apache.aries.spifly.dynamic.framework.extension;version='[1.3.2,1.3.3)',\
diff --git a/cdi-itests/weld-itest.bndrun b/cdi-itests/weld-itest.bndrun
index 9c57b94..7955bb8 100644
--- a/cdi-itests/weld-itest.bndrun
+++ b/cdi-itests/weld-itest.bndrun
@@ -11,16 +11,30 @@
 #    limitations under the License.
 
 -include: base-itest.bndrun
+
 #-runjdb: 8000
 
+_runee.version: ${substring;${-runee};7}
+_java.opens: "--add-opens", "java.base/java.lang=ALL-UNNAMED"
+
+-runvm.weld: ${if;${ncompare;${_runee.version};1.8};${list;_java.opens}}
+-runsystemcapabilities.weld: \
+	osgi.contract;\
+		osgi.contract=JavaAnnotation;\
+		uses:="javax.annotation,javax.annotation.sql,javax.annotation.security";\
+		version:List<Version>="1.3,1.2,1.1,1.0"
+-runpath.weld: \
+	org.apache.geronimo.specs.geronimo-annotation_1.3_spec,\
+	org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec
+
 -runrequires: \
-	osgi.identity;filter:='(osgi.identity=org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec)',\
 	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.weld)'
 
 -runblacklist: \
 	osgi.identity;filter:='(osgi.identity=*owb*)'
 -runbundles: \
 	assertj-core;version='[3.17.2,3.17.3)',\
+	jakarta.xml.bind-api;version='[2.3.2,2.3.3)',\
 	jboss-classfilewriter;version='[1.2.4,1.2.5)',\
 	jcl.over.slf4j;version='[1.7.30,1.7.31)',\
 	org.apache.aries.cdi.extender;version='[1.1.4,1.1.5)',\
@@ -33,7 +47,7 @@
 	org.apache.aries.cdi.itests;version='[1.1.4,1.1.5)',\
 	org.apache.aries.cdi.spi;version='[1.1.4,1.1.5)',\
 	org.apache.aries.cdi.weld;version='[1.1.4,1.1.5)',\
-	org.apache.aries.jax.rs.whiteboard;version='[1.0.6,1.0.7)',\
+	org.apache.aries.jax.rs.whiteboard;version='[1.1.0,1.1.1)',\
 	org.apache.aries.jndi.api;version='[1.1.0,1.1.1)',\
 	org.apache.aries.jndi.core;version='[1.0.2,1.0.3)',\
 	org.apache.aries.spifly.dynamic.framework.extension;version='[1.3.2,1.3.3)',\
@@ -45,7 +59,6 @@
 	org.apache.felix.gogo.shell;version='[1.1.2,1.1.3)',\
 	org.apache.felix.http.jetty;version='[4.1.4,4.1.5)',\
 	org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
-	org.apache.geronimo.specs.geronimo-annotation_1.3_spec;version='[1.3.0,1.3.1)',\
 	org.apache.geronimo.specs.geronimo-atinject_1.0_spec;version='[1.1.0,1.1.1)',\
 	org.apache.geronimo.specs.geronimo-el_2.2_spec;version='[1.1.0,1.1.1)',\
 	org.apache.geronimo.specs.geronimo-interceptor_1.2_spec;version='[1.2.0,1.2.1)',\
@@ -55,8 +68,7 @@
 	org.apache.httpcomponents.httpcore;version='[4.4.14,4.4.15)',\
 	org.apache.servicemix.bundles.junit;version='[4.13.0,4.13.1)',\
 	org.jboss.logging.jboss-logging;version='[3.4.1,3.4.2)',\
-	org.jboss.spec.javax.ejb.jboss-ejb-api_3.2_spec;version='[2.0.0,2.0.1)',\
-	org.jboss.weld.osgi-bundle;version='[3.1.3,3.1.4)',\
+	org.jboss.weld.osgi-bundle;version='[3.1.7,3.1.8)',\
 	org.osgi.service.cdi;version='[1.0.0,1.0.1)',\
 	org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
 	org.osgi.test.common;version='[0.10.0,0.10.1)',\
diff --git a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/BundleResourcesLoader.java b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/BundleResourcesLoader.java
index 4485138..bfe2d87 100644
--- a/cdi-weld/src/main/java/org/apache/aries/cdi/weld/BundleResourcesLoader.java
+++ b/cdi-weld/src/main/java/org/apache/aries/cdi/weld/BundleResourcesLoader.java
@@ -16,11 +16,16 @@
 
 import java.io.IOException;
 import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.security.ProtectionDomain;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.aries.cdi.spi.loader.SpiLoader;
 import org.jboss.weld.resources.spi.ResourceLoader;
@@ -34,6 +39,36 @@
 
 public class BundleResourcesLoader implements ProxyServices, ResourceLoader {
 
+	private static java.lang.reflect.Method defineClass1, defineClass2;
+	private static final AtomicBoolean classLoaderMethodsMadeAccessible = new AtomicBoolean(false);
+
+	public static void makeClassLoaderMethodsAccessible() {
+		// the AtomicBoolean make sure this gets invoked only once as WeldStartup is triggered per deployment
+		if (classLoaderMethodsMadeAccessible.compareAndSet(false, true)) {
+			try {
+				AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+					@Override
+					public Object run() throws Exception {
+						Class<?> cl = Class.forName("java.lang.ClassLoader");
+						final String name = "defineClass";
+
+						defineClass1 = cl.getDeclaredMethod(name, String.class, byte[].class, int.class, int.class);
+						defineClass2 = cl.getDeclaredMethod(name, String.class, byte[].class, int.class, int.class, ProtectionDomain.class);
+						defineClass1.setAccessible(true);
+						defineClass2.setAccessible(true);
+						return null;
+					}
+				});
+			} catch (PrivilegedActionException pae) {
+				throw new RuntimeException("cannot initialize ClassPool", pae.getException());
+			}
+		}
+	}
+
+	static {
+		makeClassLoaderMethodsAccessible();
+	}
+
 	BundleResourcesLoader(SpiLoader loader, Bundle spiImplBundle) {
 		BundleWiring spiImplWiring = spiImplBundle.adapt(BundleWiring.class);
 
@@ -84,6 +119,34 @@
 	}
 
 	@Override
+	public Class<?> defineClass(Class<?> originalClass, String className, byte[] classBytes, int off, int len) throws ClassFormatError {
+		return defineClass(originalClass, className, classBytes, off, len, null);
+	}
+
+	@Override
+	public Class<?> defineClass(Class<?> originalClass, String className, byte[] classBytes, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError {
+		try {
+			java.lang.reflect.Method method;
+			Object[] args;
+			if (protectionDomain == null) {
+				method = defineClass1;
+				args = new Object[]{className, classBytes, 0, len};
+			} else {
+				method = defineClass2;
+				args = new Object[]{className, classBytes, 0, len, protectionDomain};
+			}
+			Class<?> clazz = (Class<?>) method.invoke(_classLoader, args);
+			return clazz;
+		} catch (RuntimeException e) {
+			throw e;
+		} catch (java.lang.reflect.InvocationTargetException e) {
+			throw new RuntimeException(e.getTargetException());
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@Override
 	public ClassLoader getClassLoader(Class<?> proxiedBeanType) {
 		return _classLoader;
 	}
@@ -108,6 +171,16 @@
 		}
 	}
 
+	@Override
+	public Class<?> loadClass(Class<?> originalClass, String className) throws ClassNotFoundException {
+		return _classLoader.loadClass(className);
+	}
+
+	@Override
+	public boolean supportsClassDefining() {
+		return true;
+	}
+
 	private static final String ERROR_LOADING_CLASS = "Error loading class ";
 
 	private final ClassLoader _classLoader;
diff --git a/pom.xml b/pom.xml
index 861b28a..1f7ee54 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
 		<owb.version>2.0.13</owb.version>
 		<slf4j.version>1.7.30</slf4j.version>
 		<surefire.version>2.12</surefire.version>
-		<weld.version>3.1.3.Final</weld.version>
+		<weld.version>3.1.7.SP1</weld.version>
 	</properties>
 
 	<licenses>