org.eclipse.cft.server.ui.internal.wizards.ConnectSsoServerDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cft.server.ui.internal.wizards.ConnectSsoServerDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2016 Pivotal Software, Inc.  and others
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * 
 * The Eclipse Public License is available at 
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * and the Apache License v2.0 is available at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * You may elect to redistribute this code under either of these licenses.
 *
 *  Contributors:
 *     Pivotal Software, Inc. - initial API and implementation
 ********************************************************************************/
package org.eclipse.cft.server.ui.internal.wizards;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.cft.server.core.internal.CloudFoundryServer;
import org.eclipse.cft.server.core.internal.client.CloudFoundryClientFactory;
import org.eclipse.cft.server.ui.internal.CFUiUtil;
import org.eclipse.cft.server.ui.internal.CloudFoundryServerUiPlugin;
import org.eclipse.cft.server.ui.internal.Messages;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.browser.WebBrowserPreference;
import org.eclipse.wst.server.core.IServerWorkingCopy;

/**
 * A dialog for connecting to a sso server
 */
@SuppressWarnings("restriction")
public class ConnectSsoServerDialog extends Dialog {
    /**
     * Passcode text widget.
     */
    private Text passcodeText;

    /**
     * Error message label widget.
     */
    private Text errorMessageText;

    /**
     * Error message string.
     */
    private String errorMessage;

    private CloudFoundryServer cloudServer;

    public ConnectSsoServerDialog(Shell shell, CloudFoundryServer cloudServer) {
        super(shell);
        this.cloudServer = cloudServer;
    }

    private boolean connectionSuccess = false;

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected void buttonPressed(int buttonId) {
        if (buttonId == IDialogConstants.OK_ID) {
            final ConnectThread ct = new ConnectThread(cloudServer, passcodeText.getText());

            getShell().setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_WAIT));
            SafeRunner.run(new SafeRunnable() {
                public void run() throws Exception {
                    IServerWorkingCopy server = cloudServer.getServerWorkingCopy();
                    if (server == null) {
                        server = cloudServer.getServer().createWorkingCopy();
                        cloudServer.getBehaviour();
                    }
                    server.setAttribute(CloudFoundryServer.PROP_PASSCODE_ID, passcodeText.getText());
                    server.save(true, new NullProgressMonitor());

                    ct.start();

                    // Wait for thread to complete w/o blocking the UI thread.
                    ProgressMonitorDialog dialog = new ProgressMonitorDialog(
                            PlatformUI.getWorkbench().getDisplay().getActiveShell());
                    dialog.run(true, true, new IRunnableWithProgress() {

                        @Override
                        public void run(IProgressMonitor monitor)
                                throws InvocationTargetException, InterruptedException {
                            while (!monitor.isCanceled() && !ct.isJobComplete()) {
                                Thread.sleep(100);
                            }
                        }
                    });

                    CoreException exception = ct.getException();
                    if (exception != null) {
                        if (exception.getMessage() != null) {
                            setErrorMessage(exception.getMessage());
                        }
                        CloudFoundryServerUiPlugin.logError(exception);
                    }
                }

                @Override
                public void handleException(Throwable e) {
                    setErrorMessage(e.getMessage());
                    CloudFoundryServerUiPlugin.logError(e);
                }
            });
            getShell().setCursor(null);
            if (ct.isConnected()) {
                connectionSuccess = true;
                super.buttonPressed(buttonId);
            }
        } else {
            super.buttonPressed(buttonId);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets
     * .Shell)
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.ConnectSsoServerDialog_CONNECT_TITLE);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse
     * .swt.widgets.Composite)
     */
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, Messages.ConnectSsoServerDialog_CONNECT_BUTTON, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
        passcodeText.setFocus();
        String value = cloudServer.getPasscode();
        if (value != null) {
            passcodeText.setText(value);
            passcodeText.selectAll();
        }
    }

    /*
     * (non-Javadoc) Method declared on Dialog.
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        composite.setLayout(new GridLayout(2, false));
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        GridData gd;
        Link prompt = new Link(composite, SWT.LEFT | SWT.WRAP);
        gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        gd.horizontalSpan = 2;
        prompt.setLayoutData(gd);
        String ssoUrl = CFUiUtil.getPromptText(cloudServer);
        prompt.setText(ssoUrl);
        prompt.addListener(SWT.Selection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                if (cloudServer.getUrl() != null && !cloudServer.getUrl().isEmpty()) {
                    try {
                        String url = CloudFoundryClientFactory.getSsoUrl(cloudServer.getUrl(),
                                cloudServer.isSelfSigned());
                        CFUiUtil.openUrl(url, WebBrowserPreference.EXTERNAL);
                    } catch (Exception e) {
                        CloudFoundryServerUiPlugin.logError(e);
                    }
                }
            }
        });
        Label passcodeLabel = new Label(composite, SWT.NONE);
        passcodeLabel.setText(Messages.LABEL_PASSCODE);
        gd = new GridData(SWT.FILL, SWT.CENTER, false, false);
        passcodeLabel.setLayoutData(gd);

        passcodeText = new Text(composite, SWT.BORDER | SWT.PASSWORD);
        gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        passcodeText.setLayoutData(gd);
        passcodeText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                validateInput();
            }
        });

        errorMessageText = new Text(composite, SWT.READ_ONLY | SWT.WRAP);
        gd = new GridData(SWT.FILL, SWT.FILL, true, false);
        gd.horizontalSpan = 2;
        errorMessageText.setLayoutData(gd);
        errorMessageText.setBackground(errorMessageText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
        setErrorMessage(errorMessage);

        applyDialogFont(composite);
        return composite;
    }

    /**
     * Validates the input.
     */
    protected void validateInput() {
        String errorMessage = null;
        if (passcodeText.getText().isEmpty()) {
            errorMessage = Messages.ConnectSsoServerDialog_Passcode_is_required;
        }
        setErrorMessage(errorMessage);
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
        if (errorMessageText != null && !errorMessageText.isDisposed()) {
            errorMessageText.setText(errorMessage == null ? " \n " : errorMessage); //$NON-NLS-1$
            boolean hasError = errorMessage != null
                    && (StringConverter.removeWhiteSpaces(errorMessage)).length() > 0;
            errorMessageText.setEnabled(hasError);
            errorMessageText.setVisible(hasError);
            errorMessageText.getParent().update();
            Control button = getButton(IDialogConstants.OK_ID);
            if (button != null) {
                button.setEnabled(errorMessage == null);
            }
        }
    }

    private static class ConnectThread extends Thread {

        final CloudFoundryServer cloudServer;
        final String passcodeTxt;

        boolean connectResult = false;

        boolean jobComplete = false;

        CoreException exception;

        public ConnectThread(CloudFoundryServer cloudServer, String passcodeTxt) {

            this.cloudServer = cloudServer;
            this.passcodeTxt = passcodeTxt;
        }

        public void run() {
            try {
                boolean result = cloudServer.getBehaviour().regenerateSsoLogin(passcodeTxt,
                        new NullProgressMonitor());

                if (result) {
                    RefreshServerJob refreshJob = new RefreshServerJob(cloudServer);
                    refreshJob.setPriority(Job.SHORT);
                    refreshJob.schedule();
                    connectResult = true;
                }

            } catch (CoreException e) {
                e.printStackTrace();
                exception = e;
                return;
            } finally {
                jobComplete = true;
            }

            return;

        }

        public boolean isConnected() {
            return connectResult;
        }

        public boolean isJobComplete() {
            return jobComplete;
        }

        public CoreException getException() {
            return exception;
        }
    }

    private static class RefreshServerJob extends Job {

        final CloudFoundryServer cloudServer;

        public RefreshServerJob(CloudFoundryServer cloudServer) {
            super(Messages.ConnectCommand_JOB_CONN_SERVER);
            setSystem(false);
            setUser(true);
            this.cloudServer = cloudServer;
        }

        @Override
        protected IStatus run(IProgressMonitor monitor) {
            try {
                cloudServer.getBehaviour().connect(monitor);

                return Status.OK_STATUS;

            } catch (CoreException e) {
                e.printStackTrace();
                return e.getStatus();
            }

        }

    }

    public boolean isConnectionSuccess() {
        return connectionSuccess;
    }
}