1 5 package com.tc.object.applicator; 6 7 import com.tc.object.ClientObjectManager; 8 import com.tc.object.ObjectID; 9 import com.tc.object.SerializationUtil; 10 import com.tc.object.TCObject; 11 import com.tc.object.TraversedReferences; 12 import com.tc.object.bytecode.Manageable; 13 import com.tc.object.dna.api.DNA; 14 import com.tc.object.dna.api.DNACursor; 15 import com.tc.object.dna.api.DNAWriter; 16 import com.tc.object.dna.api.LogicalAction; 17 import com.tc.object.dna.impl.DNAEncoding; 18 import com.tc.object.tx.optimistic.OptimisticTransactionManager; 19 import com.tc.object.tx.optimistic.TCObjectClone; 20 import com.tc.util.Assert; 21 22 import java.io.IOException ; 23 import java.util.ArrayList ; 24 import java.util.IdentityHashMap ; 25 import java.util.Iterator ; 26 import java.util.List ; 27 import java.util.Map ; 28 import java.util.Set ; 29 30 33 public class HashSetApplicator extends BaseApplicator { 34 35 public HashSetApplicator(DNAEncoding encoding) { 36 super(encoding); 37 } 38 39 public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object pojo) throws IOException , 40 ClassNotFoundException { 41 Set set = (Set ) pojo; 42 DNACursor cursor = dna.getCursor(); 43 44 while (cursor.next(encoding)) { 45 LogicalAction action = cursor.getLogicalAction(); 46 int method = action.getMethod(); 47 Object [] params = action.getParameters(); 48 apply(objectManager, set, method, params); 49 } 50 } 51 52 protected void apply(ClientObjectManager objectManager, Set set, int method, Object [] params) throws ClassNotFoundException { 53 switch (method) { 54 case SerializationUtil.ADD: 55 Object v = getValue(params); 56 Object value = v instanceof ObjectID ? objectManager.lookupObject((ObjectID) v) : v; 57 set.add(value); 58 break; 59 case SerializationUtil.REMOVE: 60 Object rkey = params[0] instanceof ObjectID ? objectManager.lookupObject((ObjectID) params[0]) : params[0]; 61 set.remove(rkey); 62 break; 63 case SerializationUtil.REMOVE_ALL: 64 set.removeAll(getObjectParams(objectManager, params)); 65 break; 66 case SerializationUtil.CLEAR: 67 set.clear(); 68 break; 69 default: 70 throw new AssertionError ("invalid action:" + method); 71 } 72 } 73 74 private List getObjectParams(ClientObjectManager objectManager, Object [] params) throws ClassNotFoundException { 75 List retParams = new ArrayList (params.length); 76 77 for (int i = 0; i < params.length; i++) { 78 retParams.add(params[i] instanceof ObjectID ? objectManager.lookupObject((ObjectID) params[i]) : params[i]); 79 } 80 return retParams; 81 } 82 83 private Object getValue(Object [] params) { 84 return params.length == 2 ? params[1] : params[0]; 86 } 87 88 public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object pojo) { 89 Set set = (Set ) pojo; 90 for (Iterator i = set.iterator(); i.hasNext();) { 91 Object value = i.next(); 92 if (!objectManager.isPortableInstance(value)) { 93 continue; 94 } 95 96 final Object addValue = getDehydratableObject(value, objectManager); 97 98 if (addValue == null) { 99 continue; 100 } 101 102 writer.addLogicalAction(SerializationUtil.ADD, new Object [] { addValue }); 103 } 104 } 105 106 public TraversedReferences getPortableObjects(Object pojo, TraversedReferences addTo) { 107 Set set = (Set ) pojo; 108 for (Iterator i = set.iterator(); i.hasNext();) { 109 Object o = i.next(); 110 if (o != null && isPortableReference(o.getClass())) { 111 addTo.addAnonymousReference(o); 112 } 113 } 114 return addTo; 115 } 116 117 public Object getNewInstance(ClientObjectManager objectManager, DNA dna) { 118 throw new UnsupportedOperationException (); 119 } 120 121 public Map connectedCopy(Object source, Object dest, Map visited, ClientObjectManager objectManager, 122 OptimisticTransactionManager txManager) { 123 Map cloned = new IdentityHashMap (); 124 125 Manageable sourceManageable = (Manageable) source; 126 Manageable destManaged = (Manageable) dest; 127 128 Set sourceSet = (Set ) source; 129 Set destSet = (Set ) dest; 130 131 for (Iterator i = sourceSet.iterator(); i.hasNext();) { 132 Object v = i.next(); 133 Object copyValue = null; 134 135 if (isLiteralInstance(v)) { 136 copyValue = v; 137 } else if (visited.containsKey(v)) { 138 Assert.eval(visited.get(v) != null); 139 copyValue = visited.get(v); 140 } else { 141 Assert.eval(!isLiteralInstance(v)); 142 copyValue = objectManager.createNewCopyInstance(v, createParentIfNecessary(visited, objectManager, cloned, v)); 143 144 visited.put(v, copyValue); 145 cloned.put(v, copyValue); 146 } 147 destSet.add(copyValue); 148 } 149 150 destManaged.__tc_managed(new TCObjectClone(sourceManageable.__tc_managed(), txManager)); 151 return cloned; 152 } 153 } 154 | Popular Tags |