/******************************************************************************* * Copyright (c) 2012 Google, Inc. * 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: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.recorder.ui.remote.standalone; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.RuntimeProcess; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import com.windowtester.codegen.CodegenControllerHandler; import com.windowtester.codegen.ExecutionProfile; import com.windowtester.codegen.ICodegenControllerHandler; import com.windowtester.codegen.debug.DebugRecordingDialog; import com.windowtester.codegen.debug.DebugRecordingInfo; import com.windowtester.recorder.event.meta.RecorderControllerStartEvent; import com.windowtester.recorder.event.meta.RecorderDisplayNotFoundEvent; import com.windowtester.recorder.event.meta.RecorderErrorEvent; import com.windowtester.recorder.event.meta.RecorderTraceEvent; import com.windowtester.recorder.event.user.SemanticEventHandler; import com.windowtester.swt.codegen.wizards.NewTestTypeWizard; import com.windowtester.swt.event.recorder.EventRecorderPlugin; import com.windowtester.swt.event.server.WorkbenchEventController; import com.windowtester.ui.util.Logger; import com.windowtester.ui.util.Tracer; /** * This is a port of the (soon to be) legacy {@link CodegenControllerHandler} * fitted to drive our new remote. */ public class RemoteRecordingController extends SemanticEventHandler implements IDebugEventSetListener, ICodegenControllerHandler { private final ExecutionProfile profile; private final Display display; private final Shell workbenchShell; private final WorkbenchEventController server; private int port; private Remote remote; public RemoteRecordingController(WorkbenchEventController server, ExecutionProfile profile) { this.profile = profile; this.server = server; this.workbenchShell = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getShell(); this.display = PlatformUI.getWorkbench().getDisplay(); } /* (non-Javadoc) * @see com.windowtester.swt.event.model.SemanticEventHandler#handleDisplayNotFound(com.windowtester.swt.event.model.RecorderDisplayNotFoundEvent) */ public void handleDisplayNotFound(RecorderDisplayNotFoundEvent event) { MessageDialog.openError(workbenchShell, "Application Initialization", "The application user interface is not yet initialized"); } /* (non-Javadoc) * @see com.windowtester.swt.event.model.SemanticEventHandler#handleControllerStart(com.windowtester.swt.event.model.RecorderControllerStartEvent) */ public void handleControllerStart(RecorderControllerStartEvent event) { port = event.getPort(); if(port<=0){ Logger.log("Got invalid port number from application under test"); return; } display.syncExec(new Runnable(){ public void run() { if (remote != null) remote.dispose(); remote = Remote.forRecorder(RecorderGateway.forPort(port)); remote.open(); } }); EventRecorderPlugin.inRecording = true; } /* (non-Javadoc) * @see com.windowtester.swt.event.model.SemanticEventHandler#handleError(com.windowtester.swt.event.model.RecorderErrorEvent) */ public void handleError(RecorderErrorEvent event) { Logger.log(event.getMsg(), event.getThrowable()); } /* (non-Javadoc) * @see com.windowtester.swt.event.model.SemanticEventHandler#handleTrace(com.windowtester.swt.event.model.RecorderTraceEvent) */ public void handleTrace(RecorderTraceEvent event) { Tracer.trace(event.getTraceOption(), event.getMsg()); } /** * Call the codegen wizard. */ protected void codegen() { display.syncExec(new Runnable() { public void run() { final NewTestTypeWizard wizard = new NewTestTypeWizard(server.getEvents(), profile); WizardDialog dialog = new WizardDialog(display.getActiveShell(), wizard); dialog.open(); } }); } /* (non-Javadoc) * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[]) */ public void handleDebugEvents(DebugEvent[] events) { if (events == null || events.length == 0) return; DebugEvent event = events[0]; if(event.getSource() instanceof RuntimeProcess){ RuntimeProcess process = (RuntimeProcess)event.getSource(); if(process.getLaunch().equals(profile.getLaunch())&&event.getKind()==DebugEvent.TERMINATE){ // the recording flag EventRecorderPlugin.inRecording = false; // close Controller dialog window if (remote != null) remote.dispose(); // stop the server from listening on socket if not in debug mode if(!EventRecorderPlugin.isInDebugMode()) server.stopServer(); // now codegen is ready to go...` if (!server.getEvents().isEmpty()) //ignore case where no events have been recorded codegen(); // display debug information as appropriate DebugRecordingInfo debugInfo = DebugRecordingInfo.getInfo(); debugInfo.setSemanticEvents(server.getEvents()); if (debugInfo.shouldShow()) { Display.getDefault().asyncExec(new Runnable() { public void run() { new DebugRecordingDialog(null).open(); } }); } // in both cases, clear the cache server.getEvents().clear(); // remove this class from debug listeners DebugPlugin.getDefault().removeDebugEventListener(this); // delete launch configuration if not in debug mode try { if(!EventRecorderPlugin.isInDebugMode()){ ILaunchConfiguration lc = process.getLaunch().getLaunchConfiguration(); if(lc.getName().equals(ExecutionProfile.TMP_APPLICATION_LAUNCH_CONFIG)) lc.delete(); } } catch (CoreException e) { Logger.log(e); } } } } }