blob: 663159441c74586e5f108c570b27730bb8993f21 [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 HIGUCHI672488d2014-10-07 09:23:43 -07005import org.onlab.onos.store.serializers.Serializer;
Yuta HIGUCHIad4c2182014-09-29 11:16:23 -07006
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 HIGUCHI672488d2014-10-07 09:23:43 -070021 private final Serializer serializer;
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070022 private IMap<byte[], byte[]> rawMap;
23
24 /**
25 * Constructor.
26 *
Yuta HIGUCHI672488d2014-10-07 09:23:43 -070027 * @param serializer to use for serialization
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070028 * @param rawMap underlying IMap
29 */
Yuta HIGUCHI672488d2014-10-07 09:23:43 -070030 public OptionalCacheLoader(Serializer serializer, IMap<byte[], byte[]> rawMap) {
31 this.serializer = checkNotNull(serializer);
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 HIGUCHI672488d2014-10-07 09:23:43 -070037 byte[] keyBytes = serializer.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 HIGUCHI672488d2014-10-07 09:23:43 -070042 V dev = serializer.decode(valBytes);
Yuta HIGUCHI951e7902014-09-23 14:45:11 -070043 return Optional.of(dev);
44 }
45}