KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tctest > CloneTestApp


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.tctest;
5
6 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier;
7
8 import com.tc.object.bytecode.ManagerUtil;
9 import com.tc.object.config.ConfigVisitor;
10 import com.tc.object.config.DSOClientConfigHelper;
11 import com.tc.object.config.spec.CyclicBarrierSpec;
12 import com.tc.object.lockmanager.api.LockLevel;
13 import com.tc.simulator.app.ApplicationConfig;
14 import com.tc.simulator.listener.ListenerProvider;
15 import com.tc.util.Assert;
16 import com.tctest.runner.AbstractTransparentApp;
17
18 import java.sql.Timestamp JavaDoc;
19 import java.util.ArrayList JavaDoc;
20 import java.util.Arrays JavaDoc;
21 import java.util.Date JavaDoc;
22 import java.util.HashMap JavaDoc;
23 import java.util.HashSet JavaDoc;
24 import java.util.Iterator JavaDoc;
25 import java.util.List JavaDoc;
26 import java.util.Map JavaDoc;
27 import java.util.Set JavaDoc;
28 import java.util.Map.Entry;
29
30 public class CloneTestApp extends AbstractTransparentApp {
31
32   public static final int NODE_COUNT = 2;
33
34   private MyStuff root;
35   private CyclicBarrier barrier = new CyclicBarrier(NODE_COUNT);
36   private int nodeCount[] = new int[1];
37
38   public CloneTestApp(String JavaDoc appId, ApplicationConfig cfg, ListenerProvider listenerProvider) {
39     super(appId, cfg, listenerProvider);
40   }
41
42   public void run() {
43     int myId = 0;
44     synchronized (nodeCount) {
45       myId = nodeCount[0]++;
46     }
47
48     MyStuff copy = null;
49     if (myId == 0) {
50       MyStuff s = new MyStuff(null);
51       s.map = new HashMap JavaDoc();
52       s.map.put(s, s);
53       s.one = 2;
54       s.list = new ArrayList JavaDoc();
55       s.list.add(s.map);
56       s.set = new HashSet JavaDoc();
57       s.set.add(s.list);
58       s.date = new Date JavaDoc();
59       s.myStuffArray = new MyStuff[10];
60       s.shortArray = new short[200];
61       s.myStuffArray[3] = s;
62       s.myStuffArray[9] = new MyStuff(null);
63       s.shortArray[5] = 4;
64
65       root = new MyStuff(s);
66
67       synchronized (root) {
68         s.obj1 = root;
69         root.one = 1;
70         root.date = s.date;
71       }
72
73       test1();
74     }
75     System.out.println("NODE:" + myId + " is about to enter");
76     barrier();
77
78     if (myId == 0) {
79       ManagerUtil.optimisticBegin();
80       synchronized (root) {
81         copy = (MyStuff) ManagerUtil.deepCopy(root);
82       }
83     }
84     barrier();
85     if (myId == 0) {
86       copy.obj1.one = 250;
87       copy.obj1.map.put("steve", "steve");
88       copy.obj1.map.put("doh", copy);
89       copy.obj1.myStuffArray[7] = new MyStuff(null);
90       copy.obj1.myStuffArray[7].one = 7;
91       copy.obj1.myStuffArray[3] = copy;
92
93       // checking primitive array access
94
short[] tmpShortArray = new short[20];
95       Arrays.fill(tmpShortArray, (short) 99);
96       copy.shortArray = new short[20];
97       System.arraycopy(tmpShortArray, 0, copy.shortArray, 0, 20);
98       copy.shortArray[1] = 5;
99       copy.shortArray[2] = 6;
100
101       // checking object array access
102
MyStuff[] tmpMyStuffArray = new MyStuff[3];
103       for (int i = 0; i < tmpMyStuffArray.length; i++) {
104         tmpMyStuffArray[i] = new MyStuff(null);
105         tmpMyStuffArray[i].one = 100 + i;
106       }
107       copy.myStuffArray = new MyStuff[10];
108       System.arraycopy(tmpMyStuffArray, 0, copy.myStuffArray, 4, 3);
109       copy.myStuffArray[5] = new MyStuff(null);
110       copy.myStuffArray[5].one = 5;
111       copy.myStuffArray[6] = new MyStuff(null);
112       copy.myStuffArray[6].one = 6;
113     }
114     barrier();
115     if (myId == 1) {
116       synchronized (root) {
117         root.obj1.one = 150; // shouldn't commit fail because of this change?
118
}
119     }
120     barrier();
121     if (myId == 0) {
122       ManagerUtil.beginLock("test", LockLevel.WRITE);
123       ManagerUtil.optimisticCommit();
124       ManagerUtil.commitLock("test");
125     }
126     barrier();
127     System.out.println("NODE:" + myId + " is about to exit");
128     synchronized (root) {
129       System.out.println("NODE:" + myId + " Value:" + root.obj1.one);
130       Assert.eval(root.obj1.one == 250);
131       Assert.eval(root.obj1.myStuffArray[7] != null);
132       Assert.eval(root.obj1.myStuffArray[7].one == 7);
133       Assert.eval(root.obj1.map.get("steve").equals("steve"));
134       Assert.eval(root.obj1.map.get("doh") == root);
135
136       // verify primitive array content
137
Assert.eval(root.shortArray[0] == 99);
138       Assert.eval(root.shortArray[1] == 5);
139       Assert.eval(root.shortArray[2] == 6);
140       Assert.eval(root.shortArray[3] == 99);
141       Assert.eval(root.shortArray[4] == 99);
142
143       // verify object array content
144
Assert.eval(root.myStuffArray[4] != null);
145       Assert.eval(root.myStuffArray[4].one == 100);
146       Assert.eval(root.myStuffArray[5] != null);
147       Assert.eval(root.myStuffArray[5].one == 5);
148       Assert.eval(root.myStuffArray[6] != null);
149       Assert.eval(root.myStuffArray[6].one == 6);
150     }
151   }
152
153   private void test1() {
154     ManagerUtil.optimisticBegin();
155
156     MyStuff copy = (MyStuff) ManagerUtil.deepCopy(root);
157     Assert.eval(copy != root);
158     Assert.eval(copy.obj1 != root.obj1);
159
160     System.out.println("Root:" + root);
161     System.out.println("Root obj:" + root.obj1 + " one:" + root.one);
162     System.out.println("sub Root obj:" + root.obj1.obj1 + " one:" + root.obj1.one);
163
164     System.out.println("Copy:" + copy);
165     System.out.println("Copy obj:" + copy.obj1 + " one:" + copy.one);
166     System.out.println("sub Copy obj:" + copy.obj1.obj1 + " one:" + copy.obj1.one);
167
168     Assert.eval(copy == copy.obj1.obj1);
169     Assert.eval(copy.inner != root.inner);
170     Assert.eval(copy.inner != null);
171     Assert.eval(copy.one == 1);
172     Assert.eval(copy.obj1.one == 2);
173     Assert.eval(copy.obj1.map != root.obj1.map);
174     Assert.eval(copy.obj1.myStuffArray[3] == copy.obj1);
175     Assert.eval(copy.obj1.myStuffArray[4] == null);
176     Assert.eval(copy.obj1.myStuffArray[2] == null);
177     Assert.eval(copy.obj1.myStuffArray != root.obj1.myStuffArray);
178
179     Assert.eval(copy.obj1.shortArray[4] != 4);
180     Assert.eval(copy.obj1.shortArray[5] == 4);
181     Assert.eval(copy.obj1.shortArray[6] != 4);
182     Assert.eval(copy.obj1.shortArray != root.obj1.shortArray);
183
184     int size = 0;
185     for (Iterator JavaDoc i = copy.obj1.map.entrySet().iterator(); i.hasNext();) {
186       size++;
187       Entry e = (Entry) i.next();
188       Assert.eval(e.getValue() == copy.obj1);
189       Assert.eval(e.getKey() == copy.obj1);
190
191       Assert.eval(e.getValue() != root.obj1.map);
192       Assert.eval(e.getKey() != root.obj1);
193     }
194
195     Assert.eval(size == 1);
196
197     Assert.eval(copy.obj1.list != root.obj1.list);
198     Assert.eval(copy.obj1.set != root.obj1.set);
199     Assert.eval(copy.obj1.set.size() == root.obj1.set.size());
200     Assert.eval(copy.obj1.set.iterator().next() == copy.obj1.list);
201
202     Assert.eval(copy.obj1.list.size() == root.obj1.list.size());
203     Assert.eval(copy.obj1.list.iterator().next() == copy.obj1.map);
204     Assert.eval((copy.obj1.date != root.obj1.date));
205     Assert.eval((copy.obj1.date.equals(root.obj1.date)));
206     Assert.eval(copy.obj1.date == copy.date);
207
208     // make changes on copy
209
Date JavaDoc d = new Date JavaDoc();
210     copy.obj1.map.put("date", d);
211     copy.obj1.map.put(copy, d);
212     copy.date = d;
213     copy.one = 500;
214
215     Assert.eval(root.date != d);
216     Assert.eval(!root.obj1.map.containsKey("date"));
217     Assert.eval(root.one != 500);
218
219     ManagerUtil.beginLock("test", LockLevel.WRITE);
220     ManagerUtil.optimisticCommit();
221     ManagerUtil.commitLock("test");
222
223     Assert.eval(root.date == d);
224     Assert.eval(root.one == 500);
225     Assert.eval(root.obj1.map.get("date") == d);
226   }
227
228   private void barrier() {
229     try {
230       barrier.barrier();
231     } catch (InterruptedException JavaDoc ie) {
232       throw new AssertionError JavaDoc();
233     }
234   }
235
236   public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) {
237     String JavaDoc testClass = CloneTestApp.class.getName();
238
239     config.getOrCreateSpec(testClass) //
240
.addRoot("barrier", "barrier") //
241
.addRoot("root", "root") //
242
.addRoot("nodeCount", "nodeCount");
243
244     config.getOrCreateSpec(MyStuff.class.getName());
245     config.getOrCreateSpec(MyStuff.MyInner.class.getName());
246
247     config.addWriteAutolock("* " + testClass + "*.*(..)");
248     new CyclicBarrierSpec().visit(visitor, config);
249
250   }
251
252   private static class MyStuff {
253     public MyStuff obj1;
254     public long one = 1;
255     public Map JavaDoc map;
256     public List JavaDoc list;
257     public Set JavaDoc set;
258     public Date JavaDoc date;
259     public Timestamp JavaDoc timestamp;
260     public MyStuff[] myStuffArray;
261     public short[] shortArray;
262     public MyInner inner = new MyInner();
263
264     public MyStuff(MyStuff stuff) {
265       this.obj1 = stuff;
266     }
267
268     private class MyInner {
269       public int two;
270     }
271   }
272 }
273
Popular Tags