package com.constellio.data.conf; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.joda.time.Days; import org.joda.time.Duration; import com.constellio.data.conf.PropertiesConfigurationRuntimeException.PropertiesConfigurationRuntimeException_ConfigNotDefined; import com.constellio.data.conf.PropertiesConfigurationRuntimeException.PropertiesConfigurationRuntimeException_InvalidConfigValue; public abstract class PropertiesConfiguration { protected File propertyFile; protected Map<String, String> configs; protected PropertiesConfiguration(Map<String, String> configs, File propertyFile) { this.configs = configs; this.propertyFile = propertyFile; } protected Object getEnum(String key, Enum<?> defaultValue) { String value = getString(key, null); if (value == null) { return defaultValue; } else { Object enumValue = EnumUtils.getEnum(defaultValue.getDeclaringClass(), value.toUpperCase()); if (enumValue == null) { List supportedValues = EnumUtils.getEnumList(defaultValue.getDeclaringClass()); String supportedValuesString = supportedValues.toString().toLowerCase(); throw new PropertiesConfigurationRuntimeException_InvalidConfigValue(key, value, supportedValuesString); } return enumValue; } } protected String getString(String key, String defaultValue) { String value = configs.get(key); return value == null ? defaultValue : value; } protected void setBoolean(String key, boolean value) { setString(key, value ? "true" : "false"); } protected void setString(String key, String value) { writeProperty(key, value); } protected void setInt(String key, int value) { writeProperty(key, "" + value); } protected void setFile(String key, File value) { writeProperty(key, value == null ? "" : value.getAbsolutePath()); } public void writeProperty(String key, String value) { try { List<String> properties = FileUtils.readLines(propertyFile); String languageProperty = null; for (String property : properties) { if (property.startsWith(key)) { languageProperty = property; break; } } if (languageProperty != null) { properties.remove(languageProperty); } if (value != null) { properties.add(key + "=" + value); } propertyFile.delete(); FileUtils.writeLines(propertyFile, properties); } catch (IOException e) { throw new RuntimeException(e); } configs.put(key, value); } protected Boolean getBoolean(String key, boolean defaultValue) { String stringValue = getString(key, defaultValue ? "true" : "false"); return Boolean.valueOf(stringValue); } protected File getFile(String key, File defaultValue) { String value = configs.get(key); if (value == null) { return defaultValue; } else { return new File(value); } } protected Object getRequiredEnum(String key, Class enumClass) { String value = getRequiredString(key); Object enumValue = EnumUtils.getEnum(enumClass, value.toUpperCase()); if (enumValue == null) { List supportedValues = EnumUtils.getEnumList(enumClass); String supportedValuesString = supportedValues.toString().toLowerCase(); throw new PropertiesConfigurationRuntimeException_InvalidConfigValue(key, value, supportedValuesString); } return enumValue; } protected String getRequiredString(String key) { String value = configs.get(key); if (value == null) { throw new PropertiesConfigurationRuntimeException_ConfigNotDefined(key); } return value; } protected Boolean getRequiredBoolean(String key) { return Boolean.valueOf(getRequiredString(key)); } protected File getRequiredFile(String key) { return new File(getRequiredString(key)); } protected int getRequiredInt(String key) { return Integer.parseInt(getRequiredString(key)); } protected int getInt(String key, int defaultValue) { try { return Integer.parseInt(getRequiredString(key)); } catch (Exception e) { return defaultValue; } } protected Duration getDuration(String key, Duration defaultDuration) { String durationString = getString(key, null); if (durationString == null) { return defaultDuration; } else { if (durationString.toUpperCase().endsWith("S")) { return Duration.standardSeconds(Long.valueOf(StringUtils.substringBefore(durationString.toUpperCase(), "S"))); } else if (durationString.toUpperCase().endsWith("M")) { return Duration.standardMinutes(Long.valueOf(StringUtils.substringBefore(durationString.toUpperCase(), "M"))); } else if (durationString.toUpperCase().endsWith("H")) { return Duration.standardHours(Long.valueOf(StringUtils.substringBefore(durationString.toUpperCase(), "H"))); } else if (durationString.toUpperCase().endsWith("D")) { return Duration.standardDays(Long.valueOf(StringUtils.substringBefore(durationString.toUpperCase(), "D"))); } } return null; } protected void setDuration(String key, Duration value) { String stringValue; if (value == null) { stringValue = null; } else { stringValue = value.getStandardSeconds() + "s"; } setString(key, stringValue); } }