eu.geclipse.ui.dialogs.AccessControlRuleDialog.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.ui.dialogs.AccessControlRuleDialog.java

Source

/*****************************************************************************
 * Copyright (c) 2008 g-Eclipse Consortium 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Initial development of the original code was made for the
 * g-Eclipse project founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributors:
 *    Ariel Garcia - initial API and implementation
 *****************************************************************************/

package eu.geclipse.ui.dialogs;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.ImageDescriptor;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import eu.geclipse.core.accesscontrol.ActorType;
import eu.geclipse.core.accesscontrol.IACLActor;
import eu.geclipse.core.accesscontrol.IACLCapability;
import eu.geclipse.core.accesscontrol.IACLEntry;
import eu.geclipse.core.accesscontrol.IACLPolicy;
import eu.geclipse.ui.internal.Activator;
import eu.geclipse.ui.widgets.StoredCombo;

/**
 * Dialog for editing single ACL entries {@link IACLEntry}.
 * 
 * @author agarcia
 */
public class AccessControlRuleDialog extends Dialog {

    /** If <code>true</code> the "OK" button will be relabeled "Save" */
    boolean withSaveButton;

    /* Dialog widgets */
    Combo actorTypeCombo;

    private Group entryGroup;
    private Combo policyCombo;
    private Combo capCombo;

    private CertificateComposite actorDNCertComposite;
    private CertificateComposite actorCACertComposite;
    private FieldComposite groupNameComposite;
    private FieldComposite userNameComposite;
    private FieldComposite userEmailComposite;
    private SAMLComposite samlComposite;

    /** The ACL entry to edit */
    private IACLEntry entry;

    /** The old value of actor type, for updating the dialog correctly */
    private ActorType type;

    /**
     * The constructor.
     * 
     * @param entry the {@link IACLEntry} to edit.
     * @param withSaveButton display a "Save" button instead of the "OK" one.
     *        To be used in the case single ACL entries must be saved separately.
     * @param parentShell the parent shell.
     */
    protected AccessControlRuleDialog(final IACLEntry entry, final boolean withSaveButton,
            final Shell parentShell) {
        super(parentShell);
        setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE | SWT.MIN | SWT.MAX);

        this.withSaveButton = withSaveButton;
        this.entry = entry;
        this.type = this.entry.getActor().getActorType();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public Control createDialogArea(final Composite parent) {

        GridData gData;

        Composite mainComp = new Composite(parent, SWT.NONE);
        mainComp.setLayout(new GridLayout(1, false));
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        mainComp.setLayoutData(gData);

        this.entryGroup = new Group(mainComp, SWT.NONE);
        this.entryGroup.setLayout(new GridLayout(2, false));
        this.entryGroup.setText(Messages.getString("AccessControlRuleDialog.group_title")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gData.heightHint = 260;
        gData.widthHint = 500;
        this.entryGroup.setLayoutData(gData);

        createDialogWidgets(this.entryGroup);

        // Fill in the policy data
        List<String> policyNames = new ArrayList<String>(5);
        IACLPolicy[] policies = this.entry.getSupportedPolicies();
        for (IACLPolicy policy : policies) {
            String name = policy.toString();
            policyNames.add(name != null ? name : ""); //$NON-NLS-1$
        }
        this.policyCombo.setItems(policyNames.toArray(new String[policyNames.size()]));
        IACLPolicy policy = this.entry.getPolicy();
        if (policy != null) {
            this.policyCombo.select(this.policyCombo.indexOf(policy.toString()));
        }

        // Fill in the capability data
        List<String> capNames = new ArrayList<String>(5);
        IACLCapability[] capabilities = this.entry.getSupportedCapabilities();
        for (IACLCapability capability : capabilities) {
            String name = capability.getName();
            capNames.add(name != null ? name : ""); //$NON-NLS-1$
        }
        this.capCombo.setItems(capNames.toArray(new String[capNames.size()]));
        IACLCapability capability = this.entry.getCapability();
        if (capability != null) {
            this.capCombo.select(this.capCombo.indexOf(capability.getName()));
        }

        // Fill in the actor type data
        List<String> aTypeNames = new ArrayList<String>(5);
        IACLActor actor = this.entry.getActor();
        assert actor != null : "Null actor in ACL entry: implementation BUG."; //$NON-NLS-1$
        ActorType[] aTypes = actor.getSupportedTypes();
        for (ActorType aType : aTypes) {
            String name = aType.getName();
            aTypeNames.add(name != null ? name : ""); //$NON-NLS-1$
        }
        this.actorTypeCombo.setItems(aTypeNames.toArray(new String[aTypeNames.size()]));

        ActorType aType = actor.getActorType();
        int index = this.actorTypeCombo.indexOf(aType.getName());
        this.actorTypeCombo.select(index);

        updateDialogContents(aType);

        return mainComp;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    @Override
    protected void configureShell(final Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.getString("AccessControlRuleDialog.dialog_title")); //$NON-NLS-1$
    }

    /**
     * Create the dialog buttons. We override the superclass' method to be able
     * to modify the OK button label if each entry has to be saved individually.
     */
    @Override
    protected void createButtonsForButtonBar(final Composite parent) {

        // We change just the label of the OK button
        String buttonText = null;
        if (this.withSaveButton) {
            buttonText = Messages.getString("AccessControlRuleDialog.save_button_text"); //$NON-NLS-1$
        } else {
            buttonText = IDialogConstants.OK_LABEL;
        }

        // TODO reenable when write support is available
        Button button;
        button = createButton(parent, IDialogConstants.OK_ID, buttonText, true);
        button.setEnabled(false);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Helper method to create all the dialog widgets.
     */
    private void createDialogWidgets(final Composite group) {

        GridData gData;

        // The policy widgets
        Label policyLabel = new Label(group, SWT.LEAD);
        gData = new GridData(SWT.LEAD, SWT.CENTER, false, false);
        policyLabel.setLayoutData(gData);
        policyLabel.setText(Messages.getString("AccessControlRuleDialog.policy_label")); //$NON-NLS-1$

        this.policyCombo = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.LEAD);
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        this.policyCombo.setLayoutData(gData);

        // The capability widgets
        Label capLabel = new Label(group, SWT.LEAD);
        gData = new GridData(SWT.LEAD, SWT.CENTER, false, false);
        capLabel.setLayoutData(gData);
        capLabel.setText(Messages.getString("AccessControlRuleDialog.capability_label")); //$NON-NLS-1$

        this.capCombo = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.LEAD);
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        this.capCombo.setLayoutData(gData);

        // The actor type widgets
        Label actorTypeLabel = new Label(group, SWT.LEAD);
        gData = new GridData(SWT.LEAD, SWT.CENTER, false, false);
        actorTypeLabel.setLayoutData(gData);
        actorTypeLabel.setText(Messages.getString("AccessControlRuleDialog.actor_type_label")); //$NON-NLS-1$

        this.actorTypeCombo = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN | SWT.LEAD);
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        this.actorTypeCombo.setLayoutData(gData);
        this.actorTypeCombo.addModifyListener(new ModifyListener() {

            public void modifyText(final ModifyEvent e) {
                ActorType aType = getSelectedActorType(AccessControlRuleDialog.this.actorTypeCombo.getText());
                updateDialogContents(aType);
            }
        });

        // The actor DN composite
        this.actorDNCertComposite = new CertificateComposite(this.entryGroup,
                Messages.getString("AccessControlRuleDialog.actor_DN_label")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        this.actorDNCertComposite.setLayoutData(gData);
        setVisibility(this.actorDNCertComposite, false);

        // The actor CA composite
        this.actorCACertComposite = new CertificateComposite(this.entryGroup,
                Messages.getString("AccessControlRuleDialog.signing_CA_label")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        this.actorCACertComposite.setLayoutData(gData);
        setVisibility(this.actorCACertComposite, false);

        // The group composite
        this.groupNameComposite = new FieldComposite(this.entryGroup,
                Messages.getString("AccessControlRuleDialog.group_name_label")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        this.groupNameComposite.setLayoutData(gData);
        setVisibility(this.groupNameComposite, false);

        // The user composite
        this.userNameComposite = new FieldComposite(this.entryGroup,
                Messages.getString("AccessControlRuleDialog.user_name_label")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        this.userNameComposite.setLayoutData(gData);
        setVisibility(this.userNameComposite, false);

        // The user email composite
        this.userEmailComposite = new FieldComposite(this.entryGroup,
                Messages.getString("AccessControlRuleDialog.user_email_label")); //$NON-NLS-1$
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        this.userEmailComposite.setLayoutData(gData);
        setVisibility(this.userEmailComposite, false);

        // The SAML composite
        this.samlComposite = new SAMLComposite(this.entryGroup);
        gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        gData.horizontalSpan = 2;
        gData.exclude = true;
        this.samlComposite.setLayoutData(gData);
        setVisibility(this.samlComposite, false);

    }

    /**
     * Helper method to update the dialog widgets when the actor type is changed.
     */
    void updateDialogContents(final ActorType newType) {

        // Fill in the actor DN data
        String actorID = this.entry.getActor().getID();
        this.actorDNCertComposite.setDN(actorID != null ? actorID : ""); //$NON-NLS-1$

        // Fill in the actor CA data
        String actorCA = this.entry.getActor().getCA();
        this.actorCACertComposite.setDN(actorCA != null ? actorCA : ""); //$NON-NLS-1$

        // Make the old widgets invisible
        if (this.type.equals(ActorType.ANYBODY)) {
            // Nothing to do
        } else if (this.type.equals(ActorType.CA_ANY_DN_ANY)) {
            // Nothing to do
        } else if (this.type.equals(ActorType.CA_NAME_DN_ANY)) {
            setVisibility(this.actorCACertComposite, false);
        } else if (this.type.equals(ActorType.CA_NAME_DN_PATTERN)) {
            //
        } else if (this.type.equals(ActorType.CA_NAME_DN_NAME)) {
            setVisibility(this.actorDNCertComposite, false);
            setVisibility(this.actorCACertComposite, false);
        } else if (this.type.equals(ActorType.GROUP_PATTERN)) {
            //
        } else if (this.type.equals(ActorType.GROUP_NAME)) {
            setVisibility(this.groupNameComposite, false);
        } else if (this.type.equals(ActorType.USER_PATTERN)) {
            //
        } else if (this.type.equals(ActorType.USER_NAME)) {
            setVisibility(this.userNameComposite, false);
        } else if (this.type.equals(ActorType.USER_EMAIL)) {
            setVisibility(this.userEmailComposite, false);
        } else if (this.type.equals(ActorType.SAML_ATTRIBUTE)) {
            setVisibility(this.samlComposite, false);
        }

        // Make the right widgets visible
        if (newType.equals(ActorType.ANYBODY)) {
            // Nothing to do
        } else if (newType.equals(ActorType.CA_ANY_DN_ANY)) {
            // Nothing to do
        } else if (newType.equals(ActorType.CA_NAME_DN_ANY)) {
            setVisibility(this.actorCACertComposite, true);
        } else if (newType.equals(ActorType.CA_NAME_DN_PATTERN)) {
            //
        } else if (newType.equals(ActorType.CA_NAME_DN_NAME)) {
            setVisibility(this.actorDNCertComposite, true);
            setVisibility(this.actorCACertComposite, true);
        } else if (newType.equals(ActorType.GROUP_PATTERN)) {
            //
        } else if (newType.equals(ActorType.GROUP_NAME)) {
            setVisibility(this.groupNameComposite, true);
        } else if (newType.equals(ActorType.USER_PATTERN)) {
            //
        } else if (newType.equals(ActorType.USER_NAME)) {
            setVisibility(this.userNameComposite, true);
        } else if (newType.equals(ActorType.USER_EMAIL)) {
            setVisibility(this.userEmailComposite, true);
        } else if (newType.equals(ActorType.SAML_ATTRIBUTE)) {
            setVisibility(this.samlComposite, true);
        }

        //    this.actorDNText.setText();
        //    this.actorCAText.setText();

        this.type = newType;
        this.entryGroup.layout();
    }

    /**
     * Helper method to hide or make visible a control.
     */
    private void setVisibility(final Control control, final boolean visible) {
        control.setVisible(visible);
        ((GridData) control.getLayoutData()).exclude = !visible;
    }

    /**
     * Helper method to get the selected actorType. May return null if
     * the selected type was not found.
     */
    ActorType getSelectedActorType(final String selectedItem) {

        ActorType result = null;

        IACLActor actor = this.entry.getActor();
        ActorType[] aTypes = actor.getSupportedTypes();
        for (ActorType aType : aTypes) {
            String name = aType.getName();
            if (name.equals(selectedItem)) {
                result = aType;
                break;
            }
        }

        return result;
    }

    /**
     * SelectionAdapter used for opening the <code>GridFileDialog</code> when
     * selecting a certificate file.
     */
    class CertFileSelectionAdapter extends SelectionAdapter {

        private Combo widget;

        /**
         * Constructs a SelectionAdapter for a given combo widget.
         * 
         * @param widget the combo widget where the filename is stored.
         */
        public CertFileSelectionAdapter(final Combo widget) {
            super();
            this.widget = widget;
        }

        @Override
        public void widgetSelected(final SelectionEvent e) {
            String filename = this.widget.getText();
            filename = showFileDialog(filename, Messages.getString("AccessControlRuleDialog.file_dialog_title")); //$NON-NLS-1$ );
            if (filename != null) {
                this.widget.setText(filename);
            }
        }
    }

    /**
     * Show a dialog for selecting a file.
     * 
     * @param path the initial path to be set on the dialog.
     * @param title the title of the dialog window.
     * @return the chosen file or <code>null</code> if "Cancel" was pressed.
     */
    protected String showFileDialog(final String path, final String title) {
        String[] filterExtensions = { "*.pem", "*.p12", "*;*.*" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        String[] filterNames = { "Base64 encoded certificate", //$NON-NLS-1$
                "PKCS#12 encoded certificate", //$NON-NLS-1$
                "All Files" }; //$NON-NLS-1$
        FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN | SWT.SINGLE);
        fileDialog.setFilterExtensions(filterExtensions);
        fileDialog.setFilterNames(filterNames);
        fileDialog.setFileName(path);
        fileDialog.setText(title);
        String selected = fileDialog.open();
        return selected;
    }

    /**
     * A composite holding all the widgets necessary for displaying or entering
     * a certificate.
     */
    class CertificateComposite extends Composite {

        /** The text field displaying the certificate DN */
        private Text dnText;

        /** The combo-box for selecting the certificate file */
        private StoredCombo certFileCombo;

        /**
         * Constructs a certificate composite with the given parent.
         * 
         * @param parent the parent composite where this collection of widgets should live.
         * @param label a string used as a label for the field.
         */
        CertificateComposite(final Composite parent, final String label) {

            super(parent, SWT.NONE);
            this.setLayout(new GridLayout(2, false));

            GridData gData;

            URL openFileIcon = Activator.getDefault().getBundle().getEntry("icons/obj16/open_file.gif"); //$NON-NLS-1$
            Image openFileImage = ImageDescriptor.createFromURL(openFileIcon).createImage();

            // The certificate DN widgets
            Label dnLabel = new Label(this, SWT.LEAD);
            gData = new GridData(SWT.LEAD, SWT.CENTER, false, false);
            dnLabel.setLayoutData(gData);
            dnLabel.setText(label);

            this.dnText = new Text(this, SWT.READ_ONLY | SWT.LEAD);
            gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
            this.dnText.setLayoutData(gData);

            // The certificate file widgets
            Label certFileLabel = new Label(this, SWT.TRAIL);
            gData = new GridData(SWT.FILL, SWT.CENTER, false, false);
            certFileLabel.setLayoutData(gData);
            certFileLabel.setText(Messages.getString("AccessControlRuleDialog.dn_file_label")); //$NON-NLS-1$

            Composite dnComp = new Composite(this, SWT.NONE);
            dnComp.setLayout(new GridLayout(2, false));
            gData = new GridData(SWT.FILL, SWT.FILL, true, false);
            dnComp.setLayoutData(gData);

            this.certFileCombo = new StoredCombo(dnComp, SWT.DROP_DOWN | SWT.LEAD);
            gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
            this.certFileCombo.setLayoutData(gData);

            Button dnFileButton = new Button(dnComp, SWT.PUSH);
            dnFileButton.setImage(openFileImage);
            gData = new GridData();
            dnFileButton.setLayoutData(gData);
            dnFileButton.setToolTipText(Messages.getString("AccessControlRuleDialog.dn_file_button_tooltip")); //$NON-NLS-1$
            dnFileButton.addSelectionListener(new CertFileSelectionAdapter(this.certFileCombo));
        }

        /**
         * Sets the content of the text widget displaying the certificate's DN.
         * 
         * @param text the text string to set.
         */
        void setDN(final String text) {
            this.dnText.setText(text);
        }

        /**
         * Returns the content of certificate file combo-box.
         * 
         * @return the path of the certificate file which was selected by the user.
         */
        String getCertificateFile() {
            return this.certFileCombo.getText();
        }

    }

    /**
     * A composite holding a label and a combo-box for entering text.
     */
    class FieldComposite extends Composite {

        /** The combo-box for entering the data */
        private StoredCombo combo;

        /**
         * Constructs a composite for entering data, with the given parent.
         * 
         * @param parent the parent composite where this collection of widgets should live.
         * @param label a string used as a label for the field.
         */
        FieldComposite(final Composite parent, final String label) {

            super(parent, SWT.NONE);
            this.setLayout(new GridLayout(2, false));

            GridData gData;

            Label dnLabel = new Label(this, SWT.LEAD);
            gData = new GridData(SWT.LEAD, SWT.CENTER, false, false);
            dnLabel.setLayoutData(gData);
            dnLabel.setText(label);

            this.combo = new StoredCombo(this, SWT.DROP_DOWN | SWT.LEAD);
            gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
            this.combo.setLayoutData(gData);
        }

        /**
         * Sets the content of the data field.
         * 
         * @param text the text string to set.
         */
        void setText(final String text) {
            this.combo.setText(text);
        }

        /**
         * Returns the content of the combo-box.
         * 
         * @return the text entered by the user.
         */
        String getText() {
            return this.combo.getText();
        }

    }

    /**
     * A composite holding the widgets necessary for entering a SAML attribute.
     */
    class SAMLComposite extends Composite {

        /** The SAML attribute composite. */
        private FieldComposite samlAttr;

        /** The SAML value composite. */
        private FieldComposite samlValue;

        /**
         * Constructs a composite for a SAML attribute, with the given parent.
         * 
         * @param parent the parent composite where this collection of widgets should live.
         */
        SAMLComposite(final Composite parent) {

            super(parent, SWT.NONE);
            this.setLayout(new GridLayout(1, false));

            GridData gData;

            this.samlAttr = new FieldComposite(this,
                    Messages.getString("AccessControlRuleDialog.SAML_attribute_label")); //$NON-NLS-1$
            gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
            this.samlAttr.setLayoutData(gData);

            this.samlValue = new FieldComposite(this,
                    Messages.getString("AccessControlRuleDialog.SAML_value_label")); //$NON-NLS-1$
            gData = new GridData(SWT.FILL, SWT.CENTER, true, false);
            this.samlValue.setLayoutData(gData);
        }

        /**
         * Sets the SAML attribute field.
         * 
         * @param attr the attribute to set.
         */
        void setAttribute(final String attr) {
            this.samlAttr.setText(attr);
        }

        /**
         * Sets the SAML value field.
         * 
         * @param value the attribute value to set.
         */
        void setValue(final String value) {
            this.samlValue.setText(value);
        }

        /**
         * Returns the SAML attribute field.
         * 
         * @return the attribute entered by the user.
         */
        String getAttribute() {
            return this.samlAttr.getText();
        }

        /**
         * Returns the SAML attribute value field.
         * 
         * @return the attribute value entered by the user.
         */
        String getValue() {
            return this.samlValue.getText();
        }

    }

}