+ add dynamic classfiletransformer -> JBoss translator adaptor (since there isn't any in JBoss 5.0.x)
This commit is contained in:
Costin Leau 2009-11-12 02:28:42 +00:00
parent 155f6b1aa1
commit 1dc1d5ef9a
1 changed files with 10 additions and 17 deletions

View File

@ -16,8 +16,9 @@
package org.springframework.instrument.classloading.jboss; package org.springframework.instrument.classloading.jboss;
import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.ClassFileTransformer;
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
@ -30,7 +31,6 @@ import org.springframework.util.ReflectionUtils;
*/ */
class JBossClassLoaderAdapter { 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 TRANSLATOR_NAME = "org.jboss.util.loading.Translator";
private static final String POLICY_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderPolicy"; 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 DOMAIN_NAME = "org.jboss.classloader.spi.base.BaseClassLoaderDomain";
@ -46,7 +46,8 @@ class JBossClassLoaderAdapter {
private static final String SET_TRANSLATOR_NAME = "setTranslator"; private static final String SET_TRANSLATOR_NAME = "setTranslator";
private final ClassLoader classLoader; private final ClassLoader classLoader;
private final Constructor<?> constructor; private final Class<?> translatorClass;
private final Method addTranslator; private final Method addTranslator;
private final Object target; private final Object target;
@ -81,7 +82,7 @@ class JBossClassLoaderAdapter {
// try the 5.1.x hooks // try the 5.1.x hooks
// check existence of BaseClassLoaderPolicy#addTranslator(Translator) // check existence of BaseClassLoaderPolicy#addTranslator(Translator)
Class<?> translatorClass = classLoader.loadClass(TRANSLATOR_NAME); this.translatorClass = classLoader.loadClass(TRANSLATOR_NAME);
Class<?> clazz = classLoader.loadClass(POLICY_NAME); Class<?> clazz = classLoader.loadClass(POLICY_NAME);
try { try {
addMethod = clazz.getDeclaredMethod(ADD_TRANSLATOR_NAME, translatorClass); addMethod = clazz.getDeclaredMethod(ADD_TRANSLATOR_NAME, translatorClass);
@ -102,25 +103,20 @@ class JBossClassLoaderAdapter {
method = clazz.getDeclaredMethod(GET_SYSTEM); method = clazz.getDeclaredMethod(GET_SYSTEM);
ReflectionUtils.makeAccessible(method); ReflectionUtils.makeAccessible(method);
Object system = method.invoke(domain); Object system = method.invoke(domain);
addTarget = system;
// resolve ClassLoaderSystem // resolve ClassLoaderSystem
clazz = classLoader.loadClass(DEDICATED_SYSTEM); clazz = classLoader.loadClass(DEDICATED_SYSTEM);
Assert.isInstanceOf(clazz, system, "JBoss LoadTimeWeaver requires JBoss loader system of type " Assert.isInstanceOf(clazz, system, "JBoss LoadTimeWeaver requires JBoss loader system of type "
+ clazz.getName() + " on JBoss 5.0.x"); + clazz.getName() + " on JBoss 5.0.x");
// ClassLoaderSystem#setTranslator // ClassLoaderSystem#setTranslator
addMethod = clazz.getDeclaredMethod(SET_TRANSLATOR_NAME, translatorClass); addMethod = clazz.getDeclaredMethod(SET_TRANSLATOR_NAME, translatorClass);
addTarget = system;
} }
this.addTranslator = addMethod; this.addTranslator = addMethod;
this.target = addTarget; this.target = addTarget;
// resolve Transformer2TranslatorUtil constructor
clazz = classLoader.loadClass(TRANSLATOR_ADAPTER_NAME);
this.constructor = clazz.getDeclaredConstructor(ClassFileTransformer.class);
} catch (Exception ex) { } catch (Exception ex) {
throw new IllegalStateException( throw new IllegalStateException(
"Could not initialize JBoss LoadTimeWeaver because the JBoss 5 API classes are not available", ex); "Could not initialize JBoss LoadTimeWeaver because the JBoss 5 API classes are not available", ex);
@ -128,15 +124,12 @@ class JBossClassLoaderAdapter {
} }
public void addTransformer(ClassFileTransformer transformer) { public void addTransformer(ClassFileTransformer transformer) {
Object translator = null; InvocationHandler adapter = new JBossTranslatorAdapter(transformer);
try { Object adapterInstance = Proxy.newProxyInstance(this.translatorClass.getClassLoader(),
translator = this.constructor.newInstance(transformer); new Class[] { this.translatorClass }, adapter);
} catch (Exception ex) {
throw new IllegalStateException("Could not instantiate a JBoss class translator", ex);
}
try { try {
addTranslator.invoke(target, translator); addTranslator.invoke(target, adapterInstance);
} catch (Exception ex) { } catch (Exception ex) {
throw new IllegalStateException("Could not add transformer on JBoss classloader " + classLoader, ex); throw new IllegalStateException("Could not add transformer on JBoss classloader " + classLoader, ex);
} }