package com.constellio.app.ui.pages.management.ldap;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.ArrayList;
import java.util.List;
import com.vaadin.ui.*;
import org.joda.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.app.ui.framework.buttons.AddButton;
import com.constellio.app.ui.framework.buttons.BaseButton;
import com.constellio.app.ui.framework.components.CollectionsSelectionPanel;
import com.constellio.app.ui.framework.components.DurationPanel;
import com.constellio.app.ui.framework.components.fields.BaseComboBox;
import com.constellio.app.ui.framework.components.ScheduleComponent;
import com.constellio.app.ui.pages.base.BaseViewImpl;
import com.constellio.model.conf.ldap.LDAPDirectoryType;
import com.constellio.model.conf.ldap.RegexFilter;
import com.constellio.model.conf.ldap.config.LDAPServerConfiguration;
import com.constellio.model.conf.ldap.config.LDAPUserSyncConfiguration;
import com.constellio.model.services.users.sync.LDAPUserSyncManager.LDAPSynchProgressionInfo;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.ui.themes.ValoTheme;
import org.vaadin.dialogs.ConfirmDialog;
public abstract class LDAPConfigBaseView extends BaseViewImpl implements LDAPConfigManagementView {
private static final Logger LOGGER = LoggerFactory.getLogger(LDAPConfigBaseView.class);
protected final LDAPConfigManagementPresenter presenter;
protected Field directoryTypeField;
protected String previousDirectoryType;
protected Field usersAcceptanceRegexField;
protected Field usersRejectionRegexField;
protected Field groupsAcceptanceRegexField;
protected Field groupsRejectionRegexField;
protected TextArea testAuthentication;
protected CollectionsSelectionPanel collectionsComponent;
protected ScheduleComponent scheduleComponentField;
protected Button saveButton;
private BaseButton forceUsersSynchronization;
protected Button deleteUnusedUserButton, activateLDAPButton;
protected LDAPConfigBaseView() {
this.presenter = new LDAPConfigManagementPresenter(this);
}
@Override
protected String getTitle() {
return $("LDAPConfigManagementView.viewTitle");
}
@Override
protected Button.ClickListener getBackButtonClickListener() {
return new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
presenter.backButtonClick();
}
};
}
@Override
public void updateComponents() {
}
protected Field createStringField(String value, boolean required) {
TextField textField = new TextField();
textField.setRequired(required);
if (value != null) {
textField.setValue(value);
}
return textField;
}
protected Field createEnumField(Enum enumeration, Enum[] constants) {
ComboBox combobox = new BaseComboBox();
combobox.setNullSelectionAllowed(false);
for (Enum value : constants) {
combobox.addItem(value.name());
combobox.setItemCaption(value.name(), $(value.getClass().getSimpleName() + "." + value.name()));
}
combobox.setValue(enumeration.name());
combobox.setRequired(true);
return combobox;
}
protected void buildDirectoryTypeField() {
LDAPServerConfiguration ldapServerConfiguration = presenter.getLDAPServerConfiguration();
LDAPDirectoryType directoryType = ldapServerConfiguration.getDirectoryType();
directoryTypeField = createEnumField(directoryType, LDAPDirectoryType.class.getEnumConstants());
previousDirectoryType = (String) directoryTypeField.getValue();
directoryTypeField.setCaption($("ldap.serverConfiguration.directoryType"));
directoryTypeField.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
String newValue = (String) event.getProperty().getValue();
presenter.typeChanged(previousDirectoryType, newValue);
previousDirectoryType = newValue;
}
});
}
protected void buildUsersAcceptRegex(LDAPUserSyncConfiguration ldapUserSyncConfiguration) {
String usersAcceptanceRegex = ldapUserSyncConfiguration.getUsersFilterAcceptanceRegex();
usersAcceptanceRegexField = createStringField(usersAcceptanceRegex, false);
usersAcceptanceRegexField.setCaption($("ldap.syncConfiguration.userFilter.acceptedRegex"));
}
protected void buildUsersRejectRegex(LDAPUserSyncConfiguration ldapUserSyncConfiguration) {
String usersRejectionRegex = ldapUserSyncConfiguration.getUsersFilterRejectionRegex();
usersRejectionRegexField = createStringField(usersRejectionRegex, false);
usersRejectionRegexField.setCaption($("ldap.syncConfiguration.userFilter.rejectedRegex"));
}
protected void buildGroupsAcceptRegex(LDAPUserSyncConfiguration ldapUserSyncConfiguration) {
String groupsAcceptanceRegex = ldapUserSyncConfiguration.getGroupsFilterAcceptanceRegex();
groupsAcceptanceRegexField = createStringField(groupsAcceptanceRegex, false);
groupsAcceptanceRegexField.setCaption($("ldap.syncConfiguration.groupFilter.acceptedRegex"));
}
protected void buildGroupsRejectRegex(LDAPUserSyncConfiguration ldapUserSyncConfiguration) {
String groupsRejectionRegex = ldapUserSyncConfiguration.getGroupsFilterRejectionRegex();
groupsRejectionRegexField = createStringField(groupsRejectionRegex, false);
groupsRejectionRegexField.setCaption($("ldap.syncConfiguration.groupFilter.rejectedRegex"));
}
protected void buildSynchronizationScheduleFields(LDAPUserSyncConfiguration ldapUserSyncConfiguration) {
scheduleComponentField = new ScheduleComponent(ldapUserSyncConfiguration.getScheduleTime(), ldapUserSyncConfiguration.getDurationBetweenExecution());
}
protected void buildCollectionsPanel() {
String title = $("ImportUsersFileViewImpl.collection");
collectionsComponent = new CollectionsSelectionPanel(title, presenter.getAllCollections(),
presenter.getSelectedCollections());
}
protected void buildButtonsPanel(final VerticalLayout layout) {
Panel buttonsPanel = new Panel();
buttonsPanel.setSizeUndefined();
buttonsPanel.addStyleName(ValoTheme.PANEL_BORDERLESS);
Button testButton = new BaseButton($("ldap.test.button")) {
@Override
protected void buttonClick(ClickEvent event) {
try {
testAuthentication.setVisible(true);
LDAPServerConfiguration ldapServerConfiguration = getLDAPServerConfiguration();
LDAPUserSyncConfiguration ldapUserSyncConfiguration = getLDAPUserSyncConfiguration();
testAuthentication.setValue(
presenter.getAuthenticationResultMessage(ldapServerConfiguration, getAuthenticationUser(),
getAuthenticationPassword()) + "\n"
+ presenter.getSynchResultMessage(ldapServerConfiguration, ldapUserSyncConfiguration));
layout.replaceComponent(testAuthentication, testAuthentication);
} catch (Throwable e) {
LOGGER.warn("Error when testing ldap configuration ", e);
showErrorMessage(e.getMessage());
}
}
};
forceUsersSynchronization = new BaseButton($("ldap.forceSynch.button")) {
@Override
protected void buttonClick(ClickEvent event) {
LDAPSynchProgressionInfo progression = presenter
.forceSynchronization();
}
};
forceUsersSynchronization.setVisible(presenter.isForceSynchVisible());
saveButton = new BaseButton($("save")) {
@Override
protected void buttonClick(ClickEvent event) {
LDAPServerConfiguration ldapServerConfigurationVO = getLDAPServerConfiguration();
LDAPUserSyncConfiguration ldapUserSyncConfigurationVO = getLDAPUserSyncConfiguration();
presenter.saveConfigurations(ldapServerConfigurationVO, ldapUserSyncConfigurationVO);
forceUsersSynchronization.setVisible(presenter.isForceSynchVisible());
}
};
saveButton.addStyleName(ValoTheme.BUTTON_PRIMARY);
HorizontalLayout hLayout = new HorizontalLayout(testButton, forceUsersSynchronization, saveButton);
hLayout.addComponent(saveButton);
buttonsPanel.setContent(hLayout);
layout.addComponent(buttonsPanel);
layout.setComponentAlignment(buttonsPanel, Alignment.BOTTOM_RIGHT);
}
@Override
protected List<Button> buildActionMenuButtons(ViewChangeListener.ViewChangeEvent event) {
List<Button> actionMenuButtons = new ArrayList<Button>();
deleteUnusedUserButton = new AddButton($("ldap.authentication.deleteUnusedUser")) {
@Override
protected void buttonClick(ClickEvent event) {
presenter.deleteUsedUserButtonClick();
}
};
activateLDAPButton = new AddButton(!presenter.isLDAPActive() ? $("ldap.authentication.active") : $("ldap.authentication.inactive")) {
@Override
protected void buttonClick(ClickEvent event) {
ConfirmDialog confirmDialog = ConfirmDialog.getFactory().create(
presenter.isLDAPActive() ? $("ldap.authentication.inactive.caption") : $("ldap.authentication.active.caption"),
presenter.isLDAPActive() ? $("ldap.authentication.inactive.msg") : $("ldap.authentication.active.msg"),
$("OK"),
$("cancel"),
null);
confirmDialog.getOkButton().addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
presenter.setLDAPActive(!presenter.isLDAPActive());
activateLDAPButton.setCaption(!presenter.isLDAPActive() ? $("ldap.authentication.active") : $("ldap.authentication.inactive"));
}
});
confirmDialog.show(UI.getCurrent(), new ConfirmDialog.Listener() {
@Override
public void onClose(ConfirmDialog dialog) {
}
}, true);
}
};
//actionMenuButtons.add(deleteUnusedUserButton);
actionMenuButtons.add(activateLDAPButton);
return actionMenuButtons;
}
protected abstract String getAuthenticationPassword();
protected abstract String getAuthenticationUser();
protected RegexFilter getGroupsFilter() {
return new RegexFilter(groupsAcceptanceRegexField.getValue().toString(), groupsRejectionRegexField.getValue().toString());
}
protected RegexFilter getUserFilter() {
return new RegexFilter(usersAcceptanceRegexField.getValue().toString(), usersRejectionRegexField.getValue().toString());
}
protected LDAPDirectoryType getDirectoryType() {
return LDAPDirectoryType.valueOf(directoryTypeField.getValue().toString());
}
protected List<String> selectedCollections() {
return collectionsComponent.getSelectedCollections();
}
protected abstract LDAPUserSyncConfiguration getLDAPUserSyncConfiguration();
protected abstract LDAPServerConfiguration getLDAPServerConfiguration();
}