org.gw4e.eclipse.launching.test.GW4ELaunchConfigurationTab.java Source code

Java tutorial

Introduction

Here is the source code for org.gw4e.eclipse.launching.test.GW4ELaunchConfigurationTab.java

Source

package org.gw4e.eclipse.launching.test;

/*-
 * #%L
 * gw4e
 * $Id:$
 * $HeadURL:$
 * %%
 * Copyright (C) 2017 gw4e-project
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import java.util.List;
import java.util.StringTokenizer;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
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.layout.FillLayout;
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.TableItem;
import org.eclipse.swt.widgets.Text;
import org.gw4e.eclipse.facade.GraphWalkerContextManager;
import org.gw4e.eclipse.facade.JDTManager;
import org.gw4e.eclipse.facade.ResourceManager;
import org.gw4e.eclipse.message.MessageUtil;
import org.gw4e.eclipse.product.GW4ENature;

/**
 * Launch configuration tab used to specify the GraphWalker Parameters for the
 * offline command
 *
 */
public class GW4ELaunchConfigurationTab extends AbstractLaunchConfigurationTab implements LaunchingConstant {

    public static String GW4E_LAUNCH_CONFIGURATION_CONTROL_ID = "gw4e.launch.configuration.control.id";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_PROJECT = "gw4e.launch.test.project";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_PROJECT_BUTTON = "gw4e.launch.test.project.button";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_MAIN_TEST = "gw4e.launch.test.project.main.test";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_ADDITIONAL_TEST = "gw4e.launch.test.project.additional.test";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_HINT_BUTTON = "gw4e.launch.test.project.hint.button";
    public static String GW4E_LAUNCH_TEST_CONFIGURATION_SELECTALL_BUTTON = "gw4e.launch.test.project.selectall.button";
    public static String GW4E_LAUNCH_TEST_TEST_REMOVE_BLOCKED_ELEMENT_BUTTON = "gw4e.launch.config.test.execution.remove.blocked.elements.configuration";

    private Text fProjectText;
    private Button fProjectButton;

    private Button fSelectAllButton;
    private Button fDeselectAllButton;
    private ComboViewer fMainTestExecutionComboViewer;
    private CheckboxTableViewer fAdditionalTestViewer;
    private Composite compositeContainer;
    private IType additionalExecutionContexts[];
    private IType mainExecutionContexts[];
    private boolean doHint = false;

    private Button hintButton;
    private Button removeBockedElementButton;
    private Button displayDetailsButton;
    private GridData gd_1;

    public GW4ELaunchConfigurationTab() {
        super();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.
     * swt.widgets.Composite)
     */

    /**
     * @wbp.parser.entryPoint
     */
    @Override
    public void createControl(Composite parent) {
        compositeContainer = new Composite(parent, SWT.NONE);
        setControl(compositeContainer);

        GridLayout gl = new GridLayout();
        gl.numColumns = 3;
        compositeContainer.setLayout(gl);

        createProjectSection(compositeContainer);
        createTestContainerSelectionGroup(compositeContainer);
        createRemoveBlockedElementGroup(compositeContainer);
        createDisplayReportElementGroup(compositeContainer);
        createAdditionalExecutionContextContainer(compositeContainer);

    }

    private void createProjectSection(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        GridData gd = new GridData();
        gd.horizontalSpan = 3;
        gd.grabExcessHorizontalSpace = true;
        label.setLayoutData(gd);
        label.setText(MessageUtil.getString("label_project_explanation"));

        gd = new GridData();
        gd.horizontalSpan = 3;
        label = new Label(parent, SWT.NONE);
        label.setText(MessageUtil.getString("label_project1"));
        gd_1 = new GridData();
        gd_1.horizontalAlignment = SWT.RIGHT;
        gd_1.horizontalIndent = 25;
        label.setLayoutData(gd_1);

        fProjectText = new Text(parent, SWT.SINGLE | SWT.BORDER);
        fProjectText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fProjectText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent evt) {
                validatePage();
                GW4ELaunchConfigurationTab.this.setDirty(true);
                setDefaultMainExecutionContextTest();
            }
        });
        fProjectText.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_TEST_CONFIGURATION_PROJECT);

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));

        Composite compButtons = new Composite(composite, SWT.NONE);
        compButtons.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1));
        compButtons.setLayout(new FillLayout(SWT.VERTICAL));

        fProjectButton = new Button(compButtons, SWT.PUSH);
        fProjectButton.setText(MessageUtil.getString("label_browse"));
        fProjectButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                handleProjectButtonSelected();
            }
        });
        fProjectButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_TEST_CONFIGURATION_PROJECT_BUTTON);
    }

    private void createAdditionalExecutionContextContainer(Composite parent) {

        Label lblNewLabel = new Label(compositeContainer, SWT.NONE);
        lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));
        lblNewLabel.setText(MessageUtil.getString("additionalExecutionContext"));

        ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_QUALIFIED);
        fAdditionalTestViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
        fAdditionalTestViewer.setContentProvider(new IStructuredContentProvider() {
            @Override
            public Object[] getElements(Object inputElement) {
                Display display = Display.getCurrent();
                Runnable longJob = new Runnable() {
                    public void run() {
                        display.syncExec(new Runnable() {
                            public void run() {
                                if (inputElement == null) {
                                    additionalExecutionContexts = new IType[0];
                                }
                                IType type = (IType) inputElement;
                                List<IType> all = null;
                                try {
                                    all = JDTManager.getOrphanGraphWalkerClasses(type, doHint);
                                } catch (Exception e) {
                                    ResourceManager.logException(e);
                                    additionalExecutionContexts = new IType[0];
                                }
                                additionalExecutionContexts = new IType[all.size()];
                                all.toArray(additionalExecutionContexts);
                            }
                        });
                        display.wake();
                    }
                };
                BusyIndicator.showWhile(display, longJob);
                return additionalExecutionContexts;
            }
        });
        fAdditionalTestViewer.setLabelProvider(labelProvider);
        fAdditionalTestViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        fAdditionalTestViewer.addCheckStateListener(new ICheckStateListener() {
            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                validatePage();
            }
        });
        fAdditionalTestViewer.getTable().setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_TEST_CONFIGURATION_ADDITIONAL_TEST);

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        GridData gd = new GridData();
        gd.verticalAlignment = SWT.TOP;
        composite.setLayoutData(gd);

        Composite compButtons = new Composite(composite, SWT.NONE);
        compButtons.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));
        compButtons.setLayout(new FillLayout(SWT.VERTICAL));

        fSelectAllButton = new Button(compButtons, SWT.NONE);
        fSelectAllButton.setText(MessageUtil.getString("selectAll"));
        fSelectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                fAdditionalTestViewer.setAllChecked(true);
                validatePage();
            }
        });
        fSelectAllButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_TEST_CONFIGURATION_SELECTALL_BUTTON);

        fDeselectAllButton = new Button(compButtons, SWT.NONE);
        fDeselectAllButton.setText(MessageUtil.getString("deselectAll"));

        fDeselectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                fAdditionalTestViewer.setAllChecked(false);
                validatePage();
            }
        });

        hintButton = new Button(compButtons, SWT.CHECK);
        hintButton.setText(MessageUtil.getString("hint"));
        hintButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                hint();
            }
        });
        hintButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_TEST_CONFIGURATION_HINT_BUTTON);

    }

    private void createTestContainerSelectionGroup(Composite parent) {
        Label fTestLabel = new Label(parent, SWT.NONE);
        GridData gd = new GridData();
        gd.horizontalAlignment = SWT.RIGHT;
        gd.horizontalIndent = 25;
        gd.verticalAlignment = SWT.TOP;
        fTestLabel.setLayoutData(gd);
        fTestLabel.setText(MessageUtil.getString("mainTestExecutionContext"));

        fMainTestExecutionComboViewer = new ComboViewer(parent, SWT.DROP_DOWN);
        Combo combo = fMainTestExecutionComboViewer.getCombo();
        combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fMainTestExecutionComboViewer.setContentProvider(new IStructuredContentProvider() {
            @Override
            public Object[] getElements(Object inputElement) {
                String projectName = (String) inputElement;
                loadMainExecutionContextTests(projectName);
                return mainExecutionContexts;
            }
        });
        ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_QUALIFIED);
        fMainTestExecutionComboViewer.setLabelProvider(labelProvider);
        fMainTestExecutionComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                fAdditionalTestViewer.setInput(null);
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection.size() > 0) {
                    resetDoHint();
                    IType type = (IType) selection.getFirstElement();
                    fAdditionalTestViewer.setInput(type);
                    validatePage();
                }
            }
        });
        combo.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_TEST_CONFIGURATION_MAIN_TEST);
    }

    private void createRemoveBlockedElementGroup(Composite parent) {
        Label lfiller = new Label(parent, SWT.NONE);
        lfiller.setText("");

        Label lblRemoveBlockedElement = new Label(parent, SWT.NONE);
        lblRemoveBlockedElement.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        lblRemoveBlockedElement.setText(MessageUtil.getString("removeBlockedElement"));

        removeBockedElementButton = new Button(parent, SWT.CHECK);
        removeBockedElementButton.setText("");
        removeBockedElementButton.setSelection(true);

        removeBockedElementButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                validatePage();
            }
        });

    }

    private void createDisplayReportElementGroup(Composite parent) {
        Label lfiller = new Label(parent, SWT.NONE);
        lfiller.setText("");

        Label lblDisplayReporElement = new Label(parent, SWT.NONE);
        lblDisplayReporElement.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        lblDisplayReporElement.setText(MessageUtil.getString("displayReport"));

        displayDetailsButton = new Button(parent, SWT.CHECK);
        displayDetailsButton.setText("");
        displayDetailsButton.setSelection(true);
        new Label(parent, SWT.NONE);
        displayDetailsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                validatePage();
            }
        });
    }

    private void hint() {
        this.doHint = !this.doHint;
        IStructuredSelection selection = (IStructuredSelection) fMainTestExecutionComboViewer.getSelection();
        if (selection == null)
            return;
        IType type = (IType) selection.getFirstElement();
        if (type == null)
            return;
        fAdditionalTestViewer.setInput(type);
    }

    private void loadMainExecutionContextTests(String projectName) {
        List<IType> all = null;
        ;
        try {
            if (projectName == null || projectName.trim().length() == 0)
                return;
            all = JDTManager.getStartableGraphWalkerClasses(projectName);
        } catch (Exception e) {
            ResourceManager.logException(e);
            mainExecutionContexts = new IType[0];
        }
        mainExecutionContexts = new IType[all.size()];
        all.toArray(mainExecutionContexts);

    }

    private void resetDoHint() {
        this.doHint = false;
        hintButton.setSelection(false);
    }

    private void setDefaultMainExecutionContextTest() {
        String projectName = fProjectText.getText();
        if (projectName != null && projectName.trim().length() > 0) {
            fMainTestExecutionComboViewer.setInput(projectName);
            if (mainExecutionContexts != null && mainExecutionContexts.length > 0) {
                fMainTestExecutionComboViewer.setSelection(new StructuredSelection(mainExecutionContexts[0]));
            }
        }
    }

    private void handleProjectButtonSelected() {
        IJavaProject project = chooseJavaProject();
        if (project == null) {
            return;
        }
        String projectName = project.getElementName();
        fProjectText.setText(projectName);

    }

    @Override
    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
        configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
        configuration.setAttribute(CONFIG_TEST_CLASSES, "");
        configuration.setAttribute(EXECUTION_TEST_REMOVE_BLOCKED_ELEMENT_CONFIGURATION, true);
        if (fProjectText != null)
            fProjectText.setText("");
    }

    @Override
    public void initializeFrom(ILaunchConfiguration configuration) {
        try {
            String projectName = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
                    "");
            if (projectName == null || projectName.trim().length() == 0) {
                additionalExecutionContexts = new IType[0];
                mainExecutionContexts = new IType[0];
                fMainTestExecutionComboViewer.setInput(null);
                fAdditionalTestViewer.setInput(null);
            }
            ;
            fProjectText.setText(projectName);
            removeBockedElementButton.setSelection(
                    configuration.getAttribute(EXECUTION_TEST_REMOVE_BLOCKED_ELEMENT_CONFIGURATION, true));
            displayDetailsButton.setSelection(
                    new Boolean(configuration.getAttribute(EXECUTION_TEST_DISPLAY_CONFIGURATION, "true"))
                            .booleanValue());
            String classes = configuration.getAttribute(CONFIG_TEST_CLASSES, "");
            StringTokenizer st = new StringTokenizer(classes, ";");
            if (st.hasMoreTokens()) {
                String mainContext = st.nextToken();
                for (int i = 0; i < mainExecutionContexts.length; i++) {
                    IType executionContext = mainExecutionContexts[i];
                    if (executionContext.getFullyQualifiedName().equalsIgnoreCase(mainContext)) {
                        fMainTestExecutionComboViewer.setSelection(new StructuredSelection(executionContext));
                        break;
                    }
                }
            }

            while (st.hasMoreTokens()) {
                String clazz = st.nextToken();
                TableItem[] items = this.fAdditionalTestViewer.getTable().getItems();
                for (int i = 0; i < items.length; ++i) {
                    IType type = (IType) items[i].getData();
                    String name = type.getFullyQualifiedName();
                    if (name.equalsIgnoreCase(clazz)) {
                        items[i].setChecked(true);
                    }
                }
            }
        } catch (CoreException e) {
            ResourceManager.logException(e);
        }
    }

    @Override
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {
        configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
                fProjectText.getText().trim());
        IStructuredSelection selection = fMainTestExecutionComboViewer.getStructuredSelection();
        IType type = (IType) selection.getFirstElement();
        if (type == null)
            return;
        StringBuffer sb = new StringBuffer();
        sb.append(type.getFullyQualifiedName()).append(";");
        TableItem[] items = fAdditionalTestViewer.getTable().getItems();
        for (int i = 0; i < items.length; ++i) {
            boolean checked = items[i].getChecked();
            type = (IType) items[i].getData();
            String name = type.getFullyQualifiedName();
            if (checked)
                sb.append(name).append(";").toString();
        }
        configuration.setAttribute(CONFIG_TEST_CLASSES, sb.toString());
        configuration.setAttribute(EXECUTION_TEST_REMOVE_BLOCKED_ELEMENT_CONFIGURATION,
                removeBockedElementButton.getSelection());
        configuration.setAttribute(EXECUTION_TEST_DISPLAY_CONFIGURATION, displayDetailsButton.getSelection() + "");

    }

    @Override
    public String getName() {
        return MessageUtil.getString("graphwalkerName");
    }

    private void updateButtons(boolean enabled) {
        fSelectAllButton.setEnabled(enabled);
        fDeselectAllButton.setEnabled(enabled);
    }

    private void validatePage() {
        setErrorMessage(null);
        setMessage(null);
        updateButtons(false);

        String projectName = fProjectText.getText().trim();
        if (projectName.length() == 0) {
            setErrorMessage(MessageUtil.getString("project_not_defined"));
            return;
        }

        IProject project = ResourceManager.getProject(projectName);
        if (!project.exists()) {
            setErrorMessage(MessageUtil.getString("invalid_project_name"));
            return;
        }

        if (!GW4ENature.hasGW4ENature(project)) {
            setErrorMessage(MessageUtil.getString("not_a_gw4e_project"));
            return;
        }
        GW4ELaunchConfigurationTab.this.setDirty(true);
        updateLaunchConfigurationDialog();
        updateButtons(true);

    }

    private IJavaProject chooseJavaProject() {
        IJavaProject project = GraphWalkerContextManager.chooseGW4EProject(null);
        return project;
    }

}