org.apache.directory.studio.openldap.config.acl.dialogs.OpenLdapAccessLevelDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.openldap.config.acl.dialogs.OpenLdapAccessLevelDialog.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.openldap.config.acl.dialogs;

import java.util.List;

import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPlugin;
import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPluginConstants;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevel;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelLevelEnum;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelPrivModifierEnum;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelPrivilegeEnum;

/**
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class OpenLdapAccessLevelDialog extends Dialog {
    /** The array of access levels */
    private Object[] levels = new Object[] { new AccessLevelComboViewerName(), AclAccessLevelLevelEnum.MANAGE,
            AclAccessLevelLevelEnum.WRITE, AclAccessLevelLevelEnum.READ, AclAccessLevelLevelEnum.SEARCH,
            AclAccessLevelLevelEnum.COMPARE, AclAccessLevelLevelEnum.AUTH, AclAccessLevelLevelEnum.DISCLOSE,
            AclAccessLevelLevelEnum.NONE, };

    /** The access level */
    private AclAccessLevel accessLevel;

    // UI widgets
    private Button okButton;
    private Button selfCheckbox;
    private Button levelRadioButton;
    private ComboViewer levelComboViewer;
    private Button customPrivilegesRadioButton;
    private Button privilegeModifierEqualRadioButton;
    private Button privilegeModifierPlusRadioButton;
    private Button privilegeModifierMinusRadioButton;
    private Button privilegeAuthCheckbox;
    private Button privilegeCompareCheckbox;
    private Button privilegeSearchCheckbox;
    private Button privilegeReadCheckbox;
    private Button privilegeWriteCheckbox;

    /**
     * Creates a new instance of OpenLdapAccessLevelDialog.
     *
     * @param accessLevel the access level
     */
    public OpenLdapAccessLevelDialog(AclAccessLevel accessLevel) {
        super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
        this.accessLevel = accessLevel;
    }

    /**
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("Access Level Editor");
        shell.setImage(OpenLdapAclEditorPlugin.getDefault().getImage(OpenLdapAclEditorPluginConstants.IMG_EDITOR));
    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    protected void createButtonsForButtonBar(Composite parent) {
        okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    protected Control createContents(Composite parent) {
        Control control = super.createContents(parent);

        // Validating the dialog
        validate();

        return control;
    }

    /**
     * {@inheritDoc}
     */
    protected void okPressed() {
        // Self
        accessLevel.setSelf(selfCheckbox.getSelection());

        // Level
        if (levelRadioButton.getSelection()) {
            Object levelSelection = ((StructuredSelection) levelComboViewer.getSelection()).getFirstElement();
            if (levelSelection instanceof AclAccessLevelLevelEnum) {
                accessLevel.setLevel((AclAccessLevelLevelEnum) levelSelection);
            } else {
                accessLevel.setLevel(null);
            }
        } else {
            accessLevel.setLevel(null);
        }

        // Custom privileges
        if (customPrivilegesRadioButton.getSelection()) {
            // Privilege modifier
            accessLevel.setPrivilegeModifier(getPrivilegeModifier());

            // Privileges
            accessLevel.clearPrivileges();
            addPrivileges();
        } else {
            accessLevel.setPrivilegeModifier(null);
            accessLevel.clearPrivileges();
        }

        super.okPressed();
    }

    /**
     * Gets the privilege modifier.
     *
     * @return the privilege modifier
     */
    private AclAccessLevelPrivModifierEnum getPrivilegeModifier() {
        if (privilegeModifierEqualRadioButton.getSelection()) {
            return AclAccessLevelPrivModifierEnum.EQUAL;
        } else if (privilegeModifierPlusRadioButton.getSelection()) {
            return AclAccessLevelPrivModifierEnum.PLUS;
        } else if (privilegeModifierMinusRadioButton.getSelection()) {
            return AclAccessLevelPrivModifierEnum.MINUS;
        }

        return null;
    }

    /**
     * Adds privileges.
     */
    private void addPrivileges() {
        // Auth checkbox
        if (privilegeAuthCheckbox.getSelection()) {
            accessLevel.addPrivilege(AclAccessLevelPrivilegeEnum.AUTHENTICATION);
        }

        // Compare checkbox
        if (privilegeCompareCheckbox.getSelection()) {
            accessLevel.addPrivilege(AclAccessLevelPrivilegeEnum.COMPARE);
        }

        // Read checkbox
        if (privilegeReadCheckbox.getSelection()) {
            accessLevel.addPrivilege(AclAccessLevelPrivilegeEnum.READ);
        }

        // Search checkbox
        if (privilegeSearchCheckbox.getSelection()) {
            accessLevel.addPrivilege(AclAccessLevelPrivilegeEnum.SEARCH);
        }

        // Write checkbox
        if (privilegeWriteCheckbox.getSelection()) {
            accessLevel.addPrivilege(AclAccessLevelPrivilegeEnum.WRITE);
        }

    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        //        gd.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 4 / 3;
        //        gd.heightHint = convertVerticalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 4 / 3;
        composite.setLayoutData(gd);

        // Creating UI
        createSelfGroup(composite);
        createLevelAndPrivilegesGroup(composite);

        // Initializing the UI with the access level
        initWithAccessLevel();

        // Adding listeners
        addListeners();

        // Setting default focus on the composite
        composite.setFocus();

        applyDialogFont(composite);
        return composite;
    }

    /**
     * Validates the dialog.
     */
    private void validate() {
        if (levelRadioButton.getSelection()) {
            // Getting the selection of the level combo viewer
            Object levelSelection = ((StructuredSelection) levelComboViewer.getSelection()).getFirstElement();

            // Enabling the OK button only when the selection is a 'real' level
            okButton.setEnabled(levelSelection instanceof AclAccessLevelLevelEnum);
            return;
        } else if (customPrivilegesRadioButton.getSelection()) {
            // Enabling the OK button only when at least one of privileges is checked
            okButton.setEnabled(privilegeAuthCheckbox.getSelection() || privilegeCompareCheckbox.getSelection()
                    || privilegeSearchCheckbox.getSelection() || privilegeReadCheckbox.getSelection()
                    || privilegeWriteCheckbox.getSelection());
            return;
        }

        // Default case
        okButton.setEnabled(true);
    }

    /**
     * Creates the self group.
     *
     * @param parent the parent composite
     */
    private void createSelfGroup(Composite parent) {
        Group selfGroup = BaseWidgetUtils.createGroup(parent, "", 1);
        selfGroup.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Self Checkbox
        selfCheckbox = new Button(selfGroup, SWT.CHECK);
        selfCheckbox.setText("Self"); //$NON-NLS-1$
    }

    /**
     * Creates the level and privileges group.
     *
     * @param parent the parent composite
     */
    private void createLevelAndPrivilegesGroup(Composite parent) {
        // Access level and privileges group
        Group levelAndPrivilegesGroup = BaseWidgetUtils.createGroup(parent, "Access Level and Privilege(s)", 1);
        levelAndPrivilegesGroup.setLayout(new GridLayout(2, false));
        levelAndPrivilegesGroup.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Level label and radio button
        levelRadioButton = BaseWidgetUtils.createRadiobutton(levelAndPrivilegesGroup, "Level:", 1);
        levelComboViewer = new ComboViewer(
                BaseWidgetUtils.createReadonlyCombo(levelAndPrivilegesGroup, new String[0], -1, 1));
        levelComboViewer.setContentProvider(new ArrayContentProvider());
        levelComboViewer.setLabelProvider(new LabelProvider() {
            public String getText(Object element) {
                if (element instanceof AccessLevelComboViewerName) {
                    return "< Access Level >";
                } else if (element instanceof AclAccessLevelLevelEnum) {
                    AclAccessLevelLevelEnum value = (AclAccessLevelLevelEnum) element;
                    switch (value) {
                    case MANAGE:
                        return "Manage";
                    case WRITE:
                        return "Write";
                    case READ:
                        return "Read";
                    case SEARCH:
                        return "Search";
                    case COMPARE:
                        return "Compare";
                    case AUTH:
                        return "Auth";
                    case DISCLOSE:
                        return "Disclose";
                    case NONE:
                        return "None";
                    }
                }

                return super.getText(element);
            }
        });
        levelComboViewer.setInput(levels);
        //        levelComboViewer.setSelection( new StructuredSelection( currentClauseSelection ) ); TODO

        // Custom privileges radio button
        customPrivilegesRadioButton = BaseWidgetUtils.createRadiobutton(levelAndPrivilegesGroup,
                "Custom Privilege(s):", 2);

        // Custom privileges composite
        Composite privilegesTabComposite = BaseWidgetUtils.createColumnContainer(levelAndPrivilegesGroup, 2, 2);

        // Custom privileges modifier group
        createRadioIndent(privilegesTabComposite);
        Group modifierGroup = BaseWidgetUtils.createGroup(privilegesTabComposite, "Modifier", 1);
        modifierGroup.setLayout(new GridLayout(3, true));
        modifierGroup.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Custom privileges modifier radio buttons
        privilegeModifierEqualRadioButton = BaseWidgetUtils.createRadiobutton(modifierGroup, "Equal (=)", 1);
        privilegeModifierEqualRadioButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeModifierPlusRadioButton = BaseWidgetUtils.createRadiobutton(modifierGroup, "Add (+)", 1);
        privilegeModifierPlusRadioButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeModifierMinusRadioButton = BaseWidgetUtils.createRadiobutton(modifierGroup, "Delete (-)", 1);
        privilegeModifierMinusRadioButton.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Custom privileges group
        createRadioIndent(privilegesTabComposite);
        Group privilegesGroup = BaseWidgetUtils.createGroup(privilegesTabComposite, "Privileges", 1);
        privilegesGroup.setLayout(new GridLayout(3, true));
        privilegesGroup.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        // Custom privileges checkboxes
        privilegeAuthCheckbox = BaseWidgetUtils.createCheckbox(privilegesGroup, "Auth", 1);
        privilegeAuthCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeCompareCheckbox = BaseWidgetUtils.createCheckbox(privilegesGroup, "Compare", 1);
        privilegeCompareCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeSearchCheckbox = BaseWidgetUtils.createCheckbox(privilegesGroup, "Search", 1);
        privilegeSearchCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeReadCheckbox = BaseWidgetUtils.createCheckbox(privilegesGroup, "Read", 1);
        privilegeReadCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        privilegeWriteCheckbox = BaseWidgetUtils.createCheckbox(privilegesGroup, "Write", 1);
        privilegeWriteCheckbox.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
    }

    /**
     * Adds some space to indent radio buttons.
     *
     * @param parent the parent
     * @param span the horizontal span
     */
    public static void createRadioIndent(Composite parent) {
        Label l = new Label(parent, SWT.NONE);
        GridData gd = new GridData();
        gd.horizontalIndent = 10;
        l.setLayoutData(gd);
    }

    private void initWithAccessLevel() {
        // Creating a boolean to indicate if the level is used (rather than the privileges)
        boolean isLevelUsed = true;

        if (accessLevel == null) {
            // Access level can't be null, creating a new one
            accessLevel = new AclAccessLevel();
        }

        // Self
        selfCheckbox.setSelection(accessLevel.isSelf());

        // Level
        AclAccessLevelLevelEnum level = accessLevel.getLevel();
        if (level != null) {
            levelComboViewer.setSelection(new StructuredSelection(level));
        } else {
            // Default
            levelComboViewer.setSelection(new StructuredSelection(levels[0]));
        }

        // Privilege Modifier
        AclAccessLevelPrivModifierEnum privilegeModifier = accessLevel.getPrivilegeModifier();
        if (privilegeModifier != null) {
            // Level is not used in that case
            isLevelUsed = false;

            privilegeModifierEqualRadioButton
                    .setSelection(AclAccessLevelPrivModifierEnum.EQUAL.equals(privilegeModifier));
            privilegeModifierPlusRadioButton
                    .setSelection(AclAccessLevelPrivModifierEnum.PLUS.equals(privilegeModifier));
            privilegeModifierMinusRadioButton
                    .setSelection(AclAccessLevelPrivModifierEnum.MINUS.equals(privilegeModifier));
        } else {
            // Default
            privilegeModifierEqualRadioButton.setSelection(true);
            privilegeModifierPlusRadioButton.setSelection(false);
            privilegeModifierMinusRadioButton.setSelection(false);
        }

        // Privileges
        List<AclAccessLevelPrivilegeEnum> privileges = accessLevel.getPrivileges();
        privilegeAuthCheckbox.setSelection(privileges.contains(AclAccessLevelPrivilegeEnum.AUTHENTICATION));
        privilegeCompareCheckbox.setSelection(privileges.contains(AclAccessLevelPrivilegeEnum.COMPARE));
        privilegeSearchCheckbox.setSelection(privileges.contains(AclAccessLevelPrivilegeEnum.SEARCH));
        privilegeReadCheckbox.setSelection(privileges.contains(AclAccessLevelPrivilegeEnum.READ));
        privilegeWriteCheckbox.setSelection(privileges.contains(AclAccessLevelPrivilegeEnum.WRITE));

        // Setting choice buttons
        levelRadioButton.setSelection(isLevelUsed);
        customPrivilegesRadioButton.setSelection(!isLevelUsed);

        // Setting the enable/disable state for buttons
        setButtonsEnableDisableState();
    }

    /**
     * Sets the enable/disable state for buttons
     */
    private void setButtonsEnableDisableState() {
        boolean isLevelUsed = levelRadioButton.getSelection();

        levelComboViewer.getCombo().setEnabled(isLevelUsed);
        privilegeModifierEqualRadioButton.setEnabled(!isLevelUsed);
        privilegeModifierPlusRadioButton.setEnabled(!isLevelUsed);
        privilegeModifierMinusRadioButton.setEnabled(!isLevelUsed);
        privilegeAuthCheckbox.setEnabled(!isLevelUsed);
        privilegeCompareCheckbox.setEnabled(!isLevelUsed);
        privilegeSearchCheckbox.setEnabled(!isLevelUsed);
        privilegeReadCheckbox.setEnabled(!isLevelUsed);
        privilegeWriteCheckbox.setEnabled(!isLevelUsed);
    }

    /**
     * Adds listeners to the UI widgets.
     */
    private void addListeners() {
        // Level and custom privileges radio buttons
        SelectionAdapter enableDisableStateAndValidateSelectionAdapter = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                setButtonsEnableDisableState();
                validate();
            }
        };
        levelRadioButton.addSelectionListener(enableDisableStateAndValidateSelectionAdapter);
        customPrivilegesRadioButton.addSelectionListener(enableDisableStateAndValidateSelectionAdapter);

        // Level combo viewer
        levelComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                validate();
            }
        });

        // Privilege modifier and privileges radio buttons
        SelectionAdapter validateSelectionAdapter = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                validate();
            }
        };
        privilegeModifierEqualRadioButton.addSelectionListener(validateSelectionAdapter);
        privilegeModifierPlusRadioButton.addSelectionListener(validateSelectionAdapter);
        privilegeModifierMinusRadioButton.addSelectionListener(validateSelectionAdapter);
        privilegeAuthCheckbox.addSelectionListener(validateSelectionAdapter);
        privilegeCompareCheckbox.addSelectionListener(validateSelectionAdapter);
        privilegeSearchCheckbox.addSelectionListener(validateSelectionAdapter);
        privilegeReadCheckbox.addSelectionListener(validateSelectionAdapter);
        privilegeWriteCheckbox.addSelectionListener(validateSelectionAdapter);
    }

    /**
     * Gets the ACL Access Level value.
     * 
     * @return the ACL Access Level value
     */
    public AclAccessLevel getAccessLevel() {
        return accessLevel;
    }

    /**
     * A private object for the first row of the access level combo viewer.
     */
    private class AccessLevelComboViewerName {
    }
}