org.eclipse.titan.log.viewer.views.text.table.SwitchToMscAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.titan.log.viewer.views.text.table.SwitchToMscAction.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.log.viewer.views.text.table;

import java.io.IOException;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.titan.common.logging.ErrorReporter;
import org.eclipse.titan.log.viewer.Activator;
import org.eclipse.titan.log.viewer.actions.OpenMSCViewAction;
import org.eclipse.titan.log.viewer.extractors.TestCaseExtractor;
import org.eclipse.titan.log.viewer.models.LogFileMetaData;
import org.eclipse.titan.log.viewer.parsers.data.TestCase;
import org.eclipse.titan.log.viewer.utils.Constants;
import org.eclipse.titan.log.viewer.utils.LogFileCacheHandler;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;

class SwitchToMscAction extends Action {
    private TextTableView textTableView;

    public SwitchToMscAction(TextTableView textTableView) {
        super("", ImageDescriptor.createFromImage(Activator.getDefault().getIcon(Constants.ICONS_MSC_VIEW)));
        this.textTableView = textTableView;
        setId("switchToMSC");
        setToolTipText("Switch to MSC view");
    }

    @Override
    public void run() {
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IWorkspaceRoot root = workspace.getRoot();
        LogFileMetaData logFileMetaData = textTableView.getLogFileMetaData();
        IProject project = root.getProject(logFileMetaData.getProjectName());
        IFile logFile = project.getFile(
                logFileMetaData.getProjectRelativePath().substring(logFileMetaData.getProjectName().length() + 1));

        if (LogFileCacheHandler.hasLogFileChanged(logFile)) {
            LogFileCacheHandler.handleLogFileChange(logFile);
            return;
        }

        final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        TestCaseExtractor extractor = new TestCaseExtractor();
        try {
            extractor.extractTestCasesFromIndexedLogFile(logFile);
        } catch (IOException e) {
            ErrorReporter.logExceptionStackTrace(e);
            MessageBox mb = new MessageBox(activePage.getActivePart().getSite().getShell(),
                    SWT.ICON_ERROR | SWT.OK);
            mb.setText("Test case extraction failed.");
            mb.setMessage("Error while extracting the test cases.");
            return;
        } catch (ClassNotFoundException e) {
            ErrorReporter.logExceptionStackTrace(e);
            MessageBox mb = new MessageBox(activePage.getActivePart().getSite().getShell(),
                    SWT.ICON_ERROR | SWT.OK);
            mb.setText("Test case extraction failed.");
            mb.setMessage("Error while extracting the test cases.");
            return;
        }

        List<TestCase> testCases = extractor.getTestCases();
        if (textTableView.getSelectedRecord() == null) {
            MessageBox mb = new MessageBox(activePage.getActivePart().getSite().getShell(),
                    SWT.ICON_ERROR | SWT.OK);
            mb.setText("Invalid selection.");
            mb.setMessage("Please select a record to open the MSC view.");
            return;
        }

        int recordNumber = textTableView.getSelectedRecord().getRecordNumber();
        int testCaseNumber = findContainingTestCase(testCases, recordNumber);

        if (testCaseNumber == -1) {
            MessageBox mb = new MessageBox(activePage.getActivePart().getSite().getShell(),
                    SWT.ICON_ERROR | SWT.OK);
            mb.setText("Testcase can not be found.");
            mb.setMessage("The testcase containing the selected log record can not be found.");
            return;
        }

        final OpenMSCViewAction openMSCAction = new OpenMSCViewAction();
        openMSCAction.selectionChanged(null, new StructuredSelection(testCases.get(testCaseNumber)));
        openMSCAction.setFirstRow(recordNumber);
        openMSCAction.run();
    }

    private int findContainingTestCase(List<TestCase> testCases, int recordNumber) {
        int testCaseNumber = -1;
        for (int min = 0, max = testCases.size() - 1, mid = (min + max) / 2; min <= max; mid = (min + max) / 2) {

            if (recordNumber > testCases.get(mid).getEndRecordNumber()) {
                min = mid + 1;
            } else if (recordNumber < testCases.get(mid).getStartRecordNumber()) {
                max = mid - 1;
            } else {
                testCaseNumber = mid;
                break;
            }
        }
        return testCaseNumber;
    }
}