diff --git a/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java b/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java index 9c264be1..63a49498 100644 --- a/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java +++ b/src/main/java/org/embeddedt/modernfix/dynresources/DynamicModelSystem.java @@ -38,6 +38,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -57,19 +58,32 @@ public class DynamicModelSystem { FileToIdConverter converter, String debugName, ResultLoader loader) { - LoadingCache resultCache = CacheBuilder.newBuilder().softValues().maximumSize(1000).build(new CacheLoader<>() { + LoadingCache> resultCache = CacheBuilder.newBuilder().softValues().maximumSize(1000).build(new CacheLoader<>() { @Override - public RESULT load(Identifier id) throws Exception { + public Optional load(Identifier id) throws Exception { var file = converter.idToFile(id); var resource = resourceMap.get(file); + if (resource == null) { + return Optional.empty(); + } if (DEBUG_DYNAMIC_MODEL_LOADING) { ModernFix.LOGGER.info("Loading {} {}", debugName, id); } - return loader.load(file, resource); + return Optional.of(loader.load(file, resource)); } }); Set idSet = resourceMap.keySet().stream().map(converter::fileToId).collect(Collectors.toUnmodifiableSet()); - return Maps.asMap(idSet, key -> key != null ? resultCache.getUnchecked(key) : null); + return new DynamicRegistryMap<>(idSet, key -> { + if (key == null) { + return null; + } + try { + return resultCache.getUnchecked(key).orElse(null); + } catch (RuntimeException e) { + ModernFix.LOGGER.error("Error loading {} {} from cache", debugName, key); + throw e; + } + }); } public static Map createDynamicUnbakedModelMap(Map resourceMap) {