From 155b293b61129b5970361fcdef5a77c1f6a6c9ab Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 28 Nov 2020 16:45:35 -0700 Subject: [PATCH] new loading system, begin ZIP loading implementation --- .../dfsek/terra/config/base/ConfigPack.java | 59 ++++++++++++++----- .../config/files/ExceptionalConsumer.java | 8 +++ .../terra/config/files/FolderLoader.java | 52 ++++++++++++++++ .../com/dfsek/terra/config/files/Loader.java | 20 +++++++ .../dfsek/terra/config/files/ZIPLoader.java | 48 +++++++++++++++ .../terra/config/templates/BiomeTemplate.java | 6 +- .../java/com/dfsek/terra/util/ConfigUtil.java | 28 --------- 7 files changed, 175 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java create mode 100644 src/main/java/com/dfsek/terra/config/files/FolderLoader.java create mode 100644 src/main/java/com/dfsek/terra/config/files/Loader.java create mode 100644 src/main/java/com/dfsek/terra/config/files/ZIPLoader.java diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 08ba46ba8..a16e5a6b8 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -13,6 +13,7 @@ import com.dfsek.terra.config.factories.BiomeGridFactory; import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.PaletteFactory; +import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.loaders.NoiseBuilderLoader; import com.dfsek.terra.config.templates.BiomeGridTemplate; @@ -26,6 +27,7 @@ import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; import com.dfsek.terra.registry.FloraRegistry; +import com.dfsek.terra.registry.OreRegistry; import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.util.ConfigUtil; @@ -55,6 +57,19 @@ public class ConfigPack { private final CarverRegistry carverRegistry = new CarverRegistry(); private final PaletteRegistry paletteRegistry = new PaletteRegistry(); private final FloraRegistry floraRegistry = new FloraRegistry(); + private final OreRegistry oreRegistry = new OreRegistry(); + + private final AbstractConfigLoader abstractConfigLoader; + + { + abstractConfigLoader = new AbstractConfigLoader(); + abstractConfigLoader + .registerLoader(Palette.class, paletteRegistry) + .registerLoader(Biome.class, biomeRegistry) + .registerLoader(UserDefinedCarver.class, carverRegistry) + .registerLoader(Flora.class, floraRegistry); + ConfigUtil.registerAllLoaders(abstractConfigLoader); + } private final Scope varScope; @@ -78,51 +93,65 @@ public class ConfigPack { varScope.create(var.getKey()).setValue(var.getValue()); } - AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); - abstractConfigLoader - .registerLoader(Palette.class, paletteRegistry) - .registerLoader(Biome.class, biomeRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry) - .registerLoader(Flora.class, floraRegistry); - ConfigUtil.registerAllLoaders(abstractConfigLoader); + List paletteTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "palettes").toPath()) + .then(streams -> paletteTemplates.addAll(abstractConfigLoader.load(streams, PaletteTemplate::new))) + .close(); - List paletteTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "palettes").toPath()), PaletteTemplate::new); PaletteFactory paletteFactory = new PaletteFactory(); paletteTemplates.forEach(palette -> { paletteRegistry.add(palette.getID(), paletteFactory.build(palette)); Debug.info("Loaded palette " + palette.getID()); }); - List floraTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "flora").toPath()), FloraTemplate::new); + List floraTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "flora").toPath()) + .then(streams -> floraTemplates.addAll(abstractConfigLoader.load(streams, FloraTemplate::new))) + .close(); + FloraFactory floraFactory = new FloraFactory(); floraTemplates.forEach(flora -> { floraRegistry.add(flora.getID(), floraFactory.build(flora)); Debug.info("Loaded flora " + flora.getID()); }); - List structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new); + List structureTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "structures/single").toPath()) + .then(streams -> structureTemplates.addAll(abstractConfigLoader.load(streams, StructureTemplate::new))) + .close(); + structureTemplates.forEach(structure -> { structureRegistry.add(structure.getID(), structure); Debug.info("Loaded structure " + structure.getID()); }); - List carverTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "carving").toPath()), CarverTemplate::new); + List carverTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "carving").toPath()) + .then(streams -> carverTemplates.addAll(abstractConfigLoader.load(streams, CarverTemplate::new))) + .close(); + CarverFactory carverFactory = new CarverFactory(); carverTemplates.forEach(carver -> { carverRegistry.add(carver.getID(), carverFactory.build(carver)); Debug.info("Loaded carver " + carver.getID()); }); - List biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this)); + List biomeTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "biomes").toPath()) + .then(streams -> biomeTemplates.addAll(abstractConfigLoader.load(streams, () -> new BiomeTemplate(this)))) + .close(); + BiomeFactory biomeFactory = new BiomeFactory(this); biomeTemplates.forEach(biome -> { biomeRegistry.add(biome.getID(), biomeFactory.build(biome)); Debug.info("Loaded biome " + biome.getID()); - Debug.info("Flora: " + biome.getFlora()); - Debug.info("Carvers: " + biome.getCarvers()); }); - List biomeGridTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "grids").toPath()), BiomeGridTemplate::new); + List biomeGridTemplates = new ArrayList<>(); + new FolderLoader(new File(folder, "grids").toPath()) + .then(streams -> biomeGridTemplates.addAll(abstractConfigLoader.load(streams, BiomeGridTemplate::new))) + .close(); + BiomeGridFactory biomeGridFactory = new BiomeGridFactory(); biomeGridTemplates.forEach(grid -> { biomeGridRegistry.add(grid.getID(), biomeGridFactory.build(grid)); diff --git a/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java b/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java new file mode 100644 index 000000000..9705afe78 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.config.files; + +import com.dfsek.tectonic.exception.ConfigException; + +@FunctionalInterface +public interface ExceptionalConsumer { + void accept(T t) throws ConfigException; +} diff --git a/src/main/java/com/dfsek/terra/config/files/FolderLoader.java b/src/main/java/com/dfsek/terra/config/files/FolderLoader.java new file mode 100644 index 000000000..fbd2af232 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/files/FolderLoader.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.config.files; + +import com.dfsek.tectonic.exception.ConfigException; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * Load all {@code *.yml} files from a {@link java.nio.file.Path}. + */ +public class FolderLoader implements Loader { + private final List streams = new ArrayList<>(); + + public FolderLoader(Path path) { + path.toFile().mkdirs(); + try(Stream paths = Files.walk(path)) { + paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(".yml")).forEach(file -> { + try { + streams.add(new FileInputStream(file.toFile())); + } catch(FileNotFoundException e) { + e.printStackTrace(); + } + }); + } catch(IOException e) { + e.printStackTrace(); + } + } + + public FolderLoader then(ExceptionalConsumer> consumer) throws ConfigException { + consumer.accept(streams); + return this; + } + + @Override + public void close() { + streams.forEach(stream -> { + try { + stream.close(); + } catch(IOException e) { + e.printStackTrace(); + } + }); + streams.clear(); + } +} diff --git a/src/main/java/com/dfsek/terra/config/files/Loader.java b/src/main/java/com/dfsek/terra/config/files/Loader.java new file mode 100644 index 000000000..695c649bc --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.config.files; + +import com.dfsek.tectonic.exception.ConfigException; + +import java.io.InputStream; +import java.util.List; + +public interface Loader { + /** + * Do something with the InputStreams. + * + * @param consumer Something to do with the streams. + */ + Loader then(ExceptionalConsumer> consumer) throws ConfigException; + + /** + * Close all InputStreams opened. + */ + void close(); +} diff --git a/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java b/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java new file mode 100644 index 000000000..7a7458947 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.config.files; + +import com.dfsek.tectonic.exception.ConfigException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class ZIPLoader implements Loader { + private final List streams = new ArrayList<>(); + + public ZIPLoader(ZipFile file, String subDirectory) { + Enumeration entries = file.entries(); + + while(entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if(!entry.isDirectory() && entry.getName().startsWith(subDirectory) && entry.getName().endsWith(".yml")) { + try { + streams.add(file.getInputStream(entry)); + } catch(IOException e) { + e.printStackTrace(); + } + } + } + } + + @Override + public ZIPLoader then(ExceptionalConsumer> consumer) throws ConfigException { + consumer.accept(streams); + return this; + } + + @Override + public void close() { + streams.forEach(stream -> { + try { + stream.close(); + } catch(IOException e) { + e.printStackTrace(); + } + }); + streams.clear(); + } +} diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 53e6474b4..860436e43 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -53,9 +53,9 @@ public class BiomeTemplate implements ConfigTemplate { @Value("noise-equation") @Abstractable private String noiseEquation; - @Value("ores") - @Abstractable - @Default + //@Value("ores") + //@Abstractable + //@Default private Map ores = new HashMap<>(); @Value("ocean.level") @Abstractable diff --git a/src/main/java/com/dfsek/terra/util/ConfigUtil.java b/src/main/java/com/dfsek/terra/util/ConfigUtil.java index cba109bb4..58df2a7d5 100644 --- a/src/main/java/com/dfsek/terra/util/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/util/ConfigUtil.java @@ -26,35 +26,7 @@ import org.bukkit.block.data.BlockData; import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.Range; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - public final class ConfigUtil { - public static List loadFromPath(Path folder) { - List streams = new ArrayList<>(); - folder.toFile().mkdirs(); - try(Stream paths = Files.walk(folder)) { - paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(".yml")).forEach(file -> { - try { - streams.add(new FileInputStream(file.toFile())); - } catch(FileNotFoundException e) { - e.printStackTrace(); - } - }); - } catch(IOException e) { - e.printStackTrace(); - } - - return streams; - } - /** * Register all Terra loaders to a {@link TypeRegistry}. *