KickJava   Java API By Example, From Geeks To Geeks.

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


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.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 JavaDoc;
23 import java.util.ArrayList JavaDoc;
24 import java.util.IdentityHashMap JavaDoc;
25 import java.util.Iterator JavaDoc;
26 import java.util.List JavaDoc;
27 import java.util.Map JavaDoc;
28 import java.util.Set JavaDoc;
29
30 /**
31  * ChangeApplicator for HashSets.
32  */

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 JavaDoc pojo) throws IOException JavaDoc,
40       ClassNotFoundException JavaDoc {
41     Set JavaDoc set = (Set JavaDoc) pojo;
42     DNACursor cursor = dna.getCursor();
43
44     while (cursor.next(encoding)) {
45       LogicalAction action = cursor.getLogicalAction();
46       int method = action.getMethod();
47       Object JavaDoc[] params = action.getParameters();
48       apply(objectManager, set, method, params);
49     }
50   }
51
52   protected void apply(ClientObjectManager objectManager, Set JavaDoc set, int method, Object JavaDoc[] params) throws ClassNotFoundException JavaDoc {
53     switch (method) {
54       case SerializationUtil.ADD:
55         Object JavaDoc v = getValue(params);
56         Object JavaDoc value = v instanceof ObjectID ? objectManager.lookupObject((ObjectID) v) : v;
57         set.add(value);
58         break;
59       case SerializationUtil.REMOVE:
60         Object JavaDoc 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 JavaDoc("invalid action:" + method);
71     }
72   }
73
74   private List JavaDoc getObjectParams(ClientObjectManager objectManager, Object JavaDoc[] params) throws ClassNotFoundException JavaDoc {
75     List JavaDoc retParams = new ArrayList JavaDoc(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 JavaDoc getValue(Object JavaDoc[] params) {
84     // hack to deal with trove set which replaces on set unlike java Set which does not
85
return params.length == 2 ? params[1] : params[0];
86   }
87
88   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
89     Set JavaDoc set = (Set JavaDoc) pojo;
90     for (Iterator JavaDoc i = set.iterator(); i.hasNext();) {
91       Object JavaDoc value = i.next();
92       if (!objectManager.isPortableInstance(value)) {
93         continue;
94       }
95
96       final Object JavaDoc addValue = getDehydratableObject(value, objectManager);
97
98       if (addValue == null) {
99         continue;
100       }
101
102       writer.addLogicalAction(SerializationUtil.ADD, new Object JavaDoc[] { addValue });
103     }
104   }
105
106   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
107     Set JavaDoc set = (Set JavaDoc) pojo;
108     for (Iterator JavaDoc i = set.iterator(); i.hasNext();) {
109       Object JavaDoc o = i.next();
110       if (o != null && isPortableReference(o.getClass())) {
111         addTo.addAnonymousReference(o);
112       }
113     }
114     return addTo;
115   }
116
117   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) {
118     throw new UnsupportedOperationException JavaDoc();
119   }
120
121   public Map JavaDoc connectedCopy(Object JavaDoc source, Object JavaDoc dest, Map JavaDoc visited, ClientObjectManager objectManager,
122                            OptimisticTransactionManager txManager) {
123     Map JavaDoc cloned = new IdentityHashMap JavaDoc();
124
125     Manageable sourceManageable = (Manageable) source;
126     Manageable destManaged = (Manageable) dest;
127
128     Set JavaDoc sourceSet = (Set JavaDoc) source;
129     Set JavaDoc destSet = (Set JavaDoc) dest;
130
131     for (Iterator JavaDoc i = sourceSet.iterator(); i.hasNext();) {
132       Object JavaDoc v = i.next();
133       Object JavaDoc 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