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 List<K> getKeys() {
076 return (List<K>)_ehcache.getKeys();
077 }
078
079 @Override
080 public String getName() {
081 return _ehcache.getName();
082 }
083
084 @Override
085 public void put(K key, V value) {
086 Element element = new Element(key, value);
087
088 _ehcache.put(element);
089 }
090
091 @Override
092 public void put(K key, V value, int timeToLive) {
093 Element element = new Element(key, value);
094
095 element.setTimeToLive(timeToLive);
096
097 _ehcache.put(element);
098 }
099
100 @Override
101 public void registerCacheListener(CacheListener<K, V> cacheListener) {
102 registerCacheListener(cacheListener, CacheListenerScope.ALL);
103 }
104
105 @Override
106 public void registerCacheListener(
107 CacheListener<K, V> cacheListener,
108 CacheListenerScope cacheListenerScope) {
109
110 if (_cacheEventListeners.containsKey(cacheListener)) {
111 return;
112 }
113
114 CacheEventListener cacheEventListener =
115 new PortalCacheCacheEventListener<K, V>(cacheListener, this);
116
117 _cacheEventListeners.put(cacheListener, cacheEventListener);
118
119 NotificationScope notificationScope = getNotificationScope(
120 cacheListenerScope);
121
122 RegisteredEventListeners registeredEventListeners =
123 _ehcache.getCacheEventNotificationService();
124
125 registeredEventListeners.registerListener(
126 cacheEventListener, notificationScope);
127 }
128
129 @Override
130 public void remove(K key) {
131 _ehcache.remove(key);
132 }
133
134 @Override
135 public void removeAll() {
136 _ehcache.removeAll();
137 }
138
139 public void setEhcache(Ehcache ehcache) {
140 _ehcache = ehcache;
141 }
142
143 @Override
144 public void unregisterCacheListener(CacheListener<K, V> cacheListener) {
145 CacheEventListener cacheEventListener = _cacheEventListeners.get(
146 cacheListener);
147
148 if (cacheEventListener != null) {
149 RegisteredEventListeners registeredEventListeners =
150 _ehcache.getCacheEventNotificationService();
151
152 registeredEventListeners.unregisterListener(cacheEventListener);
153 }
154
155 _cacheEventListeners.remove(cacheListener);
156 }
157
158 @Override
159 public void unregisterCacheListeners() {
160 RegisteredEventListeners registeredEventListeners =
161 _ehcache.getCacheEventNotificationService();
162
163 for (CacheEventListener cacheEventListener :
164 _cacheEventListeners.values()) {
165
166 registeredEventListeners.unregisterListener(cacheEventListener);
167 }
168
169 _cacheEventListeners.clear();
170 }
171
172 protected NotificationScope getNotificationScope(
173 CacheListenerScope cacheListenerScope) {
174
175 if (cacheListenerScope.equals(CacheListenerScope.ALL)) {
176 return NotificationScope.ALL;
177 }
178 else if (cacheListenerScope.equals(CacheListenerScope.LOCAL)) {
179 return NotificationScope.LOCAL;
180 }
181 else {
182 return NotificationScope.REMOTE;
183 }
184 }
185
186 private Map<CacheListener<K, V>, CacheEventListener> _cacheEventListeners =
187 new ConcurrentHashMap<CacheListener<K, V>, CacheEventListener>();
188 private Ehcache _ehcache;
189
190 }