package com.constellio.app.ui.pages.management.email; import static com.constellio.app.ui.i18n.i18n.$; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.constellio.app.ui.entities.EmailServerConfigVO; import com.constellio.app.ui.framework.buttons.BaseButton; import com.constellio.app.ui.framework.components.StringListComponent; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.model.conf.email.EmailServerConfiguration; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Panel; import com.vaadin.ui.PasswordField; import com.vaadin.ui.TextArea; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; public class EmailServerConfigViewImpl extends BaseViewImpl implements EmailServerConfigView { private EmailServerConfigPresenter presenter; private CheckBox enabledCheckbox; private TextField userField; private TextField defaultEmailSenderField; private TextField testEmailField; private PasswordField passwordField; private StringListComponent propertiesField; private TextArea testAuthentication; private Button saveButton; public EmailServerConfigViewImpl() { super(); this.presenter = new EmailServerConfigPresenter(this); } @Override protected Component buildMainComponent(ViewChangeListener.ViewChangeEvent event) { VerticalLayout layout = new VerticalLayout(); layout.setSizeFull(); layout.setSpacing(true); buildEmailServerConfigComponent(layout); buildTestArea(layout); buildSaveAndTestButtonsPanel(layout); return layout; } private void buildTestArea(VerticalLayout layout) { testEmailField = new TextField($("EmailServerConfigView.testEmail")); testEmailField.setNullRepresentation(""); layout.addComponent(testEmailField); testAuthentication = new TextArea($("EmailServerConfigView.results")); testAuthentication.setSizeFull(); testAuthentication.setEnabled(false); testAuthentication.setVisible(false); layout.addComponent(testAuthentication); } private void buildSaveAndTestButtonsPanel(final VerticalLayout layout) { Panel buttonsPanel = new Panel(); buttonsPanel.setSizeUndefined(); buttonsPanel.addStyleName(ValoTheme.PANEL_BORDERLESS); Button testButton = new BaseButton($("EmailServerConfigView.testButton")) { @Override protected void buttonClick(ClickEvent event) { testAuthentication.setVisible(true); try { EmailServerConfigVO emailServerConfigVO = getEmailServerConfig(); testAuthentication.setValue(presenter.getTestServerMessage(emailServerConfigVO, testEmailField.getValue())); layout.replaceComponent(testAuthentication, testAuthentication); } catch (InvalidPropertiesField invalidPropertiesField) { showErrorMessage($("EmailServerConfigView.invalidProperties")); } } }; saveButton = new BaseButton($("save")) { @Override protected void buttonClick(ClickEvent event) { EmailServerConfigVO emailServerConfigVO = null; try { emailServerConfigVO = getEmailServerConfig(); presenter.saveButtonClicked(emailServerConfigVO); } catch (InvalidPropertiesField invalidPropertiesField) { showErrorMessage($("EmailServerConfigView.invalidProperties")); } } }; saveButton.addStyleName(ValoTheme.BUTTON_PRIMARY); HorizontalLayout hlayout = new HorizontalLayout(testButton, saveButton); hlayout.setSpacing(true); hlayout.addComponent(saveButton); buttonsPanel.setContent(hlayout); layout.addComponent(buttonsPanel); layout.setComponentAlignment(buttonsPanel, Alignment.BOTTOM_RIGHT); } private EmailServerConfigVO getEmailServerConfig() throws InvalidPropertiesField { Map<String, String> properties = asMap(propertiesField.getValues()); return new EmailServerConfigVO() .setEnabled(enabledCheckbox.getValue()) .setPassword(passwordField.getValue()) .setUsername(userField.getValue()) .setProperties(properties) .setDefaultEmailServer(defaultEmailSenderField.getValue()); } private Map<String, String> asMap(List<String> values) throws InvalidPropertiesField { Map<String, String> returnMap = new HashMap<>(); for (String currentValue : values) { if (StringUtils.isBlank(currentValue)) { continue; } String[] elements = currentValue.split("="); if (elements.length != 2) { throw new InvalidPropertiesField(); } String key = elements[0]; String value = elements[1]; returnMap.put(key, value); } return returnMap; } private void buildEmailServerConfigComponent(VerticalLayout layout) { EmailServerConfiguration emailServerConfiguration = presenter.getEmailServerConfiguration(); boolean enabled; String user; String defaultEmail; String password; List<String> properties; if (emailServerConfiguration != null) { enabled = emailServerConfiguration.isEnabled(); user = emailServerConfiguration.getUsername(); defaultEmail = emailServerConfiguration.getDefaultSenderEmail(); password = emailServerConfiguration.getPassword(); properties = asList(emailServerConfiguration.getProperties()); } else { enabled = true; user = ""; password = ""; defaultEmail = ""; properties = new ArrayList<>(); } enabledCheckbox = new CheckBox($("EmailServerConfigView.enabled")); enabledCheckbox.setValue(enabled); layout.addComponent(enabledCheckbox); userField = new TextField($("EmailServerConfigView.username")); userField.setValue(user); userField.setRequired(true); userField.setNullRepresentation(""); layout.addComponent(userField); defaultEmailSenderField = new TextField($("EmailServerConfigView.defaultEmailSender")); defaultEmailSenderField.setValue(defaultEmail); defaultEmailSenderField.setRequired(true); defaultEmailSenderField.setNullRepresentation(""); layout.addComponent(defaultEmailSenderField); passwordField = new PasswordField($("EmailServerConfigView.password")); passwordField.setValue(password); passwordField.setRequired(false); layout.addComponent(passwordField); propertiesField = new StringListComponent(); propertiesField.setCaption($("EmailServerConfigView.properties")); propertiesField.setValues(properties); propertiesField.setRequired(true); layout.addComponent(propertiesField); } private List<String> asList(Map<String, String> properties) { List<String> returnList = new ArrayList<>(); if (properties != null) { for (Map.Entry<String, String> entry : properties.entrySet()) { returnList.add(entry.getKey() + "=" + entry.getValue()); } } return returnList; } private class InvalidPropertiesField extends Exception { } @Override protected String getTitle() { return $("EmailServerConfigView.viewTitle"); } @Override protected Button.ClickListener getBackButtonClickListener() { return new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { presenter.backButtonClick(); } }; } }