1 4 package com.tc.object.applicator; 5 6 import com.tc.object.ClientObjectManager; 7 import com.tc.object.SerializationUtil; 8 import com.tc.object.TCObject; 9 import com.tc.object.dna.api.DNA; 10 import com.tc.object.dna.api.DNACursor; 11 import com.tc.object.dna.api.DNAWriter; 12 import com.tc.object.dna.api.LogicalAction; 13 import com.tc.object.dna.api.PhysicalAction; 14 import com.tc.object.dna.impl.DNAEncoding; 15 import com.tc.util.Assert; 16 import com.tc.util.FieldUtils; 17 18 import java.io.IOException ; 19 import java.lang.reflect.Field ; 20 import java.util.LinkedHashMap ; 21 22 25 public class LinkedHashMapApplicator extends PartialHashMapApplicator { 26 private static final String ACCESS_ORDER_FIELDNAME = "java.util.LinkedHashMap.accessOrder"; 27 private static final Field ACCESS_ORDER_FIELD; 28 29 static { 30 try { 31 ACCESS_ORDER_FIELD = LinkedHashMap .class.getDeclaredField("accessOrder"); 32 ACCESS_ORDER_FIELD.setAccessible(true); 33 } catch (Exception e) { 34 throw new RuntimeException (e); 35 } 36 } 37 38 public LinkedHashMapApplicator(DNAEncoding encoding) { 39 super(encoding); 40 } 41 42 public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object pojo) throws IOException , 43 ClassNotFoundException { 44 DNACursor cursor = dna.getCursor(); 45 while (cursor.next(encoding)) { 46 Object action = cursor.getAction(); 47 if (action instanceof PhysicalAction) { 48 PhysicalAction physicalAction = (PhysicalAction) action; 49 Assert.assertEquals(ACCESS_ORDER_FIELDNAME, physicalAction.getFieldName()); 50 setAccessOrder(pojo, physicalAction.getObject()); 51 } else { 52 LogicalAction logicalAction = (LogicalAction) action; 53 int method = logicalAction.getMethod(); 54 Object [] params = logicalAction.getParameters(); 55 apply(objectManager, pojo, method, params); 56 } 57 } 58 } 59 60 private void setAccessOrder(Object target, Object value) { 61 try { 62 FieldUtils.tcSet(target, value, ACCESS_ORDER_FIELD); 63 } catch (Exception e) { 64 throw new RuntimeException (e); 65 } 66 } 67 68 protected void apply(ClientObjectManager objectManager, Object pojo, int method, Object [] params) throws ClassNotFoundException { 69 switch (method) { 70 case SerializationUtil.GET: 71 ((LinkedHashMap ) pojo).get(params[0]); 72 break; 73 default: 74 super.apply(objectManager, pojo, method, params); 75 } 76 } 77 78 private boolean getAccessOrder(Object pojo) { 79 try { 80 return ACCESS_ORDER_FIELD.getBoolean(pojo); 81 } catch (Exception e) { 82 throw new RuntimeException (e); 83 } 84 } 85 86 public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object pojo) { 87 writer.addPhysicalAction(ACCESS_ORDER_FIELDNAME, new Boolean (getAccessOrder(pojo))); 88 super.dehydrate(objectManager, tcObject, writer, pojo); 89 } 90 91 public Object getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException , ClassNotFoundException { 92 DNACursor cursor = dna.getCursor(); 93 if (!cursor.next(encoding)) { throw new AssertionError ( 94 "Cursor is empty in LinkedHashMapApplicator.getNewInstance()"); } 95 PhysicalAction physicalAction = cursor.getPhysicalAction(); 96 97 return new LinkedHashMap (1, 0.75f, ((Boolean ) physicalAction.getObject()).booleanValue()); 98 } 99 } 100 | Popular Tags |