1 /* 2 * MIT License 3 * 4 * Copyright (c) 2010-2022 The Waffle Project Contributors: https://github.com/Waffle/waffle/graphs/contributors 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 package waffle.util.cache; 25 26 import com.github.benmanes.caffeine.cache.Caffeine; 27 28 import java.time.Duration; 29 30 import org.checkerframework.checker.index.qual.NonNegative; 31 32 /** 33 * A {@link Cache} based on {@link com.github.benmanes.caffeine.cache.Cache} 34 * 35 * @param <K> 36 * the type of keys maintained by this cache 37 * @param <V> 38 * the type of mapped values 39 * 40 * @author Simon Legner 41 */ 42 public class CaffeineCache<K, V> implements Cache<K, V> { 43 44 /** The cache store. */ 45 private final com.github.benmanes.caffeine.cache.Cache<K, V> cache; 46 47 /** 48 * Instantiate new caffeine cache with timeout. 49 * 50 * @param timeout 51 * Specified timeout in seconds for cache. 52 */ 53 public CaffeineCache(@NonNegative final long timeout) { 54 cache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(timeout)).build(); 55 } 56 57 @Override 58 public V get(K key) { 59 return cache.asMap().get(key); 60 } 61 62 @Override 63 public void put(K key, V value) { 64 cache.put(key, value); 65 } 66 67 @Override 68 public void remove(K key) { 69 cache.asMap().remove(key); 70 } 71 72 @Override 73 public int size() { 74 return cache.asMap().size(); 75 } 76 }