1 4 package com.tctest.restart; 5 6 import java.util.HashMap ; 7 import java.util.HashSet ; 8 import java.util.Iterator ; 9 import java.util.Map ; 10 import java.util.Set ; 11 12 public class AppStateSnapshot { 13 14 private final RestartTestApp[] apps; 15 private final Set inits = new HashSet (); 16 private final Set starts = new HashSet (); 17 final Set holders = new HashSet (); 18 final Set waiters = new HashSet (); 19 private final Set ends = new HashSet (); 20 private final Map sets = new HashMap (); 21 22 public AppStateSnapshot(RestartTestApp[] apps) { 23 this.apps = apps; 24 sets.put(TestAppState.INIT, inits); 25 sets.put(TestAppState.START, starts); 26 sets.put(TestAppState.HOLDER, holders); 27 sets.put(TestAppState.WAITER, waiters); 28 sets.put(TestAppState.END, ends); 29 takeSnapshot(); 30 } 31 32 public synchronized RestartTestApp getHolder() { 33 while (true) { 34 takeSnapshot(); 35 if (allEnded()) return null; 36 RestartTestApp[] h = getHolders(); 37 if (h.length == 1) return h[0]; 38 } 39 } 40 41 public String toString() { 42 StringBuffer buf = new StringBuffer (); 43 for (Iterator i = sets.keySet().iterator(); i.hasNext();) { 44 Object key = i.next(); 45 buf.append(key + ":" + ((Set ) sets.get(key)).size() + " "); 46 } 47 return buf.toString(); 48 } 49 50 private void clear() { 51 for (Iterator i = sets.values().iterator(); i.hasNext();) { 52 Set s = (Set ) i.next(); 53 s.clear(); 54 } 55 } 56 57 public synchronized AppStateSnapshot takeSnapshot() { 58 clear(); 59 for (int i = 0; i < apps.length; i++) { 60 ((Set ) sets.get(apps[i].getStateName())).add(apps[i]); 61 } 62 return this; 63 } 64 65 public synchronized RestartTestApp[] getHolders() { 66 takeSnapshot(); 67 return toArray(holders); 68 } 69 70 public synchronized RestartTestApp[] getWaiters() { 71 takeSnapshot(); 72 return toArray(waiters); 73 } 74 75 private RestartTestApp[] toArray(Set s) { 76 RestartTestApp[] rv = new RestartTestApp[s.size()]; 77 return (RestartTestApp[]) s.toArray(rv); 78 } 79 80 public synchronized boolean allStarted() { 81 takeSnapshot(); 82 return inits.size() == 0; 83 } 84 85 public boolean allWaiters() { 86 takeSnapshot(); 87 return waiters.size() == apps.length; 88 } 89 90 public synchronized boolean allEnded() { 91 takeSnapshot(); 92 return ends.size() == apps.length; 93 } 94 }
| Popular Tags
|