com.technophobia.substeps.junit.ui.TestRelauncher.java Source code

Java tutorial

Introduction

Here is the source code for com.technophobia.substeps.junit.ui.TestRelauncher.java

Source

/*******************************************************************************
 * Copyright Technophobia Ltd 2012
 * 
 * This file is part of the Substeps Eclipse Plugin.
 * 
 * The Substeps Eclipse Plugin is free software: you can redistribute it and/or modify
 * it under the terms of the Eclipse Public License v1.0.
 * 
 * The Substeps Eclipse Plugin is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Eclipse Public License for more details.
 * 
 * You should have received a copy of the Eclipse Public License
 * along with the Substeps Eclipse Plugin.  If not, see <http://www.eclipse.org/legal/epl-v10.html>.
 ******************************************************************************/
package com.technophobia.substeps.junit.ui;

import java.text.MessageFormat;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;

import com.technophobia.eclipse.launcher.config.SubstepsLaunchConfigurationConstants;
import com.technophobia.eclipse.ui.Notifier;
import com.technophobia.substeps.supplier.Supplier;

public class TestRelauncher implements Runnable {

    private final Supplier<SubstepsRunSession> substepsRunSession;
    private final Shell shell;
    private final Notifier<String> infoMessageNotifier;

    public TestRelauncher(final Supplier<SubstepsRunSession> substepsRunSession, final Shell shell,
            final Notifier<String> infoMessageNotifier) {
        this.substepsRunSession = substepsRunSession;
        this.shell = shell;
        this.infoMessageNotifier = infoMessageNotifier;
    }

    /**
     * Stops the currently running test and shuts down the RemoteTestRunner
     */
    @Override
    public void run() {
        stopIfCurrentlyRunning();

        final ILaunch launch = substepsRunSession.get().getLaunch();
        if (launch == null)
            return;
        final ILaunchConfiguration launchConfiguration = launch.getLaunchConfiguration();
        if (launchConfiguration == null)
            return;

        final ILaunchConfiguration configuration = prepareLaunchConfigForRelaunch(launchConfiguration);
        relaunch(configuration, launch.getLaunchMode());
    }

    private void stopIfCurrentlyRunning() {
        if (substepsRunSession.get().isKeptAlive()) {
            // prompt for terminating the existing run
            if (MessageDialog.openQuestion(shell,
                    SubstepsFeatureMessages.SubstepsFeatureTestRunnerViewPart_terminate_title,
                    SubstepsFeatureMessages.SubstepsFeatureTestRunnerViewPart_terminate_message)) {
                stopTest(); // TODO: wait for terminatio
            }
        }
    }

    private void stopTest() {
        if (substepsRunSession != null) {
            if (substepsRunSession.get().isRunning()) {
                infoMessageNotifier
                        .notify(SubstepsFeatureMessages.SubstepsFeatureTestRunnerViewPart_message_stopping);
            }
            substepsRunSession.get().stopTestRun();
        }
    }

    protected ILaunchConfiguration prepareLaunchConfigForRelaunch(final ILaunchConfiguration configuration) {
        try {
            final String attribute = configuration
                    .getAttribute(SubstepsLaunchConfigurationConstants.ATTR_FAILURES_NAMES, ""); //$NON-NLS-1$
            if (attribute.length() != 0) {
                final String configName = MessageFormat.format(
                        SubstepsFeatureMessages.SubstepsFeatureTestRunnerViewPart_configName,
                        configuration.getName());
                final ILaunchConfigurationWorkingCopy tmp = configuration.copy(configName);
                tmp.setAttribute(SubstepsLaunchConfigurationConstants.ATTR_FAILURES_NAMES, ""); //$NON-NLS-1$
                return tmp;
            }
        } catch (final CoreException e) {
            // fall through
        }
        return configuration;
    }

    private void relaunch(final ILaunchConfiguration configuration, final String launchMode) {
        DebugUITools.launch(configuration, launchMode);
    }
}