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<K extends Serializable, V>
041 implements PortalCache<K, V> {
042
043 public EhcachePortalCache(Ehcache ehcache) {
044 _ehcache = ehcache;
045 }
046
047 @Override
048 public void destroy() {
049 }
050
051 @Override
052 public Collection<V> get(Collection<K> keys) {
053 List<V> values = new ArrayList<V>(keys.size());
054
055 for (K key : keys) {
056 values.add(get(key));
057 }
058
059 return values;
060 }
061
062 @Override
063 public V get(K key) {
064 Element element = _ehcache.get(key);
065
066 if (element == null) {
067 return null;
068 }
069 else {
070 return (V)element.getObjectValue();
071 }
072 }
073
074 @Override
075 public String getName() {
076 return _ehcache.getName();
077 }
078
079 @Override
080 public void put(K key, V value) {
081 Element element = new Element(key, value);
082
083 _ehcache.put(element);
084 }
085
086 @Override
087 public void put(K key, V value, int timeToLive) {
088 Element element = new Element(key, value);
089
090 element.setTimeToLive(timeToLive);
091
092 _ehcache.put(element);
093 }
094
095 @Override
096 public void registerCacheListener(CacheListener<K, V> cacheListener) {
097 registerCacheListener(cacheListener, CacheListenerScope.ALL);
098 }
099
100 @Override
101 public void registerCacheListener(
102 CacheListener<K, V> cacheListener,
103 CacheListenerScope cacheListenerScope) {
104
105 if (_cacheEventListeners.containsKey(cacheListener)) {
106 return;
107 }
108
109 CacheEventListener cacheEventListener =
110 new PortalCacheCacheEventListener<K, V>(cacheListener, this);
111
112 _cacheEventListeners.put(cacheListener, cacheEventListener);
113
114 NotificationScope notificationScope = getNotificationScope(
115 cacheListenerScope);
116
117 RegisteredEventListeners registeredEventListeners =
118 _ehcache.getCacheEventNotificationService();
119
120 registeredEventListeners.registerListener(
121 cacheEventListener, notificationScope);
122 }
123
124 @Override
125 public void remove(K key) {
126 _ehcache.remove(key);
127 }
128
129 @Override
130 public void removeAll() {
131 _ehcache.removeAll();
132 }
133
134 public void setEhcache(Ehcache ehcache) {
135 _ehcache = ehcache;
136 }
137
138 @Override
139 public void unregisterCacheListener(CacheListener<K, V> cacheListener) {
140 CacheEventListener cacheEventListener = _cacheEventListeners.get(
141 cacheListener);
142
143 if (cacheEventListener != null) {
144 RegisteredEventListeners registeredEventListeners =
145 _ehcache.getCacheEventNotificationService();
146
147 registeredEventListeners.unregisterListener(cacheEventListener);
148 }
149
150 _cacheEventListeners.remove(cacheListener);
151 }
152
153 @Override
154 public void unregisterCacheListeners() {
155 RegisteredEventListeners registeredEventListeners =
156 _ehcache.getCacheEventNotificationService();
157
158 for (CacheEventListener cacheEventListener :
159 _cacheEventListeners.values()) {
160
161 registeredEventListeners.unregisterListener(cacheEventListener);
162 }
163
164 _cacheEventListeners.clear();
165 }
166
167 protected NotificationScope getNotificationScope(
168 CacheListenerScope cacheListenerScope) {
169
170 if (cacheListenerScope.equals(CacheListenerScope.ALL)) {
171 return NotificationScope.ALL;
172 }
173 else if (cacheListenerScope.equals(CacheListenerScope.LOCAL)) {
174 return NotificationScope.LOCAL;
175 }
176 else {
177 return NotificationScope.REMOTE;
178 }
179 }
180
181 private Map<CacheListener<K, V>, CacheEventListener> _cacheEventListeners =
182 new ConcurrentHashMap<CacheListener<K, V>, CacheEventListener>();
183 private Ehcache _ehcache;
184
185 }