From 620ae7d1ff121460def92b6c6888525f0dcbda1a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 21 Aug 2022 00:51:26 -0700 Subject: [PATCH] make Registry immutable, remove other registry implementations --- .../biome/extrusion/BiomeExtrusionAddon.java | 9 +- .../biome/image/ImageBiomeProviderAddon.java | 7 +- .../biome/pipeline/BiomePipelineAddon.java | 16 +- .../single/SingleBiomeProviderAddon.java | 4 +- .../NoiseChunkGenerator3DAddon.java | 2 +- .../commands/addons/AddonsCommandAddon.java | 6 +- .../commands/packs/PacksCommandAddon.java | 10 - .../feature/distributor/DistributorAddon.java | 9 +- .../addons/feature/locator/LocatorAddon.java | 9 +- .../dfsek/terra/addons/noise/NoiseAddon.java | 9 +- .../terra/addons/palette/PaletteAddon.java | 10 - .../feature/FeatureGenerationAddon.java | 6 +- .../structure/StructureGenerationAddon.java | 2 +- .../terra/addons/manifest/api/monad/Init.java | 12 +- .../addons/manifest/api/monad/Register.java | 22 +++ .../addons/sponge/SpongeSchematicAddon.java | 5 +- .../addons/terrascript/TerraScriptAddon.java | 11 +- .../check/TerraScriptCheckFunctionAddon.java | 24 +-- .../TerraScriptSamplerFunctionAddon.java | 5 +- .../java/com/dfsek/terra/api/Platform.java | 23 +-- .../dfsek/terra/api/config/ConfigPack.java | 4 +- .../config/type/ConfigTypeLoadEvent.java | 10 +- .../config/type/ConfigTypePostLoadEvent.java | 4 +- .../config/type/ConfigTypePreLoadEvent.java | 4 +- .../terra/api/registry/CheckedRegistry.java | 32 --- .../terra/api/registry/OpenRegistry.java | 50 ----- .../dfsek/terra/api/registry/Registry.java | 50 ++--- .../dfsek/terra/api/registry/key/Keyed.java | 5 + .../registry/meta/CheckedRegistryHolder.java | 19 -- .../api/registry/meta/RegistryProvider.java | 8 +- .../com/dfsek/terra/AbstractPlatform.java | 22 +-- .../dfsek/terra/config/GenericLoaders.java | 2 +- .../terra/config/pack/ConfigPackImpl.java | 90 ++++----- .../terra/registry/CheckedRegistryImpl.java | 108 ---------- .../terra/registry/LockedRegistryImpl.java | 95 --------- .../terra/registry/OpenRegistryImpl.java | 185 ------------------ .../dfsek/terra/registry/RegistryImpl.java | 103 ++++++++++ .../terra/registry/master/ConfigRegistry.java | 6 +- .../src/test/java/registry/RegistryTest.java | 96 --------- 39 files changed, 275 insertions(+), 819 deletions(-) create mode 100644 common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Register.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java delete mode 100644 common/api/src/main/java/com/dfsek/terra/api/registry/meta/CheckedRegistryHolder.java delete mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java delete mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java delete mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/registry/RegistryImpl.java delete mode 100644 common/implementation/base/src/test/java/registry/RegistryTest.java diff --git a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionAddon.java b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionAddon.java index 10c77f9b4..f9e00bcb8 100644 --- a/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionAddon.java +++ b/common/addons/biome-provider-extrusion/src/main/java/com/dfsek/terra/addons/biome/extrusion/BiomeExtrusionAddon.java @@ -17,7 +17,6 @@ import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.generic.Construct; @@ -49,14 +48,14 @@ public class BiomeExtrusionAddon implements MonadAddonInitializer { }); return functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> providerRegistry = + Registry>> providerRegistry = event.getPack() - .getOrCreateRegistry(PROVIDER_REGISTRY_KEY); + .createRegistry(PROVIDER_REGISTRY_KEY); providerRegistry.register(base.key("EXTRUSION"), BiomeExtrusionTemplate::new); }) .then(event -> { - CheckedRegistry>> extrusionRegistry = - event.getPack().getOrCreateRegistry( + Registry>> extrusionRegistry = + event.getPack().createRegistry( EXTRUSION_REGISTRY_KEY); extrusionRegistry.register(base.key("SET"), SetExtrusionTemplate::new); extrusionRegistry.register(base.key("REPLACE"), ReplaceExtrusionTemplate::new); diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java index 6108a197a..abfbde8fc 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProviderAddon.java @@ -15,12 +15,9 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.Biome; @@ -40,7 +37,7 @@ public class ImageBiomeProviderAddon implements MonadAddonInitializer { ((functionalEventHandler, base, platform) -> Init.ofPure( functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + Registry>> providerRegistry = event.getPack().createRegistry( PROVIDER_REGISTRY_KEY); providerRegistry.register(base.key("IMAGE"), () -> new ImageProviderTemplate(event.getPack().getRegistry(Biome.class))); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java index ee374a256..2978b7437 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/BiomePipelineAddon.java @@ -27,13 +27,9 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.generic.Construct; @@ -60,20 +56,20 @@ public class BiomePipelineAddon implements MonadAddonInitializer { ((functionalEventHandler, base) -> Init.ofPure(Construct.construct(() -> { functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> providerRegistry = - event.getPack().getOrCreateRegistry( + Registry>> providerRegistry = + event.getPack().createRegistry( PROVIDER_REGISTRY_KEY); providerRegistry.register(base.key("PIPELINE"), BiomePipelineTemplate::new); }) .then(event -> { - CheckedRegistry>> sourceRegistry = - event.getPack().getOrCreateRegistry( + Registry>> sourceRegistry = + event.getPack().createRegistry( SOURCE_REGISTRY_KEY); sourceRegistry.register(base.key("SAMPLER"), SamplerSourceTemplate::new); }) .then(event -> { - CheckedRegistry>> stageRegistry = - event.getPack().getOrCreateRegistry( + Registry>> stageRegistry = + event.getPack().createRegistry( STAGE_REGISTRY_KEY); stageRegistry.register(base.key("FRACTAL_EXPAND"), ExpanderStageTemplate::new); stageRegistry.register(base.key("SMOOTH"), SmoothMutatorTemplate::new); diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java index 005bc951a..4557dbd0b 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProviderAddon.java @@ -17,7 +17,7 @@ import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -36,7 +36,7 @@ public class SingleBiomeProviderAddon implements MonadAddonInitializer { ((handler, base, platform) -> Init.ofPure( handler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> providerRegistry = event.getPack().getOrCreateRegistry( + Registry>> providerRegistry = event.getPack().createRegistry( PROVIDER_REGISTRY_KEY); providerRegistry.register(base.key("SINGLE"), SingleBiomeProviderTemplate::new); }) diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java index 6f9e45cf7..1686db5a1 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/NoiseChunkGenerator3DAddon.java @@ -45,7 +45,7 @@ public class NoiseChunkGenerator3DAddon implements MonadAddonInitializer { NoiseChunkGeneratorPackConfigTemplate config = event.loadTemplate(new NoiseChunkGeneratorPackConfigTemplate()); event.getPack() - .getOrCreateRegistry(ChunkGeneratorProvider.class) + .createRegistry(ChunkGeneratorProvider.class) .register(base.key("NOISE_3D"), pack -> new NoiseChunkGenerator3D(pack, platform, config.getElevationBlend(), config.getHorizontalRes(), diff --git a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java index bb676fc62..7b64bd8da 100644 --- a/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java +++ b/common/addons/command-addons/src/main/java/com/dfsek/terra/addons/commands/addons/AddonsCommandAddon.java @@ -7,13 +7,11 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.arguments.RegistryArgument; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.util.function.monad.Monad; @@ -37,7 +35,7 @@ public class AddonsCommandAddon implements MonadAddonInitializer { .handler(context -> { StringBuilder addons = new StringBuilder( "Installed addons:\n"); - platform.getAddons() + platform.addons() .forEach(addon -> addons .append(" - ") .append(addon.getID()) @@ -50,7 +48,7 @@ public class AddonsCommandAddon implements MonadAddonInitializer { .command( manager.commandBuilder("addons") .argument( - RegistryArgument.of("addon", platform.getAddons())) + RegistryArgument.of("addon", platform.addons())) .permission("terra.addons.info") .handler(context -> { BaseAddon addon = context.get("addon"); diff --git a/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java b/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java index 0a6bbcc3f..265c58ccc 100644 --- a/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java +++ b/common/addons/command-packs/src/main/java/com/dfsek/terra/addons/commands/packs/PacksCommandAddon.java @@ -2,31 +2,21 @@ package com.dfsek.terra.addons.commands.packs; import cloud.commandframework.ArgumentDescription; import cloud.commandframework.CommandManager; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.function.monad.Monad; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.command.CommandSender; import com.dfsek.terra.api.command.arguments.RegistryArgument; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.event.events.platform.CommandRegistrationEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; - -import java.util.function.Supplier; public class PacksCommandAddon implements MonadAddonInitializer { diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java index 1b30b78d3..ab9aa7253 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -25,12 +25,9 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -48,9 +45,9 @@ public class DistributorAddon implements MonadAddonInitializer { ((functionalEventHandler, base) -> Init.ofPure( functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> distributorRegistry = event + Registry>> distributorRegistry = event .getPack() - .getOrCreateRegistry(DISTRIBUTOR_TOKEN); + .createRegistry(DISTRIBUTOR_TOKEN); distributorRegistry.register(base.key("SAMPLER"), SamplerDistributorTemplate::new); distributorRegistry.register(base.key("POINTS"), PointSetDistributorTemplate::new); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java index 9cb6282e7..a0ec2de9d 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java @@ -35,12 +35,9 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -62,7 +59,7 @@ public class LocatorAddon implements MonadAddonInitializer { ((functionalEventHandler, base, platform) -> Init.ofPure( functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); + Registry>> locatorRegistry = event.getPack().createRegistry(LOCATOR_TOKEN); locatorRegistry.register(base.key("SURFACE"), SurfaceLocatorTemplate::new); locatorRegistry.register(base.key("TOP"), TopLocatorTemplate::new); @@ -80,7 +77,7 @@ public class LocatorAddon implements MonadAddonInitializer { locatorRegistry.register(base.key("XOR"), XorLocatorTemplate::new); }) .then(event -> { - CheckedRegistry>> patternRegistry = event.getPack().getOrCreateRegistry(PATTERN_TOKEN); + Registry>> patternRegistry = event.getPack().createRegistry(PATTERN_TOKEN); patternRegistry.register(base.key("MATCH_AIR"), AirMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH_SOLID"), SolidMatchPatternTemplate::new); patternRegistry.register(base.key("MATCH"), SingleBlockMatchPatternTemplate::new); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index 913d4e7bc..d97226736 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -54,17 +54,12 @@ import com.dfsek.terra.addons.noise.samplers.noise.simplex.PerlinSampler; import com.dfsek.terra.addons.noise.samplers.noise.simplex.SimplexSampler; import com.dfsek.terra.addons.noise.samplers.noise.value.ValueCubicSampler; import com.dfsek.terra.addons.noise.samplers.noise.value.ValueSampler; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; public class NoiseAddon implements MonadAddonInitializer { @@ -80,7 +75,7 @@ public class NoiseAddon implements MonadAddonInitializer { ((functionalEventHandler, base, platform) -> Init.ofPure( functionalEventHandler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry( + Registry>> noiseRegistry = event.getPack().createRegistry( NOISE_SAMPLER_TOKEN); event.getPack() .applyLoader(CellularSampler.DistanceFunction.class, diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java index 6f7e501b8..2adc65bb2 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java @@ -7,25 +7,15 @@ package com.dfsek.terra.addons.palette; -import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; - import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.addons.palette.palette.PaletteLayerLoader; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.util.function.monad.Monad; -import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; - -import java.util.function.Supplier; public class PaletteAddon implements MonadAddonInitializer { diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java index 75c7df42b..781689c6a 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java @@ -24,13 +24,10 @@ import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.config.meta.Meta; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.properties.Context; import com.dfsek.terra.api.properties.PropertyKey; import com.dfsek.terra.api.structure.feature.Feature; @@ -39,7 +36,6 @@ import com.dfsek.terra.api.util.generic.Construct; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; -import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; public class FeatureGenerationAddon implements MonadAddonInitializer { @@ -61,7 +57,7 @@ public class FeatureGenerationAddon implements MonadAddonInitializer { ((handler, base, platform) -> Init.ofPure(Construct.construct(() -> { handler.register(base, ConfigPackPreLoadEvent.class) .then(event -> event.getPack() - .getOrCreateRegistry(STAGE_TYPE_KEY) + .createRegistry(STAGE_TYPE_KEY) .register(base.key("FEATURE"), () -> new FeatureStageTemplate(platform, biomeFeaturesKey))) .failThrough(); return handler.register(base, ConfigurationLoadEvent.class) diff --git a/common/addons/generation-stage-structure/src/main/java/com/dfsek/terra/addons/generation/structure/StructureGenerationAddon.java b/common/addons/generation-stage-structure/src/main/java/com/dfsek/terra/addons/generation/structure/StructureGenerationAddon.java index 020835d6c..f67b74405 100644 --- a/common/addons/generation-stage-structure/src/main/java/com/dfsek/terra/addons/generation/structure/StructureGenerationAddon.java +++ b/common/addons/generation-stage-structure/src/main/java/com/dfsek/terra/addons/generation/structure/StructureGenerationAddon.java @@ -24,7 +24,7 @@ public class StructureGenerationAddon implements MonadAddonInitializer { ((handler, base, platform) -> Init.ofPure(Construct.construct(() -> { handler.register(base, ConfigPackPreLoadEvent.class) .then(event -> event.getPack() - .getOrCreateRegistry(GenerationStageProvider.class) + .createRegistry(GenerationStageProvider.class) .register(base.key("STRUCTURE"), pack -> new StructureGenerationStage(platform))) .failThrough(); return handler.register(base, ConfigurationLoadEvent.class) diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Init.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Init.java index 3eaa9a7af..58ee75108 100644 --- a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Init.java +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Init.java @@ -4,15 +4,25 @@ import com.dfsek.terra.addons.manifest.impl.InitInfo; import com.dfsek.terra.api.util.function.Functions; import com.dfsek.terra.api.util.function.monad.Monad; +import io.vavr.Function0; +import io.vavr.Function1; + +import java.util.function.Consumer; import java.util.function.Function; public class Init implements Monad> { private final Function get; - public static Init of(Function get) { + protected static Init of(Function get) { return new Init<>(get); } + protected static Init unit(Consumer get) { + return new Init<>(info -> { + get.accept(info); + return null; + }); + } private Init(Function get) { this.get = get; diff --git a/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Register.java b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Register.java new file mode 100644 index 000000000..dcd61fa51 --- /dev/null +++ b/common/addons/manifest-addon-loader/src/main/java/com/dfsek/terra/addons/manifest/api/monad/Register.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.manifest.api.monad; + +import com.dfsek.terra.api.registry.key.Keyed; +import com.dfsek.terra.api.util.function.monad.Monad; +import com.dfsek.terra.api.util.reflection.TypeKey; + + +public class Register { + private static Monad> register(TypeKey type, String key, T object) { + return Init.unit(info -> { + throw new UnsupportedOperationException("TODO"); + }); + } + + public static Monad> register(Class clazz, String key, T object) { + return register(TypeKey.of(clazz), key, object); + } + + public static > Monad> register(Class clazz, Keyed keyed) { + return register(TypeKey.of(clazz), keyed.getID(), keyed.coerce()); + } +} diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java index cd4053d4c..f73a3ca50 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java @@ -32,8 +32,7 @@ import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.util.StringUtil; @@ -59,7 +58,7 @@ public class SpongeSchematicAddon implements MonadAddonInitializer { ((handler, base, platform) -> Init.ofPure( handler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); + Registry structureRegistry = event.getPack().createRegistry(Structure.class); event.getPack() .getLoader() .open("", ".schem") diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index 49d4dc6c6..22deebce4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -14,12 +14,9 @@ import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.script.StructureScript; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.util.StringUtil; @@ -36,8 +33,8 @@ public class TerraScriptAddon implements MonadAddonInitializer { ((handler, base, platform) -> Init.ofPure( handler.register(base, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); - CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); + Registry structureRegistry = event.getPack().createRegistry(Structure.class); + Registry lootRegistry = event.getPack().createRegistry(LootTable.class); event.getPack().getLoader().open("", ".tesf").thenEntries( entries -> entries.stream() @@ -50,7 +47,7 @@ public class TerraScriptAddon implements MonadAddonInitializer { platform, structureRegistry, lootRegistry, - event.getPack().getOrCreateRegistry(FunctionBuilder.class)); + event.getPack().createRegistry(FunctionBuilder.class)); } catch(ParseException e) { throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e); } diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java index ce950c1e8..413c6f178 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java @@ -1,33 +1,17 @@ package com.dfsek.terra.addon.terrascript.check; import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; -import com.dfsek.terra.addons.manifest.api.monad.Do; -import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.util.function.monad.Monad; +import static com.dfsek.terra.addons.manifest.api.monad.Get.platform; +import static com.dfsek.terra.addons.manifest.api.monad.Register.register; + public class TerraScriptCheckFunctionAddon implements MonadAddonInitializer { @Override public Monad> initialize() { - return Do.with( - Get.eventManager().map(eventManager -> eventManager.getHandler(FunctionalEventHandler.class)), - Get.addon(), - Get.platform(), - ((handler, base, platform) -> Init.ofPure( - handler.register(base, ConfigPackPreLoadEvent.class) - .priority(1) - .then(event -> event - .getPack() - .getOrCreateRegistry(FunctionBuilder.class) - .register(base.key("check"), new CheckFunctionBuilder(platform))) - .failThrough())) - ); + return platform().bind(platform -> register(FunctionBuilder.class, "check", new CheckFunctionBuilder(platform))); } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java index 9249d61ef..fd35b98e6 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java @@ -6,11 +6,8 @@ import com.dfsek.terra.addons.manifest.api.monad.Get; import com.dfsek.terra.addons.manifest.api.monad.Init; import com.dfsek.terra.addons.noise.NoiseConfigPackTemplate; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.util.function.monad.Monad; @@ -25,7 +22,7 @@ public class TerraScriptSamplerFunctionAddon implements MonadAddonInitializer { .priority(51) .then(event -> event .getPack() - .getOrCreateRegistry(FunctionBuilder.class) + .createRegistry(FunctionBuilder.class) .register(base.key("sampler"), new SamplerFunctionBuilder(event.getPack().getContext().get( NoiseConfigPackTemplate.class).getSamplers()))) .failThrough())) diff --git a/common/api/src/main/java/com/dfsek/terra/api/Platform.java b/common/api/src/main/java/com/dfsek/terra/api/Platform.java index 080998b31..09273805b 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/Platform.java +++ b/common/api/src/main/java/com/dfsek/terra/api/Platform.java @@ -7,6 +7,9 @@ package com.dfsek.terra.api; +import com.dfsek.terra.api.registry.meta.RegistryHolder; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -19,7 +22,6 @@ import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.handle.ItemHandle; import com.dfsek.terra.api.handle.WorldHandle; import com.dfsek.terra.api.profiler.Profiler; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.tectonic.LoaderRegistrar; @@ -27,24 +29,13 @@ import com.dfsek.terra.api.tectonic.LoaderRegistrar; /** * Represents a Terra mod/plugin instance. */ -public interface Platform extends LoaderRegistrar { +public interface Platform extends LoaderRegistrar, RegistryHolder { boolean reload(); @NotNull @Contract(pure = true) String platformName(); - /** - * Runs a task that may or may not be thread safe, depending on platform. - *

- * Allows platforms to define what code is safe to be run asynchronously. - * - * @param task Task to be run. - */ - default void runPossiblyUnsafeTask(@NotNull Runnable task) { - task.run(); - } - @NotNull @Contract(pure = true) WorldHandle getWorldHandle(); @@ -59,11 +50,7 @@ public interface Platform extends LoaderRegistrar { @NotNull @Contract(pure = true) - CheckedRegistry getConfigRegistry(); - - @NotNull - @Contract(pure = true) - Registry getAddons(); + Registry addons(); @NotNull @Contract(pure = true) diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java index 860a742be..ee2218ba2 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigPack.java @@ -17,7 +17,7 @@ import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.properties.PropertyHolder; import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.registry.meta.CheckedRegistryHolder; +import com.dfsek.terra.api.registry.meta.RegistryHolder; import com.dfsek.terra.api.registry.meta.RegistryProvider; import com.dfsek.terra.api.tectonic.ConfigLoadingDelegate; import com.dfsek.terra.api.tectonic.LoaderRegistrar; @@ -30,7 +30,7 @@ import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorPr public interface ConfigPack extends LoaderRegistrar, ConfigLoadingDelegate, - CheckedRegistryHolder, + RegistryHolder, RegistryProvider, Keyed, PropertyHolder { diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java index 8dd7db191..3738a6276 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypeLoadEvent.java @@ -11,17 +11,17 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.PackEvent; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.reflection.ReflectionUtil; public abstract class ConfigTypeLoadEvent implements PackEvent, FailThroughEvent { private final ConfigType type; - private final CheckedRegistry registry; + private final Registry registry; private final ConfigPack pack; - public ConfigTypeLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { + public ConfigTypeLoadEvent(ConfigType type, Registry registry, ConfigPack pack) { this.type = type; this.registry = registry; this.pack = pack; @@ -37,11 +37,11 @@ public abstract class ConfigTypeLoadEvent implements PackEvent, FailThroughEvent } @SuppressWarnings("unchecked") - public CheckedRegistry getRegistry(Class clazz) { + public Registry getRegistry(Class clazz) { if(!clazz.isAssignableFrom(type.getTypeKey().getRawType())) throw new ClassCastException( "Cannot assign object from loader of type " + ReflectionUtil.typeToString(type.getTypeKey().getType()) + " to class " + clazz.getCanonicalName()); - return (CheckedRegistry) registry; + return (Registry) registry; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java index f3b72ccd2..c5d96c6fa 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePostLoadEvent.java @@ -9,11 +9,11 @@ package com.dfsek.terra.api.event.events.config.type; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; public class ConfigTypePostLoadEvent extends ConfigTypeLoadEvent { - public ConfigTypePostLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { + public ConfigTypePostLoadEvent(ConfigType type, Registry registry, ConfigPack pack) { super(type, registry, pack); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java index 084d68a0a..c78d71ffb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java +++ b/common/api/src/main/java/com/dfsek/terra/api/event/events/config/type/ConfigTypePreLoadEvent.java @@ -9,11 +9,11 @@ package com.dfsek.terra.api.event.events.config.type; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigType; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; public class ConfigTypePreLoadEvent extends ConfigTypeLoadEvent { - public ConfigTypePreLoadEvent(ConfigType type, CheckedRegistry registry, ConfigPack pack) { + public ConfigTypePreLoadEvent(ConfigType type, Registry registry, ConfigPack pack) { super(type, registry, pack); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java deleted file mode 100644 index dd79c7c4a..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/CheckedRegistry.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.registry; - -import org.jetbrains.annotations.NotNull; - -import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.key.Keyed; -import com.dfsek.terra.api.registry.key.RegistryKey; - - -public interface CheckedRegistry extends Registry { - /** - * Add a value to this registry, checking whether it is present first. - * - * @param identifier Identifier to assign value. - * @param value Value to register. - * - * @throws DuplicateEntryException If an entry with the same identifier is already present. - */ - void register(@NotNull RegistryKey identifier, @NotNull T value) throws DuplicateEntryException; - - @SuppressWarnings("unchecked") - default void register(@NotNull Keyed value) throws DuplicateEntryException { - register(value.getRegistryKey(), (T) value); - } -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java deleted file mode 100644 index dcedae900..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/OpenRegistry.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra API is licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in the common/api directory. - */ - -package com.dfsek.terra.api.registry; - -import org.jetbrains.annotations.NotNull; - -import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.key.Keyed; -import com.dfsek.terra.api.registry.key.RegistryKey; - - -public interface OpenRegistry extends Registry { - /** - * Add a value to this registry. - * - * @param identifier Identifier to assign value. - * @param value Value to register. - */ - boolean register(@NotNull RegistryKey identifier, @NotNull T value); - - @SuppressWarnings("unchecked") - default boolean register(@NotNull Keyed value) { - return register(value.getRegistryKey(), (T) value); - } - - /** - * Add a value to this registry, checking whether it is present first. - * - * @param identifier Identifier to assign value. - * @param value Value to register. - * - * @throws DuplicateEntryException If an entry with the same identifier is already present. - */ - void registerChecked(@NotNull RegistryKey identifier, @NotNull T value) throws DuplicateEntryException; - - @SuppressWarnings("unchecked") - default void registerChecked(@NotNull Keyed value) { - registerChecked(value.getRegistryKey(), (T) value); - } - - /** - * Clears all entries from the registry. - */ - void clear(); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java index 00b2dd309..00420889f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/Registry.java @@ -8,16 +8,17 @@ package com.dfsek.terra.api.registry; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.api.registry.key.Keyed; + import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import java.util.Collection; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Function; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.util.reflection.TypeKey; @@ -65,7 +66,22 @@ public interface Registry extends TypeLoader { */ @NotNull @Contract(pure = true) - Collection entries(); + Set entries(); + + /** + * Add a value to this registry. + * + * @param identifier Identifier to assign value. + * @param value Value to register. + */ + @Contract(pure = true, value = "_,_->new") + Registry register(@NotNull RegistryKey identifier, @NotNull T value); + + @SuppressWarnings("unchecked") + @Contract(pure = true, value = "_->new") + default Registry register(@NotNull Keyed value) { + return register(value.getRegistryKey(), (T) value); + } /** * Get all the keys in this registry. @@ -82,31 +98,7 @@ public interface Registry extends TypeLoader { return getType().getRawType(); } - @Deprecated - default Optional getByID(String id) { - return getByID(id, map -> { - if(map.isEmpty()) return Optional.empty(); - if(map.size() == 1) { - return map.values().stream().findFirst(); // only one value. - } - throw new IllegalArgumentException("ID \"" + id + "\" is ambiguous; matches: " + map - .keySet() - .stream() - .map(RegistryKey::toString) - .reduce("", (a, b) -> a + "\n - " + b)); - }); - } + Map getID(String id); - default Collection getAllWithID(String id) { - return getMatches(id).values(); - } - - Map getMatches(String id); - - default Optional getByID(String attempt, Function, Optional> reduction) { - if(attempt.contains(":")) { - return get(RegistryKey.parse(attempt)); - } - return reduction.apply(getMatches(attempt)); - } + Map getNamespace(String namespace); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java index 957226f52..f5ebb14bc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/Keyed.java @@ -13,4 +13,9 @@ public interface Keyed> extends Namespaced, StringIdentifiabl default String getID() { return getRegistryKey().getID(); } + + @SuppressWarnings("unchecked") + default T coerce() { + return (T) this; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/CheckedRegistryHolder.java b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/CheckedRegistryHolder.java deleted file mode 100644 index 57d35e043..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/CheckedRegistryHolder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.api.registry.meta; - -import java.lang.reflect.Type; - -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.util.reflection.TypeKey; - - -public interface CheckedRegistryHolder extends RegistryHolder { - default CheckedRegistry getCheckedRegistry(Class clazz) throws IllegalStateException { - return getCheckedRegistry((Type) clazz); - } - - default CheckedRegistry getCheckedRegistry(TypeKey type) throws IllegalStateException { - return getCheckedRegistry(type.getType()); - } - - CheckedRegistry getCheckedRegistry(Type type); -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryProvider.java b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryProvider.java index b3acdfd20..7b37cbaf0 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/meta/RegistryProvider.java @@ -1,13 +1,13 @@ package com.dfsek.terra.api.registry.meta; -import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.util.reflection.TypeKey; public interface RegistryProvider { - default CheckedRegistry getOrCreateRegistry(Class clazz) { - return getOrCreateRegistry(TypeKey.of(clazz)); + default Registry createRegistry(Class clazz) { + return createRegistry(TypeKey.of(clazz)); } - CheckedRegistry getOrCreateRegistry(TypeKey type); + Registry createRegistry(TypeKey type); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java index 4ea9466ec..6eedab2e1 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/AbstractPlatform.java @@ -58,19 +58,15 @@ import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.inject.Injector; import com.dfsek.terra.api.inject.impl.InjectorImpl; import com.dfsek.terra.api.profiler.Profiler; -import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.StringIdentifiable; import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.mutable.MutableBoolean; -import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfigImpl; import com.dfsek.terra.event.EventManagerImpl; import com.dfsek.terra.profiler.ProfilerImpl; -import com.dfsek.terra.registry.CheckedRegistryImpl; -import com.dfsek.terra.registry.LockedRegistryImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; +import com.dfsek.terra.registry.RegistryImpl; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -84,9 +80,7 @@ public abstract class AbstractPlatform implements Platform { private static final MutableBoolean LOADED = new MutableBoolean(false); private final EventManager eventManager = new EventManagerImpl(); - private final ConfigRegistry configRegistry = new ConfigRegistry(); - - private final CheckedRegistry checkedConfigRegistry = new CheckedRegistryImpl<>(configRegistry); + private final Registry configRegistry = new ConfigRegistry(); private final Profiler profiler = new ProfilerImpl(); @@ -94,9 +88,7 @@ public abstract class AbstractPlatform implements Platform { private final PluginConfigImpl config = new PluginConfigImpl(); - private final CheckedRegistry addonRegistry = new CheckedRegistryImpl<>(new OpenRegistryImpl<>(TypeKey.of(BaseAddon.class))); - - private final Registry lockedAddonRegistry = new LockedRegistryImpl<>(addonRegistry); + private final Registry addonRegistry = ; public ConfigRegistry getRawConfigRegistry() { return configRegistry; @@ -321,13 +313,13 @@ public abstract class AbstractPlatform implements Platform { } @Override - public @NotNull CheckedRegistry getConfigRegistry() { - return checkedConfigRegistry; + public @NotNull Registry getConfigRegistry() { + return configRegistry; } @Override - public @NotNull Registry getAddons() { - return lockedAddonRegistry; + public @NotNull Registry addons() { + return addonRegistry; } @Override diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index f4f5c6cfd..3f06ec7ae 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -56,7 +56,7 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()); if(platform != null) { - registry.registerLoader(BaseAddon.class, platform.getAddons()) + registry.registerLoader(BaseAddon.class, platform.addons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform .getWorldHandle().createBlockState((String) object).getBlockType()) .registerLoader(BlockState.class, (type, object, configLoader, depthTracker) -> platform 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 84f2fb382..4fb0b1b9b 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 @@ -67,8 +67,6 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.type.ConfigTypePostLoadEvent; import com.dfsek.terra.api.properties.Context; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.OpenRegistry; import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.key.RegistryKey; import com.dfsek.terra.api.tectonic.ShortcutLoader; @@ -89,8 +87,7 @@ import com.dfsek.terra.config.preprocessor.MetaNumberPreprocessor; import com.dfsek.terra.config.preprocessor.MetaStringPreprocessor; import com.dfsek.terra.config.preprocessor.MetaValuePreprocessor; import com.dfsek.terra.config.prototype.ProtoConfig; -import com.dfsek.terra.registry.CheckedRegistryImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; +import com.dfsek.terra.registry.RegistryImpl; import com.dfsek.terra.registry.ShortcutHolder; @@ -113,10 +110,10 @@ public class ConfigPackImpl implements ConfigPack { private final BiomeProvider seededBiomeProvider; - private final Map> registryMap = new HashMap<>(); + private final Map> registryMap = new HashMap<>(); private final Map> shortcuts = new HashMap<>(); - private final OpenRegistry> configTypeRegistry; + private final Registry> configTypeRegistry; private final TreeMap>>> configTypes = new TreeMap<>(); private final RegistryKey key; @@ -202,7 +199,7 @@ public class ConfigPackImpl implements ConfigPack { }, ListMultimap::putAll); configTypeRegistry.forEach(configType -> { - CheckedRegistry registry = getCheckedRegistry(configType.getTypeKey()); + Registry registry = getRegistry(configType.getTypeKey()); abstractConfigLoader .loadConfigs(multimap.get(configType)) .stream() @@ -311,35 +308,33 @@ public class ConfigPackImpl implements ConfigPack { @SuppressWarnings("unchecked") @Override - public CheckedRegistry getOrCreateRegistry(TypeKey typeKey) { - return (CheckedRegistry) registryMap.computeIfAbsent(typeKey.getType(), c -> { - OpenRegistry registry = new OpenRegistryImpl<>(typeKey); - selfLoader.registerLoader(c, registry); - abstractConfigLoader.registerLoader(c, registry); - logger.debug("Registered loader for registry of class {}", ReflectionUtil.typeToString(c)); - - if(typeKey.getType() instanceof ParameterizedType param) { - Type base = param.getRawType(); - if(base instanceof Class // should always be true but we'll check anyways - && Supplier.class.isAssignableFrom((Class) base)) { // If it's a supplier - Type supplied = param.getActualTypeArguments()[0]; // Grab the supplied type - if(supplied instanceof ParameterizedType suppliedParam) { - Type suppliedBase = suppliedParam.getRawType(); - if(suppliedBase instanceof Class // should always be true but we'll check anyways - && ObjectTemplate.class.isAssignableFrom((Class) suppliedBase)) { - Type templateType = suppliedParam.getActualTypeArguments()[0]; - GenericTemplateSupplierLoader loader = new GenericTemplateSupplierLoader<>( - (Registry>>>>) registry); - selfLoader.registerLoader(templateType, loader); - abstractConfigLoader.registerLoader(templateType, loader); - logger.debug("Registered template loader for registry of class {}", ReflectionUtil.typeToString(templateType)); - } + public Registry createRegistry(TypeKey typeKey) { + Registry registry = RegistryImpl.empty(typeKey); + selfLoader.registerLoader(c, registry); + abstractConfigLoader.registerLoader(c, registry); + logger.debug("Registered loader for registry of class {}", ReflectionUtil.typeToString(c)); + + if(typeKey.getType() instanceof ParameterizedType param) { + Type base = param.getRawType(); + if(base instanceof Class // should always be true but we'll check anyway + && Supplier.class.isAssignableFrom((Class) base)) { // If it's a supplier + Type supplied = param.getActualTypeArguments()[0]; // Grab the supplied type + if(supplied instanceof ParameterizedType suppliedParam) { + Type suppliedBase = suppliedParam.getRawType(); + if(suppliedBase instanceof Class // should always be true but we'll check anyway + && ObjectTemplate.class.isAssignableFrom((Class) suppliedBase)) { + Type templateType = suppliedParam.getActualTypeArguments()[0]; + GenericTemplateSupplierLoader loader = new GenericTemplateSupplierLoader<>( + (Registry>>>>) registry); + selfLoader.registerLoader(templateType, loader); + abstractConfigLoader.registerLoader(templateType, loader); + logger.debug("Registered template loader for registry of class {}", ReflectionUtil.typeToString(templateType)); } } } - - return new CheckedRegistryImpl<>(registry); - }); + } + return registry; + } @Override @@ -366,7 +361,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public ConfigPack registerShortcut(TypeKey clazz, String shortcut, ShortcutLoader loader) { ShortcutHolder holder = shortcuts - .computeIfAbsent(clazz.getType(), c -> new ShortcutHolder<>(getOrCreateRegistry(clazz))) + .computeIfAbsent(clazz.getType(), c -> new ShortcutHolder<>(createRegistry(clazz))) .register(shortcut, (ShortcutLoader) loader); selfLoader.registerLoader(clazz.getType(), holder); abstractConfigLoader.registerLoader(clazz.getType(), holder); @@ -378,17 +373,17 @@ public class ConfigPackImpl implements ConfigPack { return template.getGeneratorProvider(); } - private OpenRegistry> createConfigRegistry() { - return new OpenRegistryImpl<>(new LinkedHashMap<>(), CONFIG_TYPE_TYPE_KEY) { + private Registry> createConfigRegistry() { + return new RegistryImpl<>(new LinkedHashMap<>(), CONFIG_TYPE_TYPE_KEY) { @Override public boolean register(@NotNull RegistryKey key, @NotNull ConfigType value) { if(!registryMap .containsKey(value.getTypeKey() .getType())) { - OpenRegistry openRegistry = new OpenRegistryImpl<>(value.getTypeKey()); - selfLoader.registerLoader(value.getTypeKey().getType(), openRegistry); - abstractConfigLoader.registerLoader(value.getTypeKey().getType(), openRegistry); - registryMap.put(value.getTypeKey().getType(), new CheckedRegistryImpl<>(openRegistry)); + Registry Registry = new RegistryImpl<>(value.getTypeKey()); + selfLoader.registerLoader(value.getTypeKey().getType(), Registry); + abstractConfigLoader.registerLoader(value.getTypeKey().getType(), Registry); + registryMap.put(value.getTypeKey().getType(), new RegistryImpl<>(Registry)); } return super.register(key, value); } @@ -396,9 +391,10 @@ public class ConfigPackImpl implements ConfigPack { } private void checkDeadEntries() { - registryMap.forEach((clazz, pair) -> ((OpenRegistryImpl) pair.getRegistry()) - .getDeadEntries() - .forEach((id, value) -> logger.debug("Dead entry in '{}' registry: '{}'", ReflectionUtil.typeToString(clazz), id))); + logger.warn("TODO: Dead Entries"); + //registryMap.forEach((clazz, pair) -> ((RegistryImpl) pair.getRegistry()) + // .getDeadEntries() + // .forEach((id, value) -> logger.debug("Dead entry in '{}' registry: '{}'", ReflectionUtil.typeToString(clazz), id))); } public ConfigPackTemplate getTemplate() { @@ -407,14 +403,14 @@ public class ConfigPackImpl implements ConfigPack { @Override @SuppressWarnings("unchecked") - public CheckedRegistry getRegistry(Type type) { - return (CheckedRegistry) registryMap.get(type); + public Registry getRegistry(Type type) { + return (Registry) registryMap.get(type); } @SuppressWarnings("unchecked") @Override - public CheckedRegistry getCheckedRegistry(Type type) throws IllegalStateException { - return (CheckedRegistry) registryMap.get(type); + public Registry getRegistry(Type type) throws IllegalStateException { + return (Registry) registryMap.get(type); } @Override diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java deleted file mode 100644 index 13e849675..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/CheckedRegistryImpl.java +++ /dev/null @@ -1,108 +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.registry; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import org.jetbrains.annotations.ApiStatus.Internal; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.AnnotatedType; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.OpenRegistry; -import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.util.reflection.TypeKey; - - -/** - * Wrapper for a registry that ensures checked additions. - * - * @param Type in registry - */ -public class CheckedRegistryImpl implements CheckedRegistry { - private final OpenRegistry registry; - - public CheckedRegistryImpl(OpenRegistry registry) { - this.registry = registry; - } - - @Internal - public OpenRegistry getRegistry() { - return registry; - } - - @Override - public void register(@NotNull RegistryKey identifier, @NotNull T value) throws DuplicateEntryException { - registry.registerChecked(identifier, value); - } - - @Override - public Optional get(@NotNull RegistryKey key) { - return registry.get(key); - } - - @Override - public boolean contains(@NotNull RegistryKey key) { - return registry.contains(key); - } - - @Override - public void forEach(@NotNull Consumer consumer) { - registry.forEach(consumer); - } - - @Override - public void forEach(@NotNull BiConsumer consumer) { - registry.forEach(consumer); - } - - @Override - public @NotNull Collection entries() { - return registry.entries(); - } - - @Override - public @NotNull Set keys() { - return registry.keys(); - } - - @Override - public TypeKey getType() { - return registry.getType(); - } - - @Override - public Map getMatches(String id) { - return registry.getMatches(id); - } - - @Override - public T load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - return registry.load(t, c, loader, depthTracker); - } -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java deleted file mode 100644 index 977979148..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/LockedRegistryImpl.java +++ /dev/null @@ -1,95 +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.registry; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.AnnotatedType; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import com.dfsek.terra.api.registry.Registry; -import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.util.reflection.TypeKey; - - -/** - * Wrapper for a registry that forbids all write access. - * - * @param Type in registry - */ -public class LockedRegistryImpl implements Registry { - private final Registry registry; - - public LockedRegistryImpl(Registry registry) { - this.registry = registry; - } - - @Override - public Optional get(@NotNull RegistryKey key) { - return registry.get(key); - } - - @Override - public boolean contains(@NotNull RegistryKey key) { - return registry.contains(key); - } - - @Override - public void forEach(@NotNull Consumer consumer) { - registry.forEach(consumer); - } - - @Override - public void forEach(@NotNull BiConsumer consumer) { - registry.forEach(consumer); - } - - @Override - public @NotNull Collection entries() { - return registry.entries(); - } - - @Override - public @NotNull Set keys() { - return registry.keys(); - } - - @Override - public TypeKey getType() { - return registry.getType(); - } - - @Override - public Map getMatches(String id) { - return registry.getMatches(id); - } - - @Override - public T load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) - throws LoadException { - return registry.load(t, c, loader, depthTracker); - } -} 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 deleted file mode 100644 index d02ba1172..000000000 --- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/OpenRegistryImpl.java +++ /dev/null @@ -1,185 +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.registry; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Multimaps; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.AnnotatedType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -import com.dfsek.terra.api.registry.OpenRegistry; -import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.util.generic.pair.Pair; -import com.dfsek.terra.api.util.reflection.TypeKey; - - -/** - * Registry implementation with read/write access. For internal use only. - * - * @param - */ -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 TypeKey typeKey; - - public OpenRegistryImpl(TypeKey typeKey) { - this(new HashMap<>(), typeKey); - } - - protected OpenRegistryImpl(Map> init, TypeKey typeKey) { - this.objects = init; - this.typeKey = typeKey; - } - - @Override - public T load(@NotNull AnnotatedType type, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) - throws LoadException { - return getByID((String) o).orElseThrow(() -> new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + - "\" was found in this registry. Registry contains items: " + - getItemsFormatted(), depthTracker)); - } - - private String getItemsFormatted() { - if(objects.isEmpty()) { - return "[ ]"; - } - return objects - .keySet() - .stream() - .map(RegistryKey::toString) - .sorted() - .reduce("", (a, b) -> a + "\n - " + b); - } - - @Override - public boolean register(@NotNull RegistryKey identifier, @NotNull T value) { - return register(identifier, new Entry<>(value)); - } - - @Override - public void registerChecked(@NotNull RegistryKey identifier, @NotNull T value) throws DuplicateEntryException { - if(objects.containsKey(identifier)) - throw new DuplicateEntryException("Value with identifier \"" + identifier + "\" is already defined in registry."); - register(identifier, value); - } - - @Override - public void clear() { - objects.clear(); - objectIDs.clear(); - } - - private boolean register(RegistryKey identifier, Entry value) { - boolean exists = objects.containsKey(identifier); - objects.put(identifier, value); - objectIDs.put(identifier.getID(), Pair.of(identifier, value)); - return exists; - } - - @SuppressWarnings("unchecked") - @Override - public Optional get(@NotNull RegistryKey key) { - return Optional.ofNullable(objects.getOrDefault(key, (Entry) NULL).getValue()); - } - - @Override - public boolean contains(@NotNull RegistryKey key) { - return objects.containsKey(key); - } - - @Override - public void forEach(@NotNull Consumer consumer) { - objects.forEach((id, obj) -> consumer.accept(obj.getRaw())); - } - - @Override - public void forEach(@NotNull BiConsumer consumer) { - objects.forEach((id, entry) -> consumer.accept(id, entry.getRaw())); - } - - @Override - public @NotNull Collection entries() { - return objects.values().stream().map(Entry::getRaw).collect(Collectors.toList()); - } - - @Override - public @NotNull Set keys() { - return objects.keySet(); - } - - @Override - public TypeKey getType() { - return typeKey; - } - - @Override - public Map getMatches(String id) { - return objectIDs - .get(id) - .stream() - .collect(HashMap::new, (map, pair) -> map.put(pair.getLeft(), pair.getRight().getValue()), Map::putAll); - } - - public Map getDeadEntries() { - Map dead = new HashMap<>(); - objects.forEach((id, entry) -> { - if(entry.dead()) dead.put(id, entry.value); // dont increment value here. - }); - return dead; - } - - - private static final class Entry { - private final T value; - private final AtomicInteger access = new AtomicInteger(0); - - public Entry(T value) { - this.value = value; - } - - public boolean dead() { - return access.get() == 0; - } - - public T getValue() { - access.incrementAndGet(); - return value; - } - - private T getRaw() { - return value; - } - } -} diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/RegistryImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/RegistryImpl.java new file mode 100644 index 000000000..842ca891d --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/RegistryImpl.java @@ -0,0 +1,103 @@ +package com.dfsek.terra.registry; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import com.dfsek.terra.api.registry.Registry; +import com.dfsek.terra.api.registry.key.RegistryKey; +import com.dfsek.terra.api.util.reflection.TypeKey; + + +public class RegistryImpl implements Registry { + private final io.vavr.collection.Map contents; + private final TypeKey type; + + private RegistryImpl(io.vavr.collection.Map contents, TypeKey type) { + this.contents = contents; + this.type = type; + } + + public static RegistryImpl empty(TypeKey key) { + return new RegistryImpl<>(io.vavr.collection.HashMap.empty(), key); + } + + @Override + public Optional get(@NotNull RegistryKey key) { + return contents.get(key).toJavaOptional(); + } + + @Override + public boolean contains(@NotNull RegistryKey key) { + return contents.containsKey(key); + } + + @Override + public void forEach(@NotNull Consumer consumer) { + contents.values().forEach(consumer); + } + + @Override + public void forEach(@NotNull BiConsumer consumer) { + contents.forEach(consumer); + } + + @Override + public @NotNull Set entries() { + return contents.values().toJavaSet(); + } + + @Override + public Registry register(@NotNull RegistryKey identifier, @NotNull T value) { + return new RegistryImpl<>(contents.put(identifier, value), type); + } + + @Override + public @NotNull Set keys() { + return contents.keySet().toJavaSet(); + } + + @Override + public TypeKey getType() { + return type; + } + + @Override + public Map getID(String id) { + return contents.filterKeys(key -> key.getID().equals(id)).toJavaMap(); + } + + @Override + public Map getNamespace(String namespace) { + return contents.filterKeys(key -> key.getNamespace().equals(namespace)).toJavaMap(); + } + + + @Override + public T load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, DepthTracker depthTracker) + throws LoadException { + return get(RegistryKey.parse((String) o)).orElseThrow(() -> new LoadException("No such " + type.getType().getTypeName() + " matching \"" + o + + "\" was found in this registry. Registry contains items: " + + getItemsFormatted(), depthTracker)); + + } + + private String getItemsFormatted() { + if(contents.isEmpty()) { + return "[ ]"; + } + return contents + .keySet() + .map(RegistryKey::toString) + .toSortedSet() + .reduce((a, b) -> a + "\n - " + b); + } +} 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 b4ba6dc40..b7acaae58 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 @@ -18,6 +18,9 @@ package com.dfsek.terra.registry.master; import com.dfsek.tectonic.api.exception.ConfigException; + +import com.dfsek.terra.registry.RegistryImpl; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,13 +33,12 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.util.reflection.TypeKey; import com.dfsek.terra.config.pack.ConfigPackImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; /** * Class to hold config packs */ -public class ConfigRegistry extends OpenRegistryImpl { +public class ConfigRegistry extends RegistryImpl { private static final Logger logger = LoggerFactory.getLogger(ConfigRegistry.class); public ConfigRegistry() { diff --git a/common/implementation/base/src/test/java/registry/RegistryTest.java b/common/implementation/base/src/test/java/registry/RegistryTest.java deleted file mode 100644 index 3f17a1776..000000000 --- a/common/implementation/base/src/test/java/registry/RegistryTest.java +++ /dev/null @@ -1,96 +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 registry; - -import org.junit.jupiter.api.Test; - -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.registry.OpenRegistry; -import com.dfsek.terra.api.registry.exception.DuplicateEntryException; -import com.dfsek.terra.api.registry.key.RegistryKey; -import com.dfsek.terra.api.util.reflection.TypeKey; -import com.dfsek.terra.registry.CheckedRegistryImpl; -import com.dfsek.terra.registry.OpenRegistryImpl; - -import static org.junit.jupiter.api.Assertions.*; - - -public class RegistryTest { - @Test - public void openRegistry() { - OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - - test.register(RegistryKey.parse("test:test"), "bazinga"); - - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); - } - - @Test - public void openRegistryChecked() { - OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - - test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); - - try { - test.registerChecked(RegistryKey.parse("test:test"), "bazinga2"); - fail("Shouldn't be able to re-register with #registerChecked!"); - } catch(DuplicateEntryException ignore) { - - } - } - - @Test - public void checkedRegistry() { - CheckedRegistry test = new CheckedRegistryImpl<>(new OpenRegistryImpl<>(TypeKey.of(String.class))); - - test.register(RegistryKey.parse("test:test"), "bazinga"); - - assertEquals(test.get(RegistryKey.parse("test:test")).orElseThrow(), "bazinga"); - - try { - test.register(RegistryKey.parse("test:test"), "bazinga2"); - fail("Shouldn't be able to re-register in CheckedRegistry!"); - } catch(DuplicateEntryException ignore) { - - } - } - - @Test - public void getID() { - OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - - test.register(RegistryKey.parse("test:test"), "bazinga"); - - assertEquals(test.getByID("test").orElseThrow(), "bazinga"); - } - - @Test - public void getIDAmbiguous() { - OpenRegistry test = new OpenRegistryImpl<>(TypeKey.of(String.class)); - - test.registerChecked(RegistryKey.parse("test:test"), "bazinga"); - test.registerChecked(RegistryKey.parse("test2:test"), "bazinga"); - - try { - test.getByID("test"); - fail("Shouldn't be able to get with ambiguous ID!"); - } catch(IllegalArgumentException ignore) { - - } - } -}