001
014
015 package com.liferay.portal.kernel.poller.comet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019
020 import java.util.HashMap;
021 import java.util.Iterator;
022 import java.util.Map;
023 import java.util.Set;
024 import java.util.concurrent.locks.Lock;
025 import java.util.concurrent.locks.ReadWriteLock;
026 import java.util.concurrent.locks.ReentrantReadWriteLock;
027
028
032 public class CometHandlerPool {
033
034 public void closeCometHandler(String sessionId) throws CometException {
035 if (_log.isDebugEnabled()) {
036 _log.debug("Close comet handler " + sessionId);
037 }
038
039 Lock writeLock = _cometHandlerPoolReadWriteLock.writeLock();
040
041 try {
042 writeLock.lock();
043
044 CometHandler cometHandler = _cometHandlers.remove(sessionId);
045
046 if (cometHandler != null) {
047 cometHandler.destroy();
048 }
049 }
050 finally {
051 writeLock.unlock();
052 }
053 }
054
055 public void closeCometHandlers() throws CometException {
056 Lock writeLock = _cometHandlerPoolReadWriteLock.writeLock();
057
058 try {
059 writeLock.lock();
060
061 Set<Map.Entry<String, CometHandler>> cometHandlers =
062 _cometHandlers.entrySet();
063
064 Iterator<Map.Entry<String, CometHandler>> itr =
065 cometHandlers.iterator();
066
067 while (itr.hasNext()) {
068 Map.Entry<String, CometHandler> entry = itr.next();
069
070 CometHandler cometHandler = entry.getValue();
071
072 if (cometHandler != null) {
073 cometHandler.destroy();
074 }
075
076 itr.remove();
077 }
078 }
079 finally {
080 writeLock.unlock();
081 }
082 }
083
084 public CometHandler getCometHandler(String sessionId) {
085 Lock readLock = _cometHandlerPoolReadWriteLock.readLock();
086
087 try {
088 readLock.lock();
089
090 return _cometHandlers.get(sessionId);
091 }
092 finally {
093 readLock.unlock();
094 }
095 }
096
097 public void startCometHandler(
098 CometSession cometSession, CometHandler cometHandler)
099 throws CometException {
100
101 String sessionId = cometSession.getSessionId();
102
103 if (_log.isDebugEnabled()) {
104 _log.debug("Start comet handler " + sessionId);
105 }
106
107 Lock writeLock = _cometHandlerPoolReadWriteLock.writeLock();
108
109 try {
110 writeLock.lock();
111
112 if (_cometHandlers.containsKey(sessionId)) {
113 closeCometHandler(sessionId);
114 }
115
116 _cometHandlers.put(sessionId, cometHandler);
117
118 if (_log.isWarnEnabled()) {
119 _log.warn("Initialize comet handler " + sessionId);
120 }
121
122 cometHandler.init(cometSession);
123 }
124 finally {
125 writeLock.unlock();
126 }
127 }
128
129 private static Log _log = LogFactoryUtil.getLog(CometHandlerPool.class);
130
131 private ReadWriteLock _cometHandlerPoolReadWriteLock =
132 new ReentrantReadWriteLock();
133 private Map<String, CometHandler> _cometHandlers =
134 new HashMap<String, CometHandler>();
135
136 }