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