KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > object > applicator > TreeMapApplicator


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 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.api.PhysicalAction;
18 import com.tc.object.dna.impl.DNAEncoding;
19 import com.tc.object.tx.optimistic.OptimisticTransactionManager;
20 import com.tc.object.tx.optimistic.TCObjectClone;
21 import com.tc.util.Assert;
22 import com.tc.util.FieldUtils;
23
24 import java.io.IOException JavaDoc;
25 import java.lang.reflect.Field JavaDoc;
26 import java.util.Collection JavaDoc;
27 import java.util.Comparator JavaDoc;
28 import java.util.IdentityHashMap JavaDoc;
29 import java.util.Iterator JavaDoc;
30 import java.util.Map JavaDoc;
31 import java.util.TreeMap JavaDoc;
32 import java.util.Map.Entry;
33
34 public class TreeMapApplicator extends BaseApplicator {
35
36   static final String JavaDoc COMPARATOR_FIELDNAME = "java.util.TreeMap.comparator";
37   private static final Field JavaDoc COMPARATOR_FIELD;
38
39   static {
40     try {
41       Field JavaDoc field = TreeMap JavaDoc.class.getDeclaredField("comparator");
42       field.setAccessible(true);
43       COMPARATOR_FIELD = field;
44     } catch (Exception JavaDoc e) {
45       throw new RuntimeException JavaDoc(e);
46     }
47   }
48
49   public TreeMapApplicator(DNAEncoding encoding) {
50     super(encoding);
51   }
52
53   /**
54    * return the key value pairs of field names to shared objects for this source. We already updated the literals and
55    * set the new TCObjectClone
56    */

57   public Map JavaDoc connectedCopy(Object JavaDoc source, Object JavaDoc dest, Map JavaDoc visited, ClientObjectManager objectManager,
58                            OptimisticTransactionManager txManager) {
59     Map JavaDoc cloned = new IdentityHashMap JavaDoc();
60
61     Manageable sourceManageable = (Manageable) source;
62     Manageable destManaged = (Manageable) dest;
63
64     TreeMap JavaDoc sourceMap = (TreeMap JavaDoc) source;
65     TreeMap JavaDoc destMap = (TreeMap JavaDoc) dest;
66
67     for (Iterator JavaDoc i = sourceMap.entrySet().iterator(); i.hasNext();) {
68       Entry e = (Entry) i.next();
69
70       Object JavaDoc k = e.getKey();
71       Object JavaDoc v = e.getValue();
72
73       Object JavaDoc copyKey = createCopyIfNecessary(objectManager, visited, cloned, k);
74       Object JavaDoc copyValue = createCopyIfNecessary(objectManager, visited, cloned, v);
75
76       destMap.put(copyKey, copyValue);
77     }
78
79     // deal with comparator
80
Comparator JavaDoc comparatorOrig = sourceMap.comparator();
81     Comparator JavaDoc copyValue = (Comparator JavaDoc) createCopyIfNecessary(objectManager, visited, cloned, comparatorOrig);
82     // FIXME::TODO:: check if this is OK.
83
setComparator(destMap, copyValue);
84
85     destManaged.__tc_managed(new TCObjectClone(sourceManageable.__tc_managed(), txManager));
86
87     return cloned;
88   }
89
90   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
91     TreeMap JavaDoc treemap = (TreeMap JavaDoc) pojo;
92     filterPortableObjects(treemap.keySet(), addTo);
93     filterPortableObjects(treemap.values(), addTo);
94     filterPortableObject(treemap.comparator(), addTo);
95     return addTo;
96   }
97
98   private void filterPortableObjects(Collection JavaDoc objects, TraversedReferences addTo) {
99     for (Iterator JavaDoc i = objects.iterator(); i.hasNext();) {
100       Object JavaDoc value = i.next();
101       filterPortableObject(value, addTo);
102     }
103   }
104
105   private void filterPortableObject(Object JavaDoc value, TraversedReferences addTo) {
106     if (value != null && isPortableReference(value.getClass())) {
107       addTo.addAnonymousReference(value);
108     }
109   }
110
111   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc po) throws IOException JavaDoc,
112       ClassNotFoundException JavaDoc {
113     Map JavaDoc m = (Map JavaDoc) po;
114     DNACursor cursor = dna.getCursor();
115
116     while (cursor.next(encoding)) {
117       Object JavaDoc action = cursor.getAction();
118       if (action instanceof PhysicalAction) {
119         // This is done so that subclass of TreeMaps can work
120
PhysicalAction pa = (PhysicalAction) action;
121         Assert.assertEquals(COMPARATOR_FIELDNAME, pa.getFieldName());
122         Comparator JavaDoc c = (Comparator JavaDoc) objectManager.lookupObject((ObjectID) pa.getObject());
123         setComparator(po, c);
124       } else {
125         LogicalAction la = (LogicalAction) action;
126         int method = la.getMethod();
127         Object JavaDoc[] params = la.getParameters();
128         switch (method) {
129           case SerializationUtil.PUT:
130             Object JavaDoc k = params[0];
131             Object JavaDoc v = params[1];
132             Object JavaDoc pkey = k instanceof ObjectID ? objectManager.lookupObject((ObjectID) k) : k;
133             Object JavaDoc value = v instanceof ObjectID ? objectManager.lookupObject((ObjectID) v) : v;
134             m.put(pkey, value);
135             break;
136           case SerializationUtil.REMOVE:
137             Object JavaDoc rkey = params[0] instanceof ObjectID ? objectManager.lookupObject((ObjectID) params[0]) : params[0];
138             m.remove(rkey);
139             break;
140           case SerializationUtil.CLEAR:
141             m.clear();
142             break;
143           default:
144             throw new AssertionError JavaDoc("invalid action:" + method);
145         }
146       }
147     }
148   }
149
150   private void setComparator(Object JavaDoc target, Object JavaDoc value) {
151     try {
152       FieldUtils.tcSet(target, value, COMPARATOR_FIELD);
153     } catch (Exception JavaDoc e) {
154       throw new RuntimeException JavaDoc(e);
155     }
156   }
157
158   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
159     TreeMap JavaDoc map = (TreeMap JavaDoc) pojo;
160
161     Comparator JavaDoc cmp = map.comparator();
162     final Object JavaDoc cmpObj = getDehydratableObject(cmp, objectManager);
163     if (cmpObj != null) {
164       writer.addPhysicalAction(COMPARATOR_FIELDNAME, cmpObj);
165     }
166
167     for (Iterator JavaDoc i = map.entrySet().iterator(); i.hasNext();) {
168       Entry entry = (Entry) i.next();
169       Object JavaDoc key = entry.getKey();
170       Object JavaDoc value = entry.getValue();
171
172       if (!objectManager.isPortableInstance(key)) {
173         continue;
174       }
175       if (!objectManager.isPortableInstance(value)) {
176         continue;
177       }
178
179       final Object JavaDoc addKey = getDehydratableObject(key, objectManager);
180       final Object JavaDoc addValue = getDehydratableObject(value, objectManager);
181
182       if (addKey == null || addValue == null) {
183         continue;
184       }
185
186       writer.addLogicalAction(SerializationUtil.PUT, new Object JavaDoc[] { addKey, addValue });
187     }
188
189   }
190
191   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
192     DNACursor cursor = dna.getCursor();
193     if (!cursor.next(encoding)) { throw new AssertionError JavaDoc("Cursor is empty in TreeMap.getNewInstance()"); }
194     PhysicalAction physicalAction = cursor.getPhysicalAction();
195     Assert.assertEquals(COMPARATOR_FIELDNAME, physicalAction.getFieldName());
196     Comparator JavaDoc c = (Comparator JavaDoc) objectManager.lookupObject((ObjectID) physicalAction.getObject());
197     return (c == null ? new TreeMap JavaDoc() : new TreeMap JavaDoc(c));
198   }
199 }
200
Popular Tags