net.rim.ejde.internal.ui.launchers.AbstractLaunchShortcut.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.launchers.AbstractLaunchShortcut.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.launchers;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import net.rim.ejde.internal.core.ContextManager;
import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.launching.DeviceInfo;
import net.rim.ejde.internal.launching.IFledgeLaunchConstants;
import net.rim.ejde.internal.model.BlackBerryProject;
import net.rim.ejde.internal.model.BlackBerryProperties;
import net.rim.ejde.internal.sourcelookup.RIMSourcePathProvider;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.NatureUtils;
import net.rim.ejde.internal.util.ProjectUtils;
import net.rim.ide.RIA;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.ILaunchShortcut;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.internal.debug.ui.launcher.LauncherMessages;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;

public abstract class AbstractLaunchShortcut implements ILaunchShortcut {

    private static final Logger _logger = Logger.getLogger(AbstractLaunchShortcut.class);

    public AbstractLaunchShortcut() {
        super();
    }

    public void launch(ISelection selection, String mode) {
        Set<IProject> allProjects = new HashSet<IProject>();
        List<IProject> selectedProjects = LaunchUtils.getSelectedProjects((StructuredSelection) selection);
        Set<IProject> referencedProjects;
        try {
            referencedProjects = ProjectUtils.getAllReferencedProjects(selectedProjects);
        } catch (CoreException e) {
            _logger.error("", e);
            referencedProjects = new HashSet<IProject>();
        }
        allProjects.addAll(selectedProjects);
        allProjects.addAll(referencedProjects);
        launch(allProjects, mode);
    }

    public void launch(IEditorPart editor, String mode) {
        IEditorInput input = editor.getEditorInput();
        if (input instanceof IFileEditorInput) {
            IFileEditorInput fileInput = (IFileEditorInput) input;
            IFile ifile = fileInput.getFile();
            IProject iproject = ifile.getProject();
            if (NatureUtils.hasBBNature(iproject)) {
                Set<IProject> projects = new HashSet<IProject>();
                projects.add(iproject);
                Set<IProject> referencedProjects;
                try {
                    referencedProjects = ProjectUtils.getAllReferencedProjects(iproject);
                } catch (CoreException e) {
                    _logger.error("", e);
                    referencedProjects = new HashSet<IProject>();
                }
                projects.addAll(referencedProjects);
                launch(projects, mode);
            }
        }
    }

    public void openLaunchConfiguration(ISelection selection, String mode) {
        Set<IProject> allProjects = new HashSet<IProject>();
        List<IProject> selectedProjects = LaunchUtils.getSelectedProjects((StructuredSelection) selection);
        Set<IProject> referencedProjects;
        try {
            referencedProjects = ProjectUtils.getAllReferencedProjects(selectedProjects);
        } catch (CoreException e) {
            _logger.error("", e);
            referencedProjects = new HashSet<IProject>();
        }
        allProjects.addAll(selectedProjects);
        allProjects.addAll(referencedProjects);
        final ILaunchConfiguration config = findLaunchConfiguration(allProjects, getConfigurationType());
        if (config != null) {
            DebugUITools.openLaunchConfigurationDialog(getShell(), new StructuredSelection(new Object[] { config }),
                    mode);
        }
    }

    protected void launch(final Set<IProject> projects, final String mode) {
        final ILaunchConfiguration config = findLaunchConfiguration(projects, getConfigurationType());
        if (config != null) {
            DebugUITools.launch(config, mode);
        }
    }

    protected abstract ILaunchConfigurationType getConfigurationType();

    /**
     * Search launch configurations in given type by projects and VM. If one could not be found, creates one; if multiple
     * configurations are found, prompt a dialog for user selection.
     *
     * @param selectedProjects
     *            The selected projects
     * @param configType
     *            The launch configuration type
     * @return The launch configuration
     */
    private ILaunchConfiguration findLaunchConfiguration(Set<IProject> selectedProjects,
            ILaunchConfigurationType configType) {
        List<ILaunchConfiguration> candidateConfigs = new ArrayList<ILaunchConfiguration>();
        try {
            ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager()
                    .getLaunchConfigurations(configType);
            for (int i = 0; i < configs.length; i++) {
                // Compare projects and VM in the launch configuration and selected projects
                Collection<IProject> projects = LaunchUtils.getProjectsFromConfiguration(configs[i]);
                if (projects.equals(selectedProjects)) {
                    candidateConfigs.add(configs[i]);
                }
            }
        } catch (CoreException e) {
            _logger.error(e.getMessage(), e);
        }

        // If there are no existing configs associated with the IType, create
        // one.
        // If there is exactly one config associated with the IType, return it.
        // Otherwise, if there is more than one config associated with the
        // IType, prompt the user to choose one.
        int candidateCount = candidateConfigs.size();
        ILaunchConfiguration ret;
        if (candidateCount < 1) {
            ret = createConfiguration(selectedProjects);
        } else if (candidateCount == 1) {
            ret = candidateConfigs.get(0);
        } else {
            // Prompt the user to choose a config. A null result means the user
            // canceled the dialog, in which case this method returns null,
            // since canceling the dialog should also cancel launching anything.
            ret = chooseConfiguration(candidateConfigs);
        }
        return ret;
    }

    protected ILaunchConfiguration createConfiguration(Set<IProject> projects) {
        ILaunchConfiguration config = null;
        try {
            IVMInstall defaultVM = LaunchUtils.getDefaultLaunchVM(projects);
            ILaunchConfigurationType configType = getConfigurationType();
            List<String> projectNames = new ArrayList<String>();
            int napps = 0;
            BlackBerryProperties bbprops;
            String lcName = IConstants.UNDERSCORE_STRING;
            for (IProject project : projects) {
                projectNames.add(project.getName());
                bbprops = ContextManager.PLUGIN.getBBProperties(project.getName(), false);
                // when determine the launch configuration name, skip library or non-BB projects
                if (bbprops != null && !BlackBerryProject.LIBRARY.equals(bbprops._application.getType())
                        && NatureUtils.hasBBNature(project)) {
                    napps++;
                    lcName = project.getName();
                }
            }
            // if use selects only one project, name the launch configuration as project name
            // otherwise name it "MultiProjects[n]"
            if (napps == 0) {
                lcName = IConstants.LC_LIBRARIES;
            } else if (napps > 1) {
                lcName = IConstants.LC_MULTIPROJECTS;
            }
            ILaunchConfigurationWorkingCopy wc = configType.newInstance(null,
                    DebugPlugin.getDefault().getLaunchManager().generateUniqueLaunchConfigurationNameFrom(lcName));
            wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER,
                    RIMSourcePathProvider.RIM_SOURCEPATH_PROVIDER_ID);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_DEPLOYED_PROJECTS, projectNames);
            RIA ria = ContextManager.PLUGIN.getRIA(defaultVM.getInstallLocation().getPath());
            if (ria == null) {
                _logger.error(NLS.bind(Messages.RIA_NO_RIA_INSTANCE_ERROR_MSG, defaultVM.getName()));
                return null;
            }
            wc.setAttribute(IFledgeLaunchConstants.ATTR_JRE_TYPE, IFledgeLaunchConstants.DEFAULT_JRE_TYPE);
            // wc.setAttribute( IFledgeLaunchConstants.ATTR_JRE_ID, defaultVM.getId() );
            DeviceInfo defaultDevice = LaunchUtils.getDefaultDeviceInfo(defaultVM);
            if (defaultDevice != null) {
                wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_SIM_DIR, defaultDevice.getDirectory());
                wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_BUNDLE, defaultDevice.getBundleName());
                wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_DEVICE, defaultDevice.getDeviceName());
                wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_CONFIG_FILE, defaultDevice.getConfigName());
            } else {
                MessageDialog.openError(getShell(), Messages.Launch_Error_Title,
                        Messages.Launch_Error_SimulatorNotAvailable);
                return null;
            }
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_PIN, IFledgeLaunchConstants.DEFAULT_PIN_NUMBER);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_LAUNCH_MDSCS, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_LAUNCH_APP_ON_STARTUP,
                    napps == 1 ? lcName : StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_AUTOMATICALLY_USE_DEFAULT_VALUE, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_NUMBER_OF_SECONDS_WAIT_BEFORE_RESPONSE,
                    StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_ESN, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_MEID, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_ENABLE_DEVICE_SECURITY, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_SYSTEM_LOCALE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_KEYBOARD_LOCALE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_DEBUG_INTERRUPT_DEBUGGER_ON_DEADLOCK, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_DEBUG_DO_NOT_STOP_EXECUTION, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_APPLICATION_HEAP_SIZE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_BRANDING_DATA, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_RESET_FILE_SYSTEM_ON_STARTUP, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_RESET_NVRAM_ON_STARTUP, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_FILE_SYSTEM_SIZE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_NOT_SAVE_FLASH_ON_EXIT, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_NOT_COMPACT_FILE_SYSTEM_ON_EXIT, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_SIMULATE_SDCARD_INSERTED, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_FORMAT_SDCARD_ON_STARTUP, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_DESTROY_EXISTING_SDCARD_IMAGE, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_SDCARD_SIZE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_SDCARD_IMAGE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_USE_PC_FILESYSTEM_FOR_SDCARD_FILES, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_PC_FILESYSTEM_PATH, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_NOT_SUPPORT_MULTIMEDIA_CARD_SIMULATION, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_MEMORY_NOT_SPLIT_MMC_PARTITION_INTO_DIFFERENT_FILES, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_DISABLE_REGISTRATION, true);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_NETWORKS, Collections.EMPTY_LIST);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_START_WITH_RADIO_OFF, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_PHONE_NUMBERS, Collections.EMPTY_LIST);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_AUTO_ANSWER_OUTGOING_CALL, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_IMEI, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_ICCID, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_IMSI, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_SIMULATE_SIM_NOT_PRESENT, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_SAVE_SIM_CARD_DATA, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_IP_ADDRESS, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_IGNORE_UDP_PORT_CONFLICT, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_SMS_SOURCE_PORT, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_SMS_DESTINATION_PORT, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_NETWORK_PDE_PORT, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_PORTS_USB_CONNECTED, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_PORTS_BLUETOOTH_PORT, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_DISABLE_AUTO_BACKLIGHT_SHUTOFF, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_HIDE_NETWORK_INFORMATION, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_DISPLAY_LCD_ONLY, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_PATH_TO_CONFIG_PACK, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_LCD_ZOOM, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_VIEW_NOT_SHOW_HELP_FOR_KEY_MAPPING, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_ADVANCED_NOT_SIMULATE_RIM_BATTERY, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_ADVANCED_NOT_USE_PC_NUMPAD_FOR_TRACKBALL, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_USE_CUSTOMIZED_COMMAND_LINE, false);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_CUSTOMIZED_COMMAND_LINE, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_CUSTOMIZED_WORKING_DIRECTORY, StringUtils.EMPTY);
            wc.setAttribute(IFledgeLaunchConstants.ATTR_CUSTOMIZED_MDS_DIRECTORY, StringUtils.EMPTY);

            /** Fix IDT345420 */
            wc.setMappedResources(projects.toArray(new IResource[projects.size()]));

            config = wc.doSave();
        } catch (CoreException ce) {
            _logger.error(ce.getMessage(), ce);
        }
        return config;
    }

    /**
     * Show a selection dialog that allows the user to choose one of the specified launch configurations. Return the chosen
     * config, or <code>null</code> if the user canceled the dialog.
     */
    protected ILaunchConfiguration chooseConfiguration(List<ILaunchConfiguration> configList) {
        IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
        ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider);
        dialog.setElements(configList.toArray());
        dialog.setTitle("Choose a launch configuration");
        dialog.setMessage(LauncherMessages.JavaLaunchShortcut_2);
        dialog.setMultipleSelection(false);
        int result = dialog.open();
        labelProvider.dispose();
        if (result == Window.OK) {
            return (ILaunchConfiguration) dialog.getFirstResult();
        }
        return null;
    }

    /**
     * Convenience method to get the window that owns this action's Shell.
     */
    protected Shell getShell() {
        return JDIDebugUIPlugin.getActiveWorkbenchShell();
    }

}