org.fusesource.ide.syndesis.extensions.ui.wizards.pages.SyndesisExtensionProjectWizardExtensionDetailsPage.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.syndesis.extensions.ui.wizards.pages.SyndesisExtensionProjectWizardExtensionDetailsPage.java

Source

/*******************************************************************************
 * Copyright (c) 2018 Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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
 *
 * Contributors:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.fusesource.ide.syndesis.extensions.ui.wizards.pages;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.ValidationStatusProvider;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.dialog.IValidationMessageProvider;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.fusesource.ide.foundation.core.util.Strings;
import org.fusesource.ide.foundation.ui.util.ControlDecorationHelper;
import org.fusesource.ide.projecttemplates.adopters.AbstractProjectTemplate;
import org.fusesource.ide.syndesis.extensions.core.model.SyndesisExtension;
import org.fusesource.ide.syndesis.extensions.core.util.IgniteVersionMapper;
import org.fusesource.ide.syndesis.extensions.ui.internal.Messages;
import org.fusesource.ide.syndesis.extensions.ui.internal.SyndesisExtensionsUIActivator;
import org.fusesource.ide.syndesis.extensions.ui.templates.CustomConnectorProjectTemplate;
import org.fusesource.ide.syndesis.extensions.ui.templates.CustomStepAsCamelRouteProjectTemplate;
import org.fusesource.ide.syndesis.extensions.ui.templates.CustomStepAsJavaBeanProjectTemplate;
import org.fusesource.ide.syndesis.extensions.ui.util.SyndesisVersionChecker;
import org.fusesource.ide.syndesis.extensions.ui.wizards.SyndesisExtensionProjectWizard;
import org.fusesource.ide.syndesis.extensions.ui.wizards.validation.SyndesisExtensionIdValidator;
import org.fusesource.ide.syndesis.extensions.ui.wizards.validation.SyndesisExtensionNameValidator;
import org.fusesource.ide.syndesis.extensions.ui.wizards.validation.SyndesisExtensionVersionValidator;

/**
 * @author lheinema
 */
public class SyndesisExtensionProjectWizardExtensionDetailsPage extends WizardPage {

    private static final String DEFAULT_EXTENSION_ID = "fuse.online.extension.example";
    private static final String DEFAULT_EXTENSION_NAME = "Example Fuse Online Extension";
    private static final String DEFAULT_EXTENSION_VERSION = "1.0.0";

    private SelectionListener btnGroupSelectionListener = new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            customConnector = customConnectorRadio.getSelection();
            stepButtonGroup.setVisible(customStepRadio.getSelection());
        }
    };

    private SelectionListener stepSelectionListener = new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            camelRoute = stepCamelRouteRadio.getSelection();
        }
    };

    private IValidationMessageProvider dummyMessageProvider = new IValidationMessageProvider() {

        @Override
        public int getMessageType(ValidationStatusProvider statusProvider) {
            IStatus s = getStatus(statusProvider);
            if (!s.isOK()) {
                return IMessageProvider.ERROR;
            }
            return IMessageProvider.NONE;
        }

        @Override
        public String getMessage(ValidationStatusProvider statusProvider) {
            IStatus s = getStatus(statusProvider);
            if (!s.isOK()) {
                return Messages.newProjectWizardExtensionDetailsPageErrorValidationError;
            }
            return null;
        }

        private IStatus getStatus(ValidationStatusProvider statusProvider) {
            if (statusProvider != null) {
                IObservableValue<IStatus> s = statusProvider.getValidationStatus();
                return s.getValue();
            }
            return Status.OK_STATUS;
        }
    };

    private ComboViewer syndesisVersionCombo;
    private Button customStepRadio;
    private Button customConnectorRadio;
    private Button stepCamelRouteRadio;
    private Composite stepButtonGroup;

    private ControlDecorationHelper controlDecorationHelper = new ControlDecorationHelper();
    private SyndesisExtensionProjectWizard wizard;
    private Map<String, String> syndesisVersionMap = new HashMap<>();
    private boolean customConnector;
    private boolean camelRoute;

    public SyndesisExtensionProjectWizardExtensionDetailsPage() {
        super(Messages.newProjectWizardExtensionDetailsPageName);
        setTitle(Messages.newProjectWizardExtensionDetailsPageTitle);
        setDescription(Messages.newProjectWizardExtensionDetailsPageDescription);
        setImageDescriptor(
                SyndesisExtensionsUIActivator.imageDescriptorFromPlugin(SyndesisExtensionsUIActivator.PLUGIN_ID,
                        SyndesisExtensionsUIActivator.SYNDESIS_EXTENSION_PROJECT_ICON));
        setPageComplete(false);
    }

    @Override
    public void createControl(Composite parent) {
        DataBindingContext dbc = new DataBindingContext();
        WizardPageSupport wps = WizardPageSupport.create(this, dbc);
        wps.setValidationMessageProvider(dummyMessageProvider);
        wizard = (SyndesisExtensionProjectWizard) getWizard();

        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout(4, false));

        createSyndesisVersionControls(container, dbc);

        Label spacer = new Label(container, SWT.NONE);
        GridData gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        spacer.setLayoutData(gridData);

        Label extensionDetailsLabel = new Label(container, SWT.NONE);
        extensionDetailsLabel.setText(Messages.newProjectWizardExtensionDetailsPageExtensionDetailsLabel);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        extensionDetailsLabel.setLayoutData(gridData);

        Text extensionIdText = createField(container, Messages.newProjectWizardExtensionDetailsPageExtensionIdLabel,
                null, Messages.newProjectWizardExtensionDetailsPageExtensionIdTooltip);
        UpdateValueStrategy updateStrategy = UpdateValueStrategy.create(null);
        updateStrategy.setBeforeSetValidator(new SyndesisExtensionIdValidator());
        createBinding(dbc, extensionIdText, "extensionId", updateStrategy);
        // set a default value
        extensionIdText.setText(DEFAULT_EXTENSION_ID);

        Text extensionNameText = createField(container, Messages.newProjectWizardExtensionDetailsPageNameLabel,
                null, Messages.newProjectWizardExtensionDetailsPageNameTooltip);
        updateStrategy = UpdateValueStrategy.create(null);
        updateStrategy.setBeforeSetValidator(new SyndesisExtensionNameValidator());
        createBinding(dbc, extensionNameText, "name", updateStrategy);
        // set a default value
        extensionNameText.setText(DEFAULT_EXTENSION_NAME);

        Text extensionDescriptionText = createField(container,
                Messages.newProjectWizardExtensionDetailsPageDescriptionLabel,
                Messages.newProjectWizardExtensionDetailsPageOptionalDescriptionFieldHint,
                Messages.newProjectWizardExtensionDetailsPageDescriptionTooltip);
        createBinding(dbc, extensionDescriptionText, "description");

        Text extensionVersionText = createField(container,
                Messages.newProjectWizardExtensionDetailsPageVersionLabel, null,
                Messages.newProjectWizardExtensionDetailsPageVersionTooltip);
        updateStrategy = UpdateValueStrategy.create(null);
        updateStrategy.setBeforeSetValidator(new SyndesisExtensionVersionValidator());
        createBinding(dbc, extensionVersionText, "version", updateStrategy);
        // set a default value
        extensionVersionText.setText(DEFAULT_EXTENSION_VERSION);

        spacer = new Label(container, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        spacer.setLayoutData(gridData);

        createExtensionTypeRadioGroup(container);

        spacer = new Label(container, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        spacer.setLayoutData(gridData);

        createStepTypeRadioGroup(container);

        setControl(container);

        extensionIdText.setFocus();
    }

    private Binding createBinding(DataBindingContext dbc, Widget control, String property) {
        return createBinding(dbc, control, property, null);
    }

    private Binding createBinding(DataBindingContext dbc, Widget control, String property,
            UpdateValueStrategy updateStrategy) {
        IObservableValue target = null;
        if (control instanceof Combo) {
            target = WidgetProperties.text().observeDelayed(200, control);
        } else if (control instanceof Text) {
            target = WidgetProperties.text(SWT.Modify).observeDelayed(200, control);
        } else {
            // not supported
        }
        IObservableValue model = BeanProperties.value(SyndesisExtension.class, property)
                .observe(wizard.getSyndesisExtension());
        if (model != null && target != null) {
            Binding b = dbc.bindValue(target, model, updateStrategy, null);
            ControlDecorationSupport.create(b, SWT.TOP | SWT.LEFT);
            return b;
        }
        return null;
    }

    private void createSyndesisVersionControls(Composite container, DataBindingContext dbc) {
        Label syndesisVersionLabel = new Label(container, SWT.NONE);
        syndesisVersionLabel.setText(Messages.newProjectWizardExtensionDetailsPageSyndesisVersionLabel);
        GridData gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        syndesisVersionLabel.setLayoutData(gridData);

        Label spacer = new Label(container, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        syndesisVersionCombo = new ComboViewer(container, SWT.BORDER | SWT.DROP_DOWN);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(2, 1).indent(8, 0).create();
        syndesisVersionCombo.getCombo().setLayoutData(gridData);
        syndesisVersionCombo.getCombo()
                .setToolTipText(Messages.newProjectWizardExtensionDetailsPageSyndesisVersionTooltip);
        new ControlDecorationHelper().addInformationOnFocus(syndesisVersionCombo.getCombo(),
                Messages.newProjectWizardExtensionDetailsPageSyndesisVersionTooltip);
        syndesisVersionCombo.setLabelProvider(new SyndesisVersionLabelProvider());
        syndesisVersionCombo.setComparator(new ViewerComparator(Comparator.reverseOrder()));
        syndesisVersionCombo.setContentProvider(ArrayContentProvider.getInstance());
        UpdateValueStrategy updateStrategy = UpdateValueStrategy.create(null);
        updateStrategy.setConverter(
                IConverter.create(String.class, String.class, o1 -> translateDisplayTextToVersion((String) o1)));
        updateStrategy.setBeforeSetValidator(new SyndesisExtensionVersionValidator());
        createBinding(dbc, syndesisVersionCombo.getCombo(), "syndesisVersion", updateStrategy);

        Display.getDefault().asyncExec(() -> {
            syndesisVersionMap = new IgniteVersionMapper().getMapping();
            syndesisVersionCombo.setInput(getSyndesisVersions());
            syndesisVersionCombo.getCombo().select(0);
        });

        Button syndesisVersionValidationBtn = new Button(container, SWT.PUSH);
        GridData verifyVersionButtonData = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
        syndesisVersionValidationBtn.setLayoutData(verifyVersionButtonData);
        syndesisVersionValidationBtn
                .setText(Messages.newProjectWizardExtensionDetailsPageSyndesisVersionValidationLabel);
        syndesisVersionValidationBtn
                .setToolTipText(Messages.newProjectWizardExtensionDetailsPageSyndesisVersionValidationTooltip);
        syndesisVersionValidationBtn.addSelectionListener(new VersionValidationHandler());
    }

    private void createStepTypeRadioGroup(Composite container) {
        GridData gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        stepButtonGroup = new Composite(container, SWT.NONE);
        stepButtonGroup.setLayoutData(gridData);
        stepButtonGroup.setLayout(new GridLayout(4, false));

        Label stepTypeLabel = new Label(stepButtonGroup, SWT.NONE);
        stepTypeLabel.setText(Messages.newProjectWizardExtensionDetailsPageStepTypeSelectionLabel);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        stepTypeLabel.setLayoutData(gridData);

        Label spacer = new Label(stepButtonGroup, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        gridData = GridDataFactory.fillDefaults().grab(true, false).span(3, 1).indent(8, 0).create();
        stepCamelRouteRadio = new Button(stepButtonGroup, SWT.RADIO);
        stepCamelRouteRadio.setText(Messages.newProjectWizardExtensionDetailsPageStepTypeSelectionCamelRouteLabel);
        stepCamelRouteRadio
                .setToolTipText(Messages.newProjectWizardExtensionDetailsPageStepTypeSelectionCamelRouteHint);
        stepCamelRouteRadio.setLayoutData(gridData);
        stepCamelRouteRadio.addSelectionListener(stepSelectionListener);

        spacer = new Label(stepButtonGroup, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        gridData = GridDataFactory.fillDefaults().grab(true, false).span(3, 1).indent(8, 0).create();
        Button stepJavaBeanRadio = new Button(stepButtonGroup, SWT.RADIO);
        stepJavaBeanRadio.setText(Messages.newProjectWizardExtensionDetailsPageStepTypeSelectionJavaBeanLabel);
        stepJavaBeanRadio
                .setToolTipText(Messages.newProjectWizardExtensionDetailsPageStepTypeSelectionJavaBeanHint);
        stepJavaBeanRadio.setLayoutData(gridData);
        stepJavaBeanRadio.addSelectionListener(stepSelectionListener);

        stepCamelRouteRadio.setSelection(true);
        camelRoute = true;
    }

    private void createExtensionTypeRadioGroup(Composite container) {
        GridData gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        Composite typeButtonGroup = new Composite(container, SWT.NONE);
        typeButtonGroup.setLayoutData(gridData);
        typeButtonGroup.setLayout(new GridLayout(4, false));

        Label extensionTypeLabel = new Label(typeButtonGroup, SWT.NONE);
        extensionTypeLabel.setText(Messages.newProjectWizardExtensionDetailsPageTypeSelectionLabel);
        gridData = GridDataFactory.fillDefaults().grab(true, false).span(4, 1).indent(8, 0).create();
        extensionTypeLabel.setLayoutData(gridData);

        Label spacer = new Label(typeButtonGroup, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        gridData = GridDataFactory.fillDefaults().grab(true, false).span(3, 1).indent(8, 0).create();
        customStepRadio = new Button(typeButtonGroup, SWT.RADIO);
        customStepRadio.setText(Messages.newProjectWizardExtensionDetailsPageTypeSelectionStepLabel);
        customStepRadio.setToolTipText(Messages.newProjectWizardExtensionDetailsPageTypeSelectionStepHint);
        customStepRadio.setLayoutData(gridData);
        customStepRadio.addSelectionListener(btnGroupSelectionListener);

        spacer = new Label(typeButtonGroup, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        gridData = GridDataFactory.fillDefaults().grab(true, false).span(3, 1).indent(8, 0).create();
        customConnectorRadio = new Button(typeButtonGroup, SWT.RADIO);
        customConnectorRadio.setText(Messages.newProjectWizardExtensionDetailsPageTypeSelectionConnectorLabel);
        customConnectorRadio
                .setToolTipText(Messages.newProjectWizardExtensionDetailsPageTypeSelectionConnectorHint);
        customConnectorRadio.setLayoutData(gridData);
        customConnectorRadio.addSelectionListener(btnGroupSelectionListener);

        customStepRadio.setSelection(true);
        customConnector = customConnectorRadio.getSelection();
    }

    private Text createField(Composite container, String label, String message, String toolTip) {
        // create the label
        Label spacer = new Label(container, SWT.NONE);
        GridData gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        gridData.minimumWidth = 10;
        gridData.widthHint = 15;
        spacer.setLayoutData(gridData);

        Label l = new Label(container, SWT.NONE);
        l.setText(label);

        gridData = GridDataFactory.fillDefaults().grab(true, false).span(1, 1).indent(8, 0).create();

        // create the control
        Text textField = new Text(container, SWT.BORDER);
        textField.setLayoutData(gridData);
        textField.setToolTipText(toolTip);

        controlDecorationHelper.addInformationOnFocus(textField, toolTip);

        if (!Strings.isBlank(message)) {
            textField.setMessage(message);
        }

        spacer = new Label(container, SWT.NONE);
        gridData = GridDataFactory.fillDefaults().grab(false, false).span(1, 1).indent(8, 0).create();
        spacer.setLayoutData(gridData);

        return textField;
    }

    private Set<String> getSyndesisVersions() {
        return syndesisVersionMap.keySet();
    }

    private String translateDisplayTextToVersion(String displayText) {
        for (Entry<String, String> e : syndesisVersionMap.entrySet()) {
            if (e.getValue().equals(displayText)) {
                return e.getKey();
            }
        }
        return displayText;
    }

    /**
     * @return the camelRoute
     */
    private boolean isCamelRoute() {
        return this.camelRoute;
    }

    /**
     * @return the customConnector
     */
    private boolean isCustomConnector() {
        return this.customConnector;
    }

    public AbstractProjectTemplate getTemplate() {
        AbstractProjectTemplate template;

        if (isCustomConnector()) {
            template = new CustomConnectorProjectTemplate();
        } else if (isCamelRoute()) {
            template = new CustomStepAsCamelRouteProjectTemplate();
        } else {
            template = new CustomStepAsJavaBeanProjectTemplate();
        }

        return template;
    }

    class VersionValidationHandler extends SelectionAdapter {
        @Override
        public void widgetSelected(SelectionEvent e) {
            String syndesisVersion = translateDisplayTextToVersion(syndesisVersionCombo.getCombo().getText());
            SyndesisVersionChecker versionChecker = new SyndesisVersionChecker(syndesisVersion);
            try {
                getWizard().getContainer().run(true, true, versionChecker);
            } catch (InterruptedException iex) {
                versionChecker.cancel();
                Thread.currentThread().interrupt();
            } catch (Exception ex) {
                SyndesisExtensionsUIActivator.pluginLog().logError(ex);
            }
            while (!versionChecker.isDone()) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
            }
            updateSyndesisValidation(syndesisVersion, versionChecker);
        }

        private void updateSyndesisValidation(String syndesisVersion, SyndesisVersionChecker versionChecker) {
            boolean valid = versionChecker.isValid();
            if (versionChecker.isCanceled()) {
                setErrorMessage(null);
            } else if (!valid) {
                setMessage(null);
                setErrorMessage(NLS.bind(Messages.newProjectWizardExtensionDetailsPageErrorInvalidSyndesisVersion,
                        syndesisVersion));
            } else {
                setErrorMessage(null);
                setMessage(Messages.newProjectWizardExtensionDetailsPageSyndesisVersionValid, INFORMATION);
            }
            setPageComplete(valid);
        }
    }
}