@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2006 - 2009 the original author or authors .
* 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 .
@ -13,6 +13,7 @@
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License .
* /
package org.springframework.instrument.classloading.glassfish ;
import java.lang.instrument.ClassFileTransformer ;
@ -24,47 +25,55 @@ import java.lang.reflect.Method;
@@ -24,47 +25,55 @@ import java.lang.reflect.Method;
* encapsulate the classloader - specific methods ( discovered and
* called through reflection ) from the load - time weaver .
*
* < p / > Supports GlassFish V1 , V2 and V3 ( currently in beta ) .
* < p > Supports GlassFish V1 , V2 and V3 ( currently in beta ) .
*
* @author Costin Leau
* @since 3 . 0 . 0
* @since 3 . 0
* /
class GlassFishClassLoaderAdapter {
static final String INSTRUMENTABLE_CLASSLOADER_GLASSFISH_V2 = "com.sun.enterprise.loader.InstrumentableClassLoader" ;
static final String INSTRUMENTABLE_CLASSLOADER_GLASSFISH_V3 = "org.glassfish.api.deployment.InstrumentableClassLoader" ;
private static final String CLASS_TRANSFORMER = "javax.persistence.spi.ClassTransformer" ;
private final ClassLoader classLoader ;
private final Method addTransformer ;
private final Method copy ;
private final boolean glassFishV3 ;
public GlassFishClassLoaderAdapter ( ClassLoader classLoader ) {
Class < ? > instrumentableLoaderClass = null ;
Class < ? > instrumentableLoaderClass ;
boolean glassV3 = false ;
try {
// try the V1/V2 API first
instrumentableLoaderClass = classLoader . loadClass ( INSTRUMENTABLE_CLASSLOADER_GLASSFISH_V2 ) ;
} catch ( ClassNotFoundException ex ) {
}
catch ( ClassNotFoundException ex ) {
// fall back to V3
try {
instrumentableLoaderClass = classLoader . loadClass ( INSTRUMENTABLE_CLASSLOADER_GLASSFISH_V3 ) ;
glassV3 = true ;
} catch ( ClassNotFoundException cnfe ) {
throw new IllegalStateException (
"Could not initialize GlassFish LoadTimeWeaver because GlassFish (V1, V2 or V3) API classes are not available" ,
ex ) ;
}
catch ( ClassNotFoundException cnfe ) {
throw new IllegalStateException ( "Could not initialize GlassFish LoadTimeWeaver because " +
"GlassFish (V1, V2 or V3) API classes are not available" , ex ) ;
}
}
try {
Class < ? > classTransformerClass = ( glassV3 ? ClassFileTransformer . class : classLoader
. loadClass ( CLASS_TRANSFORMER ) ) ;
addTransformer = instrumentableLoaderClass . getMethod ( "addTransformer" , classTransformerClass ) ;
copy = instrumentableLoaderClass . getMethod ( "copy" ) ;
Class < ? > classTransformerClass =
( glassV3 ? ClassFileTransformer . class : classLoader . loadClass ( CLASS_TRANSFORMER ) ) ;
} catch ( Exception ex ) {
this . addTransformer = instrumentableLoaderClass . getMethod ( "addTransformer" , classTransformerClass ) ;
this . copy = instrumentableLoaderClass . getMethod ( "copy" ) ;
}
catch ( Exception ex ) {
throw new IllegalStateException (
"Could not initialize GlassFish LoadTimeWeaver because GlassFish API classes are not available" , ex ) ;
}
@ -79,8 +88,8 @@ class GlassFishClassLoaderAdapter {
@@ -79,8 +88,8 @@ class GlassFishClassLoaderAdapter {
}
if ( clazzLoader = = null ) {
throw new IllegalArgumentException ( classLoader + " and its parents are not suitable ClassLoaders: " + "A ["
+ instrumentableLoaderClass . getName ( ) + "] implementation is required." ) ;
throw new IllegalArgumentException ( classLoader + " and its parents are not suitable ClassLoaders: A [ " +
instrumentableLoaderClass . getName ( ) + "] implementation is required." ) ;
}
this . classLoader = clazzLoader ;
@ -89,10 +98,13 @@ class GlassFishClassLoaderAdapter {
@@ -89,10 +98,13 @@ class GlassFishClassLoaderAdapter {
public void addTransformer ( ClassFileTransformer transformer ) {
try {
addTransformer . invoke ( classLoader , ( glassFishV3 ? transformer : new ClassTransformerAdapter ( transformer ) ) ) ;
} catch ( InvocationTargetException ex ) {
this . addTransformer . invoke ( this . classLoader ,
( this . glassFishV3 ? transformer : new ClassTransformerAdapter ( transformer ) ) ) ;
}
catch ( InvocationTargetException ex ) {
throw new IllegalStateException ( "GlassFish addTransformer method threw exception " , ex . getCause ( ) ) ;
} catch ( Exception ex ) {
}
catch ( Exception ex ) {
throw new IllegalStateException ( "Could not invoke GlassFish addTransformer method" , ex ) ;
}
}
@ -103,11 +115,14 @@ class GlassFishClassLoaderAdapter {
@@ -103,11 +115,14 @@ class GlassFishClassLoaderAdapter {
public ClassLoader getThrowawayClassLoader ( ) {
try {
return ( ClassLoader ) copy . invoke ( classLoader , ( Object [ ] ) null ) ;
} catch ( InvocationTargetException ex ) {
return ( ClassLoader ) this . copy . invoke ( this . classLoader ) ;
}
catch ( InvocationTargetException ex ) {
throw new IllegalStateException ( "GlassFish copy method threw exception " , ex . getCause ( ) ) ;
} catch ( Exception ex ) {
}
catch ( Exception ex ) {
throw new IllegalStateException ( "Could not invoke GlassFish copy method" , ex ) ;
}
}
}
}