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.Field ; 24 import java.lang.reflect.InvocationTargetException ; 25 import java.lang.reflect.Method ; 26 import java.util.Map ; 27 28 public class CglibBulkBeanApplicator extends BaseApplicator { 29 private static final String GETTERS_FIELD_NAME = "net.sf.cglib.beans.BulkBean.getters"; 30 private static final String SETTERS_FIELD_NAME = "net.sf.cglib.beans.BulkBean.setters"; 31 private static final String TYPES_FIELD_NAME = "net.sf.cglib.beans.BulkBean.types"; 32 private static final String 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 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 getGetters(Object pojo) { 47 return getField(pojo, "getters"); 49 } 50 51 private Object getSetters(Object pojo) { 52 return getField(pojo, "setters"); 54 } 55 56 private Object getPropertyTypes(Object pojo) { 57 return getField(pojo, "types"); 59 } 60 61 private Class getTarget(Object pojo) { 62 return (Class )getField(pojo, "target"); 63 } 64 65 private Object getField(Object pojo, String fieldName) { 66 try { 67 Field field = pojo.getClass().getSuperclass().getDeclaredField(fieldName); 68 field.setAccessible(true); 69 return field.get(pojo); 70 } catch (IllegalArgumentException e) { 71 throw new TCRuntimeException(e); 72 } catch (IllegalAccessException e) { 73 throw new TCRuntimeException(e); 74 } catch (NoSuchFieldException e) { 75 throw new TCRuntimeException(e); 76 } 77 } 78 79 private Object get(Object pojo, String methodName, Class [] parameterTypes, Object [] parameterValues) { 80 try { 81 Method m = pojo.getClass().getMethod(methodName, parameterTypes); 82 Object callBack = m.invoke(pojo, parameterValues); 83 return callBack; 84 } catch (NoSuchMethodException e) { 85 throw new TCRuntimeException(e); 86 } catch (IllegalArgumentException e) { 87 throw new TCRuntimeException(e); 88 } catch (IllegalAccessException e) { 89 throw new TCRuntimeException(e); 90 } catch (InvocationTargetException e) { 91 throw new TCRuntimeException(e); 92 } 93 } 94 95 public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object po) throws IOException , 96 IllegalArgumentException , ClassNotFoundException { 97 } 99 100 public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object pojo) { 101 102 Class target = getTarget(pojo); 103 writer.addPhysicalAction(TARGET_FIELD_NAME, target); 104 105 Object getters = getGetters(pojo); 106 Object dehydratableGetters = getDehydratableObject(getters, objectManager); 107 writer.addPhysicalAction(GETTERS_FIELD_NAME, dehydratableGetters); 108 109 Object setters = getSetters(pojo); 110 Object dehydratableSetters = getDehydratableObject(setters, objectManager); 111 writer.addPhysicalAction(SETTERS_FIELD_NAME, dehydratableSetters); 112 113 Object types = getPropertyTypes(pojo); 114 Object dehydratableTypes = getDehydratableObject(types, objectManager); 115 writer.addPhysicalAction(TYPES_FIELD_NAME, dehydratableTypes); 116 } 117 118 public Object getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException , ClassNotFoundException { 119 DNACursor cursor = dna.getCursor(); 120 Assert.assertEquals(4, cursor.getActionCount()); 121 122 cursor.next(encoding); 123 PhysicalAction a = cursor.getPhysicalAction(); 124 Class target = (Class ) a.getObject(); 125 126 cursor.next(encoding); 127 a = cursor.getPhysicalAction(); 128 Object getters = a.getObject(); 129 getters = objectManager.lookupObject((ObjectID) getters); 130 131 cursor.next(encoding); 132 a = cursor.getPhysicalAction(); 133 Object setters = a.getObject(); 134 setters = objectManager.lookupObject((ObjectID) setters); 135 136 cursor.next(encoding); 137 a = cursor.getPhysicalAction(); 138 Object types = a.getObject(); 139 types = objectManager.lookupObject((ObjectID) types); 140 141 return create(target, getters, setters, types); 142 } 143 144 private Object create(Class target, Object getters, Object setters, Object types) { 145 try { 146 Class bulkBeanClass = target.getClassLoader().loadClass("net.sf.cglib.beans.BulkBean"); 147 148 Method m = bulkBeanClass.getDeclaredMethod("create", new Class [] { Class .class, String [].class, String [].class, Class [].class}); 149 Object o = m.invoke(null, new Object [] { target, getters, setters, types }); 150 return o; 151 } catch (NoSuchMethodException e) { 152 throw new TCRuntimeException(e); 153 } catch (IllegalArgumentException e) { 154 throw new TCRuntimeException(e); 155 } catch (IllegalAccessException e) { 156 throw new TCRuntimeException(e); 157 } catch (InvocationTargetException e) { 158 throw new TCRuntimeException(e); 159 } catch (ClassNotFoundException e) { 160 throw new TCRuntimeException(e); 161 } 162 } 163 164 public Map connectedCopy(Object source, Object dest, Map visited, ClientObjectManager objectManager, 165 OptimisticTransactionManager txManager) { 166 throw new TCNotSupportedMethodException(); 167 } 168 } 169 | Popular Tags |