KickJava   Java API By Example, From Geeks To Geeks.

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


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.InvocationTargetException JavaDoc;
24 import java.lang.reflect.Method JavaDoc;
25 import java.util.Map JavaDoc;
26
27 public class CglibProxyApplicator extends BaseApplicator {
28   private static final String JavaDoc SUPERCLASS_FIELD_NAME = "net.sf.cglib.proxy.Factory.superclass";
29   private static final String JavaDoc CALLBACK_FIELD_NAME = "net.sf.cglib.proxy.Factory.callBack";
30
31   public CglibProxyApplicator(DNAEncoding encoding) {
32     super(encoding);
33   }
34
35   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
36     addTo.addAnonymousReference(getCallBack(pojo));
37     return addTo;
38   }
39   
40   private Object JavaDoc getCallBack(Object JavaDoc pojo) {
41     return get(pojo, "getCallback", new Class JavaDoc[]{Integer.TYPE}, new Object JavaDoc[]{new Integer JavaDoc(0)});
42   }
43   
44   private Object JavaDoc get(Object JavaDoc pojo, String JavaDoc methodName, Class JavaDoc[] parameterTypes, Object JavaDoc[] parameterValues) {
45     try {
46       Method JavaDoc m = pojo.getClass().getDeclaredMethod(methodName, parameterTypes);
47       Object JavaDoc callBack = m.invoke(pojo, parameterValues);
48       return callBack;
49     } catch (NoSuchMethodException JavaDoc e) {
50       throw new TCRuntimeException(e);
51     } catch (IllegalArgumentException JavaDoc e) {
52       throw new TCRuntimeException(e);
53     } catch (IllegalAccessException JavaDoc e) {
54       throw new TCRuntimeException(e);
55     } catch (InvocationTargetException JavaDoc e) {
56       throw new TCRuntimeException(e);
57     }
58   }
59
60   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc po) throws IOException JavaDoc,
61       IllegalArgumentException JavaDoc, ClassNotFoundException JavaDoc {
62     //
63
}
64
65   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
66     Object JavaDoc callBack = getCallBack(pojo);
67     Object JavaDoc dehydratableCallBack = getDehydratableObject(callBack, objectManager);
68
69     Class JavaDoc superClass = pojo.getClass().getSuperclass();
70
71     writer.addPhysicalAction(SUPERCLASS_FIELD_NAME, superClass);
72     writer.addPhysicalAction(CALLBACK_FIELD_NAME, dehydratableCallBack);
73   }
74
75   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
76     DNACursor cursor = dna.getCursor();
77     Assert.assertEquals(2, cursor.getActionCount());
78
79     cursor.next(encoding);
80     PhysicalAction a = cursor.getPhysicalAction();
81     Class JavaDoc superClass = (Class JavaDoc) a.getObject();
82
83     cursor.next(encoding);
84     a = cursor.getPhysicalAction();
85     Object JavaDoc callBack = a.getObject();
86
87     callBack = objectManager.lookupObject((ObjectID) callBack);
88
89     //return Enhancer.create(superClass, (Callback) callBack);
90
return create(superClass, callBack);
91   }
92   
93   private Object JavaDoc create(Class JavaDoc superClass, Object JavaDoc callBack) {
94     try {
95       Class JavaDoc enhancerClass = superClass.getClassLoader().loadClass("net.sf.cglib.proxy.Enhancer");
96       Class JavaDoc callbackClass = callBack.getClass().getClassLoader().loadClass("net.sf.cglib.proxy.Callback");
97       Method JavaDoc m = enhancerClass.getDeclaredMethod("create", new Class JavaDoc[]{ Class JavaDoc.class, callbackClass } );
98       Object JavaDoc o = m.invoke(null, new Object JavaDoc[]{ superClass, callBack });
99       return o;
100     } catch (NoSuchMethodException JavaDoc e) {
101       throw new TCRuntimeException(e);
102     } catch (IllegalArgumentException JavaDoc e) {
103       throw new TCRuntimeException(e);
104     } catch (IllegalAccessException JavaDoc e) {
105       throw new TCRuntimeException(e);
106     } catch (InvocationTargetException JavaDoc e) {
107       throw new TCRuntimeException(e);
108     } catch (ClassNotFoundException JavaDoc e) {
109       throw new TCRuntimeException(e);
110     }
111   }
112
113   public Map JavaDoc connectedCopy(Object JavaDoc source, Object JavaDoc dest, Map JavaDoc visited, ClientObjectManager objectManager,
114                            OptimisticTransactionManager txManager) {
115     throw new TCNotSupportedMethodException();
116   }
117 }
118
Popular Tags