01: package org.hibernate.bytecode.cglib;
02:
03: import org.hibernate.bytecode.ReflectionOptimizer;
04: import org.hibernate.PropertyAccessException;
05: import net.sf.cglib.beans.BulkBean;
06: import net.sf.cglib.beans.BulkBeanException;
07: import net.sf.cglib.reflect.FastClass;
08:
09: import java.io.Serializable;
10: import java.io.ObjectOutputStream;
11: import java.io.IOException;
12: import java.io.ObjectInputStream;
13:
14: /**
15: * The {@link ReflectionOptimizer.AccessOptimizer} implementation for CGLIB
16: * which simply acts as an adpater to the {@link BulkBean} class.
17: *
18: * @author Steve Ebersole
19: */
20: public class AccessOptimizerAdapter implements
21: ReflectionOptimizer.AccessOptimizer, Serializable {
22:
23: public static final String PROPERTY_GET_EXCEPTION = "exception getting property value with CGLIB (set hibernate.bytecode.use_reflection_optimizer=false for more info)";
24:
25: public static final String PROPERTY_SET_EXCEPTION = "exception setting property value with CGLIB (set hibernate.bytecode.use_reflection_optimizer=false for more info)";
26:
27: private Class mappedClass;
28: private BulkBean bulkBean;
29:
30: public AccessOptimizerAdapter(BulkBean bulkBean, Class mappedClass) {
31: this .bulkBean = bulkBean;
32: this .mappedClass = mappedClass;
33: }
34:
35: public String[] getPropertyNames() {
36: return bulkBean.getGetters();
37: }
38:
39: public Object[] getPropertyValues(Object object) {
40: try {
41: return bulkBean.getPropertyValues(object);
42: } catch (Throwable t) {
43: throw new PropertyAccessException(t,
44: PROPERTY_GET_EXCEPTION, false, mappedClass,
45: getterName(t, bulkBean));
46: }
47: }
48:
49: public void setPropertyValues(Object object, Object[] values) {
50: try {
51: bulkBean.setPropertyValues(object, values);
52: } catch (Throwable t) {
53: throw new PropertyAccessException(t,
54: PROPERTY_SET_EXCEPTION, true, mappedClass,
55: setterName(t, bulkBean));
56: }
57: }
58:
59: private static String setterName(Throwable t, BulkBean optimizer) {
60: if (t instanceof BulkBeanException) {
61: return optimizer.getSetters()[((BulkBeanException) t)
62: .getIndex()];
63: } else {
64: return "?";
65: }
66: }
67:
68: private static String getterName(Throwable t, BulkBean optimizer) {
69: if (t instanceof BulkBeanException) {
70: return optimizer.getGetters()[((BulkBeanException) t)
71: .getIndex()];
72: } else {
73: return "?";
74: }
75: }
76:
77: private void writeObject(ObjectOutputStream out) throws IOException {
78: out.writeObject(mappedClass);
79: out.writeObject(bulkBean.getGetters());
80: out.writeObject(bulkBean.getSetters());
81: out.writeObject(bulkBean.getPropertyTypes());
82: }
83:
84: private void readObject(ObjectInputStream in) throws IOException,
85: ClassNotFoundException {
86: Class beanClass = (Class) in.readObject();
87: String[] getters = (String[]) in.readObject();
88: String[] setters = (String[]) in.readObject();
89: Class[] types = (Class[]) in.readObject();
90: bulkBean = BulkBean.create(beanClass, getters, setters, types);
91: }
92: }
|