mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-12 10:46:25 +00:00
automatically register loader for Supplier<ObjectTemplate<T>>
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
package com.dfsek.terra.config.loaders;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.config.MapConfiguration;
|
||||||
|
import com.dfsek.tectonic.exception.ConfigException;
|
||||||
|
import com.dfsek.tectonic.exception.LoadException;
|
||||||
|
import com.dfsek.tectonic.loading.ConfigLoader;
|
||||||
|
import com.dfsek.tectonic.loading.TypeLoader;
|
||||||
|
import com.dfsek.tectonic.loading.object.ObjectTemplate;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
|
|
||||||
|
import java.lang.reflect.AnnotatedType;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class GenericTemplateSupplierLoader<T> implements TypeLoader<T> {
|
||||||
|
private final Registry<Supplier<ObjectTemplate<T>>> registry;
|
||||||
|
|
||||||
|
public GenericTemplateSupplierLoader(Registry<Supplier<ObjectTemplate<T>>> registry) {
|
||||||
|
this.registry = registry;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public T load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException {
|
||||||
|
Map<String, Object> map = (Map<String, Object>) c;
|
||||||
|
try {
|
||||||
|
if(!registry.contains((String) map.get("type"))) {
|
||||||
|
throw new LoadException("No such entry: " + map.get("type"));
|
||||||
|
}
|
||||||
|
ObjectTemplate<T> template = registry.get(((String) map.get("type"))).get();
|
||||||
|
loader.load(template, new MapConfiguration(map));
|
||||||
|
return template.get();
|
||||||
|
} catch(ConfigException e) {
|
||||||
|
throw new LoadException("Unable to load object: ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,18 +18,19 @@ import com.dfsek.terra.api.config.ConfigFactory;
|
|||||||
import com.dfsek.terra.api.config.ConfigPack;
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.config.ConfigType;
|
import com.dfsek.terra.api.config.ConfigType;
|
||||||
import com.dfsek.terra.api.config.Loader;
|
import com.dfsek.terra.api.config.Loader;
|
||||||
|
import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
|
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.pack.ConfigPackPreLoadEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent;
|
|
||||||
import com.dfsek.terra.api.event.events.config.type.ConfigTypePostLoadEvent;
|
import com.dfsek.terra.api.event.events.config.type.ConfigTypePostLoadEvent;
|
||||||
import com.dfsek.terra.api.event.events.config.type.ConfigTypePreLoadEvent;
|
import com.dfsek.terra.api.event.events.config.type.ConfigTypePreLoadEvent;
|
||||||
import com.dfsek.terra.api.registry.CheckedRegistry;
|
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||||
import com.dfsek.terra.api.registry.OpenRegistry;
|
import com.dfsek.terra.api.registry.OpenRegistry;
|
||||||
|
import com.dfsek.terra.api.registry.Registry;
|
||||||
import com.dfsek.terra.api.registry.exception.DuplicateEntryException;
|
import com.dfsek.terra.api.registry.exception.DuplicateEntryException;
|
||||||
import com.dfsek.terra.api.registry.meta.RegistryFactory;
|
import com.dfsek.terra.api.registry.meta.RegistryFactory;
|
||||||
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
|
|
||||||
import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
|
import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
|
||||||
|
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
|
||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
||||||
@@ -37,6 +38,7 @@ import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
|||||||
import com.dfsek.terra.config.dummy.DummyWorld;
|
import com.dfsek.terra.config.dummy.DummyWorld;
|
||||||
import com.dfsek.terra.config.fileloaders.FolderLoader;
|
import com.dfsek.terra.config.fileloaders.FolderLoader;
|
||||||
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
||||||
|
import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader;
|
||||||
import com.dfsek.terra.config.loaders.config.BufferedImageLoader;
|
import com.dfsek.terra.config.loaders.config.BufferedImageLoader;
|
||||||
import com.dfsek.terra.config.prototype.ProtoConfig;
|
import com.dfsek.terra.config.prototype.ProtoConfig;
|
||||||
import com.dfsek.terra.registry.CheckedRegistryImpl;
|
import com.dfsek.terra.registry.CheckedRegistryImpl;
|
||||||
@@ -50,6 +52,7 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -304,6 +307,28 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
selfLoader.registerLoader(c, registry);
|
selfLoader.registerLoader(c, registry);
|
||||||
abstractConfigLoader.registerLoader(c, registry);
|
abstractConfigLoader.registerLoader(c, registry);
|
||||||
main.getDebugLogger().info("Registered loader for registry of class " + ReflectionUtil.typeToString(c));
|
main.getDebugLogger().info("Registered loader for registry of class " + ReflectionUtil.typeToString(c));
|
||||||
|
|
||||||
|
if(type instanceof ParameterizedType) {
|
||||||
|
ParameterizedType param = (ParameterizedType) type;
|
||||||
|
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) {
|
||||||
|
ParameterizedType suppliedParam = (ParameterizedType) supplied;
|
||||||
|
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<Supplier<ObjectTemplate<Supplier<ObjectTemplate<?>>>>>) registry);
|
||||||
|
selfLoader.registerLoader(templateType, loader);
|
||||||
|
abstractConfigLoader.registerLoader(templateType, loader);
|
||||||
|
main.getDebugLogger().info("Registered template loader for registry of class " + ReflectionUtil.typeToString(templateType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ImmutablePair.of(registry, new CheckedRegistryImpl<>(registry));
|
return ImmutablePair.of(registry, new CheckedRegistryImpl<>(registry));
|
||||||
}).getRight();
|
}).getRight();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user