/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * 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 * * Contributors: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.rcp.controllers; import java.net.InetAddress; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jubula.client.core.ClientTest; import org.eclipse.jubula.client.core.IClientTest; import org.eclipse.jubula.client.core.businessprocess.CompNameManager; import org.eclipse.jubula.client.core.businessprocess.ITestExecutionEventListener; import org.eclipse.jubula.client.core.businessprocess.ObjectMappingEventDispatcher; import org.eclipse.jubula.client.core.businessprocess.TestExecution; import org.eclipse.jubula.client.core.businessprocess.TestExecution.PauseMode; import org.eclipse.jubula.client.core.businessprocess.TestExecutionEvent; import org.eclipse.jubula.client.core.businessprocess.TestExecutionEvent.State; import org.eclipse.jubula.client.core.businessprocess.db.TestSuiteBP; import org.eclipse.jubula.client.core.commands.AUTModeChangedCommand; import org.eclipse.jubula.client.core.communication.AUTConnection; import org.eclipse.jubula.client.core.constants.TestExecutionConstants; import org.eclipse.jubula.client.core.events.AUTEvent; import org.eclipse.jubula.client.core.events.AUTServerEvent; import org.eclipse.jubula.client.core.events.AutAgentEvent; import org.eclipse.jubula.client.core.events.DataEventDispatcher; import org.eclipse.jubula.client.core.events.DataEventDispatcher.AutState; import org.eclipse.jubula.client.core.events.DataEventDispatcher.ServerState; import org.eclipse.jubula.client.core.events.IAUTEventListener; import org.eclipse.jubula.client.core.events.IAUTServerEventListener; import org.eclipse.jubula.client.core.events.IServerEventListener; import org.eclipse.jubula.client.core.events.ServerEvent; import org.eclipse.jubula.client.core.model.IAUTConfigPO; import org.eclipse.jubula.client.core.model.IAUTMainPO; import org.eclipse.jubula.client.core.model.ICapPO; import org.eclipse.jubula.client.core.model.IObjectMappingCategoryPO; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.core.model.ITestSuitePO; import org.eclipse.jubula.client.core.persistence.GeneralStorage; import org.eclipse.jubula.client.internal.exceptions.ConnectionException; import org.eclipse.jubula.client.ui.constants.Constants; import org.eclipse.jubula.client.ui.rcp.Plugin; import org.eclipse.jubula.client.ui.rcp.controllers.jobs.StartAutJob; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.client.ui.rcp.provider.labelprovider.OMEditorTreeLabelProvider; import org.eclipse.jubula.client.ui.utils.ErrorHandlingUtil; import org.eclipse.jubula.client.ui.utils.JobUtils; import org.eclipse.jubula.communication.internal.message.ChangeAUTModeMessage; import org.eclipse.jubula.tools.internal.constants.EnvConstants; import org.eclipse.jubula.tools.internal.constants.StringConstants; import org.eclipse.jubula.tools.internal.constants.TimingConstantsClient; import org.eclipse.jubula.tools.internal.exception.Assert; import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs; import org.eclipse.jubula.tools.internal.registration.AutIdentifier; import org.eclipse.jubula.tools.internal.utils.TimeUtil; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PartInitException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author BREDEX GmbH * @created 20.07.2004 */ public class TestExecutionContributor implements IAUTEventListener, IServerEventListener, IAUTServerEventListener, ITestExecutionEventListener { /** instance of this class */ private static TestExecutionContributor instance; /** the logger */ private static Logger log = LoggerFactory .getLogger(TestExecutionContributor.class); /** ClientTestImpl */ private IClientTest m_clientTest; /** the started server */ private String m_server = StringConstants.EMPTY; /** the port number of the started server */ private String m_port = StringConstants.EMPTY; /** * Creates an empty editor action bar contributor */ private TestExecutionContributor () { super(); setClientTest(ClientTest.instance()); registerAsListener(); } /** * add this Contributor as listener for AUTEvents, AutStarterEvents and * AUTServerEvents. Deregistering happens in deregister(), called from * dispose().. */ private void registerAsListener() { IClientTest clientTest = ClientTest.instance(); clientTest.addTestEventListener(this); clientTest.addAutAgentEventListener(this); clientTest.addAUTServerEventListener(this); clientTest.addTestExecutionEventListener(this); } /** * deregister this as listener */ private void deregister() { IClientTest clientTest = ClientTest.instance(); clientTest.removeTestEventListener(this); clientTest.removeAutAgentEventListener(this); clientTest.removeAUTServerEventListener(this); clientTest.removeTestExecutionEventListener(this); } /** * {@inheritDoc} */ public void dispose() { // remove this as EventListener from ClientTestImpl deregister(); // free ClientTestImpl reference setClientTest(null); } /** * @param event AUTEvent */ public void stateChanged(final AUTEvent event) { handleEvent(event); } /** * {@inheritDoc} */ public void stateChanged(final AutAgentEvent event) { handleEvent(event); } /** * {@inheritDoc} */ public void stateChanged(final AUTServerEvent event) { handleEvent(event); } /** * {@inheritDoc} * @param event The event. */ public void stateChanged(final TestExecutionEvent event) { handleEvent(event); } /** * @return Returns the clientTest. */ public IClientTest getClientTest() { return m_clientTest; } /** * @param clientTest The clientTest to set. */ public void setClientTest(IClientTest clientTest) { m_clientTest = clientTest; } /** * display a text for an AUTEvent in the status line * @param event the raised event, determines the displayed message */ void handleEvent(AUTEvent event) { log.info(Messages.HandleAUTEvent + StringConstants.COLON + StringConstants.SPACE + event.toString()); String message = Plugin.getStatusLineText(); String error = null; int icon = Plugin.isConnectionStatusIcon(); switch (event.getState()) { case AUTEvent.AUT_STARTED: message = Messages.TestExecutionContributorAUTStartedTesting; icon = Constants.AUT_UP; fireAndSetAutState(true); AUTModeChangedCommand.setAutMode(ChangeAUTModeMessage.TESTING); break; case AUTEvent.AUT_ABORTED: fireAndSetAutState(false); break; case AUTEvent.AUT_STOPPED: message = Messages.TestExecutionContributorAUTStopped; icon = Constants.NO_SC; fireAndSetAutState(false); break; case AUTEvent.AUT_NOT_FOUND: error = Messages.TestExecutionContributorAUTNotFound; icon = Constants.NO_SC; fireAndSetAutState(false); break; case AUTEvent.AUT_MAIN_NOT_FOUND: error = Messages.TestExecutionContributorMainClassNotFound; icon = Constants.NO_SC; fireAndSetAutState(false); break; case AUTEvent.AUT_CLASS_VERSION_ERROR: error = Messages.TestExecutionContributorClassVersionError; icon = Constants.NO_SC; fireAndSetAutState(false); break; case AUTEvent.AUT_START_FAILED: error = StringConstants.EMPTY; icon = Constants.NO_SC; fireAndSetAutState(false); break; case AUTEvent.AUT_RESTARTED: m_clientTest.addAUTServerEventListener(this); fireAndSetAutState(true); // only important for TestExecution break; case AUTEvent.AUT_ABOUT_TO_TERMINATE: m_clientTest.removeAUTServerEventListener(this); break; default: Assert.notReached(Messages.UnknownAUTState + String.valueOf(event.getState())); break; } Plugin.showStatusLine(icon, message); if (error != null) { // show error if (StringConstants.EMPTY.equals(error)) { error = null; } ErrorHandlingUtil.createMessageDialog(MessageIDs.E_AUT_START, null, error.split(StringConstants.NEWLINE)); } } /** * @param isAutRunning flag, if aut is running or not */ private void fireAndSetAutState(boolean isAutRunning) { AutState state = isAutRunning ? AutState.running : AutState.notRunning; DataEventDispatcher.getInstance().fireAutStateChanged(state); } /** * display a text for an AUTServerEvent in the status line, also * enables/disables the actions * @param event the raised event, determines the displayed message */ void handleEvent(AUTServerEvent event) { if (log.isDebugEnabled()) { log.debug(Messages.HandleAUTServerEvent + event.toString()); } int icon = Plugin.isConnectionStatusIcon(); String message = Plugin.getStatusLineText(); String error = null; switch (event.getState()) { case ServerEvent.CONNECTION_CLOSED: message = getConnectionCloseMsg(message); icon = Constants.NO_SC; setAutNotRunningState(); break; case ServerEvent.CONNECTION_GAINED: message = Messages.TestExecutionContributorConnectedToAUTServer; icon = Constants.NO_AUT; // no changes for actions, see stateChanged(AUTEvent); break; case AUTServerEvent.SERVER_NOT_INSTANTIATED: error = Messages.TestExecutionContributorServerNotInstantiated; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.DOTNET_INSTALL_INVALID: error = Messages.TestExecutionContributorDotNetInstallProblem; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.JDK_INVALID: error = Messages.TestExecutionContributorUnrecognizedJavaAgent; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.INVALID_JAVA: error = Messages.TestExecutionContributorStartingJavaFailed; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.COULD_NOT_ACCEPTING: error = Messages. TestExecutionContributorOpeningConnAUTServerFailed; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.COMMUNICATION: error = Messages. TestExecutionContributorCommunicationAUTServerFailed; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.INVALID_JAR: error = Messages.TestExecutionContributorInvalidJar; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.NO_MAIN_IN_JAR: error = Messages.TestExecutionContributorNoMainInJar; icon = Constants.NO_SC; setAutNotRunningState(); break; case AUTServerEvent.TESTING_MODE: case AUTServerEvent.MAPPING_MODE: case AUTServerEvent.RECORD_MODE: case AUTServerEvent.CHECK_MODE: autServerModeChanged(event); return; default: setAutNotRunningState(); log.error(Messages.UnknownAUTServerState + event.getState()); } if (StringUtils.isNotBlank(event.getAdditionalInfo())) { error += event.getAdditionalInfo(); } showError(icon, message, error); } /** * Get connection closed message text * @param msg base message * @return detailed message */ private String getConnectionCloseMsg(String msg) { String message = getConnectionMessage(msg); message = message + StringConstants.SPACE + StringConstants.COLON + StringConstants.SPACE + Messages.TestExecutionContributorConnAUTServClosed; return message; } /** * show an error info * @param icon display info * @param message display info * @param error display info */ private void showError(int icon, String message, String error) { Plugin.showStatusLine(icon, message); if (error != null) { // show error if (StringConstants.EMPTY.equals(error)) { showError(null); } else { showError(error); } } } /** * @param errorHolder The error string */ private void showError(final String errorHolder) { Display.getDefault().asyncExec(new Runnable() { public void run() { ErrorHandlingUtil.createMessageDialog( MessageIDs.E_AUT_START, null, errorHolder.split(StringConstants.NEWLINE)); } }); } /** * @param message the serverConnectionStatusMessage to show in status bar * @return the serverConnectionStatusMessage to show in status bar */ private String getConnectionMessage(String message) { String msg = message; InetAddress localhost = EnvConstants.LOCALHOST; msg = NLS.bind(Messages.TestExecutionContributorConnectedToAUTAgent1, new Object[] { m_server, m_port }); if (Messages.StartAutBPLocalhost.equals(m_server.toLowerCase())) { msg = NLS.bind( Messages.TestExecutionContributorConnectedToAUTAgent2, new Object[] { m_server, m_port }); } else if (localhost != null && (m_server.equals(localhost.getHostName()) || m_server.equals(localhost.getHostAddress()) || m_server .equals(localhost.getCanonicalHostName()))) { msg = NLS .bind(Messages.TestExecutionContributorConnectedToAUTAgent3, new Object[] { m_server, Messages.StartAutBPLocalhost, m_port }); } return msg; } /** * */ private void setAutNotRunningState() { DataEventDispatcher.getInstance().fireAutStateChanged( AutState.notRunning); } /** * set the status Line for changed mode * @param e AUTServerEvent */ private void autServerModeChanged(AUTServerEvent e) { int icon = Plugin.isConnectionStatusIcon(); String message = Plugin.getStatusLineText(); switch (e.getState()) { case AUTServerEvent.TESTING_MODE: message = Messages.TestExecutionContributorAUTStartedTesting; icon = Constants.AUT_UP; break; case AUTServerEvent.MAPPING_MODE: String strCat; IObjectMappingCategoryPO cat = ObjectMappingEventDispatcher.getCategoryToCreateIn(); if (cat != null) { strCat = cat.getName(); if (OMEditorTreeLabelProvider .getTopLevelCategoryName(strCat) != null) { strCat = OMEditorTreeLabelProvider .getTopLevelCategoryName(strCat); } } else { strCat = Messages.TestExecutionContributorCatUnassigned; } message = NLS.bind(Messages. TestExecutionContributorAUTStartedMapping, strCat); icon = Constants.MAPPING; break; case AUTServerEvent.RECORD_MODE: //message = I18n.getString("TestExecutionContributor.AUTStartedRecording"); //$NON-NLS-1$ message = Messages.TestExecutionContributorAUTStartedRecording; icon = Constants.RECORDING; break; case AUTServerEvent.CHECK_MODE: //message = I18n.getString("TestExecutionContributor.AUTStartedRecordingCheckMode"); //$NON-NLS-1$ message = Messages. TestExecutionContributorAUTStartedRecordingCheckMode; icon = Constants.CHECKING; break; default: break; } Plugin.showStatusLine(icon, message); } /** * display a text for an AutAgentEvent in the status line * @param event the raised event, determines the displayed message */ void handleEvent(AutAgentEvent event) { if (log.isDebugEnabled()) { log.debug(Messages.HandleAUTAgentEvent + StringConstants.COLON + StringConstants.SPACE + event.toString()); } String statusLineMessage = Plugin.getStatusLineText(); Integer messageId = MessageIDs.E_SERVER_ERROR; String error = null; int icon = Plugin.isConnectionStatusIcon(); switch (event.getState()) { case ServerEvent.CONNECTION_CLOSED: statusLineMessage = Messages.StatusLine_NotConnected; icon = Constants.NO_SERVER; DataEventDispatcher.getInstance().fireAutAgentConnectionChanged( ServerState.Disconnected); break; case ServerEvent.CONNECTION_GAINED: statusLineMessage = getConnectionMessage(statusLineMessage); icon = Constants.NO_SC; DataEventDispatcher.getInstance() .fireAutAgentConnectionChanged(ServerState.Connected); // no changing for the actions, see AUTServerEvent break; case AutAgentEvent.SERVER_CANNOT_CONNECTED: error = Messages.InfoDetailConnectToAutAgentFailed; statusLineMessage = Messages.StatusLine_NotConnected; DataEventDispatcher.getInstance().fireAutAgentConnectionChanged( ServerState.Disconnected); messageId = MessageIDs.I_SERVER_CANNOT_CONNECTED; break; case AutAgentEvent.VERSION_ERROR: error = Messages.ErrorMessageVERSION_ERROR; statusLineMessage = Messages.StatusLine_NotConnected; DataEventDispatcher.getInstance().fireAutAgentConnectionChanged( ServerState.Disconnected); break; default: log.error(Messages.UnknownAUTAgentState + StringConstants.COLON + StringConstants.SPACE + String.valueOf(event.getState())); break; } Plugin.showStatusLine(icon, statusLineMessage); if (error != null) { // show error if (StringConstants.EMPTY.equals(error)) { error = null; } ErrorHandlingUtil.createMessageDialog(messageId, new String [] {m_server, m_port}, error.split(StringConstants.NEWLINE)); } } /** * enables and disables the start and stopTestSuiteActions * @param event the event to determins the enabled/disabled actions */ void handleEvent(TestExecutionEvent event) { String message = Plugin.getStatusLineText(); String error = null; int icon = Plugin.isConnectionStatusIcon(); ICapPO cap = null; String testCaseName = null; String capName = null; switch (event.getState()) { case TEST_EXEC_STOP: icon = Constants.AUT_UP; message = Messages.TestExecutionContributorSuiteStop; break; case TEST_EXEC_FAILED: error = getTestSuiteErrorText(event); message = Messages.TestExecutionContributorSuiteFailed; break; case TEST_EXEC_START: setClientMinimized(true); icon = Constants.AUT_UP; message = Messages.TestExecutionContributorSuiteRun; showTestResultTreeView(); break; case TEST_EXEC_RESULT_TREE_READY: message = Messages.TestExecutionContributorSuiteRun; break; case TEST_EXEC_FINISHED: message = Messages.TestExecutionContributorSuiteFinished; icon = Constants.AUT_UP; break; case TEST_EXEC_COMPONENT_FAILED: cap = TestExecution.getInstance().getActualCap(); final String compName = CompNameManager.getInstance(). getNameByGuid(cap.getComponentName()); testCaseName = cap.getSpecAncestor().getName(); capName = cap.getName(); error = NLS.bind(Messages.TestExecutionContributorCompFailure, new Object[]{compName, testCaseName, capName}); message = Messages.TestExecutionContributorSuiteFailed; break; case TEST_EXEC_PAUSED: setClientMinimized(false); icon = Constants.PAUSED; message = Messages.TestExecutionContributorSuitePaused; break; case TEST_RUN_INCOMPLETE_TESTDATA_ERROR: setClientMinimized(false); error = getIncompleteTestRunMessage( State.TEST_RUN_INCOMPLETE_TESTDATA_ERROR); message = Messages.TestExecutionContributorSuiteFailed; break; case TEST_RUN_INCOMPLETE_OBJECTMAPPING_ERROR: setClientMinimized(false); error = getIncompleteTestRunMessage( State.TEST_RUN_INCOMPLETE_OBJECTMAPPING_ERROR); message = Messages.TestExecutionContributorSuiteFailed; break; case TEST_EXEC_RESTART: icon = Constants.AUT_UP; message = Messages.TestExecutionContributorSuiteRun; break; default: log.error(Messages.UnknownTestExecutionEvent); endTestExecution(); } showErrorAndStatus(event, message, error, icon); } /** * @param event the current TestExecutionEvent * @param message the status message * @param error the error message * @param icon the status icon */ private void showErrorAndStatus(TestExecutionEvent event, String message, String error, int icon) { DataEventDispatcher.getInstance().fireTestSuiteStateChanged(event); Plugin.showStatusLine(icon, message); if (error != null) { String[] errorDetail = error.split(StringConstants.NEWLINE); if (StringConstants.EMPTY.equals(error)) { errorDetail = null; } ErrorHandlingUtil.createMessageDialog( MessageIDs.E_TEST_EXECUTION_ERROR, null, errorDetail); } } /** * Gets the I18N-String of an error occured in an incomplete TestSuite-Run * depending of the given TestExecutionEvent-ID * @param testExecEventID the TestExecutionEvent-ID * @return the I18N-String of the error description. */ private String getIncompleteTestRunMessage(State testExecEventID) { ICapPO cap = TestExecution.getInstance().getActualCap(); String testCaseName = cap.getSpecAncestor().getName(); String capName = cap.getName(); switch (testExecEventID) { case TEST_RUN_INCOMPLETE_TESTDATA_ERROR: return NLS.bind(Messages. TestExecutionContributorTEST_RUN_INCOMPLETE_TESTDATA_ERROR, new Object[]{testCaseName, capName}); case TEST_RUN_INCOMPLETE_OBJECTMAPPING_ERROR: return NLS.bind(Messages. TestExecutionContributorRunIncompleteOMError, new Object[]{testCaseName, capName}); default: log.error(Messages.UnknownTestExecutionEvent); endTestExecution(); } return StringConstants.EMPTY; } /** * minimize/maximize when preference is set * * @param flag * boolean */ public static void setClientMinimized(final boolean flag) { if (Plugin.getDefault().getPreferenceStore().getBoolean( Constants.MINIMIZEONSUITESTART_KEY)) { Display.getDefault().syncExec(new Runnable() { public void run() { Shell shell = Plugin.getActiveWorkbenchWindowShell(); boolean foundShell = shell != null ? true : false; if (!foundShell) { shell = Plugin.getDisplay().getActiveShell(); foundShell = shell != null ? true : false; } if (!foundShell) { shell = Display.getDefault().getActiveShell(); foundShell = shell != null ? true : false; } if (!foundShell) { shell = Plugin.getShell(); foundShell = shell != null ? true : false; } shell.setMinimized(flag); if (shell.getMinimized() != flag) { shell.setMaximized(!flag); } } }); } } /** * returns an Error Text for displaying in GUI * @param event TestExecutionEvent * @return Text */ private String getTestSuiteErrorText(TestExecutionEvent event) { if (event.getException() != null) { return event.getException().getMessage(); } return Messages.TestExecutionContributorSuiteFailed; } /** * Shows the TestResultTreeView */ private void showTestResultTreeView() { if (Plugin.getDefault().getPreferenceStore().getBoolean( Constants.OPENRESULTVIEW_KEY)) { Display.getDefault().syncExec(new Runnable() { public void run() { try { Plugin.getActivePage().showView(Constants.TESTRE_ID); } catch (PartInitException pie) { log.error(Messages .TestResultTreeViewCouldNotInitialised, pie); } catch (NullPointerException npe) { log.error(Messages.WindowIsNull, npe); } } }); } } /** * the startAUT action * @param conf configuration to use for AUT * @param aut The IAUTMainPO */ public void startAUTaction(final IAUTMainPO aut, final IAUTConfigPO conf) { Validate.notNull(conf, Messages.ConfigurationMustNotNull); Job job = new StartAutJob(aut, conf); JobUtils.executeJob(job, null); } /** * the connectServer action * @param autAgentHost The server to start. * @param port The port of the server to start. */ public void connectToAutAgent(String autAgentHost, String port) { m_server = autAgentHost; m_port = port; getClientTest().connectToAutAgent(autAgentHost, port); } /** * the disconnectServer action */ public void disconnectFromAutAgent() { getClientTest().disconnectFromAutAgent(); m_server = StringConstants.EMPTY; m_port = StringConstants.EMPTY; } /** * Stops the Running AUT with the given ID. * * @param autId The ID of the Running AUT to stop. */ public void stopAUT(AutIdentifier autId) { fireAndSetAutState(false); final ITestSuitePO startedTestSuite = TestExecution.getInstance() .getStartedTestSuite(); if (startedTestSuite != null && startedTestSuite.isStarted()) { stopTestSuiteAction(); } getClientTest().stopAut(autId); } /** * Starts the testSuiteExecution * @param ts The runnableTestSuite. * @param autId The ID of the Running AUT on which the test will take place. * @param autoScreenshot * whether screenshots should be automatically taken in case of * test execution errors * @param iterMax maximum number of iterations */ public void startTestSuiteAction(ITestSuitePO ts, AutIdentifier autId, boolean autoScreenshot, int iterMax) { TimeUtil.delay(TimingConstantsClient.START_TEST_SUITE_DELAY); getClientTest().startTestSuite(ts, autId, autoScreenshot, iterMax, null, TestExecutionConstants.RunSteps.NORMAL.getStepValue(), null); } /** * Stops the TestSuiteExecution */ public void stopTestSuiteAction() { getClientTest().stopTestExecution(); } /** * {@inheritDoc} */ public void pauseTestSuiteAction(PauseMode pm) { getClientTest().pauseTestExecution(pm); } /** * @return Returns the instance. */ public static TestExecutionContributor getInstance() { if (instance == null) { instance = new TestExecutionContributor(); } return instance; } /** * {@inheritDoc} */ public void endTestExecution() { IProjectPO project = GeneralStorage.getInstance().getProject(); if (project == null) { return; } List<ITestSuitePO> tsList = TestSuiteBP.getListOfTestSuites(project); for (ITestSuitePO ts : tsList) { ts.setStarted(false); } if (TestExecution.getInstance().getStartedTestSuite() != null) { TestExecution.getInstance().getStartedTestSuite().setStarted(false); } try { AUTConnection.getInstance().getCommunicator() .interruptAllTimeouts(); } catch (ConnectionException e) { log.error(e.getLocalizedMessage(), e); } setClientMinimized(false); } @Override public void receiveExecutionNotification(String notification) { ErrorHandlingUtil.createMessageDialog(MessageIDs.E_TEST_EXECUTION_ERROR, null, new String[] { notification }); } }