Source code: org/hibernate/bytecode/cglib/AccessOptimizerAdapter.java
1 package org.hibernate.bytecode.cglib;
2
3 import org.hibernate.bytecode.ReflectionOptimizer;
4 import org.hibernate.PropertyAccessException;
5 import net.sf.cglib.beans.BulkBean;
6 import net.sf.cglib.beans.BulkBeanException;
7 import net.sf.cglib.reflect.FastClass;
8
9 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 ReflectionOptimizer.AccessOptimizer, Serializable {
21
22 public static final String PROPERTY_GET_EXCEPTION =
23 "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 =
26 "exception setting property value with CGLIB (set hibernate.bytecode.use_reflection_optimizer=false for more info)";
27
28 private Class mappedClass;
29 private BulkBean bulkBean;
30
31 public AccessOptimizerAdapter(BulkBean bulkBean, Class mappedClass) {
32 this.bulkBean = bulkBean;
33 this.mappedClass = mappedClass;
34 }
35
36 public String[] getPropertyNames() {
37 return bulkBean.getGetters();
38 }
39
40 public Object[] getPropertyValues(Object object) {
41 try {
42 return bulkBean.getPropertyValues( object );
43 }
44 catch ( Throwable t ) {
45 throw new PropertyAccessException(
46 t,
47 PROPERTY_GET_EXCEPTION,
48 false,
49 mappedClass,
50 getterName( t, bulkBean )
51 );
52 }
53 }
54
55 public void setPropertyValues(Object object, Object[] values) {
56 try {
57 bulkBean.setPropertyValues( object, values );
58 }
59 catch ( Throwable t ) {
60 throw new PropertyAccessException(
61 t,
62 PROPERTY_SET_EXCEPTION,
63 true,
64 mappedClass,
65 setterName( t, bulkBean )
66 );
67 }
68 }
69
70 private static String setterName(Throwable t, BulkBean optimizer) {
71 if ( t instanceof BulkBeanException ) {
72 return optimizer.getSetters()[( ( BulkBeanException ) t ).getIndex()];
73 }
74 else {
75 return "?";
76 }
77 }
78
79 private static String getterName(Throwable t, BulkBean optimizer) {
80 if ( t instanceof BulkBeanException ) {
81 return optimizer.getGetters()[( ( BulkBeanException ) t ).getIndex()];
82 }
83 else {
84 return "?";
85 }
86 }
87
88 private void writeObject(ObjectOutputStream out) throws IOException {
89 out.writeObject( mappedClass );
90 out.writeObject( bulkBean.getGetters() );
91 out.writeObject( bulkBean.getSetters() );
92 out.writeObject( bulkBean.getPropertyTypes() );
93 }
94
95 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
96 Class beanClass = ( Class ) in.readObject();
97 String[] getters = ( String[] ) in.readObject();
98 String[] setters = ( String[] ) in.readObject();
99 Class[] types = ( Class[] ) in.readObject();
100 bulkBean = BulkBean.create( beanClass, getters, setters, types );
101 }
102 }