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 @Override
058 public void destroy() {
059 Serializer serializer = _createSerializer(
060 PortalCacheActionType.DESTROY);
061
062 _intraband.sendDatagram(
063 _registrationReference,
064 Datagram.createRequestDatagram(
065 _portalCacheType, serializer.toByteBuffer()));
066 }
067
068 @Override
069 public Collection<V> get(Collection<K> keys) {
070 Serializer serializer = _createSerializer(
071 PortalCacheActionType.GET_BULK);
072
073 serializer.writeObject((Serializable)keys);
074
075 try {
076 return (Collection<V>)_syncSend(serializer.toByteBuffer());
077 }
078 catch (Exception e) {
079 if (_log.isWarnEnabled()) {
080 _log.warn("Unable to bulk get, coverting to cache miss", e);
081 }
082
083 List<V> values = new ArrayList<V>(keys.size());
084
085 for (int i = 0; i < keys.size(); i++) {
086 values.add(null);
087 }
088
089 return values;
090 }
091 }
092
093 @Override
094 public V get(K key) {
095 Serializer serializer = _createSerializer(PortalCacheActionType.GET);
096
097 serializer.writeObject(key);
098
099 try {
100 return _syncSend(serializer.toByteBuffer());
101 }
102 catch (Exception e) {
103 if (_log.isWarnEnabled()) {
104 _log.warn("Unable to get, coverting to cache miss", e);
105 }
106
107 return null;
108 }
109 }
110
111 @Override
112 public String getName() {
113 return _name;
114 }
115
116 @Override
117 public void put(K key, V value) {
118 Serializer serializer = _createSerializer(PortalCacheActionType.PUT);
119
120 serializer.writeObject(key);
121 serializer.writeObject(value);
122
123 _intraband.sendDatagram(
124 _registrationReference,
125 Datagram.createRequestDatagram(
126 _portalCacheType, serializer.toByteBuffer()));
127 }
128
129 @Override
130 public void put(K key, V value, int timeToLive) {
131 Serializer serializer = _createSerializer(
132 PortalCacheActionType.PUT_TTL);
133
134 serializer.writeObject(key);
135 serializer.writeObject(value);
136 serializer.writeInt(timeToLive);
137
138 _intraband.sendDatagram(
139 _registrationReference,
140 Datagram.createRequestDatagram(
141 _portalCacheType, serializer.toByteBuffer()));
142 }
143
144 @Override
145 public void registerCacheListener(CacheListener<K, V> cacheListener) {
146 }
147
148 @Override
149 public void registerCacheListener(
150 CacheListener<K, V> cacheListener,
151 CacheListenerScope cacheListenerScope) {
152 }
153
154 @Override
155 public void remove(K key) {
156 Serializer serializer = _createSerializer(PortalCacheActionType.REMOVE);
157
158 serializer.writeObject(key);
159
160 _intraband.sendDatagram(
161 _registrationReference,
162 Datagram.createRequestDatagram(
163 _portalCacheType, serializer.toByteBuffer()));
164 }
165
166 @Override
167 public void removeAll() {
168 Serializer serializer = _createSerializer(
169 PortalCacheActionType.REMOVE_ALL);
170
171 _intraband.sendDatagram(
172 _registrationReference,
173 Datagram.createRequestDatagram(
174 _portalCacheType, serializer.toByteBuffer()));
175 }
176
177 @Override
178 public void unregisterCacheListener(CacheListener<K, V> cacheListener) {
179 }
180
181 @Override
182 public void unregisterCacheListeners() {
183 }
184
185 private Serializer _createSerializer(
186 PortalCacheActionType portalCacheActionType) {
187
188 Serializer serializer = new Serializer();
189
190 serializer.writeInt(portalCacheActionType.ordinal());
191 serializer.writeString(_name);
192
193 return serializer;
194 }
195
196 private <T extends Serializable> T _syncSend(ByteBuffer byteBuffer)
197 throws Exception {
198
199 Datagram responseDatagram = _intraband.sendSyncDatagram(
200 _registrationReference,
201 Datagram.createRequestDatagram(_portalCacheType, byteBuffer));
202
203 Deserializer deserializer = new Deserializer(
204 responseDatagram.getDataByteBuffer());
205
206 return deserializer.readObject();
207 }
208
209 private static Log _log = LogFactoryUtil.getLog(IntrabandPortalCache.class);
210
211 private final Intraband _intraband;
212 private final String _name;
213 private final byte _portalCacheType;
214 private final RegistrationReference _registrationReference;
215
216 }