com.windowtester.eclipse.ui.launcher.RecorderWorkbenchLaunchConfDelegate.java Source code

Java tutorial

Introduction

Here is the source code for com.windowtester.eclipse.ui.launcher.RecorderWorkbenchLaunchConfDelegate.java

Source

/*******************************************************************************
 *  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.eclipse.ui.launcher;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
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.DebugRecordingInfo;
import com.windowtester.eclipse.ui.UiPlugin;
import com.windowtester.eclipse.ui.WTUI;
import com.windowtester.eclipse.ui.launcher.bundle.RecorderBundleRequirements;
import com.windowtester.eclipse.ui.launcher.bundle.RecorderLaunchValidator;
import com.windowtester.internal.debug.LogHandler;
import com.windowtester.net.ICommunicationProtocolConstants;
import com.windowtester.recorder.ui.RecordingSessionController;
import com.windowtester.swt.event.recorder.EventRecorderPlugin;
import com.windowtester.swt.event.server.WorkbenchEventController;
import com.windowtester.ui.util.Logger;

public class RecorderWorkbenchLaunchConfDelegate extends
        /* $codepro.preprocessor.if version < 3.2.0 $
        org.eclipse.pde.internal.ui.launcher.WorkbenchLaunchConfigurationDelegate
        $codepro.preprocessor.elseif version >= 3.2.0 $ */
        org.eclipse.pde.ui.launcher.EclipseApplicationLaunchConfiguration
/* $codepro.preprocessor.endif $ */
{
    /** Workbench event controller server */
    private WorkbenchEventController server;

    protected boolean injectBundles = false;

    public final static String INJECT_BUNDLES_KEY = "com.windowtester.eclipse.ui.launcher.INJECT_BUNDLES_KEY"; //$NON-NLS-1$

    protected static final boolean VERBOSE_INJECTION = true;

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.
     * eclipse.debug.core.ILaunchConfiguration, java.lang.String,
     * org.eclipse.debug.core.ILaunch,
     * org.eclipse.core.runtime.IProgressMonitor)
     */
    public final void launch(final ILaunchConfiguration configuration, final String mode, final ILaunch launch,
            final IProgressMonitor monitor) throws CoreException {

        optionallyInjectBundles(configuration);

        cacheConfiguration(configuration);

        // first test if we there is no recording in progress
        if (UiPlugin.getDefault().isInRecoring()) {
            UiPlugin.getDefault().showErrorDialog(
                    Messages.getString("RecorderWorkbenchLaunchConfDelegate.RECORDING_TITLE"), //$NON-NLS-1$
                    Messages.getString("RecorderWorkbenchLaunchConfDelegate.RECORDING_QUESTION")); //$NON-NLS-1$
            return;
        }
        // init bootstrap plugin and semantic event listener
        DebugRecordingInfo.newRecording();
        final CoreException[] ex = new CoreException[1];
        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                try {
                    launch0(configuration, mode, launch, monitor);
                } catch (CoreException e) {
                    ex[0] = e;
                }
            }
        });
        if (ex[0] != null)
            throw ex[0];
    }

    private void cacheConfiguration(ILaunchConfiguration configuration) {
        UiPlugin.getDefault().cacheLaunchConfig(configuration);
    }

    private void optionallyInjectBundles(final ILaunchConfiguration configuration) throws CoreException {
        if (BundleInjection.isDisabled())
            return;
        if (!validConfig(configuration)) {
            injectBundles = configuration.getAttribute(INJECT_BUNDLES_KEY, true);
            if (!injectBundles) {
                Display.getDefault().syncExec(new Runnable() {

                    public void run() {
                        boolean openQuestion = MessageDialog.openQuestion(
                                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                                Messages.getString("RecorderWorkbenchLaunchConfDelegate.MISSED_BUNDLES_TITLE"), //$NON-NLS-1$
                                Messages.getString("RecorderWorkbenchLaunchConfDelegate.MISSED_BUNDLES_QUESTION")); //$NON-NLS-1$
                        injectBundles = openQuestion;
                        try {
                            ILaunchConfigurationWorkingCopy copy = configuration.getWorkingCopy();
                            copy.setAttribute(INJECT_BUNDLES_KEY, injectBundles);
                            copy.doSave();
                        } catch (CoreException e) {
                            LogHandler.log(e);
                        }
                    }

                });

            }
        }
    }

    public String[] getProgramArguments(ILaunchConfiguration configuration) throws CoreException {
        if (injectBundles) {
            String[] requiredPluginIds = RecorderBundleRequirements.getRequiredPluginIds();
            return new ProgramArgumentBuilder().getProgramArguments(configuration, getConfigDir(configuration),
                    requiredPluginIds);
        } else {
            return super.getProgramArguments(configuration);
        }
    }

    protected boolean validConfig(ILaunchConfiguration configuration) {

        RecorderLaunchValidator validator = new RecorderLaunchValidator();

        IStatus status = validator.validate(configuration);
        if (status.isOK())
            return true;

        // LaunchConfigurationStatusReporter.forStatus(status);

        return false;
    }

    protected void launch0(ILaunchConfiguration configuration, String mode, ILaunch launch,
            IProgressMonitor monitor) throws CoreException {
        ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy();
        initSemanticEventListener(wc, launch);

        if (EventRecorderPlugin.isInDebugMode()) {
            if (ExecutionProfile.TMP_APPLICATION_LAUNCH_CONFIG.equals(wc.getName())) {
                wc.doSave(); // this name is used for SWT launch types
            } else {
                ILaunchConfigurationType type = DebugPlugin.getDefault().getLaunchManager()
                        .getLaunchConfigurationType(UiPlugin.WORKBENCH_LAUNCH_CONFIGURATION_TYPE);
                ILaunchConfigurationWorkingCopy localCopy = type.newInstance(null,
                        ExecutionProfile.TMP_APPLICATION_LAUNCH_CONFIG);
                localCopy.setAttributes(wc.getAttributes());
                localCopy.doSave();
            }
        }
        // provide actual run mode if the record mode was issued
        if (UiPlugin.LAUNCH_MODE_RECORD.equals(mode))
            mode = ILaunchManager.RUN_MODE;
        super.launch((ILaunchConfiguration) wc, mode, launch, monitor);
        // cache recording information
        String workspaceLoc = wc.getAttribute("location", (String) null); //$NON-NLS-1$
        if (workspaceLoc == null)
            workspaceLoc = wc.getAttribute("location" + String.valueOf(0), //$NON-NLS-1$
                    (String) null);
        if (workspaceLoc != null)
            DebugRecordingInfo.getInfo().setWorkspaceLocation(new Path(workspaceLoc));
    }

    public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
        String[] result = null;

        /* $codepro.preprocessor.if version > 3.1 $ */
        result = super.getClasspath(configuration);
        /* $codepro.preprocessor.endif $ */

        DebugRecordingInfo.getInfo().setRecorderClasspath(result);
        return result;
    }

    /**
     * @param wc
     * @throws CoreException
     */
    protected void initSemanticEventListener(ILaunchConfigurationWorkingCopy wc, ILaunch launch)
            throws CoreException {
        if (EventRecorderPlugin.isInDebugMode()) {
            // reuse the same instance of the server
            server = EventRecorderPlugin.getDefault().getWorkbechController();
        } else {
            // create a new instance for each LC launch
            server = new WorkbenchEventController();
        }
        ICodegenControllerHandler handler = createControllerHandler(server, launch);
        server.setHandler(handler);
        int port = server.getPort();
        if (port == -1) {
            IStatus s = Logger.createLogStatus(
                    Messages.getString("RecorderWorkbenchLaunchConfDelegate.SERVER_SOCKET_NOT_INITED"), null, null); //$NON-NLS-1$
            throw new CoreException(s);
        }
        // save the port number in configuration scoped preferences
        String vmargs = getVmAttributes(wc);
        vmargs += " -D" //$NON-NLS-1$
                + ICommunicationProtocolConstants.RECORDER_PORT_SYSTEM_PROPERTY + "=" + port; //$NON-NLS-1$
        setVmAttributes(wc, vmargs);
        // register to Debug event for termination tests
        DebugPlugin.getDefault().addDebugEventListener(handler);
        // start server
        if (!server.isAlive())
            server.start();
    }

    // Hook to plugin in another handler
    protected ICodegenControllerHandler createControllerHandler(WorkbenchEventController wbController,
            ILaunch launch) throws CoreException {
        ExecutionProfile execProfile = createExecutionProfile(launch);
        if (WTUI.isRecorderConsoleViewEnabled())
            return new RecordingSessionController(wbController, execProfile);
        return new CodegenControllerHandler(wbController, execProfile);
    }

    protected ExecutionProfile createExecutionProfile(ILaunch launch) throws CoreException {
        // create execution profile
        ExecutionProfile profile = new ExecutionProfile();
        profile.setLaunch(launch);
        profile.setExecType(ExecutionProfile.RCP_EXEC_TYPE);
        return profile;
    }

    protected void setVmAttributes(ILaunchConfigurationWorkingCopy wc, String attr) {
        /* $codepro.preprocessor.if version < 3.2.0 $ 
         wc.setAttribute("vmargs", attr);
         wc.setAttribute(org.eclipse.jdt.launching.
         IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, attr);
        $codepro.preprocessor.elseif version >= 3.2.0 $ */
        wc.setAttribute("vmargs", (String) null); //$NON-NLS-1$
        wc.setAttribute(org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, attr);
        /* $codepro.preprocessor.endif $ */
    }

    protected String getVmAttributes(ILaunchConfiguration wc) throws CoreException {
        /* $codepro.preprocessor.if version < 3.2.0 $ 
        return wc.getAttribute("vmargs", ""); 
        $codepro.preprocessor.elseif version >= 3.2.0 $ */
        return wc.getAttribute(org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, ""); //$NON-NLS-1$
        /* $codepro.preprocessor.endif $ */
    }
}