package com.constellio.app.services.recovery;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.PropertiesAlteration;
//Not a StatefulService since statefulServices are stopped during recovery mode
public class UpgradeAppRecoveryConfigManager {
public static final String UPDATE_RECOVERY_CONFIG_PATH = "/updateRecovery.properties";
private final ConfigManager configManager;
public static final String LAST_VALID_VERSION_PROPERTY = "lastValidVersion";
public static final String LAST_VALID_VERSION_DIRECTORY_PATH_PROPERTY = "lastValidVersionDirectoryPath";
public static final String LAST_VERSION_CAUSING_EXCEPTION_DIRECTORY_PATH_PROPERTY = "previousVersionCausingExceptionDirectoryPath";
public static final String UPGRADE_EXCEPTION_PROPERTY = "upgradeException";
public static final String LAST_UPLOADED_VERSION = "lastUploadedVersion";
public static final String LAST_UPLOADED_VERSION_DIRECTORY_PATH = "lastUploadedVersionDirectoryPath";
public UpgradeAppRecoveryConfigManager(ConfigManager configManager) {
this.configManager = configManager;
configManager.createPropertiesDocumentIfInexistent(UPDATE_RECOVERY_CONFIG_PATH, new PropertiesAlteration() {
@Override
public void alter(Map<String, String> properties) {
//Default values
}
});
}
public void onVersionUploadedCorrectly(final ConstellioVersionInfo currentInstalledVersion, final ConstellioVersionInfo uploadedVersion) {
configManager.updateProperties(UPDATE_RECOVERY_CONFIG_PATH, new PropertiesAlteration() {
@Override
public void alter(Map<String, String> properties) {
properties.put(LAST_VALID_VERSION_PROPERTY, currentInstalledVersion.getVersion());
properties.put(LAST_VALID_VERSION_DIRECTORY_PATH_PROPERTY, currentInstalledVersion.getVersionDirectoryPath());
properties.put(LAST_UPLOADED_VERSION, uploadedVersion.getVersion());
properties.put(LAST_UPLOADED_VERSION_DIRECTORY_PATH, uploadedVersion.getVersionDirectoryPath());
properties.put(LAST_VERSION_CAUSING_EXCEPTION_DIRECTORY_PATH_PROPERTY, "");
properties.put(UPGRADE_EXCEPTION_PROPERTY, "");
}
});
}
public void onVersionMigratedCorrectly() {
configManager.updateProperties(UPDATE_RECOVERY_CONFIG_PATH, new PropertiesAlteration() {
@Override
public void alter(Map<String, String> properties) {
properties.put(LAST_VALID_VERSION_PROPERTY, notNull(properties.get(LAST_UPLOADED_VERSION)));
properties.put(LAST_VALID_VERSION_DIRECTORY_PATH_PROPERTY, notNull(properties.get(LAST_UPLOADED_VERSION_DIRECTORY_PATH)));
properties.put(LAST_VERSION_CAUSING_EXCEPTION_DIRECTORY_PATH_PROPERTY, "");
properties.put(UPGRADE_EXCEPTION_PROPERTY, "");
}
});
}
public void onVersionMigratedWithException(final Throwable t) {
configManager.updateProperties(UPDATE_RECOVERY_CONFIG_PATH, new PropertiesAlteration() {
@Override
public void alter(Map<String, String> properties) {
properties.put(LAST_VERSION_CAUSING_EXCEPTION_DIRECTORY_PATH_PROPERTY, notNull(properties.get(LAST_UPLOADED_VERSION_DIRECTORY_PATH)));
if(t == null){
properties.put(UPGRADE_EXCEPTION_PROPERTY, "");
}else{
properties.put(UPGRADE_EXCEPTION_PROPERTY, ExceptionUtils.getStackTrace(t));
}
}
});
}
public String getLastValidVersion() {
Map<String, String> configs = configManager.getProperties(UPDATE_RECOVERY_CONFIG_PATH).getProperties();
return notNull(configs.get(LAST_VALID_VERSION_PROPERTY));
}
private String notNull(String s) {
return (StringUtils.isBlank(s)) ? "" : s;
}
public String getLastValidVersionDirectoryPath() {
Map<String, String> configs = configManager.getProperties(UPDATE_RECOVERY_CONFIG_PATH).getProperties();
return notNull(configs.get(LAST_VALID_VERSION_DIRECTORY_PATH_PROPERTY));
}
public String getLastVersionCausingExceptionDirectoryPath() {
Map<String, String> configs = configManager.getProperties(UPDATE_RECOVERY_CONFIG_PATH).getProperties();
return notNull(configs.get(LAST_VERSION_CAUSING_EXCEPTION_DIRECTORY_PATH_PROPERTY));
}
public String getUpgradeException() {
Map<String, String> configs = configManager.getProperties(UPDATE_RECOVERY_CONFIG_PATH).getProperties();
return notNull(configs.get(UPGRADE_EXCEPTION_PROPERTY));
}
Map<String, String> getAllProperties() {
return configManager.getProperties(UPDATE_RECOVERY_CONFIG_PATH).getProperties();
}
void replaceAllProperties(final Map<String, String> currentRecoveryProperties) {
configManager.updateProperties(UPDATE_RECOVERY_CONFIG_PATH, new PropertiesAlteration() {
@Override
public void alter(Map<String, String> properties) {
properties.clear();
properties.putAll(currentRecoveryProperties);
}
});
}
}