|
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;
- }
- }
- );
- }
-
- }
}
|