diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java deleted file mode 100644 index eb7087884..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of Terra. - * - * Terra is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Terra is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Terra. If not, see . - */ - -package com.dfsek.terra.config.loaders.config; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import com.dfsek.tectonic.api.loader.type.TypeLoader; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.lang.reflect.AnnotatedType; -import java.nio.file.Files; -import java.util.concurrent.ConcurrentHashMap; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.properties.Properties; - - -/* - * @deprecated Use the Image and ImageLoader class provided by the library-image addon instead. This is subject to removal in v7. - */ -@Deprecated -public class BufferedImageLoader implements TypeLoader { - - private final ConfigPack pack; - - public BufferedImageLoader(ConfigPack pack) { - this.pack = pack; - if(!pack.getContext().has(ImageCache.class)) - pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); - } - - @Override - public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> { - try { - return ImageIO.read(Files.newInputStream(pack.getRootPath().resolve(s))); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } - }); - } - - /* - * Cache prevents configs from loading the same image multiple times into memory - */ - private record ImageCache(ConcurrentHashMap map) implements Properties { - } -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index c4cc03417..42530b81f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -33,7 +33,6 @@ import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.ParameterizedType; @@ -77,7 +76,6 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader; -import com.dfsek.terra.config.loaders.config.BufferedImageLoader; import com.dfsek.terra.config.preprocessor.MetaListLikePreprocessor; import com.dfsek.terra.config.preprocessor.MetaMapPreprocessor; import com.dfsek.terra.config.preprocessor.MetaNumberPreprocessor; @@ -273,8 +271,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public void register(TypeRegistry registry) { - registry.registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(this)); + registry.registerLoader(ConfigType.class, configTypeRegistry); registryMap.forEach(registry::registerLoader); shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java index fe80bd15b..2ebab84f7 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java @@ -31,6 +31,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -51,11 +52,11 @@ import com.dfsek.terra.api.util.reflection.TypeKey; public class OpenRegistryImpl implements OpenRegistry { private static final Entry NULL = new Entry<>(null); private final Map> objects; - private final ListMultimap>> objectIDs = Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); + private final ListMultimap>> objectIDs = Multimaps.newListMultimap(new ConcurrentHashMap<>(), ArrayList::new); private final TypeKey typeKey; public OpenRegistryImpl(TypeKey typeKey) { - this(new HashMap<>(), typeKey); + this(new ConcurrentHashMap<>(), typeKey); } protected OpenRegistryImpl(Map> init, TypeKey typeKey) { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java index 859771972..01e06b585 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java @@ -23,6 +23,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Stream; import com.dfsek.terra.api.Platform; @@ -44,9 +45,9 @@ public class ConfigRegistry extends OpenRegistryImpl { public synchronized void loadAll(Platform platform) throws IOException, PackLoadFailuresException { Path packsDirectory = platform.getDataFolder().toPath().resolve("packs"); Files.createDirectories(packsDirectory); - List failedLoads = new ArrayList<>(); + List failedLoads = new CopyOnWriteArrayList<>(); try(Stream packs = Files.list(packsDirectory)) { - packs.forEach(path -> { + packs.parallel().forEach(path -> { try { ConfigPack pack = new ConfigPackImpl(path, platform); registerChecked(pack.getRegistryKey(), pack);