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 List<K> getKeys() {
095 throw new UnsupportedOperationException();
096 }
097
098 @Override
099 public V get(K key) {
100 Serializer serializer = _createSerializer(PortalCacheActionType.GET);
101
102 serializer.writeObject(key);
103
104 try {
105 return _syncSend(serializer.toByteBuffer());
106 }
107 catch (Exception e) {
108 if (_log.isWarnEnabled()) {
109 _log.warn("Unable to get, coverting to cache miss", e);
110 }
111
112 return null;
113 }
114 }
115
116 @Override
117 public String getName() {
118 return _name;
119 }
120
121 @Override
122 public void put(K key, V value) {
123 Serializer serializer = _createSerializer(PortalCacheActionType.PUT);
124
125 serializer.writeObject(key);
126 serializer.writeObject(value);
127
128 _intraband.sendDatagram(
129 _registrationReference,
130 Datagram.createRequestDatagram(
131 _portalCacheType, serializer.toByteBuffer()));
132 }
133
134 @Override
135 public void put(K key, V value, int timeToLive) {
136 Serializer serializer = _createSerializer(
137 PortalCacheActionType.PUT_TTL);
138
139 serializer.writeObject(key);
140 serializer.writeObject(value);
141 serializer.writeInt(timeToLive);
142
143 _intraband.sendDatagram(
144 _registrationReference,
145 Datagram.createRequestDatagram(
146 _portalCacheType, serializer.toByteBuffer()));
147 }
148
149 @Override
150 public void registerCacheListener(CacheListener<K, V> cacheListener) {
151 }
152
153 @Override
154 public void registerCacheListener(
155 CacheListener<K, V> cacheListener,
156 CacheListenerScope cacheListenerScope) {
157 }
158
159 @Override
160 public void remove(K key) {
161 Serializer serializer = _createSerializer(PortalCacheActionType.REMOVE);
162
163 serializer.writeObject(key);
164
165 _intraband.sendDatagram(
166 _registrationReference,
167 Datagram.createRequestDatagram(
168 _portalCacheType, serializer.toByteBuffer()));
169 }
170
171 @Override
172 public void removeAll() {
173 Serializer serializer = _createSerializer(
174 PortalCacheActionType.REMOVE_ALL);
175
176 _intraband.sendDatagram(
177 _registrationReference,
178 Datagram.createRequestDatagram(
179 _portalCacheType, serializer.toByteBuffer()));
180 }
181
182 @Override
183 public void unregisterCacheListener(CacheListener<K, V> cacheListener) {
184 }
185
186 @Override
187 public void unregisterCacheListeners() {
188 }
189
190 private Serializer _createSerializer(
191 PortalCacheActionType portalCacheActionType) {
192
193 Serializer serializer = new Serializer();
194
195 serializer.writeInt(portalCacheActionType.ordinal());
196 serializer.writeString(_name);
197
198 return serializer;
199 }
200
201 private <T extends Serializable> T _syncSend(ByteBuffer byteBuffer)
202 throws Exception {
203
204 Datagram responseDatagram = _intraband.sendSyncDatagram(
205 _registrationReference,
206 Datagram.createRequestDatagram(_portalCacheType, byteBuffer));
207
208 Deserializer deserializer = new Deserializer(
209 responseDatagram.getDataByteBuffer());
210
211 return deserializer.readObject();
212 }
213
214 private static Log _log = LogFactoryUtil.getLog(IntrabandPortalCache.class);
215
216 private final Intraband _intraband;
217 private final String _name;
218 private final byte _portalCacheType;
219 private final RegistrationReference _registrationReference;
220
221 }