KickJava   Java API By Example, From Geeks To Geeks.

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


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tc.object.applicator;
5
6 import com.tc.object.ClientObjectManager;
7 import com.tc.object.ObjectID;
8 import com.tc.object.TCObject;
9 import com.tc.object.TraversedReferences;
10 import com.tc.object.dna.api.DNA;
11 import com.tc.object.dna.api.DNACursor;
12 import com.tc.object.dna.api.DNAWriter;
13 import com.tc.object.dna.api.LogicalAction;
14 import com.tc.object.dna.api.PhysicalAction;
15 import com.tc.object.dna.impl.DNAEncoding;
16 import com.tc.util.Assert;
17 import com.tc.util.FieldUtils;
18
19 import java.io.IOException JavaDoc;
20 import java.lang.reflect.Field JavaDoc;
21 import java.util.Collection JavaDoc;
22 import java.util.Comparator JavaDoc;
23 import java.util.Iterator JavaDoc;
24 import java.util.TreeMap JavaDoc;
25 import java.util.TreeSet JavaDoc;
26
27 /**
28  * ChangeApplicator for HashSets.
29  */

30 public class TreeSetApplicator extends HashSetApplicator {
31   private static final String JavaDoc COMPARATOR_FIELDNAME = TreeMapApplicator.COMPARATOR_FIELDNAME;
32   private static final Field JavaDoc COMPARATOR_FIELD;
33   private static final Field JavaDoc TREE_MAP_FIELD;
34
35   static {
36     try {
37       COMPARATOR_FIELD = TreeMap JavaDoc.class.getDeclaredField("comparator");
38       COMPARATOR_FIELD.setAccessible(true);
39
40       TREE_MAP_FIELD = TreeSet JavaDoc.class.getDeclaredField("m");
41       TREE_MAP_FIELD.setAccessible(true);
42     } catch (Exception JavaDoc e) {
43       throw new RuntimeException JavaDoc(e);
44     }
45   }
46
47   public TreeSetApplicator(DNAEncoding encoding) {
48     super(encoding);
49   }
50
51   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc pojo) throws IOException JavaDoc,
52       ClassNotFoundException JavaDoc {
53     TreeSet JavaDoc set = (TreeSet JavaDoc) pojo;
54     DNACursor cursor = dna.getCursor();
55
56     if (!cursor.next(encoding)) { return; }
57
58     Object JavaDoc action = cursor.getAction();
59     if (action instanceof PhysicalAction) {
60       PhysicalAction pa = (PhysicalAction) action;
61       Assert.assertEquals(COMPARATOR_FIELDNAME, pa.getFieldName());
62       setComparator(set, objectManager.lookupObject((ObjectID) pa.getObject()));
63     } else {
64       LogicalAction la = (LogicalAction) action;
65       int method = la.getMethod();
66       Object JavaDoc[] params = la.getParameters();
67       super.apply(objectManager, set, method, params);
68     }
69
70     while (cursor.next(encoding)) {
71       LogicalAction la = cursor.getLogicalAction();
72       int method = la.getMethod();
73       Object JavaDoc[] params = la.getParameters();
74       super.apply(objectManager, set, method, params);
75     }
76   }
77
78   private void setComparator(Object JavaDoc treeSet, Object JavaDoc comparator) {
79     try {
80       Object JavaDoc treeMap = TREE_MAP_FIELD.get(treeSet);
81       FieldUtils.tcSet(treeMap, comparator, COMPARATOR_FIELD);
82     } catch (Exception JavaDoc e) {
83       throw new RuntimeException JavaDoc(e);
84     }
85   }
86
87   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
88     TreeSet JavaDoc set = (TreeSet JavaDoc) pojo;
89     Comparator JavaDoc cmp = set.comparator();
90     if (cmp != null) {
91       Object JavaDoc cmpObj = getDehydratableObject(cmp, objectManager);
92       if (cmpObj != null) {
93         writer.addPhysicalAction(COMPARATOR_FIELDNAME, cmpObj);
94       }
95     }
96
97     super.dehydrate(objectManager, tcObject, writer, pojo);
98   }
99
100   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
101     TreeSet JavaDoc set = (TreeSet JavaDoc) pojo;
102     filterPortableObject(set.comparator(), addTo);
103     filterPortableObjects(set, addTo);
104     return addTo;
105   }
106
107   private void filterPortableObjects(Collection JavaDoc objects, TraversedReferences addTo) {
108     for (Iterator JavaDoc i = objects.iterator(); i.hasNext();) {
109       Object JavaDoc value = i.next();
110       filterPortableObject(value, addTo);
111     }
112   }
113
114   private void filterPortableObject(Object JavaDoc value, TraversedReferences addTo) {
115     if (value != null && isPortableReference(value.getClass())) {
116       addTo.addAnonymousReference(value);
117     }
118   }
119 }
120
Popular Tags