KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > modules > cglib_2_1_3 > object > applicator > CglibBulkBeanApplicator


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package org.terracotta.modules.cglib_2_1_3.object.applicator;
6
7 import com.tc.exception.TCNotSupportedMethodException;
8 import com.tc.exception.TCRuntimeException;
9 import com.tc.object.ClientObjectManager;
10 import com.tc.object.ObjectID;
11 import com.tc.object.TCObject;
12 import com.tc.object.TraversedReferences;
13 import com.tc.object.applicator.BaseApplicator;
14 import com.tc.object.dna.api.DNA;
15 import com.tc.object.dna.api.DNACursor;
16 import com.tc.object.dna.api.DNAWriter;
17 import com.tc.object.dna.api.PhysicalAction;
18 import com.tc.object.dna.impl.DNAEncoding;
19 import com.tc.object.tx.optimistic.OptimisticTransactionManager;
20 import com.tc.util.Assert;
21
22 import java.io.IOException JavaDoc;
23 import java.lang.reflect.Field JavaDoc;
24 import java.lang.reflect.InvocationTargetException JavaDoc;
25 import java.lang.reflect.Method JavaDoc;
26 import java.util.Map JavaDoc;
27
28 public class CglibBulkBeanApplicator extends BaseApplicator {
29   private static final String JavaDoc GETTERS_FIELD_NAME = "net.sf.cglib.beans.BulkBean.getters";
30   private static final String JavaDoc SETTERS_FIELD_NAME = "net.sf.cglib.beans.BulkBean.setters";
31   private static final String JavaDoc TYPES_FIELD_NAME = "net.sf.cglib.beans.BulkBean.types";
32   private static final String JavaDoc TARGET_FIELD_NAME = "net.sf.cglib.beans.BulkBean.target";
33
34   public CglibBulkBeanApplicator(DNAEncoding encoding) {
35     super(encoding);
36   }
37
38   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
39     addTo.addAnonymousReference(getGetters(pojo));
40     addTo.addAnonymousReference(getSetters(pojo));
41     addTo.addAnonymousReference(getPropertyTypes(pojo));
42     addTo.addAnonymousReference(getTarget(pojo));
43     return addTo;
44   }
45
46   private Object JavaDoc getGetters(Object JavaDoc pojo) {
47     //return get(pojo, "getGetters", new Class[] {}, new Object[] {});
48
return getField(pojo, "getters");
49   }
50
51   private Object JavaDoc getSetters(Object JavaDoc pojo) {
52     //return get(pojo, "getGetters", new Class[] {}, new Object[] {});
53
return getField(pojo, "setters");
54   }
55
56   private Object JavaDoc getPropertyTypes(Object JavaDoc pojo) {
57     //return get(pojo, "getPropertyTypes", new Class[] {}, new Object[] {});
58
return getField(pojo, "types");
59   }
60   
61   private Class JavaDoc getTarget(Object JavaDoc pojo) {
62     return (Class JavaDoc)getField(pojo, "target");
63   }
64
65   private Object JavaDoc getField(Object JavaDoc pojo, String JavaDoc fieldName) {
66     try {
67       Field JavaDoc field = pojo.getClass().getSuperclass().getDeclaredField(fieldName);
68       field.setAccessible(true);
69       return field.get(pojo);
70     } catch (IllegalArgumentException JavaDoc e) {
71       throw new TCRuntimeException(e);
72     } catch (IllegalAccessException JavaDoc e) {
73       throw new TCRuntimeException(e);
74     } catch (NoSuchFieldException JavaDoc e) {
75       throw new TCRuntimeException(e);
76     }
77   }
78
79   private Object JavaDoc get(Object JavaDoc pojo, String JavaDoc methodName, Class JavaDoc[] parameterTypes, Object JavaDoc[] parameterValues) {
80     try {
81       Method JavaDoc m = pojo.getClass().getMethod(methodName, parameterTypes);
82       Object JavaDoc callBack = m.invoke(pojo, parameterValues);
83       return callBack;
84     } catch (NoSuchMethodException JavaDoc e) {
85       throw new TCRuntimeException(e);
86     } catch (IllegalArgumentException JavaDoc e) {
87       throw new TCRuntimeException(e);
88     } catch (IllegalAccessException JavaDoc e) {
89       throw new TCRuntimeException(e);
90     } catch (InvocationTargetException JavaDoc e) {
91       throw new TCRuntimeException(e);
92     }
93   }
94
95   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc po) throws IOException JavaDoc,
96       IllegalArgumentException JavaDoc, ClassNotFoundException JavaDoc {
97     //
98
}
99
100   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
101
102     Class JavaDoc target = getTarget(pojo);
103     writer.addPhysicalAction(TARGET_FIELD_NAME, target);
104     
105     Object JavaDoc getters = getGetters(pojo);
106     Object JavaDoc dehydratableGetters = getDehydratableObject(getters, objectManager);
107     writer.addPhysicalAction(GETTERS_FIELD_NAME, dehydratableGetters);
108
109     Object JavaDoc setters = getSetters(pojo);
110     Object JavaDoc dehydratableSetters = getDehydratableObject(setters, objectManager);
111     writer.addPhysicalAction(SETTERS_FIELD_NAME, dehydratableSetters);
112     
113     Object JavaDoc types = getPropertyTypes(pojo);
114     Object JavaDoc dehydratableTypes = getDehydratableObject(types, objectManager);
115     writer.addPhysicalAction(TYPES_FIELD_NAME, dehydratableTypes);
116   }
117
118   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
119     DNACursor cursor = dna.getCursor();
120     Assert.assertEquals(4, cursor.getActionCount());
121
122     cursor.next(encoding);
123     PhysicalAction a = cursor.getPhysicalAction();
124     Class JavaDoc target = (Class JavaDoc) a.getObject();
125
126     cursor.next(encoding);
127     a = cursor.getPhysicalAction();
128     Object JavaDoc getters = a.getObject();
129     getters = objectManager.lookupObject((ObjectID) getters);
130     
131     cursor.next(encoding);
132     a = cursor.getPhysicalAction();
133     Object JavaDoc setters = a.getObject();
134     setters = objectManager.lookupObject((ObjectID) setters);
135     
136     cursor.next(encoding);
137     a = cursor.getPhysicalAction();
138     Object JavaDoc types = a.getObject();
139     types = objectManager.lookupObject((ObjectID) types);
140
141     return create(target, getters, setters, types);
142   }
143
144   private Object JavaDoc create(Class JavaDoc target, Object JavaDoc getters, Object JavaDoc setters, Object JavaDoc types) {
145     try {
146       Class JavaDoc bulkBeanClass = target.getClassLoader().loadClass("net.sf.cglib.beans.BulkBean");
147       
148       Method JavaDoc m = bulkBeanClass.getDeclaredMethod("create", new Class JavaDoc[] { Class JavaDoc.class, String JavaDoc[].class, String JavaDoc[].class, Class JavaDoc[].class});
149       Object JavaDoc o = m.invoke(null, new Object JavaDoc[] { target, getters, setters, types });
150       return o;
151     } catch (NoSuchMethodException JavaDoc e) {
152       throw new TCRuntimeException(e);
153     } catch (IllegalArgumentException JavaDoc e) {
154       throw new TCRuntimeException(e);
155     } catch (IllegalAccessException JavaDoc e) {
156       throw new TCRuntimeException(e);
157     } catch (InvocationTargetException JavaDoc e) {
158       throw new TCRuntimeException(e);
159     } catch (ClassNotFoundException JavaDoc e) {
160       throw new TCRuntimeException(e);
161     }
162   }
163
164   public Map JavaDoc connectedCopy(Object JavaDoc source, Object JavaDoc dest, Map JavaDoc visited, ClientObjectManager objectManager,
165                            OptimisticTransactionManager txManager) {
166     throw new TCNotSupportedMethodException();
167   }
168 }
169
Popular Tags