public class A {
	public void launch(ILaunchConfiguration configuration, String mode,
			ILaunch launch, IProgressMonitor monitor) throws CoreException {
		try {
			IJavaProject javaProject = getJavaProject(configuration);
			if ((javaProject == null) || !javaProject.exists()) {
				abort(
						PDEPlugin
								.getResourceString("JUnitLaunchConfiguration.error.invalidproject"), null, IJavaLaunchConfigurationConstants.ERR_NOT_A_JAVA_PROJECT); //$NON-NLS-1$
			}
			IType[] testTypes = getTestTypes(configuration, javaProject,
					new SubProgressMonitor(monitor, 1));
			if (testTypes.length == 0) {
				abort(
						PDEPlugin
								.getResourceString("JUnitLaunchConfiguration.error.notests"), null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); //$NON-NLS-1$
			}
			monitor.worked(1);

			IVMInstall launcher = LauncherUtils.createLauncher(configuration);
			monitor.worked(1);

			int port = SocketUtil.findFreePort();
			VMRunnerConfiguration runnerConfig = createVMRunner(configuration,
					testTypes, port, mode);
			if (runnerConfig == null) {
				monitor.setCanceled(true);
				return;
			}
			monitor.worked(1);

			launch.setAttribute(ILauncherSettings.CONFIG_LOCATION,
					(configFile == null) ? null : configFile.getParent());

			String workspace = configuration.getAttribute(LOCATION + "0",
					getDefaultWorkspace(configuration));
			LauncherUtils.clearWorkspace(configuration, workspace);

			setDefaultSourceLocator(launch, configuration);
			launch.setAttribute(PORT_ATTR, Integer.toString(port));
			launch.setAttribute(TESTTYPE_ATTR, testTypes[0]
					.getHandleIdentifier());
			PDEPlugin.getDefault().getLaunchesListener().manage(launch);
			launcher.getVMRunner(mode).run(runnerConfig, launch, monitor);
			monitor.worked(1);
		} catch (CoreException e) {
			monitor.setCanceled(true);
			throw e;
		}
	}
}