org.eclipse.titan.executor.views.testexecution.TestExecutionView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.titan.executor.views.testexecution.TestExecutionView.java

Source

/******************************************************************************
 * Copyright (c) 2000-2016 Ericsson Telecom AB
 * 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
 ******************************************************************************/
package org.eclipse.titan.executor.views.testexecution;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.titan.executor.Activator;
import org.eclipse.titan.executor.executors.BaseExecutor;
import org.eclipse.titan.executor.executors.ITreeLeaf;
import org.eclipse.titan.executor.graphics.ImageCache;
import org.eclipse.titan.executor.views.executormonitor.LaunchElement;
import org.eclipse.titan.executor.views.executormonitor.MainControllerElement;
import org.eclipse.titan.executor.views.notification.NotificationView;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import java.util.ArrayList;
import java.util.List;

import static org.eclipse.titan.executor.GeneralConstants.ERROR;
import static org.eclipse.titan.executor.GeneralConstants.FAIL;
import static org.eclipse.titan.executor.GeneralConstants.INCONC;
import static org.eclipse.titan.executor.GeneralConstants.NONE;
import static org.eclipse.titan.executor.GeneralConstants.PASS;
import static org.eclipse.titan.executor.views.executormonitor.ExecutorMonitorView.EXECUTORMONITOR_VIEW_ID;

/**
 * @author Kristof Szabados
 * */
public final class TestExecutionView extends ViewPart implements ISelectionListener {
    public static final String TESTEXECUTIONVIEW = Activator.PLUGIN_ID + ".views.testExecution.TestExecutionView";

    private static TestExecutionView instance = null;

    private Table table;
    private TableViewer viewer;
    private TestExecutionContentProvider contentProvider;
    private TestExecutionLabelProvider labelProvider;

    private ITreeLeaf actualInput;
    private Action saveAsAction;
    private Action followLastRecord;
    private boolean isFollowing = true;

    @Override
    public void createPartControl(final Composite parent) {
        table = new Table(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalSpan = 2;
        table.setLayoutData(gridData);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);

        TableColumn column = new TableColumn(table, SWT.LEFT, 0);
        column.setText("reason");
        column.setWidth(300);
        Image infoImage = ImageCache.getImage("information2.gif");
        column.setImage(infoImage);
        column.setMoveable(true);
        column.setAlignment(SWT.LEFT);

        column = new TableColumn(table, SWT.LEFT, 0);
        column.setText("verdict");
        column.setWidth(100);
        column.setImage(infoImage);
        column.setMoveable(true);
        column.setAlignment(SWT.LEFT);

        column = new TableColumn(table, SWT.LEFT, 0);
        column.setText("testcase");
        column.setWidth(300);
        column.setImage(infoImage);
        column.setMoveable(true);
        column.setAlignment(SWT.LEFT);

        column = new TableColumn(table, SWT.LEFT, 0);
        column.setText("timestamp");
        column.setWidth(164);
        column.setMoveable(true);
        column.setAlignment(SWT.LEFT);
        column.setImage(ImageCache.getImage("clock.gif"));

        viewer = new TableViewer(table);
        viewer.setColumnProperties(new String[] { "timestamp", "info", "verdict" });
        contentProvider = new TestExecutionContentProvider();
        viewer.setContentProvider(contentProvider);
        labelProvider = new TestExecutionLabelProvider();
        viewer.setLabelProvider(labelProvider);

        actualInput = getInitialInput();
        viewer.setInput(actualInput);
        createTooltip(actualInput);

        createActions();
        createToolBar();
        createMenu();

        getSite().getPage().addSelectionListener(EXECUTORMONITOR_VIEW_ID, this);
        setInstance(this);
    }

    @Override
    public void dispose() {
        setInstance(null);
        saveAsAction = null;
        followLastRecord = null;
        getSite().getPage().removeSelectionListener(this);
        super.dispose();
    }

    private ITreeLeaf getInitialInput() {
        final ISelection selection = getSite().getPage().getSelection(EXECUTORMONITOR_VIEW_ID);
        if (null == selection || selection.isEmpty()) {
            return null;
        }

        final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
        ITreeLeaf element = (ITreeLeaf) structuredSelection.getFirstElement();
        if (null != element) {
            while (!(element instanceof LaunchElement)) {
                element = element.parent();
            }
        }
        return element;
    }

    @Override
    public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
        if (this.equals(part) || !(selection instanceof IStructuredSelection)
                || null == viewer.getContentProvider()) {
            return;
        }
        ITreeLeaf selectedElement;
        if (selection.isEmpty()) {
            selectedElement = null;
        } else {
            selectedElement = (ITreeLeaf) ((IStructuredSelection) selection).getFirstElement();
        }
        if (null != selectedElement) {
            while (!(selectedElement instanceof LaunchElement)) {
                selectedElement = selectedElement.parent();
            }
        }
        if (null != actualInput && actualInput.equals(selectedElement)) {
            viewer.refresh(false);
        } else {
            viewer.setInput(selectedElement);
            actualInput = selectedElement;
        }
        if (isFollowing && null != actualInput && actualInput instanceof LaunchElement) {
            final List<ITreeLeaf> children = ((LaunchElement) actualInput).children();
            for (ITreeLeaf aChildren : children) {
                final BaseExecutor executor = ((MainControllerElement) aChildren).executor();
                if (null != executor && !executor.executedTests().isEmpty()) {
                    viewer.reveal(executor.executedTests().get(executor.executedTests().size() - 1));
                }
            }
        }
        createTooltip(selectedElement);
        if (null == selectedElement) {
            saveAsAction.setEnabled(false);
        } else {
            saveAsAction.setEnabled(true);
        }
    }

    /**
     * Refreshes the input directly in case the Execution Control view is not yet opened.
     *
     * @param executor the executor to use.
     * */
    public static void refreshInput(final BaseExecutor executor) {
        if (null == getInstance()) {
            return;
        }

        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                if (null != executor && !executor.executedTests().isEmpty()) {
                    TableViewer tableViewer = getInstance().viewer;
                    tableViewer.setInput(executor.executedTests());
                    tableViewer.reveal(executor.executedTests().get(executor.executedTests().size() - 1));
                }
            }
        });
    }

    private void createTooltip(final ITreeLeaf element) {
        if (null == element) {
            setTitleToolTip(null);
            return;
        }

        final List<ExecutedTestcase> executedTestCases = new ArrayList<ExecutedTestcase>();
        final List<ITreeLeaf> children = ((LaunchElement) actualInput).children();
        ITreeLeaf executorElement;
        for (ITreeLeaf aChildren : children) {
            executorElement = aChildren;
            if (executorElement instanceof MainControllerElement) {
                BaseExecutor executor = ((MainControllerElement) executorElement).executor();
                if (null != executor) {
                    executedTestCases.addAll(executor.executedTests());
                }
            }
        }
        if (executedTestCases.isEmpty()) {
            setTitleToolTip(element.name());
            return;
        }

        String statistics = createStatistics(element, executedTestCases);
        setTitleToolTip(statistics);
    }

    private String createStatistics(ITreeLeaf element, List<ExecutedTestcase> executedTestCases) {
        int inconc = 0;
        int fail = 0;
        int error = 0;
        int none = 0;
        int pass = 0;
        int sum = executedTestCases.size();
        for (ExecutedTestcase test : executedTestCases) {
            if (PASS.equals(test.getVerdict())) {
                pass++;
            } else if (INCONC.equals(test.getVerdict())) {
                inconc++;
            } else if (FAIL.equals(test.getVerdict())) {
                fail++;
            } else if (ERROR.equals(test.getVerdict())) {
                error++;
            } else if (NONE.equals(test.getVerdict())) {
                none++;
            }
        }
        final StringBuilder builder = new StringBuilder(element.name());
        builder.append("\nVerdict statistics: ").append(none).append(" none (").append((100 * none) / sum)
                .append("%), ").append(pass).append(" pass (").append((100 * pass) / sum).append("%), ")
                .append(inconc).append(" inconc (").append((100 * inconc) / sum).append("%), ").append(fail)
                .append(" fail (").append((100 * fail) / sum).append("%), ").append(error).append(" error(")
                .append((100 * error) / sum).append("%)");
        return builder.toString();
    }

    private void createActions() {
        saveAsAction = new Action("Save As") {
            @Override
            public void run() {
                saveAs();
            }
        };
        saveAsAction.setToolTipText("Save As");
        saveAsAction.setImageDescriptor(ImageCache.getImageDescriptor("saveas_edit.gif"));
        saveAsAction.setEnabled(false);

        followLastRecord = new Action("Follow the last record") {
            @Override
            public void run() {
                isFollowing = followLastRecord.isChecked();
            }
        };
        followLastRecord.setToolTipText("Toggles the follow the last line behavior");
        followLastRecord.setEnabled(true);
        followLastRecord.setChecked(isFollowing);
    }

    private void createToolBar() {
        final IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
        toolbarManager.add(saveAsAction);
    }

    private void createMenu() {
        final IMenuManager manager = getViewSite().getActionBars().getMenuManager();
        manager.add(followLastRecord);
    }

    @Override
    public void setFocus() {
        // Do nothing
    }

    private void saveAs() {
        NotificationView.saveLaunchElementAs(getSite().getShell(), actualInput);
    }

    private static synchronized TestExecutionView getInstance() {
        return instance;
    }

    private static synchronized void setInstance(TestExecutionView instance) {
        TestExecutionView.instance = instance;
    }
}