Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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  }