diff --git a/pom.xml b/pom.xml index ac27148fd8..7343e9fd9f 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 3.37.1 5.9.2 5.1.1 + 3.1.4 @@ -50,6 +51,11 @@ jcip-annotations ${jcip-annotations.version} + + com.github.ben-manes.caffeine + caffeine + ${caffeine.version} + diff --git a/src/main/java/database/maker/MakerInfoProvider.java b/src/main/java/database/maker/MakerInfoProvider.java index e418af84d7..5c1bffa836 100644 --- a/src/main/java/database/maker/MakerInfoProvider.java +++ b/src/main/java/database/maker/MakerInfoProvider.java @@ -1,50 +1,30 @@ package database.maker; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import net.jcip.annotations.ThreadSafe; -import java.util.Map; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; @ThreadSafe public class MakerInfoProvider { private final MakerDao makerDao; - private final Map reagentCache = new ConcurrentHashMap<>(); - private final Map recipeCache = new ConcurrentHashMap<>(); + private final Cache> reagentCache = Caffeine.newBuilder().build(); + private final Cache> recipeCache = Caffeine.newBuilder().build(); public MakerInfoProvider(MakerDao makerDao) { if (makerDao == null) { - throw new IllegalArgumentException("MakerDao is null"); + throw new IllegalArgumentException("MakerDao must not be null"); } this.makerDao = makerDao; } public Optional getMakerReagent(int itemId) { - final MakerReagent cachedReagent = reagentCache.get(itemId); - if (cachedReagent != null) { - return Optional.of(cachedReagent); - } - - final Optional reagentFromDb = makerDao.getReagent(itemId); - if (reagentFromDb.isEmpty()) { - return Optional.empty(); - } - reagentCache.put(itemId, reagentFromDb.get()); - return reagentFromDb; + return reagentCache.get(itemId, makerDao::getReagent); } public Optional getMakerRecipe(int itemId) { - final MakerRecipe cachedRecipe = recipeCache.get(itemId); - if (cachedRecipe != null) { - return Optional.of(cachedRecipe); - } - - final Optional recipeFromDb = makerDao.getRecipe(itemId); - if (recipeFromDb.isEmpty()) { - return Optional.empty(); - } - recipeCache.put(itemId, recipeFromDb.get()); - return recipeFromDb; + return recipeCache.get(itemId, makerDao::getRecipe); } public Optional getStimulant(int itemId) {