01: package org.hibernate.bytecode.javassist;
02:
03: import java.lang.reflect.Modifier;
04:
05: import org.apache.commons.logging.Log;
06: import org.apache.commons.logging.LogFactory;
07: import org.hibernate.bytecode.BytecodeProvider;
08: import org.hibernate.bytecode.ClassTransformer;
09: import org.hibernate.bytecode.ProxyFactoryFactory;
10: import org.hibernate.bytecode.ReflectionOptimizer;
11: import org.hibernate.bytecode.util.ClassFilter;
12: import org.hibernate.bytecode.util.FieldFilter;
13: import org.hibernate.util.StringHelper;
14:
15: /**
16: * Bytecode provider implementation for Javassist.
17: *
18: * @author Steve Ebersole
19: */
20: public class BytecodeProviderImpl implements BytecodeProvider {
21:
22: private static final Log log = LogFactory
23: .getLog(BytecodeProviderImpl.class);
24:
25: public ProxyFactoryFactory getProxyFactoryFactory() {
26: return new ProxyFactoryFactoryImpl();
27: }
28:
29: public ReflectionOptimizer getReflectionOptimizer(Class clazz,
30: String[] getterNames, String[] setterNames, Class[] types) {
31: FastClass fastClass;
32: BulkAccessor bulkAccessor;
33: try {
34: fastClass = FastClass.create(clazz);
35: bulkAccessor = BulkAccessor.create(clazz, getterNames,
36: setterNames, types);
37: if (!clazz.isInterface()
38: && !Modifier.isAbstract(clazz.getModifiers())) {
39: if (fastClass == null) {
40: bulkAccessor = null;
41: } else {
42: //test out the optimizer:
43: Object instance = fastClass.newInstance();
44: bulkAccessor.setPropertyValues(instance,
45: bulkAccessor.getPropertyValues(instance));
46: }
47: }
48: } catch (Throwable t) {
49: fastClass = null;
50: bulkAccessor = null;
51: String message = "reflection optimizer disabled for: "
52: + clazz.getName() + " ["
53: + StringHelper.unqualify(t.getClass().getName())
54: + ": " + t.getMessage();
55:
56: if (t instanceof BulkAccessorException) {
57: int index = ((BulkAccessorException) t).getIndex();
58: if (index >= 0) {
59: message += " (property " + setterNames[index] + ")";
60: }
61: }
62:
63: log.debug(message);
64: }
65:
66: if (fastClass != null && bulkAccessor != null) {
67: return new ReflectionOptimizerImpl(
68: new InstantiationOptimizerAdapter(fastClass),
69: new AccessOptimizerAdapter(bulkAccessor, clazz));
70: } else {
71: return null;
72: }
73: }
74:
75: public ClassTransformer getTransformer(ClassFilter classFilter,
76: FieldFilter fieldFilter) {
77: return new JavassistClassTransformer(classFilter, fieldFilter);
78: }
79:
80: }
|