org.apache.directory.studio.apacheds.configuration.editor.ReplicationDetailsPage.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.apacheds.configuration.editor.ReplicationDetailsPage.java

Source

/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *  
 *    http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License. 
 *  
 */
package org.apache.directory.studio.apacheds.configuration.editor;

import java.util.ArrayList;
import java.util.List;

import org.apache.directory.api.ldap.model.constants.SchemaConstants;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.message.AliasDerefMode;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.server.config.beans.ReplConsumerBean;
import org.apache.directory.studio.common.ui.dialogs.AttributeDialog;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyEvent;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyListener;
import org.apache.directory.studio.ldapbrowser.common.widgets.search.EntryWidget;
import org.apache.directory.studio.ldapbrowser.common.widgets.search.FilterWidget;
import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.apache.directory.studio.ldapbrowser.core.utils.SchemaObjectLoader;
import org.apache.directory.studio.common.ui.wrappers.StringValueWrapper;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IFormPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;

/**
 * This class represents the Details Page of the Server Configuration Editor for the Replication type
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class ReplicationDetailsPage implements IDetailsPage {
    /** The associated Master Details Block */
    private ReplicationMasterDetailsBlock masterDetailsBlock;

    /** The Managed Form */
    private IManagedForm mform;

    /** The input consumer */
    private ReplConsumerBean input;

    /** The browser connection */
    private IBrowserConnection browserConnection;

    /** The Attribute list loader */
    private SchemaObjectLoader attributeLoader;

    /** The list of attributes */
    private List<String> attributesList = new ArrayList<String>();

    // UI Widgets
    private Button enabledCheckbox;
    private Text idText;
    private Text descriptionText;
    private Button refreshAndPersistModeButton;
    private Button refreshOnlyModeButton;
    private Text refreshIntervalText;
    private Text remoteHostText;
    private Text remotePortText;
    private Text bindDnText;
    private Text bindPasswordText;
    private Button showPasswordCheckbox;
    private Button useStartTlsCheckbox;
    private Text sizeLimitText;
    private Text timeLimitText;
    private EntryWidget entryWidget;
    private FilterWidget filterWidget;
    private Button subtreeScopeButton;
    private Button oneLevelScopeButton;
    private Button objectScopeButton;
    private Button allAttributesCheckbox;
    private TableViewer attributesTableViewer;
    private Button addAttributeButton;
    private Button editAttributeButton;
    private Button deleteAttributeButton;
    private Button findingBaseDnAliasesDereferencingButton;
    private Button searchAliasesDereferencingButton;

    // Listeners
    /** The Text Modify Listener */
    private ModifyListener textModifyListener = new ModifyListener() {
        public void modifyText(ModifyEvent e) {
            commit(true);
            masterDetailsBlock.setEditorDirty();
        }
    };

    /** The button Selection Listener */
    private SelectionListener buttonSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            commit(true);
            masterDetailsBlock.setEditorDirty();
        }
    };

    /** The widget Modify Listener */
    private WidgetModifyListener widgetModifyListener = new WidgetModifyListener() {
        public void widgetModified(WidgetModifyEvent event) {
            commit(true);
            masterDetailsBlock.setEditorDirty();
        }
    };

    private VerifyListener integerVerifyListener = new VerifyListener() {
        public void verifyText(VerifyEvent e) {
            if (!e.text.matches("[0-9]*")) //$NON-NLS-1$
            {
                e.doit = false;
            }
        }
    };

    private SelectionListener showPasswordCheckboxSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            if (showPasswordCheckbox.getSelection()) {
                bindPasswordText.setEchoChar('\0');
            } else {
                bindPasswordText.setEchoChar('\u2022');
            }
        }
    };

    private ISelectionChangedListener attributesTableViewerSelectionListener = new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            updateAttributesButtonsEnableState();
        }
    };

    /** The Double Click Listener for the Indexed Attributes Table Viewer */
    private IDoubleClickListener attributesTableViewerDoubleClickListener = new IDoubleClickListener() {
        public void doubleClick(DoubleClickEvent event) {
            editSelectedAttribute();
        }
    };

    private SelectionListener addAttributeButtonSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            addNewAttribute();
        }
    };

    private SelectionListener editAttributeButtonSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            editSelectedAttribute();
        }
    };

    private SelectionListener deleteAttributeButtonSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            deleteSelectedAttribute();
        }
    };

    /**
     * Creates a new instance of ReplicationDetailsPage.
     *
     * @param pmdb
     *      the associated Master Details Block
     */
    public ReplicationDetailsPage(ReplicationMasterDetailsBlock pmdb) {
        masterDetailsBlock = pmdb;
        attributeLoader = new SchemaObjectLoader();

        // Getting the browser connection associated with the connection in the configuration
        browserConnection = BrowserCorePlugin.getDefault().getConnectionManager()
                .getBrowserConnection(masterDetailsBlock.getPage().getConnection());
    }

    /**
     * {@inheritDoc}
     */
    public void createContents(Composite parent) {
        FormToolkit toolkit = mform.getToolkit();
        TableWrapLayout layout = new TableWrapLayout();
        layout.topMargin = 5;
        layout.leftMargin = 5;
        layout.rightMargin = 2;
        layout.bottomMargin = 2;
        parent.setLayout(layout);

        createDetailsSection(parent, toolkit);
        createConnectionSection(parent, toolkit);
        createConfigurationSection(parent, toolkit);
    }

    /**
     * Creates the Details Section
     *
     * @param parent
     *      the parent composite
     * @param toolkit
     *      the toolkit to use
     */
    private void createDetailsSection(Composite parent, FormToolkit toolkit) {
        Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
        section.marginWidth = 10;
        section.setText("Replication Consumer Details");
        section.setDescription("Set the properties of the replication consumer.");
        TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
        td.grabHorizontal = true;
        section.setLayoutData(td);
        Composite client = toolkit.createComposite(section);
        toolkit.paintBordersFor(client);
        GridLayout glayout = new GridLayout(2, false);
        client.setLayout(glayout);
        section.setClient(client);

        // Enabled Checkbox
        enabledCheckbox = toolkit.createButton(client, "Enabled", SWT.CHECK);
        enabledCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 2, 1));

        // ID Text
        toolkit.createLabel(client, "ID:");
        idText = toolkit.createText(client, "");
        idText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Description Text
        toolkit.createLabel(client, "Description:");
        descriptionText = toolkit.createText(client, "");
        descriptionText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
    }

    /**
     * Creates the Details Section
     *
     * @param parent
     *      the parent composite
     * @param toolkit
     *      the toolkit to use
     */
    private void createConnectionSection(Composite parent, FormToolkit toolkit) {
        Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
        section.marginWidth = 10;
        section.setText("Connection");
        section.setDescription("Set the properties of the connection.");
        TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
        td.grabHorizontal = true;
        section.setLayoutData(td);
        Composite composite = toolkit.createComposite(section);
        toolkit.paintBordersFor(composite);
        composite.setLayout(new GridLayout(2, false));
        section.setClient(composite);

        // Replication Mode
        toolkit.createLabel(composite, "Replication Mode:");

        // Refresh And Persist Mode Button
        refreshAndPersistModeButton = toolkit.createButton(composite, "Refresh And Persist", SWT.RADIO);
        refreshAndPersistModeButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));

        // Refresh Only Mode Button
        toolkit.createLabel(composite, "");
        refreshOnlyModeButton = toolkit.createButton(composite, "Refresh Only", SWT.RADIO);
        refreshOnlyModeButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));

        // Refresh Interval
        toolkit.createLabel(composite, "");
        Composite refreshIntervalComposite = toolkit.createComposite(composite);
        refreshIntervalComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        refreshIntervalComposite.setLayout(new GridLayout(3, false));
        toolkit.createLabel(refreshIntervalComposite, "  ");
        toolkit.createLabel(refreshIntervalComposite, "Refresh Interval (ms):");
        refreshIntervalText = toolkit.createText(refreshIntervalComposite, "");
        refreshIntervalText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Remote Host Text
        toolkit.createLabel(composite, "Remote Host:");
        remoteHostText = toolkit.createText(composite, "");
        remoteHostText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Remote Port Text
        toolkit.createLabel(composite, "Remote Port:");
        remotePortText = toolkit.createText(composite, "");
        remotePortText.addVerifyListener(integerVerifyListener);
        remotePortText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Bind DN Text
        toolkit.createLabel(composite, "Bind DN:");
        bindDnText = toolkit.createText(composite, "");
        bindDnText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Bind Password Text
        toolkit.createLabel(composite, "Bind Password:");
        bindPasswordText = toolkit.createText(composite, "");
        bindPasswordText.setEchoChar('\u2022');
        bindPasswordText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Show Password Checkbox
        toolkit.createLabel(composite, ""); //$NON-NLS-1$
        showPasswordCheckbox = toolkit.createButton(composite, "Show password", SWT.CHECK);
        showPasswordCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        showPasswordCheckbox.setSelection(false);

        // Size Limit Text
        toolkit.createLabel(composite, "Size Limit:");
        sizeLimitText = toolkit.createText(composite, "");
        sizeLimitText.addVerifyListener(integerVerifyListener);
        sizeLimitText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Time Limit Text
        toolkit.createLabel(composite, "Time Limit:");
        timeLimitText = toolkit.createText(composite, "");
        timeLimitText.addVerifyListener(integerVerifyListener);
        timeLimitText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Use Start TLS
        toolkit.createLabel(composite, ""); //$NON-NLS-1$
        useStartTlsCheckbox = toolkit.createButton(composite, "Use Start TLS", SWT.CHECK);
        useStartTlsCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        useStartTlsCheckbox.setSelection(false);
    }

    /**
     * Creates the Details Section
     *
     * @param parent
     *      the parent composite
     * @param toolkit
     *      the toolkit to use
     */
    private void createConfigurationSection(Composite parent, FormToolkit toolkit) {
        Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
        section.marginWidth = 10;
        section.setText("Replication Consumer Details");
        section.setDescription("Set the properties of the configuration.");
        TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
        td.grabHorizontal = true;
        section.setLayoutData(td);
        Composite composite = toolkit.createComposite(section);
        toolkit.paintBordersFor(composite);
        GridLayout glayout = new GridLayout(3, false);
        composite.setLayout(glayout);
        section.setClient(composite);

        // Base DN Text
        toolkit.createLabel(composite, "Base DN:");
        entryWidget = new EntryWidget(browserConnection, Dn.EMPTY_DN);
        entryWidget.createWidget(composite);

        // Filter Text
        toolkit.createLabel(composite, "Filter:");
        filterWidget = new FilterWidget();
        filterWidget.setBrowserConnection(browserConnection);
        filterWidget.createWidget(composite);

        // Scope
        Label scopeLabel = toolkit.createLabel(composite, "Scope:");
        scopeLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false, 1, 3));

        // Subtree Scope Button
        subtreeScopeButton = toolkit.createButton(composite, "Subtree", SWT.RADIO);
        subtreeScopeButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));

        // One Level Scope Button
        oneLevelScopeButton = toolkit.createButton(composite, "One Level", SWT.RADIO);
        oneLevelScopeButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));

        // Object Scope Button
        objectScopeButton = toolkit.createButton(composite, "Object", SWT.RADIO);
        objectScopeButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));

        // Attributes Label
        Label attributesLabel = toolkit.createLabel(composite, "Attributes:");
        attributesLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));

        // All Attributes Checkbox
        allAttributesCheckbox = toolkit.createButton(composite, "All Attributes", SWT.CHECK);
        allAttributesCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));

        // Attributes Table Viewer
        toolkit.createLabel(composite, ""); //$NON-NLS-1$
        Composite attributesTableComposite = toolkit.createComposite(composite);
        GridLayout gl = new GridLayout(2, false);
        gl.marginWidth = gl.marginHeight = 0;
        attributesTableComposite.setLayout(gl);
        attributesTableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
        Table attributesTable = toolkit.createTable(attributesTableComposite, SWT.BORDER);
        attributesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3));
        attributesTableViewer = new TableViewer(attributesTable);
        attributesTableViewer.setContentProvider(new ArrayContentProvider());
        attributesTableViewer.setInput(attributesList);

        addAttributeButton = toolkit.createButton(attributesTableComposite, "Add...", SWT.PUSH);
        addAttributeButton.setLayoutData(createNewButtonGridData());

        editAttributeButton = toolkit.createButton(attributesTableComposite, "Edit...", SWT.PUSH);
        editAttributeButton.setEnabled(false);
        editAttributeButton.setLayoutData(createNewButtonGridData());

        deleteAttributeButton = toolkit.createButton(attributesTableComposite, "Delete", SWT.PUSH);
        deleteAttributeButton.setEnabled(false);
        deleteAttributeButton.setLayoutData(createNewButtonGridData());

        // Aliases Dereferencing Text
        Label aliasesDereferencingLable = toolkit.createLabel(composite, "Aliases\nDereferencing:");
        aliasesDereferencingLable.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false, 1, 2));

        // Finding Base DN Aliases Dereferencing Button
        findingBaseDnAliasesDereferencingButton = toolkit.createButton(composite, "Finding Base DN", SWT.CHECK);
        findingBaseDnAliasesDereferencingButton
                .setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));

        // Search Aliases Dereferencing Button
        searchAliasesDereferencingButton = toolkit.createButton(composite, "Search", SWT.CHECK);
        searchAliasesDereferencingButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
    }

    /**
     * Updates the attributes buttons enable state.
     */
    private void updateAttributesButtonsEnableState() {
        ISelection selection = attributesTableViewer.getSelection();

        editAttributeButton.setEnabled(!selection.isEmpty());
        deleteAttributeButton.setEnabled(!selection.isEmpty());
    }

    /**
     * Adds a new attribute and opens the attribute dialog.
     */
    private void addNewAttribute() {
        AttributeDialog dialog = new AttributeDialog(addAttributeButton.getShell());
        dialog.addNewElement();
        dialog.setAttributeNamesAndOids(attributeLoader.getAttributeNamesAndOids());

        if (AttributeDialog.OK == dialog.open()) {
            String newAttribute = dialog.getEditedElement().getValue();

            if (!attributesList.contains(newAttribute)) {
                attributesList.add(newAttribute);
            }

            attributesTableViewer.refresh();
            attributesTableViewer.setSelection(new StructuredSelection(newAttribute));
            masterDetailsBlock.setEditorDirty();
        }
    }

    /**
     * Opens an attribute dialog with the selected attribute in the attributes table viewer.
     */
    private void editSelectedAttribute() {
        StructuredSelection selection = (StructuredSelection) attributesTableViewer.getSelection();

        if (!selection.isEmpty()) {
            String attribute = (String) selection.getFirstElement();

            AttributeDialog dialog = new AttributeDialog(addAttributeButton.getShell());
            dialog.setEditedElement(new StringValueWrapper(attribute, false));
            dialog.setAttributeNamesAndOids(attributeLoader.getAttributeNamesAndOids());

            if (AttributeDialog.OK == dialog.open()) {
                attributesList.remove(attribute);

                String newAttribute = dialog.getEditedElement().getValue();

                if (!attributesList.contains(newAttribute)) {
                    attributesList.add(newAttribute);
                }

                attributesTableViewer.refresh();
                attributesTableViewer.setSelection(new StructuredSelection(newAttribute));
                masterDetailsBlock.setEditorDirty();
            }
        }
    }

    /**
     * Deletes the selected index in the indexes table viewer.
     */
    private void deleteSelectedAttribute() {
        StructuredSelection selection = (StructuredSelection) attributesTableViewer.getSelection();

        if (!selection.isEmpty()) {
            String attribute = (String) selection.getFirstElement();

            attributesList.remove(attribute);
            attributesTableViewer.refresh();
            masterDetailsBlock.setEditorDirty();
        }
    }

    /**
     * Create a new button grid data.
     *
     * @return the new button grid data
     */
    private GridData createNewButtonGridData() {
        GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
        gd.widthHint = IDialogConstants.BUTTON_WIDTH;
        return gd;
    }

    /**
     * Adds listeners to UI fields.
     */
    private void addListeners() {
        enabledCheckbox.addSelectionListener(buttonSelectionListener);
        idText.addModifyListener(textModifyListener);
        descriptionText.addModifyListener(textModifyListener);
        refreshAndPersistModeButton.addSelectionListener(buttonSelectionListener);
        refreshOnlyModeButton.addSelectionListener(buttonSelectionListener);
        refreshIntervalText.addModifyListener(textModifyListener);
        remoteHostText.addModifyListener(textModifyListener);
        remotePortText.addModifyListener(textModifyListener);
        bindDnText.addModifyListener(textModifyListener);
        bindPasswordText.addModifyListener(textModifyListener);
        showPasswordCheckbox.addSelectionListener(showPasswordCheckboxSelectionListener);
        sizeLimitText.addModifyListener(textModifyListener);
        timeLimitText.addModifyListener(textModifyListener);
        useStartTlsCheckbox.addSelectionListener(buttonSelectionListener);
        entryWidget.addWidgetModifyListener(widgetModifyListener);
        filterWidget.addWidgetModifyListener(widgetModifyListener);
        subtreeScopeButton.addSelectionListener(buttonSelectionListener);
        oneLevelScopeButton.addSelectionListener(buttonSelectionListener);
        objectScopeButton.addSelectionListener(buttonSelectionListener);
        allAttributesCheckbox.addSelectionListener(buttonSelectionListener);
        attributesTableViewer.addDoubleClickListener(attributesTableViewerDoubleClickListener);
        attributesTableViewer.addSelectionChangedListener(attributesTableViewerSelectionListener);
        addAttributeButton.addSelectionListener(addAttributeButtonSelectionListener);
        editAttributeButton.addSelectionListener(editAttributeButtonSelectionListener);
        deleteAttributeButton.addSelectionListener(deleteAttributeButtonSelectionListener);
        findingBaseDnAliasesDereferencingButton.addSelectionListener(buttonSelectionListener);
        searchAliasesDereferencingButton.addSelectionListener(buttonSelectionListener);
    }

    /**
     * Removes listeners to UI fields.
     */
    private void removeListeners() {
        enabledCheckbox.removeSelectionListener(buttonSelectionListener);
        idText.removeModifyListener(textModifyListener);
        descriptionText.removeModifyListener(textModifyListener);
        refreshAndPersistModeButton.removeSelectionListener(buttonSelectionListener);
        refreshOnlyModeButton.removeSelectionListener(buttonSelectionListener);
        refreshIntervalText.removeModifyListener(textModifyListener);
        remoteHostText.removeModifyListener(textModifyListener);
        remotePortText.removeModifyListener(textModifyListener);
        bindDnText.removeModifyListener(textModifyListener);
        bindPasswordText.removeModifyListener(textModifyListener);
        showPasswordCheckbox.removeSelectionListener(showPasswordCheckboxSelectionListener);
        sizeLimitText.removeModifyListener(textModifyListener);
        timeLimitText.removeModifyListener(textModifyListener);
        useStartTlsCheckbox.removeSelectionListener(buttonSelectionListener);
        entryWidget.removeWidgetModifyListener(widgetModifyListener);
        filterWidget.removeWidgetModifyListener(widgetModifyListener);
        subtreeScopeButton.removeSelectionListener(buttonSelectionListener);
        oneLevelScopeButton.removeSelectionListener(buttonSelectionListener);
        objectScopeButton.removeSelectionListener(buttonSelectionListener);
        allAttributesCheckbox.removeSelectionListener(buttonSelectionListener);
        attributesTableViewer.removeDoubleClickListener(attributesTableViewerDoubleClickListener);
        attributesTableViewer.removeSelectionChangedListener(attributesTableViewerSelectionListener);
        addAttributeButton.removeSelectionListener(addAttributeButtonSelectionListener);
        editAttributeButton.removeSelectionListener(editAttributeButtonSelectionListener);
        deleteAttributeButton.removeSelectionListener(deleteAttributeButtonSelectionListener);
        findingBaseDnAliasesDereferencingButton.removeSelectionListener(buttonSelectionListener);
        searchAliasesDereferencingButton.removeSelectionListener(buttonSelectionListener);
    }

    /**
     * {@inheritDoc}
     */
    public void selectionChanged(IFormPart part, ISelection selection) {
        IStructuredSelection ssel = (IStructuredSelection) selection;
        if (ssel.size() == 1) {
            input = (ReplConsumerBean) ssel.getFirstElement();
        } else {
            input = null;
        }
        refresh();
    }

    /**
     * {@inheritDoc}
     */
    public void commit(boolean onSave) {
        if (input != null) {
            // Enabled
            input.setEnabled(enabledCheckbox.getSelection());

            // ID
            input.setReplConsumerId(ServerConfigurationEditorUtils.checkEmptyString(idText.getText()));

            // Description
            input.setDescription(ServerConfigurationEditorUtils.checkEmptyString(descriptionText.getText()));

            // Refresh Mode
            input.setReplRefreshNPersist(refreshAndPersistModeButton.getSelection());

            // Refresh Interval
            try {
                input.setReplRefreshInterval(Long.parseLong(refreshIntervalText.getText()));
            } catch (NumberFormatException e) {
                input.setReplRefreshInterval(60000);
            }

            // Remote Host
            input.setReplProvHostName(ServerConfigurationEditorUtils.checkEmptyString(remoteHostText.getText()));

            // Remote Port
            try {
                input.setReplProvPort(Integer.parseInt(remotePortText.getText()));
            } catch (NumberFormatException e) {
                input.setReplProvPort(0);
            }

            // Bind DN
            input.setReplUserDn(ServerConfigurationEditorUtils.checkEmptyString(bindDnText.getText()));

            // Bind Password
            String password = ServerConfigurationEditorUtils.checkEmptyString(bindPasswordText.getText());

            if (password != null) {
                input.setReplUserPassword(password.getBytes());
            } else {
                input.setReplUserPassword(null);
            }

            // Size Limit
            try {
                input.setReplSearchSizeLimit(Integer.parseInt(sizeLimitText.getText()));
            } catch (NumberFormatException e) {
                input.setReplSearchSizeLimit(0);
            }

            // Time Limit
            try {
                input.setReplSearchTimeout(Integer.parseInt(timeLimitText.getText()));
            } catch (NumberFormatException e) {
                input.setReplSearchTimeout(0);
            }

            // Use Start TLS
            input.setReplUseTls(useStartTlsCheckbox.getSelection());

            // Search Base DN
            Dn baseDn = entryWidget.getDn();

            if (baseDn != null) {
                input.setSearchBaseDn(ServerConfigurationEditorUtils.checkEmptyString(baseDn.toString()));
            } else {
                input.setSearchBaseDn(null);
            }

            // Search Filter
            input.setReplSearchFilter(ServerConfigurationEditorUtils.checkEmptyString(filterWidget.getFilter()));

            // Search Scope
            SearchScope scope = getSearchScope();

            if (scope != null) {
                input.setReplSearchScope(scope.getLdapUrlValue());
            } else {
                input.setReplSearchScope(null);
            }

            // Aliases Dereferencing
            input.setReplAliasDerefMode(getAliasDerefMode().getJndiValue());

            // Attributes
            List<String> replAttributes = new ArrayList<String>();
            replAttributes.addAll(attributesList);

            // All (User) Attribute
            if (allAttributesCheckbox.getSelection()) {
                replAttributes.add(SchemaConstants.ALL_USER_ATTRIBUTES);
            }

            input.setReplAttributes(replAttributes);
        }
    }

    /**
     * Gets the search scope.
     *
     * @return the search scope
     */
    private SearchScope getSearchScope() {
        if (subtreeScopeButton.getSelection()) {
            return SearchScope.SUBTREE;
        } else if (oneLevelScopeButton.getSelection()) {
            return SearchScope.ONELEVEL;
        } else if (objectScopeButton.getSelection()) {
            return SearchScope.OBJECT;
        }

        return null;
    }

    /**
     * Gets the aliases dereferencing mode.
     *
     * @return the aliases dereferencing mode
     */
    private AliasDerefMode getAliasDerefMode() {
        if (findingBaseDnAliasesDereferencingButton.getSelection()
                && searchAliasesDereferencingButton.getSelection()) {
            return AliasDerefMode.DEREF_ALWAYS;
        } else if (!findingBaseDnAliasesDereferencingButton.getSelection()
                && searchAliasesDereferencingButton.getSelection()) {
            return AliasDerefMode.DEREF_IN_SEARCHING;
        } else if (findingBaseDnAliasesDereferencingButton.getSelection()
                && !searchAliasesDereferencingButton.getSelection()) {
            return AliasDerefMode.DEREF_FINDING_BASE_OBJ;
        } else if (!findingBaseDnAliasesDereferencingButton.getSelection()
                && !searchAliasesDereferencingButton.getSelection()) {
            return AliasDerefMode.NEVER_DEREF_ALIASES;
        }

        return AliasDerefMode.NEVER_DEREF_ALIASES;
    }

    /**
     * {@inheritDoc}
     */
    public void dispose() {
    }

    /**
     * {@inheritDoc}
     */
    public void initialize(IManagedForm form) {
        this.mform = form;
    }

    /**
     * {@inheritDoc}
     */
    public boolean isDirty() {
        return false;
    }

    /**
     * {@inheritDoc}
     */
    public boolean isStale() {
        return false;
    }

    /**
     * {@inheritDoc}
     */
    public void refresh() {
        removeListeners();

        if (input != null) {
            // Enabled
            enabledCheckbox.setSelection(input.isEnabled());

            // ID
            idText.setText(ServerConfigurationEditorUtils.checkNull(input.getReplConsumerId()));

            // Description
            descriptionText.setText(ServerConfigurationEditorUtils.checkNull(input.getDescription()));

            // Refresh And Persist
            refreshAndPersistModeButton.setSelection(input.isReplRefreshNPersist());

            // Refresh Only
            refreshOnlyModeButton.setSelection(!input.isReplRefreshNPersist());

            // Refresh Interval
            refreshIntervalText.setText(
                    ServerConfigurationEditorUtils.checkNull(String.valueOf(input.getReplRefreshInterval())));

            // Remote Host
            remoteHostText.setText(ServerConfigurationEditorUtils.checkNull(input.getReplProvHostName()));

            // Remote Port
            remotePortText
                    .setText(ServerConfigurationEditorUtils.checkNull(String.valueOf(input.getReplProvPort())));

            // Bind DN
            bindDnText.setText(ServerConfigurationEditorUtils.checkNull(input.getReplUserDn()));

            // Bind Password
            byte[] bindPassword = input.getReplUserPassword();

            if ((bindPassword != null) && (bindPassword.length > 0)) {
                bindPasswordText
                        .setText(ServerConfigurationEditorUtils.checkNull(new String(input.getReplUserPassword())));
            } else {
                bindPasswordText.setText("");
            }

            // Size Limit
            sizeLimitText.setText(
                    ServerConfigurationEditorUtils.checkNull(String.valueOf(input.getReplSearchSizeLimit())));

            // Time Limit
            timeLimitText.setText(
                    ServerConfigurationEditorUtils.checkNull(String.valueOf(input.getReplSearchTimeout())));

            // Use Start TLS
            useStartTlsCheckbox.setSelection(input.isReplUseTls());

            // Search Base DN
            try {
                entryWidget.setInput(browserConnection, new Dn(input.getSearchBaseDn()));
            } catch (LdapInvalidDnException e) {
                entryWidget.setInput(browserConnection, Dn.EMPTY_DN);
            }

            // Search Filter
            filterWidget.setFilter(ServerConfigurationEditorUtils.checkNull(input.getReplSearchFilter()));

            // Search Scope
            SearchScope scope = null;
            try {
                scope = SearchScope.getSearchScope(SearchScope.getSearchScope(input.getReplSearchScope()));
            } catch (IllegalArgumentException e) {
                scope = null;
            }

            if (scope != null) {
                switch (scope) {
                case SUBTREE:
                    subtreeScopeButton.setSelection(true);
                    oneLevelScopeButton.setSelection(false);
                    objectScopeButton.setSelection(false);
                    break;
                case ONELEVEL:
                    subtreeScopeButton.setSelection(false);
                    oneLevelScopeButton.setSelection(true);
                    objectScopeButton.setSelection(false);
                    break;
                case OBJECT:
                    subtreeScopeButton.setSelection(false);
                    oneLevelScopeButton.setSelection(false);
                    objectScopeButton.setSelection(true);
                    break;
                }
            } else {
                subtreeScopeButton.setSelection(true);
            }

            // Aliases Dereferencing
            AliasDerefMode aliasDerefMode = null;
            try {
                aliasDerefMode = AliasDerefMode.getDerefMode(input.getReplAliasDerefMode());
            } catch (IllegalArgumentException e) {
                aliasDerefMode = null;
            }

            if (aliasDerefMode != null) {
                switch (aliasDerefMode) {
                case DEREF_ALWAYS:
                    findingBaseDnAliasesDereferencingButton.setSelection(true);
                    searchAliasesDereferencingButton.setSelection(true);
                    break;
                case DEREF_FINDING_BASE_OBJ:
                    findingBaseDnAliasesDereferencingButton.setSelection(true);
                    searchAliasesDereferencingButton.setSelection(false);
                    break;
                case DEREF_IN_SEARCHING:
                    findingBaseDnAliasesDereferencingButton.setSelection(false);
                    searchAliasesDereferencingButton.setSelection(true);
                    break;
                case NEVER_DEREF_ALIASES:
                    findingBaseDnAliasesDereferencingButton.setSelection(false);
                    searchAliasesDereferencingButton.setSelection(false);
                    break;
                }
            } else {
                findingBaseDnAliasesDereferencingButton.setSelection(true);
                searchAliasesDereferencingButton.setSelection(true);
            }

            // Attributes
            attributesList.clear();
            attributesList.addAll(input.getReplAttributes());

            // All Attributes Checkbox
            if (attributesList.contains(SchemaConstants.ALL_USER_ATTRIBUTES)) {
                attributesList.remove(SchemaConstants.ALL_USER_ATTRIBUTES);
                allAttributesCheckbox.setSelection(true);
            } else {
                allAttributesCheckbox.setSelection(false);
            }

            // All Operational Attributes
            if (attributesList.contains(SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES)) {
                attributesList.remove(SchemaConstants.ALL_OPERATIONAL_ATTRIBUTES);
            }

            attributesTableViewer.refresh();
        }

        addListeners();
    }

    /**
     * {@inheritDoc}
     */
    public void setFocus() {
        idText.setFocus();
    }

    /**
     * {@inheritDoc}
     */
    public boolean setFormInput(Object input) {
        return false;
    }
}