001
014
015 package com.liferay.portal.cache.ehcache;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.util.InstanceFactory;
020 import com.liferay.portal.util.PropsValues;
021
022 import java.util.List;
023 import java.util.Properties;
024
025 import net.sf.ehcache.CacheException;
026 import net.sf.ehcache.CacheManager;
027 import net.sf.ehcache.Ehcache;
028 import net.sf.ehcache.Element;
029 import net.sf.ehcache.Status;
030 import net.sf.ehcache.distribution.CacheManagerPeerListener;
031 import net.sf.ehcache.distribution.CacheManagerPeerListenerFactory;
032 import net.sf.ehcache.distribution.CacheReplicator;
033 import net.sf.ehcache.event.RegisteredEventListeners;
034
035
038 public class LiferayCacheManagerPeerListenerFactory
039 extends CacheManagerPeerListenerFactory {
040
041 public LiferayCacheManagerPeerListenerFactory() {
042 String className =
043 PropsValues.EHCACHE_CACHE_MANAGER_PEER_LISTENER_FACTORY;
044
045 if (_log.isDebugEnabled()) {
046 _log.debug("Instantiating " + className + " " + hashCode());
047 }
048
049 try {
050 _cacheManagerPeerListenerFactory =
051 (CacheManagerPeerListenerFactory)InstanceFactory.newInstance(
052 className);
053 }
054 catch (Exception e) {
055 throw new RuntimeException(e);
056 }
057 }
058
059 @Override
060 public CacheManagerPeerListener createCachePeerListener(
061 CacheManager cacheManager, Properties properties) {
062
063 CacheManagerPeerListener cacheManagerPeerListener =
064 _cacheManagerPeerListenerFactory.createCachePeerListener(
065 cacheManager, properties);
066
067 if (PropsValues.CLUSTER_LINK_ENABLED &&
068 !PropsValues.EHCACHE_CLUSTER_LINK_REPLICATION_ENABLED) {
069
070 return new LiferayCacheManagerPeerListener(
071 cacheManager, cacheManagerPeerListener);
072 }
073
074 return cacheManagerPeerListener;
075 }
076
077 private static final CacheReplicator _PLACE_HOLDER = new CacheReplicator() {
078
079 @Override
080 public boolean alive() {
081 return true;
082 }
083
084 @Override
085 public Object clone() {
086 return this;
087 }
088
089 @Override
090 public void dispose() {
091 }
092
093 @Override
094 public boolean isReplicateUpdatesViaCopy() {
095 return false;
096 }
097
098 @Override
099 public boolean notAlive() {
100 return false;
101 }
102
103 @Override
104 public void notifyElementEvicted(Ehcache ehcache, Element element) {
105 }
106
107 @Override
108 public void notifyElementExpired(Ehcache ehcache, Element element) {
109 }
110
111 @Override
112 public void notifyElementPut(Ehcache ehcache, Element element) {
113 }
114
115 @Override
116 public void notifyElementRemoved(Ehcache ehcache, Element element) {
117 }
118
119 @Override
120 public void notifyElementUpdated(Ehcache ehcache, Element element) {
121 }
122
123 @Override
124 public void notifyRemoveAll(Ehcache ehch) {
125 }
126
127 };
128
129 private static final Log _log = LogFactoryUtil.getLog(
130 LiferayCacheManagerPeerListenerFactory.class);
131
132 private final CacheManagerPeerListenerFactory
133 _cacheManagerPeerListenerFactory;
134
135 private static class LiferayCacheManagerPeerListener
136 implements CacheManagerPeerListener {
137
138 public LiferayCacheManagerPeerListener(
139 CacheManager cacheManager,
140 CacheManagerPeerListener cacheManagerPeerListener) {
141
142 _cacheManager = cacheManager;
143 _cacheManagerPeerListener = cacheManagerPeerListener;
144 }
145
146 @Override
147 public void attemptResolutionOfUniqueResourceConflict()
148 throws CacheException, IllegalStateException {
149
150 _cacheManagerPeerListener.
151 attemptResolutionOfUniqueResourceConflict();
152 }
153
154 @Override
155 public void dispose() {
156 _cacheManagerPeerListener.dispose();
157 }
158
159 @Override
160 @SuppressWarnings("rawtypes")
161 public List getBoundCachePeers() {
162 return _cacheManagerPeerListener.getBoundCachePeers();
163 }
164
165 @Override
166 public String getScheme() {
167 return _cacheManagerPeerListener.getScheme();
168 }
169
170 @Override
171 public Status getStatus() {
172 return _cacheManagerPeerListener.getStatus();
173 }
174
175 @Override
176 public String getUniqueResourceIdentifier() {
177 return _cacheManagerPeerListener.getUniqueResourceIdentifier();
178 }
179
180 @Override
181 public void init() {
182 for (String cacheName : _cacheManager.getCacheNames()) {
183 _wrapEhcache(cacheName);
184 }
185
186 try {
187 _cacheManagerPeerListener.init();
188 }
189 finally {
190 for (String cacheName : _cacheManager.getCacheNames()) {
191 _unwrapEhcache(cacheName);
192 }
193 }
194 }
195
196 @Override
197 public void notifyCacheAdded(String cacheName) {
198 _wrapEhcache(cacheName);
199
200 try {
201 _cacheManagerPeerListener.notifyCacheAdded(cacheName);
202 }
203 finally {
204 _unwrapEhcache(cacheName);
205 }
206 }
207
208 @Override
209 public void notifyCacheRemoved(String cacheName) {
210 _cacheManagerPeerListener.notifyCacheRemoved(cacheName);
211 }
212
213 private void _unwrapEhcache(String cacheName) {
214 Ehcache ehcache = _cacheManager.getEhcache(cacheName);
215
216 if (!(ehcache instanceof LiferayCacheDecorator)) {
217 return;
218 }
219
220 LiferayCacheDecorator liferayCacheDecorator =
221 (LiferayCacheDecorator)ehcache;
222
223 _cacheManager.replaceCacheWithDecoratedCache(
224 liferayCacheDecorator,
225 liferayCacheDecorator.getUnderlyingCache());
226
227 RegisteredEventListeners registeredEventListeners =
228 ehcache.getCacheEventNotificationService();
229
230 registeredEventListeners.unregisterListener(_PLACE_HOLDER);
231 }
232
233 private void _wrapEhcache(String cacheName) {
234 Ehcache ehcache = _cacheManager.getEhcache(cacheName);
235
236 if (!(ehcache instanceof LiferayCacheDecorator)) {
237 _cacheManager.replaceCacheWithDecoratedCache(
238 ehcache, new LiferayCacheDecorator(ehcache));
239 }
240
241 RegisteredEventListeners registeredEventListeners =
242 ehcache.getCacheEventNotificationService();
243
244 registeredEventListeners.registerListener(_PLACE_HOLDER);
245 }
246
247 private final CacheManager _cacheManager;
248 private final CacheManagerPeerListener _cacheManagerPeerListener;
249
250 }
251
252 }