package openmods.config.properties; import com.google.common.base.Preconditions; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Maps; import com.google.common.collect.Table; import java.io.File; import java.lang.reflect.Field; import java.util.Collection; import java.util.Collections; import java.util.Locale; import java.util.Map; import net.minecraftforge.common.config.Configuration; public class ConfigProcessing { public static class ModConfig { private final Configuration config; public final Class<?> configClass; public final String modId; private Table<String, String, ConfigPropertyMeta> properties = HashBasedTable.create(); private ModConfig(String modId, Configuration config, Class<?> configClass) { this.modId = modId; this.config = config; this.configClass = configClass; } void tryProcessConfig(Field field) { ConfigPropertyMeta meta = ConfigPropertyMeta.createMetaForField(config, field); if (meta != null) { meta.updateValueFromConfig(false); properties.put(meta.category.toLowerCase(Locale.ENGLISH), meta.name.toLowerCase(Locale.ENGLISH), meta); } } public File getConfigFile() { return config.getConfigFile(); } public void save() { if (config.hasChanged()) config.save(); } public Collection<String> getCategories() { return Collections.unmodifiableCollection(properties.rowKeySet()); } public Collection<String> getValues(String category) { return Collections.unmodifiableCollection(properties.row(category.toLowerCase(Locale.ENGLISH)).keySet()); } public ConfigPropertyMeta getValue(String category, String name) { return properties.get(category.toLowerCase(Locale.ENGLISH), name.toLowerCase(Locale.ENGLISH)); } } private static final Map<String, ModConfig> configs = Maps.newHashMap(); public static Collection<String> getConfigsIds() { return Collections.unmodifiableCollection(configs.keySet()); } public static ModConfig getConfig(String modId) { return configs.get(modId.toLowerCase(Locale.ENGLISH)); } public static void processAnnotations(String modId, Configuration config, Class<?> klazz) { Preconditions.checkState(!configs.containsKey(modId), "Trying to configure mod '%s' twice", modId); ModConfig configMeta = new ModConfig(modId, config, klazz); configs.put(modId.toLowerCase(Locale.ENGLISH), configMeta); for (Field f : klazz.getFields()) configMeta.tryProcessConfig(f); } }