Java tutorial
/* * 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(); } }