//$Id$ package org.hibernate.ejb.test.instrument; import java.io.IOException; import java.io.InputStream; import java.lang.instrument.IllegalClassFormatException; import java.util.List; import org.hibernate.ejb.instrument.InterceptFieldClassFileTransformer; /** * @author Emmanuel Bernard */ public class InstrumentedClassLoader extends ClassLoader { private List<String> entities; public InstrumentedClassLoader(ClassLoader parent) { super( parent ); } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { if ( name != null && name.startsWith( "java.lang." ) ) return getParent().loadClass( name ); Class c = findLoadedClass( name ); if ( c != null ) return c; InputStream is = this.getResourceAsStream( name.replace( ".", "/" ) + ".class" ); if ( is == null ) throw new ClassNotFoundException( name ); byte[] buffer = new byte[409600]; byte[] originalClass = new byte[0]; int r = 0; try { r = is.read( buffer ); } catch (IOException e) { throw new ClassNotFoundException( name + " not found", e ); } while ( r >= buffer.length ) { byte[] temp = new byte[ originalClass.length + buffer.length ]; System.arraycopy( originalClass, 0, temp, 0, originalClass.length ); System.arraycopy( buffer, 0, temp, originalClass.length, buffer.length ); originalClass = temp; } if ( r != -1 ) { byte[] temp = new byte[ originalClass.length + r ]; System.arraycopy( originalClass, 0, temp, 0, originalClass.length ); System.arraycopy( buffer, 0, temp, originalClass.length, r ); originalClass = temp; } try { is.close(); } catch (IOException e) { throw new ClassNotFoundException( name + " not found", e ); } InterceptFieldClassFileTransformer t = new InterceptFieldClassFileTransformer( entities ); byte[] transformed = new byte[0]; try { transformed = t.transform( getParent(), name, null, null, originalClass ); } catch (IllegalClassFormatException e) { throw new ClassNotFoundException( name + " not found", e ); } return defineClass( name, transformed, 0, transformed.length ); } public void setEntities(List<String> entities) { this.entities = entities; } }