Source code: org/hibernate/bytecode/javassist/BytecodeProviderImpl.java
1 package org.hibernate.bytecode.javassist;
2
3 import java.lang.reflect.Modifier;
4
5 import org.apache.commons.logging.Log;
6 import org.apache.commons.logging.LogFactory;
7 import org.hibernate.bytecode.BytecodeProvider;
8 import org.hibernate.bytecode.ClassTransformer;
9 import org.hibernate.bytecode.ProxyFactoryFactory;
10 import org.hibernate.bytecode.ReflectionOptimizer;
11 import org.hibernate.util.StringHelper;
12
13 /**
14 * Bytecode provider implementation for Javassist.
15 *
16 * @author Steve Ebersole
17 */
18 public class BytecodeProviderImpl implements BytecodeProvider {
19
20 private static final Log log = LogFactory.getLog( BytecodeProviderImpl.class );
21
22 public ProxyFactoryFactory getProxyFactoryFactory() {
23 return new ProxyFactoryFactoryImpl();
24 }
25
26 public ReflectionOptimizer getReflectionOptimizer(
27 Class clazz,
28 String[] getterNames,
29 String[] setterNames,
30 Class[] types) {
31 FastClass fastClass;
32 BulkAccessor bulkAccessor;
33 try {
34 fastClass = FastClass.create( clazz );
35 bulkAccessor = BulkAccessor.create( clazz, getterNames, setterNames, types );
36 if ( !clazz.isInterface() && !Modifier.isAbstract( clazz.getModifiers() ) ) {
37 if ( fastClass == null ) {
38 bulkAccessor = null;
39 }
40 else {
41 //test out the optimizer:
42 Object instance = fastClass.newInstance();
43 bulkAccessor.setPropertyValues( instance, bulkAccessor.getPropertyValues( instance ) );
44 }
45 }
46 }
47 catch ( Throwable t ) {
48 fastClass = null;
49 bulkAccessor = null;
50 String message = "reflection optimizer disabled for: " +
51 clazz.getName() +
52 " [" +
53 StringHelper.unqualify( t.getClass().getName() ) +
54 ": " +
55 t.getMessage();
56
57 if ( t instanceof BulkAccessorException ) {
58 int index = ( ( BulkAccessorException ) t ).getIndex();
59 if ( index >= 0 ) {
60 message += " (property " + setterNames[index] + ")";
61 }
62 }
63
64 log.debug( message );
65 }
66
67 if ( fastClass != null && bulkAccessor != null ) {
68 return new ReflectionOptimizerImpl(
69 new InstantiationOptimizerAdapter( fastClass ),
70 new AccessOptimizerAdapter( bulkAccessor, clazz )
71 );
72 }
73 else {
74 return null;
75 }
76 }
77
78 public ClassLoader generateDynamicFieldInterceptionClassLoader(ClassLoader parent, String[] classpath, String[] packages) {
79 return new TransformingClassLoader( parent, classpath );
80 }
81
82 public ClassTransformer getEntityClassTransformer(
83 String[] packages, String[] classes
84 ) {
85 return new JavassistClassTransformer( packages, classes );
86 }
87
88 public void releaseDynamicFieldInterceptionClassLoader(ClassLoader classLoader) {
89 if ( ! TransformingClassLoader.class.isAssignableFrom( classLoader.getClass() ) ) {
90 return;
91 }
92 ( ( TransformingClassLoader ) classLoader ).release();
93 }
94 }