diff --git a/org.springframework.context/ivy.xml b/org.springframework.context/ivy.xml
index 23d1f8fbdf6..45c5950d70f 100644
--- a/org.springframework.context/ivy.xml
+++ b/org.springframework.context/ivy.xml
@@ -46,8 +46,10 @@
+
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ClassFileTransformer2Translator.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ClassFileTransformer2Translator.java
deleted file mode 100644
index b7a139cef58..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ClassFileTransformer2Translator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import java.security.ProtectionDomain;
-import java.lang.instrument.ClassFileTransformer;
-
-import org.jboss.util.loading.Translator;
-
-/**
- * ClassFileTransfomer to Translator bridge.
- *
- * @author Ales Justin
- */
-public class ClassFileTransformer2Translator implements Translator {
-
- private ClassFileTransformer transformer;
-
- public ClassFileTransformer2Translator(ClassFileTransformer transformer) {
- if (transformer == null) {
- throw new IllegalArgumentException("Null transformer");
- }
-
- this.transformer = transformer;
- }
-
- public byte[] transform(ClassLoader loader,
- String className,
- Class> classBeingRedefined,
- ProtectionDomain protectionDomain,
- byte[] classfileBuffer) throws Exception {
- return transformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
- }
-
- public void unregisterClassLoader(ClassLoader loader) {
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss50ClassLoader.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss50ClassLoader.java
deleted file mode 100644
index e520154c6bc..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss50ClassLoader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import java.lang.reflect.Method;
-
-import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
-import org.jboss.classloader.spi.base.BaseClassLoaderPolicy;
-import org.jboss.classloader.spi.base.BaseClassLoaderSystem;
-import org.jboss.util.loading.Translator;
-
-/**
- * Reflective wrapper around a JBoss_5.0.x class loader. Used to encapsulate the classloader-specific methods
- * (discovered and called through reflection) from the load-time weaver.
- *
- * @author Ales Justin
- */
-public class JBoss50ClassLoader extends JBoss5ClassLoader {
-
- private Method addTranslator;
-
- private ClassLoaderSystem system;
-
- public JBoss50ClassLoader(BaseClassLoader classLoader) {
- super(classLoader);
- }
-
- protected void fallbackStrategy() throws Exception {
- try {
- // let's check if we have a patched policy, with translator per policy
- addTranslator = getMethod(BaseClassLoaderPolicy.class, "addTranslator");
- }
- catch (Exception ignored) {
- //log.info("Policy doesn't have addTranslator, falling back to ClassLoaderSystem.");
-
- Method getClassLoaderDomain = getMethod(BaseClassLoaderPolicy.class, "getClassLoaderDomain");
- BaseClassLoaderDomain domain = invokeMethod(getClassLoaderDomain, getPolicy(), BaseClassLoaderDomain.class);
- Method getClassLoaderSystem = getMethod(BaseClassLoaderDomain.class, "getClassLoaderSystem");
- BaseClassLoaderSystem system = invokeMethod(getClassLoaderSystem, domain, BaseClassLoaderSystem.class);
- if (system instanceof ClassLoaderSystem) {
- this.system = ClassLoaderSystem.class.cast(system);
- }
- else {
- throw new IllegalArgumentException(
- "ClassLoaderSystem must be instance of [" + ClassLoaderSystem.class.getName() + "]");
- }
- }
- }
-
- protected void addTranslator(Translator translator) {
- if (addTranslator != null) {
- try {
- addTranslator.invoke(translator);
- }
- catch (Exception e) {
- throw new IllegalArgumentException(e);
- }
- }
- else {
- system.setTranslator(translator);
- }
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss51ClassLoader.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss51ClassLoader.java
deleted file mode 100644
index a792c427248..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss51ClassLoader.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.util.loading.Translator;
-
-/**
- * Reflective wrapper around a JBoss_5.1.x class loader. Used to encapsulate the classloader-specific methods
- * (discovered and called through reflection) from the load-time weaver.
- *
- * @author Ales Justin
- */
-public class JBoss51ClassLoader extends JBoss5ClassLoader {
-
- public JBoss51ClassLoader(BaseClassLoader classLoader) {
- super(classLoader);
- }
-
- protected void addTranslator(Translator translator) {
-
- getPolicy().addTranslator(translator);
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5ClassLoader.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5ClassLoader.java
deleted file mode 100644
index 3bea1c9fae9..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5ClassLoader.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedExceptionAction;
-
-import org.jboss.classloader.spi.ClassLoaderPolicy;
-import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.util.loading.Translator;
-
-import org.springframework.util.Assert;
-import org.springframework.instrument.classloading.SimpleThrowawayClassLoader;
-
-/**
- * Reflective wrapper around a JBoss5 class loader. Used to encapsulate the classloader-specific methods (discovered and
- * called through reflection) from the load-time weaver.
- *
- * @author Ales Justin
- * @author Marius Bogoevici
- */
-public abstract class JBoss5ClassLoader extends ReflectionHelper {
-
- private final BaseClassLoader classLoader;
-
- private ClassLoaderPolicy policy;
-
- @SuppressWarnings("unchecked")
- protected JBoss5ClassLoader(BaseClassLoader classLoader) {
- Assert.notNull(classLoader, "ClassLoader must not be null");
- this.classLoader = classLoader;
-
- try {
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- AccessController.doPrivileged(new InstantiationAction());
- }
- else {
- doInstantiate();
- }
- }
- catch (Exception e) {
- throw new IllegalStateException(
- "Could not initialize JBoss ClassLoader because JBoss5 API classes are not available", e);
- }
- }
-
- /**
- * Get the policy.
- *
- * @return the policy
- */
- protected ClassLoaderPolicy getPolicy() {
- return policy;
- }
-
- /**
- * Do instantiate method, variables.
- *
- * @throws Exception for any error
- */
- private void doInstantiate() throws Exception {
- Method getPolicy = getMethod(BaseClassLoader.class, "getPolicy");
- policy = invokeMethod(getPolicy, classLoader, ClassLoaderPolicy.class);
- fallbackStrategy();
- }
-
- /**
- * The fallback strategy.
- *
- * @throws Exception for any error
- */
- protected void fallbackStrategy() throws Exception {
- }
-
- public void addTransformer(ClassFileTransformer transformer) {
- Assert.notNull(transformer, "ClassFileTransformer must not be null");
- Translator translator = new ClassFileTransformer2Translator(transformer);
- addTranslator(translator);
- }
-
- /**
- * Add the translator.
- *
- * @param translator the translator
- */
- protected abstract void addTranslator(Translator translator);
-
- public ClassLoader getInternalClassLoader() {
- return classLoader;
- }
-
- public ClassLoader getThrowawayClassLoader() {
- return new SimpleThrowawayClassLoader(classLoader);
- }
-
- /** Instantiation action. */
- private class InstantiationAction implements PrivilegedExceptionAction {
-
- public Object run() throws Exception {
- doInstantiate();
- return null;
- }
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5LoadTimeWeaver.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5LoadTimeWeaver.java
deleted file mode 100644
index 6be70ce4633..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBoss5LoadTimeWeaver.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.reflect.Method;
-
-import org.jboss.classloader.spi.base.BaseClassLoader;
-
-import org.springframework.instrument.classloading.LoadTimeWeaver;
-import org.springframework.util.Assert;
-import org.springframework.util.ClassUtils;
-
-/**
- * {@link LoadTimeWeaver} implementation for JBoss5's instrumentable ClassLoader.
- *
- * @author Ales Justin
- */
-public class JBoss5LoadTimeWeaver extends ReflectionHelper implements LoadTimeWeaver {
-
- private JBoss5ClassLoader classLoader;
-
- public JBoss5LoadTimeWeaver() {
- this(ClassUtils.getDefaultClassLoader());
- }
-
- public JBoss5LoadTimeWeaver(ClassLoader classLoader) {
- Assert.notNull(classLoader, "ClassLoader must not be null");
- BaseClassLoader bcl = determineClassLoader(classLoader);
- if (bcl == null) {
- throw new IllegalArgumentException(
- classLoader + " and its parents are not suitable ClassLoaders: " + "An [" +
- BaseClassLoader.class.getName() + "] implementation is required.");
- }
- this.classLoader = createClassLoaderWrapper(bcl);
- }
-
- /**
- * Create a JBoss5 classloader wrapper based on the underlying JBossAS version.
- *
- * @param bcl the base classloader
- * @return new JBoss5 classloader wrapper
- */
- protected JBoss5ClassLoader createClassLoaderWrapper(BaseClassLoader bcl) {
- int versionNumber = 0;
- String tag;
-
- try {
- // BCL should see Version class
- Class> versionClass = bcl.loadClass("org.jboss.Version");
- Method getInstance = getMethod(versionClass, "getInstance");
- Object version = getInstance.invoke(null); // static method
-
- Method getMajor = getMethod(versionClass, "getMajor");
- versionNumber += 100 * invokeMethod(getMajor, version, Integer.class);
- Method getMinor = getMethod(versionClass, "getMinor");
- versionNumber += 10 * invokeMethod(getMinor, version, Integer.class);
- Method getRevision = getMethod(versionClass, "getRevision");
- versionNumber += invokeMethod(getRevision, version, Integer.class);
- Method getTag = getMethod(versionClass, "getTag");
- tag = invokeMethod(getTag, version, String.class);
- }
- catch (Exception e) {
- //log.warn("Exception creating JBoss5 CL wrapper: " + e + ", falling back to JBoss50ClassLoader wrapper.");
- return new JBoss50ClassLoader(bcl);
- }
-
- if (versionNumber < 500) // this only works on new MC code
- {
- throw new IllegalArgumentException(
- "JBoss5LoadTimeWeaver can only be used on new JBoss Microcontainer ClassLoader.");
- }
- else if (versionNumber <= 501 || (versionNumber == 510 && "Beta1".equals(tag))) {
- return new JBoss50ClassLoader(bcl);
- }
- else {
- return new JBoss51ClassLoader(bcl);
- }
- }
-
- /**
- * Find first BaseClassLoader implementation.
- *
- * @param classLoader the classloader
- * @return BaseClassLoader instance or null if not found
- */
- private BaseClassLoader determineClassLoader(ClassLoader classLoader) {
- for (ClassLoader cl = classLoader; cl != null; cl = cl.getParent()) {
- if (cl instanceof BaseClassLoader) {
- return (BaseClassLoader) cl;
- }
- }
- return null;
- }
-
- public void addTransformer(ClassFileTransformer transformer) {
- classLoader.addTransformer(transformer);
- }
-
- public ClassLoader getInstrumentableClassLoader() {
- return classLoader.getInternalClassLoader();
- }
-
- public ClassLoader getThrowawayClassLoader() {
- return classLoader.getThrowawayClassLoader();
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossClassLoaderAdapter.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossClassLoaderAdapter.java
new file mode 100644
index 00000000000..bc88d783447
--- /dev/null
+++ b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossClassLoaderAdapter.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2006-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.instrument.classloading.jboss;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.springframework.util.Assert;
+import org.springframework.util.ReflectionUtils;
+
+/**
+ * Reflective wrapper around a JBoss 5 class loader methods (discovered and called
+ * through reflection) for load time weaving.
+ *
+ * @author Costin Leau
+ */
+class JBossClassLoaderAdapter {
+
+ private static final String TRANSLATOR_ADAPTER_NAME = "org.jboss.classloader.spi.translator.ClassFileTransformer2Translator";
+ private static final String TRANSLATOR_NAME = "org.jboss.util.loading.Translator";
+ private static final String POLICY_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderPolicy";
+ private static final String DOMAIN_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderDomain";
+ private static final String DEDICATED_SYSTEM = "org.jboss.classloader.spi.ClassLoaderSystem";
+ private static final String LOADER_NAME = "org.jboss.classloader.spi.base.BaseClassLoader";
+ private static final String GET_POLICY = "getPolicy";
+ private static final String GET_DOMAIN = "getClassLoaderDomain";
+ private static final String GET_SYSTEM = "getClassLoaderSystem";
+
+ // available since JBoss AS 5.1.0 / MC 2.0.6 (allows multiple transformers to be added)
+ private static final String ADD_TRANSLATOR_NAME = "addTranslator";
+ // available since JBoss AS 5.0.0 / MC 2.0.1 (allows only one transformer to be added)
+ private static final String SET_TRANSLATOR_NAME = "setTranslator";
+
+ private final ClassLoader classLoader;
+ private final Constructor> constructor;
+ private final Method addTranslator;
+ private final Object target;
+
+ JBossClassLoaderAdapter(ClassLoader classLoader) {
+ Class> clazzLoaderType = null;
+ try {
+ // resolve BaseClassLoader.class
+ clazzLoaderType = classLoader.loadClass(LOADER_NAME);
+
+ ClassLoader clazzLoader = null;
+ // walk the hierarchy to detect the instrumentation aware classloader
+ for (ClassLoader cl = classLoader; cl != null && clazzLoader == null; cl = cl.getParent()) {
+ if (clazzLoaderType.isInstance(cl)) {
+ clazzLoader = cl;
+ }
+ }
+
+ if (clazzLoader == null) {
+ throw new IllegalArgumentException(classLoader + " and its parents are not suitable ClassLoaders: "
+ + "A [" + LOADER_NAME + "] implementation is required.");
+ }
+
+ this.classLoader = clazzLoader;
+
+ // BaseClassLoader#getPolicy
+ Method method = clazzLoaderType.getDeclaredMethod(GET_POLICY);
+ ReflectionUtils.makeAccessible(method);
+ Object policy = method.invoke(this.classLoader);
+
+ Object addTarget = null;
+ Method addMethod = null;
+
+ // try the 5.1.x hooks
+ // check existence of BaseClassLoaderPolicy#addTranslator(Translator)
+ Class> translatorClass = classLoader.loadClass(TRANSLATOR_NAME);
+ Class> clazz = classLoader.loadClass(POLICY_NAME);
+ try {
+ addMethod = clazz.getDeclaredMethod(ADD_TRANSLATOR_NAME, translatorClass);
+ addTarget = policy;
+ } catch (NoSuchMethodException ex) {
+ }
+
+ // fall back to 5.0.x method
+ if (addMethod == null) {
+
+ // BaseClassLoaderPolicy#getClassLoaderDomain
+ method = clazz.getDeclaredMethod(GET_DOMAIN);
+ ReflectionUtils.makeAccessible(method);
+ Object domain = method.invoke(policy);
+
+ // BaseClassLoaderDomain#getClassLoaderSystem
+ clazz = classLoader.loadClass(DOMAIN_NAME);
+ method = clazz.getDeclaredMethod(GET_SYSTEM);
+ ReflectionUtils.makeAccessible(method);
+ Object system = method.invoke(domain);
+ addTarget = system;
+
+ // resolve ClassLoaderSystem
+ clazz = classLoader.loadClass(DEDICATED_SYSTEM);
+
+ Assert.isInstanceOf(clazz, system, "JBoss LoadTimeWeaver requires JBoss loader system of type "
+ + clazz.getName() + " on JBoss 5.0.x");
+
+ // ClassLoaderSystem#setTranslator
+ addMethod = clazz.getDeclaredMethod(SET_TRANSLATOR_NAME, translatorClass);
+ }
+
+ this.addTranslator = addMethod;
+ this.target = addTarget;
+
+ // resolve Transformer2TranslatorUtil constructor
+ clazz = classLoader.loadClass(TRANSLATOR_ADAPTER_NAME);
+ this.constructor = clazz.getDeclaredConstructor(ClassFileTransformer.class);
+
+ } catch (Exception ex) {
+ throw new IllegalStateException(
+ "Could not initialize JBoss LoadTimeWeaver because the JBoss 5 API classes are not available", ex);
+ }
+ }
+
+ public void addTransformer(ClassFileTransformer transformer) {
+ Object translator = null;
+ try {
+ translator = this.constructor.newInstance(transformer);
+ } catch (Exception ex) {
+ throw new IllegalStateException("Could not instantiate a JBoss class translator", ex);
+ }
+
+ try {
+ addTranslator.invoke(target, translator);
+ } catch (Exception ex) {
+ throw new IllegalStateException("Could not add transformer on JBoss classloader " + classLoader, ex);
+ }
+ }
+
+ public ClassLoader getClassLoader() {
+ return classLoader;
+ }
+}
\ No newline at end of file
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java
new file mode 100644
index 00000000000..9d6728bce19
--- /dev/null
+++ b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossLoadTimeWeaver.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.instrument.classloading.jboss;
+
+import java.lang.instrument.ClassFileTransformer;
+
+import org.springframework.instrument.classloading.LoadTimeWeaver;
+import org.springframework.instrument.classloading.SimpleThrowawayClassLoader;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+/**
+ * {@link LoadTimeWeaver} implementation for JBoss's instrumentable ClassLoader.
+ *
+ *
NOTE: Requires JBoss AS version 5.0.0 or higher.
+ *
+ *
Thanks to Ales Justin and Marius Bogoevici for the initial prototype.
+ *
+ * @author Costin Leau
+ */
+public class JBossLoadTimeWeaver implements LoadTimeWeaver {
+
+ private final JBossClassLoaderAdapter classLoader;
+
+ /**
+ * Creates a new instance of the {@link JBossLoadTimeWeaver} class using
+ * the default {@link ClassLoader class loader}.
+ * @see org.springframework.util.ClassUtils#getDefaultClassLoader()
+ */
+ public JBossLoadTimeWeaver() {
+ this(ClassUtils.getDefaultClassLoader());
+ }
+
+ /**
+ * Creates a new instance of the {@link JBossLoadTimeWeaver} class using
+ * the supplied {@link ClassLoader}.
+ * @param classLoader the ClassLoader to delegate to for
+ * weaving (must not be null)
+ */
+ public JBossLoadTimeWeaver(ClassLoader classLoader) {
+ Assert.notNull(classLoader, "ClassLoader must not be null");
+ this.classLoader = new JBossClassLoaderAdapter(classLoader);
+ }
+
+ public void addTransformer(ClassFileTransformer transformer) {
+ this.classLoader.addTransformer(transformer);
+ }
+
+ public ClassLoader getInstrumentableClassLoader() {
+ return this.classLoader.getClassLoader();
+ }
+
+ public ClassLoader getThrowawayClassLoader() {
+ return new SimpleThrowawayClassLoader(getInstrumentableClassLoader());
+ }
+}
\ No newline at end of file
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ReflectionHelper.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ReflectionHelper.java
deleted file mode 100644
index a882bbdc2df..00000000000
--- a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/ReflectionHelper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2002-2009 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springframework.instrument.classloading.jboss;
-
-import java.lang.reflect.Method;
-
-/**
- * Reflection helper.
- *
- * @author Ales Justin
- */
-public abstract class ReflectionHelper {
-
- /**
- * Get method from class.
- *
- * @param clazz the owner class
- * @param name the method name
- * @return declared method
- * @throws Exception for any error
- */
- protected static Method getMethod(Class> clazz, String name) throws Exception {
- Method method = clazz.getDeclaredMethod(name);
- method.setAccessible(true);
- return method;
- }
-
- /**
- * Invoke method and check the result.
- *
- * @param method the method
- * @param target the target
- * @param expectedType the expected type
- * @param the exact type
- * @return invocation's result
- * @throws Exception for any error
- */
- protected static T invokeMethod(Method method, Object target, Class expectedType) throws Exception {
- Object result = method.invoke(target);
- if (expectedType.isInstance(result) == false) {
- throw new IllegalArgumentException("Returned result must be instance of [" + expectedType.getName() + "]");
- }
-
- return expectedType.cast(result);
- }
-}
diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java
new file mode 100644
index 00000000000..0c861f32e92
--- /dev/null
+++ b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java
@@ -0,0 +1,8 @@
+
+/**
+ *
+ * Support for class instrumentation on JBoss AS 5.x / JBoss MC 2.0.x.
+ *
+ */
+package org.springframework.instrument.classloading.jboss;
+
diff --git a/org.springframework.context/template.mf b/org.springframework.context/template.mf
index 99980952a81..24eaeaf47d4 100644
--- a/org.springframework.context/template.mf
+++ b/org.springframework.context/template.mf
@@ -30,8 +30,6 @@ Import-Template:
org.aspectj.weaver.*;version="[1.5.4, 2.0.0)";resolution:=optional,
org.codehaus.groovy.*;version="[1.5.0, 2.0.0)";resolution:=optional,
org.joda.*;version="[1.6.0, 2.0.0)";resolution:=optional,
- org.jboss.classloader.*;version="[2.0.5, 3.0.0)";resolution:=optional,
- org.jboss.util.*;version="[2.2.13, 3.0.0)";resolution:=optional,
org.jruby.*;version="[1.1.0, 2.0.0)";resolution:=optional,
org.omg.CORBA.*;version="0";resolution:=optional,
org.springframework.aop.*;version="[3.0.0, 3.0.1)";resolution:=optional,