org.eclipse.titan.log.viewer.actions.ExtractComponentsAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.titan.log.viewer.actions.ExtractComponentsAction.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.actions;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.titan.common.logging.ErrorReporter;
import org.eclipse.titan.log.viewer.console.ConsoleWriter;
import org.eclipse.titan.log.viewer.exceptions.TechnicalException;
import org.eclipse.titan.log.viewer.exceptions.TitanLogExceptionHandler;
import org.eclipse.titan.log.viewer.exceptions.UserException;
import org.eclipse.titan.log.viewer.extractors.ComponentEvent;
import org.eclipse.titan.log.viewer.extractors.ComponentEventDispatcher;
import org.eclipse.titan.log.viewer.extractors.ComponentExtractor;
import org.eclipse.titan.log.viewer.models.LogFileMetaData;
import org.eclipse.titan.log.viewer.utils.LogFileHandler;
import org.eclipse.titan.log.viewer.utils.Messages;

/**
 * Class for the action which extracts test cases
 * from a TITAN Log Viewer log file 
 *
 */
public class ExtractComponentsAction implements IRunnableWithProgress, Observer {

    private IFile logFile;
    private ComponentExtractor componentExtractor;
    private LogFileHandler logFileHandler;
    private LogFileMetaData logFileMetaData;
    private IProgressMonitor monitor;
    private int lastWorked;
    private List<String> components;
    private ComponentEventDispatcher componentEventDispatcher;

    /**
     * Extracts components from a log file
     * @param logFile The input file full path
     */
    public ExtractComponentsAction(final IFile logFile) {
        this.logFile = logFile;
        this.componentExtractor = new ComponentExtractor();
        this.componentEventDispatcher = new ComponentEventDispatcher();
        this.componentExtractor.addObserver(this.componentEventDispatcher);

        this.logFileHandler = new LogFileHandler(logFile);
        this.logFileMetaData = null;
        this.lastWorked = 0;

        // Add this viewer as an observer
        this.componentEventDispatcher.addObserver(this);
    }

    @Override
    public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        this.monitor = monitor;
        this.components = null;

        // First of all, verify that the file is a TITAN supported log file
        try {
            this.logFileMetaData = this.logFileHandler.autoDetect();
        } catch (TechnicalException e) {
            ErrorReporter.logExceptionStackTrace(e);
            TitanLogExceptionHandler.handleException(new UserException(e.getMessage()));
            return;
        }

        try {
            if (this.monitor != null) {
                this.monitor.beginTask(Messages.getString("ExtractComponentsAction.0"), 100); //$NON-NLS-1$
            }

            long start = System.currentTimeMillis();
            this.componentExtractor.extractComponentsFromLogFile(this.logFileMetaData, monitor);
            long stop = System.currentTimeMillis();

            this.components = this.componentExtractor.getComponents();
            // SUT and MTC is expected to always exist in log file
            int numComp = this.components.size() + 2;
            ConsoleWriter.getInstance().writeToConsole(
                    Messages.getString("ExtractComponentsAction.1") + numComp
                            + Messages.getString("ExtractComponentsAction.4") + this.logFile.getName()
                            + Messages.getString("ExtractComponentsAction.5") + (stop - start) / 1000.0
                            + Messages.getString("ExtractComponentsAction.2"),
                    this.logFileMetaData.getProjectName());
            ConsoleWriter.getInstance().writeToConsole("", this.logFileMetaData.getProjectName()); //$NON-NLS-1$
        } catch (final IOException e) {
            ErrorReporter.logExceptionStackTrace(e);
            // Generate Technical Error
            String errorMsg = Messages.getString("ExtractComponentsAction.3") + //$NON-NLS-1$
                    this.logFile.getName() + "Reason: " + e.getMessage(); //$NON-NLS-1$
            TitanLogExceptionHandler.handleException(new TechnicalException(errorMsg));
        } finally {
            this.componentEventDispatcher.deleteObserver(this);
            this.componentExtractor.deleteObserver(this.componentEventDispatcher);
            if (this.monitor != null) {
                this.monitor.done();
            }
        }
    }

    @Override
    public void update(final Observable observable, final Object event) {
        if (event instanceof ComponentEvent) {
            ComponentEvent componentEvent = (ComponentEvent) event;
            if (this.monitor != null) {
                this.monitor.subTask(componentEvent.getCompName());
            }
            int worked = componentEvent.getProgress();
            if (this.monitor != null) {
                this.monitor.worked(worked - this.lastWorked);
            }
            this.lastWorked = worked;
        }
    }

    /**
     * Returns the extracted components
     * @return the extracted components
     */
    public List<String> getComponents() {
        return this.components;
    }
}