001
014
015 package com.liferay.portal.cache.ehcache;
016
017 import com.liferay.portal.kernel.cache.CacheListener;
018 import com.liferay.portal.kernel.cache.CacheListenerScope;
019 import com.liferay.portal.kernel.cache.PortalCache;
020
021 import java.io.Serializable;
022
023 import java.util.ArrayList;
024 import java.util.Collection;
025 import java.util.List;
026 import java.util.Map;
027 import java.util.concurrent.ConcurrentHashMap;
028
029 import net.sf.ehcache.Ehcache;
030 import net.sf.ehcache.Element;
031 import net.sf.ehcache.event.CacheEventListener;
032 import net.sf.ehcache.event.NotificationScope;
033 import net.sf.ehcache.event.RegisteredEventListeners;
034
035
040 public class EhcachePortalCache implements PortalCache {
041
042 public EhcachePortalCache(Ehcache ehcache) {
043 _ehcache = ehcache;
044 }
045
046 @Override
047 public void destroy() {
048 }
049
050 @Override
051 public Collection<Object> get(Collection<Serializable> keys) {
052 List<Object> values = new ArrayList<Object>(keys.size());
053
054 for (Serializable key : keys) {
055 values.add(get(key));
056 }
057
058 return values;
059 }
060
061 @Override
062 public Object get(Serializable key) {
063 Element element = _ehcache.get(key);
064
065 if (element == null) {
066 return null;
067 }
068 else {
069 return element.getObjectValue();
070 }
071 }
072
073 @Override
074 public String getName() {
075 return _ehcache.getName();
076 }
077
078 @Override
079 public void put(Serializable key, Object value) {
080 Element element = new Element(key, value);
081
082 _ehcache.put(element);
083 }
084
085 @Override
086 public void put(Serializable key, Object value, int timeToLive) {
087 Element element = new Element(key, value);
088
089 element.setTimeToLive(timeToLive);
090
091 _ehcache.put(element);
092 }
093
094 @Override
095 public void put(Serializable key, Serializable value) {
096 Element element = new Element(key, value);
097
098 _ehcache.put(element);
099 }
100
101 @Override
102 public void put(Serializable key, Serializable value, int timeToLive) {
103 Element element = new Element(key, value);
104
105 element.setTimeToLive(timeToLive);
106
107 _ehcache.put(element);
108 }
109
110 @Override
111 public void registerCacheListener(CacheListener cacheListener) {
112 registerCacheListener(cacheListener, CacheListenerScope.ALL);
113 }
114
115 @Override
116 public void registerCacheListener(
117 CacheListener cacheListener, CacheListenerScope cacheListenerScope) {
118
119 if (_cacheEventListeners.containsKey(cacheListener)) {
120 return;
121 }
122
123 CacheEventListener cacheEventListener =
124 new PortalCacheCacheEventListener(cacheListener, this);
125
126 _cacheEventListeners.put(cacheListener, cacheEventListener);
127
128 NotificationScope notificationScope = getNotificationScope(
129 cacheListenerScope);
130
131 RegisteredEventListeners registeredEventListeners =
132 _ehcache.getCacheEventNotificationService();
133
134 registeredEventListeners.registerListener(
135 cacheEventListener, notificationScope);
136 }
137
138 @Override
139 public void remove(Serializable key) {
140 _ehcache.remove(key);
141 }
142
143 @Override
144 public void removeAll() {
145 _ehcache.removeAll();
146 }
147
148 public void setEhcache(Ehcache ehcache) {
149 _ehcache = ehcache;
150 }
151
152 @Override
153 public void unregisterCacheListener(CacheListener cacheListener) {
154 CacheEventListener cacheEventListener = _cacheEventListeners.get(
155 cacheListener);
156
157 if (cacheEventListener != null) {
158 RegisteredEventListeners registeredEventListeners =
159 _ehcache.getCacheEventNotificationService();
160
161 registeredEventListeners.unregisterListener(cacheEventListener);
162 }
163
164 _cacheEventListeners.remove(cacheListener);
165 }
166
167 @Override
168 public void unregisterCacheListeners() {
169 RegisteredEventListeners registeredEventListeners =
170 _ehcache.getCacheEventNotificationService();
171
172 for (CacheEventListener cacheEventListener :
173 _cacheEventListeners.values()) {
174
175 registeredEventListeners.unregisterListener(cacheEventListener);
176 }
177
178 _cacheEventListeners.clear();
179 }
180
181 protected NotificationScope getNotificationScope(
182 CacheListenerScope cacheListenerScope) {
183
184 if (cacheListenerScope.equals(CacheListenerScope.ALL)) {
185 return NotificationScope.ALL;
186 }
187 else if (cacheListenerScope.equals(CacheListenerScope.LOCAL)) {
188 return NotificationScope.LOCAL;
189 }
190 else {
191 return NotificationScope.REMOTE;
192 }
193 }
194
195 private Map<CacheListener, CacheEventListener> _cacheEventListeners =
196 new ConcurrentHashMap<CacheListener, CacheEventListener>();
197 private Ehcache _ehcache;
198
199 }