001
014
015 package com.liferay.portal.kernel.nio.intraband.cache;
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 import com.liferay.portal.kernel.io.Deserializer;
021 import com.liferay.portal.kernel.io.Serializer;
022 import com.liferay.portal.kernel.log.Log;
023 import com.liferay.portal.kernel.log.LogFactoryUtil;
024 import com.liferay.portal.kernel.nio.intraband.Datagram;
025 import com.liferay.portal.kernel.nio.intraband.IntraBand;
026 import com.liferay.portal.kernel.nio.intraband.RegistrationReference;
027 import com.liferay.portal.kernel.nio.intraband.SystemDataType;
028
029 import java.io.Serializable;
030
031 import java.nio.ByteBuffer;
032
033 import java.util.ArrayList;
034 import java.util.Collection;
035 import java.util.List;
036
037
040 public class IntraBandPortalCache
041 <K extends Serializable, V extends Serializable>
042 implements PortalCache<K, V>, Serializable {
043
044 public IntraBandPortalCache(
045 String name, RegistrationReference registrationReference) {
046
047 _name = name;
048 _registrationReference = registrationReference;
049
050 _intraBand = registrationReference.getIntraBand();
051
052 SystemDataType systemDataType = SystemDataType.PORTAL_CACHE;
053
054 _portalCacheType = systemDataType.getValue();
055 }
056
057 public void destroy() {
058 Serializer serializer = _createSerializer(
059 PortalCacheActionType.DESTROY);
060
061 _intraBand.sendDatagram(
062 _registrationReference,
063 Datagram.createRequestDatagram(
064 _portalCacheType, serializer.toByteBuffer()));
065 }
066
067 public Collection<V> get(Collection<K> keys) {
068 Serializer serializer = _createSerializer(
069 PortalCacheActionType.GET_BULK);
070
071 serializer.writeObject((Serializable)keys);
072
073 try {
074 return (Collection<V>)_syncSend(serializer.toByteBuffer());
075 }
076 catch (Exception e) {
077 if (_log.isWarnEnabled()) {
078 _log.warn("Unable to bulk get, coverting to cache miss", e);
079 }
080
081 List<V> values = new ArrayList<V>(keys.size());
082
083 for (int i = 0; i < keys.size(); i++) {
084 values.add(null);
085 }
086
087 return values;
088 }
089 }
090
091 public V get(K key) {
092 Serializer serializer = _createSerializer(PortalCacheActionType.GET);
093
094 serializer.writeObject(key);
095
096 try {
097 return _syncSend(serializer.toByteBuffer());
098 }
099 catch (Exception e) {
100 if (_log.isWarnEnabled()) {
101 _log.warn("Unable to get, coverting to cache miss", e);
102 }
103
104 return null;
105 }
106 }
107
108 public String getName() {
109 return _name;
110 }
111
112 public void put(K key, V value) {
113 Serializer serializer = _createSerializer(PortalCacheActionType.PUT);
114
115 serializer.writeObject(key);
116 serializer.writeObject(value);
117
118 _intraBand.sendDatagram(
119 _registrationReference,
120 Datagram.createRequestDatagram(
121 _portalCacheType, serializer.toByteBuffer()));
122 }
123
124 public void put(K key, V value, int timeToLive) {
125 Serializer serializer = _createSerializer(
126 PortalCacheActionType.PUT_TTL);
127
128 serializer.writeObject(key);
129 serializer.writeObject(value);
130 serializer.writeInt(timeToLive);
131
132 _intraBand.sendDatagram(
133 _registrationReference,
134 Datagram.createRequestDatagram(
135 _portalCacheType, serializer.toByteBuffer()));
136 }
137
138 public void registerCacheListener(CacheListener<K, V> cacheListener) {
139 }
140
141 public void registerCacheListener(
142 CacheListener<K, V> cacheListener,
143 CacheListenerScope cacheListenerScope) {
144 }
145
146 public void remove(K key) {
147 Serializer serializer = _createSerializer(PortalCacheActionType.REMOVE);
148
149 serializer.writeObject(key);
150
151 _intraBand.sendDatagram(
152 _registrationReference,
153 Datagram.createRequestDatagram(
154 _portalCacheType, serializer.toByteBuffer()));
155 }
156
157 public void removeAll() {
158 Serializer serializer = _createSerializer(
159 PortalCacheActionType.REMOVE_ALL);
160
161 _intraBand.sendDatagram(
162 _registrationReference,
163 Datagram.createRequestDatagram(
164 _portalCacheType, serializer.toByteBuffer()));
165 }
166
167 public void unregisterCacheListener(CacheListener<K, V> cacheListener) {
168 }
169
170 public void unregisterCacheListeners() {
171 }
172
173 private Serializer _createSerializer(
174 PortalCacheActionType portalCacheActionType) {
175
176 Serializer serializer = new Serializer();
177
178 serializer.writeInt(portalCacheActionType.ordinal());
179 serializer.writeString(_name);
180
181 return serializer;
182 }
183
184 private <T extends Serializable> T _syncSend(ByteBuffer byteBuffer)
185 throws Exception {
186
187 Datagram responseDatagram = _intraBand.sendSyncDatagram(
188 _registrationReference,
189 Datagram.createRequestDatagram(_portalCacheType, byteBuffer));
190
191 Deserializer deserializer = new Deserializer(
192 responseDatagram.getDataByteBuffer());
193
194 return deserializer.readObject();
195 }
196
197 private static Log _log = LogFactoryUtil.getLog(IntraBandPortalCache.class);
198
199 private final IntraBand _intraBand;
200 private final String _name;
201 private final byte _portalCacheType;
202 private final RegistrationReference _registrationReference;
203
204 }