/******************************************************************************* * 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.codegen; 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.debug.DebugRecordingDialog; import com.windowtester.codegen.debug.DebugRecordingInfo; import com.windowtester.codegen.ui.controller.ControllerDialog; import com.windowtester.internal.debug.Logger; import com.windowtester.internal.debug.Tracer; 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; public class CodegenControllerHandler extends SemanticEventHandler implements IDebugEventSetListener, ICodegenControllerHandler { /** Corresponding to this event listener recording session execution profile */ private ExecutionProfile _profile; /** Main Workbench Display instance */ private Display _display; /** The workbench shell instance */ private Shell _workbenchShell; /** Application under recording controller listening port*/ private int _port; /** Controller dialog to provide controller actions for GUI recorder */ private ControllerDialog _controllerDialog; /** Workbench event controller reference */ private WorkbenchEventController server; public CodegenControllerHandler(WorkbenchEventController server, ExecutionProfile profile) { super(); this._profile = profile; this.server = server; _workbenchShell = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getShell(); _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(_controllerDialog!=null) closeControllerDialog(); _controllerDialog = new ControllerDialog(); _controllerDialog.setEnabled(_port); _controllerDialog.openDialog(); } }); 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()); } protected void closeControllerDialog() { if(_controllerDialog==null||_controllerDialog.isDisposed()) return; _controllerDialog.dispose(); } /** * 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 _display.syncExec(new Runnable(){ public void run() { closeControllerDialog(); } }); // 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); } } } } }