blob: 2629e2d4744ba594d4e32ebda63b833aee1a2a99 [file] [log] [blame]
Yuta HIGUCHIb5df76d2014-09-27 20:54:00 -07001package org.onlab.onos.store.common;
Yuta HIGUCHI951e7902014-09-23 14:45:11 -07002
3import static com.google.common.base.Preconditions.checkNotNull;
4
Yuta HIGUCHIad4c2182014-09-29 11:16:23 -07005import org.onlab.onos.store.serializers.KryoSerializationService;
6
Yuta HIGUCHI951e7902014-09-23 14:45:11 -07007import com.google.common.base.Optional;
8import com.google.common.cache.CacheLoader;
9import com.hazelcast.core.IMap;
10
11/**
12 * CacheLoader to wrap Map value with Optional,
13 * to handle negative hit on underlying IMap.
14 *
15 * @param <K> IMap key type after deserialization
16 * @param <V> IMap value type after deserialization
17 */
18public final class OptionalCacheLoader<K, V> extends
19 CacheLoader<K, Optional<V>> {
20
Yuta HIGUCHIad4c2182014-09-29 11:16:23 -070021 private final KryoSerializationService kryoSerializationService;
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070022 private IMap<byte[], byte[]> rawMap;
23
24 /**
25 * Constructor.
26 *
Yuta HIGUCHIad4c2182014-09-29 11:16:23 -070027 * @param kryoSerializationService to use for serialization
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070028 * @param rawMap underlying IMap
29 */
Yuta HIGUCHIad4c2182014-09-29 11:16:23 -070030 public OptionalCacheLoader(KryoSerializationService kryoSerializationService, IMap<byte[], byte[]> rawMap) {
31 this.kryoSerializationService = checkNotNull(kryoSerializationService);
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070032 this.rawMap = checkNotNull(rawMap);
33 }
34
35 @Override
36 public Optional<V> load(K key) throws Exception {
Yuta HIGUCHI53a285d2014-10-06 23:58:01 -070037 byte[] keyBytes = kryoSerializationService.encode(key);
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070038 byte[] valBytes = rawMap.get(keyBytes);
39 if (valBytes == null) {
40 return Optional.absent();
41 }
Yuta HIGUCHI53a285d2014-10-06 23:58:01 -070042 V dev = kryoSerializationService.decode(valBytes);
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070043 return Optional.of(dev);
44 }
45}