org.zend.php.zendserver.deployment.ui.openshift.OpenShiftCompositeFragment.java Source code

Java tutorial

Introduction

Here is the source code for org.zend.php.zendserver.deployment.ui.openshift.OpenShiftCompositeFragment.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Zend Technologies.
 * All rights reserved. This program and the accompanying materials
 * are the copyright of Zend Technologies and is protected under
 * copyright laws of the United States.
 * You must not copy, adapt or redistribute this document for 
 * any use.
 *******************************************************************************/
package org.zend.php.zendserver.deployment.ui.openshift;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.server.core.manager.ServersManager;
import org.eclipse.php.internal.ui.wizards.IControlHandler;
import org.eclipse.php.server.ui.types.IServerType;
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.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.zend.php.server.ui.types.OpenShiftServerType;
import org.zend.php.zendserver.deployment.core.targets.EclipseApiKeyDetector;
import org.zend.php.zendserver.deployment.core.targets.EclipseSSH2Settings;
import org.zend.php.zendserver.deployment.core.targets.JSCHPubKeyDecryptor;
import org.zend.php.zendserver.deployment.core.targets.TargetsManagerService;
import org.zend.php.zendserver.deployment.core.tunnel.SSHTunnelConfiguration;
import org.zend.php.zendserver.deployment.ui.Activator;
import org.zend.php.zendserver.deployment.ui.servers.AbstractCloudCompositeFragment;
import org.zend.php.zendserver.deployment.ui.servers.TargetConnectionTester;
import org.zend.php.zendserver.deployment.ui.wizards.OpenShiftTargetData;
import org.zend.php.zendserver.deployment.ui.wizards.OpenShiftTargetWizard;
import org.zend.php.zendserver.deployment.ui.wizards.OpenShiftTargetWizardDialog;
import org.zend.sdklib.SdkException;
import org.zend.sdklib.internal.target.OpenShiftTarget;
import org.zend.sdklib.internal.target.PublicKeyNotFoundException;
import org.zend.sdklib.internal.target.ZendDevCloud;
import org.zend.sdklib.internal.target.ZendTarget;
import org.zend.sdklib.manager.TargetException;
import org.zend.sdklib.manager.TargetsManager;
import org.zend.sdklib.target.IZendTarget;
import org.zend.sdklib.target.LicenseExpiredException;

/**
 * @author Wojciech Galanciak, 2014
 * 
 */
@SuppressWarnings("restriction")
public class OpenShiftCompositeFragment extends AbstractCloudCompositeFragment {

    public static String ID = "org.zend.php.zendserver.deployment.ui.preferences.PhpcloudCompositeFragment"; //$NON-NLS-1$

    private static final String RESTORE_PASSWORD_URL = "https://openshift.redhat.com/app/account/password/new"; //$NON-NLS-1$
    private static final String CREATE_ACCOUNT_URL = "https://openshift.redhat.com/app/account/new"; //$NON-NLS-1$

    private static final String GENERATED_KEY_FILENAME = "openshift"; //$NON-NLS-1$

    private Text usernameText;
    private Text passwordText;
    private Text privateKeyText;

    private String username;
    private String password;
    private String privateKey;

    public OpenShiftCompositeFragment(Composite parent, IControlHandler handler, boolean isForEditing) {
        super(parent, handler, isForEditing, Messages.OpenShiftCompositeFragment_Title,
                Messages.OpenShiftCompositeFragment_Desc);
    }

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public void validate() {
        if (usernameText != null && usernameText.getText().trim().isEmpty()) {
            setMessage(Messages.OpenShiftCompositeFragment_EmptyUsernameError, IMessageProvider.ERROR);
            return;
        }
        if (passwordText != null && passwordText.getText().trim().isEmpty()) {
            setMessage(Messages.OpenShiftCompositeFragment_EmptyPasswordError, IMessageProvider.ERROR);
            return;
        }
        if (privateKeyText != null && privateKeyText.getText().trim().isEmpty()) {
            setMessage(Messages.OpenShiftCompositeFragment_EmptyKeyError, IMessageProvider.ERROR);
            return;
        }
        File keyFile = new File(privateKey);
        if (!keyFile.exists()) {
            setMessage(Messages.OpenShiftCompositeFragment_NotExistKeyError, IMessageProvider.ERROR);
            return;
        }

        JSCHPubKeyDecryptor decryptor = new JSCHPubKeyDecryptor();
        try {
            decryptor.isValidPrivateKey(privateKey);
        } catch (PublicKeyNotFoundException e) {
            setMessage(Messages.OpenShiftCompositeFragment_InvalidKeyError, IMessageProvider.ERROR);
            return;
        }
        setMessage(getDescription(), IMessageProvider.NONE);
    }

    @Override
    protected void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
        GridLayout layout = new GridLayout(4, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.horizontalSpacing = 0;
        composite.setLayout(layout);

        Label label = new Label(composite, SWT.NONE);
        label.setText(Messages.OpenShiftCompositeFragment_UsernameLabel);
        usernameText = new Text(composite, SWT.BORDER);
        GridData layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false);
        layoutData.horizontalSpan = 3;
        usernameText.setLayoutData(layoutData);
        usernameText.setToolTipText(Messages.OpenShiftCompositeFragment_UsernameTooltip);
        usernameText.addModifyListener(modifyListener);
        usernameText.forceFocus();

        label = new Label(composite, SWT.NONE);
        label.setText(Messages.OpenShiftCompositeFragment_PasswordLabel);
        passwordText = new Text(composite, SWT.BORDER | SWT.PASSWORD);
        layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        layoutData.horizontalSpan = 2;
        passwordText.setLayoutData(layoutData);
        passwordText.setToolTipText(Messages.OpenShiftCompositeFragment_PasswordTooltip);
        passwordText.addModifyListener(modifyListener);

        Button restorePassword = new Button(composite, SWT.PUSH);
        layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        layoutData.minimumWidth = 80;
        restorePassword.setLayoutData(layoutData);
        restorePassword.setText(Messages.OpenShiftCompositeFragment_RestoreLabel);
        restorePassword.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                Program.launch(RESTORE_PASSWORD_URL);
            }
        });

        Composite newButtonsGroup = new Composite(composite, SWT.NONE);
        layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1);
        newButtonsGroup.setLayoutData(layoutData);
        GridLayout gd = new GridLayout(2, false);
        gd.marginWidth = 0;
        gd.marginHeight = 0;
        gd.horizontalSpacing = 0;
        newButtonsGroup.setLayout(gd);

        Button createAccount = new Button(newButtonsGroup, SWT.PUSH);
        layoutData = new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1);
        createAccount.setLayoutData(layoutData);
        createAccount.setText(Messages.OpenShiftCompositeFragment_CreateAccountLabel);
        createAccount.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                Program.launch(CREATE_ACCOUNT_URL);
            }
        });

        Button createTarget = new Button(newButtonsGroup, SWT.PUSH);
        layoutData = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
        createTarget.setLayoutData(layoutData);
        createTarget.setText(Messages.OpenShiftCompositeFragment_CreateTargetLabel);
        createTarget.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                openTargetWizard();
            }
        });

        label = new Label(composite, SWT.NONE);
        label.setText(Messages.OpenShiftCompositeFragment_KeyLabel);
        privateKeyText = new Text(composite, SWT.BORDER);
        privateKeyText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        privateKeyText.setToolTipText(Messages.OpenShiftCompositeFragment_KeyTooltip);
        File existingKey = EclipseSSH2Settings.getPrivateKey(ZendDevCloud.KEY_TYPE);
        if (existingKey != null) {
            privateKeyText.setText(existingKey.getPath());
        }
        privateKeyText.addModifyListener(modifyListener);

        Button btnBrowse = new Button(composite, SWT.PUSH);
        layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        layoutData.minimumWidth = 80;
        btnBrowse.setLayoutData(layoutData);
        btnBrowse.setText(Messages.OpenShiftCompositeFragment_BrowseLabel);
        Button btnGenerate = new Button(composite, SWT.PUSH);
        btnGenerate.setText(Messages.OpenShiftCompositeFragment_GenerateLabel);
        layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        layoutData.minimumWidth = 80;
        btnGenerate.setLayoutData(layoutData);
        btnBrowse.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                final FileDialog d = new FileDialog(e.display.getActiveShell(), SWT.OPEN);
                final String file = d.open();
                if (file != null) {
                    privateKeyText.setText(file);
                }
            }
        });
        btnGenerate.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final String key = generateKey();
                if (key != null) {
                    Display.getDefault().syncExec(new Runnable() {
                        public void run() {
                            privateKeyText.setText(key);
                        }
                    });
                }
                updateData();
                validate();
            }
        });

        label = new Label(composite, SWT.WRAP);
        label.setText(Messages.OpenShiftCompositeFragment_KeyDesc);
        layoutData = new GridData(SWT.FILL, SWT.TOP, true, false);
        layoutData.widthHint = 400;
        layoutData.horizontalSpan = 4;
        label.setLayoutData(layoutData);

    }

    @Override
    protected void init() {
    }

    @Override
    protected void detectServers(IProgressMonitor monitor) {
        try {
            IZendTarget[] targets = createTargets(monitor);
            IStatus finalStatus = Status.OK_STATUS;
            if (targets != null) {
                TargetConnectionTester tester = new TargetConnectionTester();
                IStatus[] results = tester.testConnection(targets, monitor);
                boolean dataInitialized = false;
                List<IZendTarget> finalTargets = tester.getFinalTargets();
                TargetsManager manager = TargetsManagerService.INSTANCE.getTargetManager();
                for (int i = 0; i < results.length; i++) {
                    IStatus status = results[i];
                    IZendTarget target = finalTargets.get(i);
                    switch (status.getSeverity()) {
                    case IStatus.OK:
                        String host = target.getHost().getHost();
                        URL baseUrl = new URL("http", host, ""); //$NON-NLS-1$ //$NON-NLS-2$
                        ZendTarget t = (ZendTarget) target;
                        Server server = null;
                        Server existingServer = getExistingServer(host);
                        if (existingServer != null) {
                            server = existingServer;
                        } else {
                            server = new Server();
                            server.setName(host);
                        }
                        server.setHost(host);
                        server.setName(target.getHost().getHost());
                        server.setBaseURL(baseUrl.toString());
                        server.setAttribute(IServerType.TYPE, OpenShiftServerType.ID);
                        setupSSHConfiguration(server, target);
                        t.setDefaultServerURL(baseUrl);
                        t.setServerName(server.getName());
                        IZendTarget existingTarget = manager.getTargetById(t.getId());
                        try {
                            if (existingTarget != null) {
                                manager.updateTarget(copy(t), true);
                            } else {
                                manager.add(copy(t), true);
                            }
                        } catch (TargetException e) {
                            // cannot occur, suppress connection
                        } catch (LicenseExpiredException e) {
                            // cannot occur, suppress connection
                        }
                        if (dataInitialized) {
                            ServersManager.addServer(server);
                        } else {
                            setData(server);
                            dataInitialized = true;
                        }
                        break;
                    case IStatus.ERROR:
                        finalStatus = new Status(IStatus.WARNING, Activator.PLUGIN_ID, MessageFormat
                                .format(Messages.OpenShiftCompositeFragment_WarningMessage, status.getMessage()));
                        break;
                    default:
                        break;
                    }
                }
                if (dataInitialized) {
                    ServersManager.save();
                    switch (finalStatus.getSeverity()) {
                    case IStatus.WARNING:
                        showWarningMessage(Messages.OpenShiftCompositeFragment_WarningTitle,
                                finalStatus.getMessage());
                        break;
                    default:
                        break;
                    }
                } else {
                    setMessage(finalStatus.getMessage(), IMessageProvider.ERROR);
                }
            }
        } catch (CoreException e) {
            setMessage(e.getMessage(), IMessageProvider.ERROR);
        } catch (IOException e) {
            setMessage(e.getMessage(), IMessageProvider.ERROR);
        }
    }

    @Override
    protected void updateData() {
        if (usernameText != null) {
            username = usernameText.getText();
        }
        if (passwordText != null) {
            password = passwordText.getText();
        }
        if (privateKeyText != null) {
            privateKey = privateKeyText.getText();
        }
    }

    @Override
    protected void setupSSHConfiguration(Server server, IZendTarget target) {
        SSHTunnelConfiguration config = SSHTunnelConfiguration.createOpenShiftConfiguration(target);
        config.store(server);
    }

    @Override
    protected String getGeneratedKeyName() {
        return GENERATED_KEY_FILENAME;
    }

    private IZendTarget[] createTargets(IProgressMonitor monitor) throws CoreException, IOException {
        OpenShiftTarget detect = new OpenShiftTarget(username, password, new EclipseApiKeyDetector());
        monitor.beginTask(Messages.OpenShiftCompositeFragment_DetectingAppsTitle, IProgressMonitor.UNKNOWN);
        JSCHPubKeyDecryptor decryptor = new JSCHPubKeyDecryptor();
        try {
            detect.uploadPublicKey(privateKey, decryptor);
        } catch (SdkException ex) {
            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getMessage(), ex));
        }

        IZendTarget[] targets = null;
        try {
            targets = detect.detectTargets(privateKey, TargetsManagerService.INSTANCE.getTargetManager(),
                    decryptor);
        } catch (SdkException e) {
            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
        }
        if (targets == null) {
            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                    Messages.OpenShiftCompositeFragment_NoValidAppsError));
        }
        if (targets == null || targets.length == 0) {
            return null;
        }
        TargetsManager tm = TargetsManagerService.INSTANCE.getTargetManager();

        targets = removeExistingTargets(targets, tm);

        for (IZendTarget target : targets) {
            try {
                tm.add(target, true);
            } catch (TargetException e) {
                // should not appear cause we do not try to connect to it
            } catch (LicenseExpiredException e) {
                // should not appear cause we do not try to connect to it
            }
        }
        return targets;
    }

    private void openTargetWizard() {
        final String username = usernameText.getText();
        final String password = passwordText.getText();
        if (username == null || username.trim().length() == 0 || password == null
                || password.trim().length() == 0) {
            setMessage(Messages.OpenShiftCompositeFragment_NoCredentialsError, IMessageProvider.ERROR);
            return;
        }
        try {
            OpenShiftTarget target = new OpenShiftTarget(username, password);
            doOpenTargetWizard(target);
        } catch (InvocationTargetException e) {
            Activator.log(e);
            Throwable a = e.getTargetException();
            if (a != null) {
                setMessage(OpenShiftTarget.getOpenShiftMessage(a), IMessageProvider.ERROR);
                return;
            }
        } catch (InterruptedException e) {
            Activator.log(e);
        }
    }

    private void doOpenTargetWizard(final OpenShiftTarget target)
            throws InvocationTargetException, InterruptedException {
        controlHandler.run(true, false, new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                monitor.beginTask("Retrieving data from OpenShift account...", //$NON-NLS-1$
                        IProgressMonitor.UNKNOWN);
                try {
                    final OpenShiftTargetData data = new OpenShiftTargetData();
                    data.setTarget(target);
                    if (target.hasDomain()) {
                        data.setGearProfiles(target.getAvaliableGearProfiles());
                        data.setZendTargets(target.getAllZendTargets());
                        data.setMySqlCartridges(target.getMySqlCartridges());
                    } else {
                        data.setGearProfiles(new ArrayList<String>());
                        data.setZendTargets(new ArrayList<String>());
                        data.setMySqlCartridges(new ArrayList<String>());
                    }
                    Display.getDefault().asyncExec(new Runnable() {

                        public void run() {
                            Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
                            WizardDialog dialog = new OpenShiftTargetWizardDialog(shell,
                                    new OpenShiftTargetWizard(data), data);
                            if (dialog.open() == Window.OK) {
                                setMessage(Messages.OpenShiftCompositeFragment_AppCreatedMessage,
                                        IMessageProvider.INFORMATION);
                            }
                        }
                    });
                } catch (final SdkException e) {
                    monitor.done();
                    Display.getDefault().asyncExec(new Runnable() {
                        public void run() {
                            setMessage(e.getCause() != null ? e.getCause().getMessage() : e.getMessage(),
                                    IMessageProvider.ERROR);
                        }
                    });
                }
                monitor.done();
            }
        });
    }

}