package krasa.formatter.settings.provider;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import krasa.formatter.common.ModifiableFile;
import krasa.formatter.plugin.InvalidPropertyFile;
import krasa.formatter.utils.FileUtils;
/**
* @author Vojtech Krasa
*/
public class CachedPropertiesProvider extends CachedProvider<Properties> {
protected CachedPropertiesProvider(ModifiableFile modifiableFile) {
super(modifiableFile);
}
/**
* Return a Java Properties object representing the options that are in the specified configuration file.
*/
@Override
protected Properties readFile(File file) throws InvalidPropertyFile {
final Properties formatterOptions = FileUtils.readPropertiesFile(file, createDefaultConfig());
// Properties.load() does not trim trailing whitespace from prop values, so trim it ourselves, since it would
// cause the Eclipse formatter to fail to parse the values.
trimTrailingWhitespaceFromConfigValues(formatterOptions);
validateConfig(formatterOptions, file);
return formatterOptions;
}
protected Properties readXmlFile(File file, String profile) {
final Properties formatterOptions = FileUtils.readXmlJavaSettingsFile(file, createDefaultConfig(), profile);
trimTrailingWhitespaceFromConfigValues(formatterOptions);
validateConfig(formatterOptions, file);
return formatterOptions;
}
protected void trimTrailingWhitespaceFromConfigValues(Properties config) {
// First trim the values and store the trimmed values in a temporary map.
Map<String, String> map = new HashMap<String, String>(config.size());
for (Object key : config.keySet()) {
String optionName = (String) key;
String optionValue = config.getProperty(optionName);
map.put(optionName, (optionValue != null) ? optionValue.trim() : null);
}
// Then copy the values back to the original Properties object.
for (String key : map.keySet()) {
config.setProperty(key, map.get(key));
}
}
protected void validateConfig(Properties config, File file) {
if (config.isEmpty()) {
throw new InvalidPropertyFile(file);
}
}
protected Properties createDefaultConfig() {
return new Properties();
}
}