package com.constellio.model.conf.email;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.jdom2.Document;
import com.constellio.data.dao.managers.StatefulService;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.DocumentAlteration;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.security.roles.RolesManagerRuntimeException;
import com.constellio.model.utils.OneXMLConfigPerCollectionManager;
import com.constellio.model.utils.OneXMLConfigPerCollectionManagerListener;
import com.constellio.model.utils.XMLConfigReader;
public class EmailConfigurationsManager
implements StatefulService, OneXMLConfigPerCollectionManagerListener<EmailServerConfiguration> {
private static final String EMAIL_CONFIGS = "/emailConfigs.xml";
public static final String USERNAME = "username";
public static final String DEFAULT_SENDER_EMAIL = "defaultSenderEmail";
public static final String PASSWORD = "password";
public static final String ENABLED = "enabled";
public static final java.lang.String PROPERTIES = "properties";
public static final java.lang.String PROPERTY = "property";
public static final String KEY = "key";
public static final String VALUE = "value";
private OneXMLConfigPerCollectionManager<EmailServerConfiguration> oneXMLConfigPerCollectionManager;
private ConfigManager configManager;
private CollectionsListManager collectionsListManager;
private ModelLayerFactory modelLayerFactory;
public EmailConfigurationsManager(ConfigManager configManager, CollectionsListManager collectionsListManager,
ModelLayerFactory modelLayerFactory) {
this.configManager = configManager;
this.collectionsListManager = collectionsListManager;
this.modelLayerFactory = modelLayerFactory;
}
public EmailServerConfiguration addEmailServerConfiguration(EmailServerConfiguration emailServerConfiguration,
final String collection) {
validateEmailConfiguration(emailServerConfiguration);
String encryptedPassword = modelLayerFactory.newEncryptionServices().encrypt(emailServerConfiguration.getPassword());
final EmailServerConfiguration emailServerConfigurationToBeSaved = new BaseEmailServerConfiguration(
emailServerConfiguration.getUsername(),
encryptedPassword, emailServerConfiguration.getDefaultSenderEmail(),
emailServerConfiguration.getProperties(), emailServerConfiguration.isEnabled());
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
EmailConfigurationsManagerWriter writer = newEmailConfigurationsManagerWriter(document);
writer.addEmailServerConfiguration(emailServerConfigurationToBeSaved, collection);
}
};
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
return emailServerConfiguration;
}
public void deleteEmailServerConfiguration(final String collection)
throws RolesManagerRuntimeException {
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
EmailConfigurationsManagerWriter writer = newEmailConfigurationsManagerWriter(document);
writer.deleteEmailServerConfiguration(collection);
}
};
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
}
public void updateEmailServerConfiguration(EmailServerConfiguration emailServerConfiguration, final String collection,
boolean encryptPassword)
throws RolesManagerRuntimeException {
validateEmailConfiguration(emailServerConfiguration);
final EmailServerConfiguration emailServerConfigurationToBeSaved;
if (encryptPassword) {
String encryptedPassword = modelLayerFactory.newEncryptionServices().encrypt(emailServerConfiguration.getPassword());
emailServerConfigurationToBeSaved = new BaseEmailServerConfiguration(emailServerConfiguration.getUsername(),
encryptedPassword, emailServerConfiguration.getDefaultSenderEmail(),
emailServerConfiguration.getProperties(), emailServerConfiguration.isEnabled());
} else {
emailServerConfigurationToBeSaved = emailServerConfiguration;
}
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
EmailConfigurationsManagerWriter writer = newEmailConfigurationsManagerWriter(document);
writer.updateEmailServerConfiguration(emailServerConfigurationToBeSaved, collection);
}
};
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
}
public static void validateEmailConfiguration(EmailServerConfiguration emailServerConfig) {
String username = emailServerConfig.getUsername();
if (StringUtils.isBlank(username)) {
throw new EmailServerConfigurationRuntimeException.InvalidBlankUsernameRuntimeException();
}
Map<String, String> serverProperties = emailServerConfig.getProperties();
if (serverProperties.isEmpty()) {
throw new EmailServerConfigurationRuntimeException.InvalidPropertiesRuntimeException();
}
}
@Override
public void onValueModified(String collection, EmailServerConfiguration newValue) {
}
@Override
public void initialize() {
this.oneXMLConfigPerCollectionManager = new OneXMLConfigPerCollectionManager<>(configManager, collectionsListManager,
EMAIL_CONFIGS, xmlConfigReader(), this, new DocumentAlteration() {
@Override
public void alter(Document document) {
EmailConfigurationsManagerWriter writer = newEmailConfigurationsManagerWriter(document);
writer.createEmptyDocument();
}
});
}
public EmailServerConfiguration getEmailConfiguration(String collection, boolean decryptPassword) {
EmailServerConfiguration config = oneXMLConfigPerCollectionManager.get(collection);
if (!decryptPassword) {
return config;
} else if (config != null) {
String password = config.getPassword();
String decryptedPassword = modelLayerFactory.newEncryptionServices().decrypt(password);
return new BaseEmailServerConfiguration(config.getUsername(), decryptedPassword, config.getDefaultSenderEmail(),
config.getProperties(), config.isEnabled());
}
return null;
}
private XMLConfigReader<EmailServerConfiguration> xmlConfigReader() {
return new XMLConfigReader<EmailServerConfiguration>() {
@Override
public EmailServerConfiguration read(String collection, Document document) {
return newEmailConfigurationReader(document).readEmailServerConfiguration(collection);
}
};
}
private EmailConfigurationManagerReader newEmailConfigurationReader(Document document) {
return new EmailConfigurationManagerReader(document);
}
private EmailConfigurationsManagerWriter newEmailConfigurationsManagerWriter(Document document) {
return new EmailConfigurationsManagerWriter(document);
}
@Override
public void close() {
}
public void createCollectionEmailConfiguration(String collection) {
DocumentAlteration createConfigAlteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
EmailConfigurationsManagerWriter writer = newEmailConfigurationsManagerWriter(document);
writer.createEmptyDocument();
}
};
oneXMLConfigPerCollectionManager.createCollectionFile(collection, createConfigAlteration);
}
}