From: <hib...@li...> - 2006-05-04 22:39:08
|
Author: epbernard Date: 2006-05-04 18:39:06 -0400 (Thu, 04 May 2006) New Revision: 9884 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java Log: EJB-172 delegate transformation to the underlying Hibernate bytecode provider Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java 2006-05-04 22:36:54 UTC (rev 9883) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java 2006-05-04 22:39:06 UTC (rev 9884) @@ -1,29 +1,13 @@ //$Id$ package org.hibernate.ejb.instrument; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; -import java.util.Arrays; import java.util.List; -import net.sf.cglib.core.ClassNameReader; -import net.sf.cglib.core.DebuggingClassWriter; -import net.sf.cglib.transform.ClassReaderGenerator; -import net.sf.cglib.transform.ClassTransformer; -import net.sf.cglib.transform.TransformingClassGenerator; -import net.sf.cglib.transform.impl.InterceptFieldEnabled; -import net.sf.cglib.transform.impl.InterceptFieldFilter; -import net.sf.cglib.transform.impl.InterceptFieldTransformer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.objectweb.asm.Attribute; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Type; -import org.objectweb.asm.attrs.Attributes; +import org.hibernate.cfg.Environment; /** * Enhance the classes allowing them to implements InterceptFieldEnabled @@ -33,92 +17,25 @@ */ public class InterceptFieldClassFileTransformer implements javax.persistence.spi.ClassTransformer { Log log = LogFactory.getLog( InterceptFieldClassFileTransformer.class.getName() ); - private List<String> entities; + private org.hibernate.bytecode.ClassTransformer classTransformer; public InterceptFieldClassFileTransformer(List<String> entities) { - this.entities = entities; + classTransformer = Environment.getBytecodeProvider().getEntityClassTransformer( + null, entities.toArray( new String[ entities.size() ] ) + ); } public byte[] transform( - ClassLoader loader, String className, Class<?> classBeingRedefined, - ProtectionDomain protectionDomain, byte[] classfileBuffer + ClassLoader loader, String className, Class<?> classBeingRedefined, + ProtectionDomain protectionDomain, byte[] classfileBuffer ) throws IllegalClassFormatException { - ClassReader reader; try { - reader = new ClassReader( new ByteArrayInputStream( classfileBuffer ) ); + return classTransformer.transform( loader, className, classBeingRedefined, + protectionDomain, classfileBuffer ); } - catch (IOException e) { - log.error( "Unable to read class", e ); - throw new IllegalClassFormatException( "Unable to read class: " + e.getMessage() ); + catch (Exception e) { + throw new IllegalClassFormatException( e.getMessage() ); } - -// if ( className.startsWith( "net/sf/cglib") -// || className.startsWith( "org/hibernate/ejb/instrument") -// || className.startsWith( "org/hibernate/proxy") -// || className.startsWith( "org/hibernate/intercept") ) { -// return classfileBuffer; -// } - - if ( ! entities.contains( className.replace( "/", "." ) ) ) return classfileBuffer; - - String name[] = ClassNameReader.getClassInfo( reader ); - ClassWriter w = new DebuggingClassWriter( true ); - ClassTransformer t = getClassTransformer( name ); - if ( t != null ) { - if ( log.isDebugEnabled() ) { - log.info( "Enhancing " + className ); - } - ByteArrayOutputStream out; - byte[] result; - try { - reader = new ClassReader( new ByteArrayInputStream( classfileBuffer ) ); - new TransformingClassGenerator( - new ClassReaderGenerator( - reader, - attributes(), skipDebug() - ), t - ).generateClass( w ); - out = new ByteArrayOutputStream(); - out.write( w.toByteArray() ); - result = out.toByteArray(); - out.close(); - } - catch (Exception e) { - log.error( "Unable to transform class", e ); - throw new IllegalClassFormatException( "Unable to transform class: " + e.getMessage() ); - } - return result; - } - return classfileBuffer; } - - private Attribute[] attributes() { - return Attributes.getDefaultAttributes(); - } - - private boolean skipDebug() { - return false; - } - - private ClassTransformer getClassTransformer(String[] classInfo) { - - if ( Arrays.asList( classInfo ).contains( InterceptFieldEnabled.class.getName() ) ) { - return null; - } - else { - return new InterceptFieldTransformer( - new InterceptFieldFilter() { - public boolean acceptRead(Type owner, String name) { - return true; - } - - public boolean acceptWrite(Type owner, String name) { - return true; - } - } - ); - } - - } } |