Add support for caching of configuration values. (#7608)

This commit is contained in:
Marc Hermans authored and GitHub committed 2021-02-24 18:36:51 -08:00
1 parent ba15737fe3
commit 65bc41281f
3 files changed
+176 -1

No files matched your search

@@ -42,6 +42,7 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
@@ -90,6 +91,7 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
((FileConfig) config).save();
}
}
this.afterReload();
}
public boolean isCorrecting() {
@@ -108,6 +110,22 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
return this.values;
}
public void afterReload() {
this.resetCaches(getValues().valueMap().values());
}
private void resetCaches(final Iterable<Object> configValues) {
configValues.forEach(value -> {
if (value instanceof ConfigValue) {
final ConfigValue<?> configValue = (ConfigValue<?>) value;
configValue.clearCache();
} else if (value instanceof Config) {
final Config innerConfig = (Config) value;
this.resetCaches(innerConfig.valueMap().values());
}
});
}
public void save()
{
Preconditions.checkNotNull(childConfig, "Cannot save config value without assigned Config object present");
@@ -690,10 +708,15 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
public static class ConfigValue<T>
{
@VisibleForTesting
static boolean USE_CACHES = true;
private final Builder parent;
private final List<String> path;
private final Supplier<T> defaultSupplier;
private T cachedValue = null;
private ForgeConfigSpec spec;
ConfigValue(Builder parent, List<String> path, Supplier<T> defaultSupplier)
@@ -714,7 +737,13 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
Preconditions.checkNotNull(spec, "Cannot get config value before spec is built");
if (spec.childConfig == null)
return defaultSupplier.get();
return getRaw(spec.childConfig, path, defaultSupplier);
if (USE_CACHES && cachedValue == null)
cachedValue = getRaw(spec.childConfig, path, defaultSupplier);
else if (!USE_CACHES)
return getRaw(spec.childConfig, path, defaultSupplier);
return cachedValue;
}
protected T getRaw(Config config, List<String> path, Supplier<T> defaultSupplier)
@@ -739,6 +768,11 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
Preconditions.checkNotNull(spec, "Cannot set config value before spec is built");
Preconditions.checkNotNull(spec.childConfig, "Cannot set config value without assigned Config object present");
spec.childConfig.set(path, value);
this.cachedValue = value;
}
public void clearCache() {
this.cachedValue = null;
}
}
@@ -156,6 +156,7 @@ public class ConfigFileTypeHandler {
throw new ConfigLoadingException(modConfig, ex);
}
LOGGER.debug(CONFIG, "Config file {} changed, sending notifies", this.modConfig.getFileName());
this.modConfig.getSpec().afterReload();
this.modConfig.fireEvent(new ModConfig.Reloading(this.modConfig));
}
}