package database.maker; 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<>(); public MakerInfoProvider(MakerDao makerDao) { if (makerDao == null) { throw new IllegalArgumentException("MakerDao is 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; } 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; } public Optional getStimulant(int itemId) { return getMakerRecipe(itemId).map(MakerRecipe::catalyst); } }