001package ca.uhn.fhir.sl.cache.caffeine; 002 003/*- 004 * #%L 005 * HAPI FHIR - ServiceLoaders - Caching Caffeine 006 * %% 007 * Copyright (C) 2014 - 2024 Smile CDR, Inc. 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import ca.uhn.fhir.sl.cache.Cache; 024import ca.uhn.fhir.sl.cache.CacheLoader; 025import ca.uhn.fhir.sl.cache.LoadingCache; 026import com.github.benmanes.caffeine.cache.Caffeine; 027 028import java.util.concurrent.TimeUnit; 029 030public class CacheProvider<K, V> implements ca.uhn.fhir.sl.cache.CacheProvider<K, V> { 031 032 public Cache<K, V> create(long timeoutMillis) { 033 return new CacheDelegator<K, V>(Caffeine.newBuilder() 034 .expireAfterWrite(timeoutMillis, TimeUnit.MILLISECONDS) 035 .build()); 036 } 037 038 public LoadingCache<K, V> create(long timeoutMillis, CacheLoader<K, V> loading) { 039 return new LoadingCacheDelegator<K, V>(Caffeine.newBuilder() 040 .expireAfterWrite(timeoutMillis, TimeUnit.MILLISECONDS) 041 .build(loading::load)); 042 } 043 044 public Cache<K, V> create(long timeoutMillis, long maximumSize) { 045 return new CacheDelegator<K, V>(Caffeine.newBuilder() 046 .expireAfterWrite(timeoutMillis, TimeUnit.MILLISECONDS) 047 // Caffeine locks the whole array when growing the hash table. 048 // Set initial capacity to max to avoid this. All our caches are <1M entries. 049 .initialCapacity((int) maximumSize) 050 .maximumSize(maximumSize) 051 .build()); 052 } 053 054 public LoadingCache<K, V> create(long timeoutMillis, long maximumSize, CacheLoader<K, V> loading) { 055 return new LoadingCacheDelegator<K, V>(Caffeine.newBuilder() 056 .expireAfterWrite(timeoutMillis, TimeUnit.MILLISECONDS) 057 // Caffeine locks the whole array when growing the hash table. 058 // Set initial capacity to max to avoid this. All our caches are <1M entries. 059 .initialCapacity((int) maximumSize) 060 .maximumSize(maximumSize) 061 .build(loading::load)); 062 } 063}