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