1 package org.sapia.ubik.rmi.server.command; 2 3 import org.sapia.ubik.net.Timer; 4 5 import java.util.*; 6 7 8 19 public class ResponseQueue { 20 private static ResponseQueue _instance = new ResponseQueue(); 21 private Map _responses = Collections.synchronizedMap(new HashMap()); 22 private boolean _shutdown; 23 24 27 ResponseQueue() { 28 super(); 29 } 30 31 37 public synchronized ResponseLock createResponseLock() { 38 ResponseLock lock = new ResponseLock(this); 39 40 if (_responses.get(lock.getId()) != null) { 41 throw new IllegalStateException ("response lock already exists for: " + 42 lock.getId()); 43 } 44 45 _responses.put(lock.getId(), lock); 46 47 return lock; 48 } 49 50 56 public void onResponses(List responses) { 57 Response resp; 58 ResponseLock lock; 59 60 for (int i = 0; i < responses.size(); i++) { 61 resp = (Response) responses.get(i); 62 lock = (ResponseLock) _responses.get(resp.getId()); 63 64 if (lock != null) { 65 lock.setResponse(resp.get()); 66 } 67 } 68 } 69 70 public synchronized void shutdown(long timeout) throws InterruptedException { 71 _shutdown = true; 72 73 Timer timer = new Timer(timeout); 74 75 while (_responses.size() > 0) { 76 wait(timeout); 77 78 if (timer.isOver()) { 79 break; 80 } 81 } 82 } 83 84 public int size() { 85 return _responses.size(); 86 } 87 88 synchronized void removeLock(String id) { 89 _responses.remove(id); 90 91 if (_shutdown) { 92 notify(); 93 } 94 } 95 96 101 public static final ResponseQueue getInstance() { 102 return _instance; 103 } 104 } 105 | Popular Tags |