mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-08-29 21:30:43 +00:00
parallel config loading
This commit is contained in:
+36
-25
@@ -62,6 +62,9 @@ import com.dfsek.terra.registry.CheckedRegistryImpl;
|
|||||||
import com.dfsek.terra.registry.OpenRegistryImpl;
|
import com.dfsek.terra.registry.OpenRegistryImpl;
|
||||||
import com.dfsek.terra.registry.ShortcutHolder;
|
import com.dfsek.terra.registry.ShortcutHolder;
|
||||||
|
|
||||||
|
import com.google.common.collect.ListMultimap;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import com.google.common.collect.Multimaps;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -74,7 +77,11 @@ import java.io.IOException;
|
|||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
@@ -83,7 +90,8 @@ import java.util.zip.ZipFile;
|
|||||||
* Represents a Terra configuration pack.
|
* Represents a Terra configuration pack.
|
||||||
*/
|
*/
|
||||||
public class ConfigPackImpl implements ConfigPack {
|
public class ConfigPackImpl implements ConfigPack {
|
||||||
public static final TypeKey<ConfigType<?, ?>> CONFIG_TYPE_TYPE_KEY = new TypeKey<>() {};
|
public static final TypeKey<ConfigType<?, ?>> CONFIG_TYPE_TYPE_KEY = new TypeKey<>() {
|
||||||
|
};
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ConfigPackImpl.class);
|
private static final Logger logger = LoggerFactory.getLogger(ConfigPackImpl.class);
|
||||||
|
|
||||||
private final ConfigPackTemplate template = new ConfigPackTemplate();
|
private final ConfigPackTemplate template = new ConfigPackTemplate();
|
||||||
@@ -162,33 +170,36 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
|
|
||||||
configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight())));
|
configTypes.values().forEach(list -> list.forEach(pair -> configTypeRegistry.register(pair.getLeft(), pair.getRight())));
|
||||||
|
|
||||||
Map<ConfigType<? extends ConfigTemplate, ?>, List<Configuration>> configs = new HashMap<>();
|
ListMultimap<ConfigType<?, ?>, Configuration> multimap = configurations.values().parallelStream().collect(
|
||||||
|
() -> Multimaps.newListMultimap(new ConcurrentHashMap<>(), ArrayList::new), (configs, configuration) -> {
|
||||||
|
if(configuration.contains("type")) { // Only sort configs with type key
|
||||||
|
ProtoConfig config = new ProtoConfig();
|
||||||
|
selfLoader.load(config, configuration);
|
||||||
|
configs.put(config.getType(), configuration);
|
||||||
|
}
|
||||||
|
}, ListMultimap::putAll);
|
||||||
|
|
||||||
for(Configuration configuration : configurations.values()) { // Sort the configs
|
configTypeRegistry.forEach(configType -> {
|
||||||
if(configuration.contains("type")) { // Only sort configs with type key
|
|
||||||
ProtoConfig config = new ProtoConfig();
|
|
||||||
selfLoader.load(config, configuration);
|
|
||||||
configs.computeIfAbsent(config.getType(), configType -> new ArrayList<>()).add(configuration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(ConfigType<?, ?> configType : configTypeRegistry.entries()) { // Load the configs
|
|
||||||
CheckedRegistry registry = getCheckedRegistry(configType.getTypeKey());
|
CheckedRegistry registry = getCheckedRegistry(configType.getTypeKey());
|
||||||
platform.getEventManager().callEvent(new ConfigTypePreLoadEvent(configType, registry, this));
|
abstractConfigLoader
|
||||||
for(AbstractConfiguration config : abstractConfigLoader.loadConfigs(
|
.loadConfigs(multimap.get(configType))
|
||||||
configs.getOrDefault(configType, Collections.emptyList()))) {
|
.stream()
|
||||||
try {
|
.parallel()
|
||||||
Object loaded = ((ConfigFactory) configType.getFactory()).build(
|
.map(configuration -> {
|
||||||
selfLoader.load(configType.getTemplate(this, platform), config), platform);
|
logger.debug("Loading abstract config {}", configuration.getID());
|
||||||
registry.register(config.getID(), loaded);
|
Object loaded = ((ConfigFactory) configType.getFactory()).build(
|
||||||
platform.getEventManager().callEvent(
|
selfLoader.load(configType.getTemplate(this, platform), configuration), platform);
|
||||||
new ConfigurationLoadEvent(this, config, template -> selfLoader.load(template, config), configType, loaded));
|
platform.getEventManager().callEvent(new ConfigurationLoadEvent(this,
|
||||||
} catch(DuplicateEntryException e) {
|
configuration,
|
||||||
throw new LoadException("Duplicate registry entry: ", e);
|
template -> selfLoader.load(template, configuration),
|
||||||
}
|
configType,
|
||||||
}
|
loaded));
|
||||||
|
return Pair.of(configuration.getID(), loaded);
|
||||||
|
})
|
||||||
|
.toList()
|
||||||
|
.forEach(pair -> registry.register(pair.getLeft(), pair.getRight()));
|
||||||
platform.getEventManager().callEvent(new ConfigTypePostLoadEvent(configType, registry, this));
|
platform.getEventManager().callEvent(new ConfigTypePostLoadEvent(configType, registry, this));
|
||||||
}
|
});
|
||||||
|
|
||||||
platform.getEventManager().callEvent(new ConfigPackPostLoadEvent(this, template -> selfLoader.load(template, packManifest)));
|
platform.getEventManager().callEvent(new ConfigPackPostLoadEvent(this, template -> selfLoader.load(template, packManifest)));
|
||||||
logger.info("Loaded config pack \"{}\" v{} by {} in {}ms.",
|
logger.info("Loaded config pack \"{}\" v{} by {} in {}ms.",
|
||||||
|
|||||||
Reference in New Issue
Block a user