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

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.launchers.LaunchUtils.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.io.File;
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.IConstants;
import net.rim.ejde.internal.launching.DeviceInfo;
import net.rim.ejde.internal.launching.DeviceProfileManager;
import net.rim.ejde.internal.launching.IDeviceLaunchConstants;
import net.rim.ejde.internal.launching.IFledgeLaunchConstants;
import net.rim.ejde.internal.launching.IRunningFledgeLaunchConstants;
import net.rim.ejde.internal.model.BlackBerryVMInstallType;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.NatureUtils;
import net.rim.ejde.internal.util.ProjectUtils;
import net.rim.ejde.internal.util.StatusFactory;
import net.rim.ejde.internal.util.VMUtils;
import net.rim.ide.SettableProperty;
import net.rim.ide.SettablePropertyGroup;
import net.rim.ide.SimulatorProfiles;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
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.jdt.core.JavaCore;
import org.eclipse.jdt.launching.AbstractVMInstall;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;

/**
 * Utility class used by launch configuration.
 *
 * @author dmeng
 *
 */
public class LaunchUtils {

    private static Logger _logger = Logger.getLogger(LaunchUtils.class);

    /**
     * Returns device info for the given VM.
     *
     * @param vm
     *            The BlackBerry VM
     * @return List of <code>DeviceInfo</code>
     */
    public static List<DeviceInfo> getDevicesInfo(IVMInstall vm) {
        List<DeviceInfo> deviceList = DeviceProfileManager.getInstance().getDeviceProfiles(vm);
        return deviceList;
    }

    /**
     * Returns the default device info in the given VM.
     *
     * @param vm
     *            The VM
     * @return The default device info
     */
    public static DeviceInfo getDefaultDeviceInfo(IVMInstall vm) {
        DeviceInfo defaultDevice = DeviceProfileManager.getInstance().getDefaultDevice(vm);
        return defaultDevice;
    }

    /**
     * Returns the device info for the given simulator profile.
     *
     * @param profiles
     *            The <code>SimulatorProfiles</code>
     * @param profileName
     *            The profile name
     * @return The device info in the given profile
     */
    public static List<DeviceInfo> getDevicesInfo(SimulatorProfiles profiles, String profileName) {
        List<DeviceInfo> deviceNames = new ArrayList<DeviceInfo>();
        SettablePropertyGroup[] propGroups = profiles.getSettableProperties(profileName);
        for (int groupIndex = 0; groupIndex < propGroups.length; groupIndex++) {
            SettableProperty[] properties = propGroups[groupIndex].getProperties();
            for (int propIndex = 0; propIndex < properties.length; propIndex++) {
                if (properties[propIndex].getLabel().equals(IFledgeLaunchConstants.SETTABLE_PROPERTY_DEVICE)) {
                    String[] choices = properties[propIndex].getChoices();
                    // filter out Default and blank
                    for (int k = 0; k < choices.length; k++) {
                        if (!choices[k].equals(IConstants.EMPTY_STRING)
                                && !choices[k].equals(IFledgeLaunchConstants.SETTABLE_PROPERTY_DEVICE_DEFAULT)) {
                            // for default simulators, don't need set directory and config file name
                            deviceNames.add(new DeviceInfo(IFledgeLaunchConstants.DEFAULT_SIMULATOR_BUNDLE_NAME,
                                    choices[k], "", choices[k]));
                        }
                    }
                    return deviceNames;
                }
            }
        }
        return Collections.emptyList();
    }

    /**
     * Returns BlackBerry VM used to launch the given projects.
     *
     * @param projects
     *            The list of <code>IProject</code>
     * @return The <code>IVMInstall</code> or <code>null</code> if not found.
     */
    public static IVMInstall getDefaultLaunchVM(Collection<IProject> projects) {
        IVMInstall targetVM = null;
        for (IProject project : projects) {
            IVMInstall vm = ProjectUtils.getVMForProject(JavaCore.create(project));
            if (vm != null) {
                if (targetVM != null) {
                    // use the highest version of VM
                    if (vm.getId().compareTo(targetVM.getId()) > 0) {
                        targetVM = vm;
                    }
                } else {
                    targetVM = vm;
                }
            }
        }
        return targetVM;
    }

    /**
     * Get the projects defined in the given launch configuration.
     *
     * @param configuration
     *            The launch configuration
     * @return The collection of projects
     */
    @SuppressWarnings("unchecked")
    public static Set<IProject> getProjectsFromConfiguration(ILaunchConfiguration configuration) {
        List<String> checkedProjectNames;
        try {
            checkedProjectNames = configuration.getAttribute(IFledgeLaunchConstants.ATTR_DEPLOYED_PROJECTS,
                    Collections.EMPTY_LIST);
        } catch (CoreException e) {
            _logger.error(e);
            return Collections.emptySet();
        }
        Set<IProject> checkedProjects = new HashSet<IProject>();
        for (String name : checkedProjectNames) {
            IResource ires = ResourcesPlugin.getWorkspace().getRoot().findMember(name);
            if (ires != null && ires instanceof IProject) {
                IProject project = (IProject) ires;
                // this also filters out closed projects
                if (project.isOpen()) {
                    checkedProjects.add(project);
                }
            }
        }
        return checkedProjects;
    }

    /**
     * Get the highest VM in the given projects.
     *
     * @param projects
     *            The projects
     * @return The highest version of VM or <code>null</code> if all VMs are uninstalled
     */
    public static IVMInstall getHighestVMInProjects(Collection<IProject> projects) {
        IVMInstall targetVM = null;
        for (IProject project : projects) {
            IVMInstall vm = ProjectUtils.getVMForProject(JavaCore.create(project));
            // The VM must be available
            if (vm != null) {
                if (targetVM != null) {
                    if (vm.getId().compareTo(targetVM.getId()) > 0) {
                        targetVM = vm;
                    }
                } else {
                    targetVM = vm;
                }
            }
        }
        return targetVM;
    }

    /**
     * Returns current running BlackBerry launch, could be Simulator, Device or Running Simulator launch.
     *
     * @return The BlackBerry launch or <code>null</code> if running BB launch does not exist.
     */
    public static ILaunch getRunningBBLaunch() {
        ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
        for (int i = 0; i < launches.length; i++) {
            if (!launches[i].isTerminated()) {
                try {
                    ILaunchConfiguration configuration = launches[i].getLaunchConfiguration();
                    if (configuration != null) {
                        ILaunchConfigurationType launchType = configuration.getType();
                        if (launchType.getIdentifier().equals(IFledgeLaunchConstants.LAUNCH_CONFIG_ID)
                                || launchType.getIdentifier().equals(IRunningFledgeLaunchConstants.LAUNCH_CONFIG_ID)
                                || launchType.getIdentifier().equals(IDeviceLaunchConstants.LAUNCH_CONFIG_ID)) {
                            return launches[i];
                        }
                    }
                } catch (CoreException e) {
                    _logger.error(e);
                }
            }
        }
        return null;
    }

    /**
     * Get list of <code>IProject</code> from the selection.
     *
     * @param selection
     * @return The list of <code>IProject</code>
     */
    public static List<IProject> getSelectedProjects(StructuredSelection selection) {
        Object[] items = selection.toArray();
        List<IProject> projects = new ArrayList<IProject>();
        IProject iproject;
        for (int i = 0; i < items.length; i++) {
            iproject = null;
            if (items[i] instanceof IAdaptable) {
                Object ires = ((IAdaptable) items[i]).getAdapter(IResource.class);
                if (ires != null) {
                    iproject = ((IResource) ires).getProject();
                }
            }
            if (iproject != null) {
                if (NatureUtils.hasBBNature(iproject) && !projects.contains(iproject)) {
                    projects.add(iproject);
                }
            }

        }
        return projects;
    }

    /**
     * Returns the VM in the given launch configuration.
     *
     * @param configuration
     *            The <code>ILaunchConfiguration</code>
     * @return The <code>IVMInstall</code> or <code>null</code> if BB-VM is not found.
     */
    public static IVMInstall getVMFromConfiguration(ILaunchConfiguration configuration) {
        IVMInstall vm = null;
        try {
            int vmType = configuration.getAttribute(IFledgeLaunchConstants.ATTR_JRE_TYPE,
                    IFledgeLaunchConstants.DEFAULT_JRE_TYPE);
            if (vmType == IFledgeLaunchConstants.JRE_TYPE_PROJECT) {
                Set<IProject> projects = getProjectsFromConfiguration(configuration);
                vm = getDefaultLaunchVM(projects);
            } else if (vmType == IFledgeLaunchConstants.JRE_TYPE_ALTERNATE) {
                String vmId = configuration.getAttribute(IFledgeLaunchConstants.ATTR_JRE_ID, StringUtils.EMPTY);
                if (!vmId.equals(StringUtils.EMPTY)) {
                    vm = VMUtils.findVMById(vmId);
                }
            }
        } catch (CoreException e) {
            _logger.error(e);
        }
        return vm;
    }

    /**
     * Returns the device name associated with the given launch configuration.
     *
     * @param configuration
     *            The launch configuration
     * @return The device name or empty string if any error occurs
     */
    public static DeviceInfo getDeviceInfo(ILaunchConfiguration configuration) {
        try {
            String simDir = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_SIM_DIR,
                    StringUtils.EMPTY);
            String bundleName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_BUNDLE,
                    StringUtils.EMPTY);
            String deviceName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_DEVICE,
                    StringUtils.EMPTY);
            String configFile = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_CONFIG_FILE,
                    StringUtils.EMPTY);
            IVMInstall vm = LaunchUtils.getVMFromConfiguration(configuration);
            List<DeviceInfo> devices = LaunchUtils.getDevicesInfo(vm);
            DeviceInfo di = new DeviceInfo(bundleName, deviceName, simDir, configFile);
            if (!devices.contains(di)) {
                return LaunchUtils.getDefaultDeviceInfo(vm);
            }
            return di;
        } catch (CoreException e) {
            _logger.error(e);
        }
        return null;
    }

    /**
     * Returns the String attribute value stored in the launch configuration.
     *
     * @param configuration
     *            The launch configuration
     * @param attribute
     *            The attribute
     * @return The attribute value
     */
    public static String getStringAttribute(ILaunchConfiguration configuration, String attribute,
            String defaultValue) {
        String ret = defaultValue;
        try {
            ret = configuration.getAttribute(attribute, defaultValue);
        } catch (CoreException e) {
            _logger.error(e.getMessage());
        }
        return ret;
    }

    /**
     * Returns the boolean attribute value stored in the launch configuration.
     *
     * @param configuration
     *            The launch configuration
     * @param attribute
     *            The attribute
     * @return The attribute value
     */
    public static boolean getBooleanAttribute(ILaunchConfiguration configuration, String attribute,
            boolean defaultValue) {
        boolean ret = defaultValue;
        try {
            ret = configuration.getAttribute(attribute, defaultValue);
        } catch (CoreException e) {
            _logger.error(e.getMessage());
        }
        return ret;
    }

    /**
     * Returns the simulator path for the given VM.
     *
     * @param vm
     *            The VM
     * @return The simulator path
     */
    public static String getSimualtorPath(IVMInstall vm) {
        String simulatorPath;
        String isInternal = ((AbstractVMInstall) vm).getAttribute(BlackBerryVMInstallType.ATTR_INTERNAL);
        if (isInternal != null && Integer.parseInt(isInternal) == 1) {
            simulatorPath = vm.getInstallLocation().getPath() + File.separator + "debug";
        } else {
            simulatorPath = vm.getInstallLocation().getPath() + File.separator + "simulator";
        }
        return simulatorPath;
    }

    /**
     * Returns the fledge.exe path for the given VM.
     *
     * @param vm
     *            The VM
     * @return The fledge.exe path
     */
    public static String getFledgeExePath(IVMInstall vm) {
        String fledgePath;
        String isInternal = ((AbstractVMInstall) vm).getAttribute(BlackBerryVMInstallType.ATTR_INTERNAL);
        if (isInternal != null && Integer.parseInt(isInternal) == 1) {
            fledgePath = vm.getInstallLocation().getPath() + File.separator + "fledge" + File.separator + "bin";
        } else {
            fledgePath = vm.getInstallLocation().getPath() + File.separator + "simulator";
        }
        return fledgePath;
    }

    public static DeviceInfo getDeviceToLaunch(ILaunchConfiguration configuration) throws CoreException {
        String bundleName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_BUNDLE,
                StringUtils.EMPTY);
        String simDir = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_SIM_DIR, StringUtils.EMPTY);
        String deviceName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_DEVICE,
                StringUtils.EMPTY);
        String configFileName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_GENERAL_CONFIG_FILE,
                StringUtils.EMPTY);
        IVMInstall vm = LaunchUtils.getVMFromConfiguration(configuration);
        List<DeviceInfo> devices = LaunchUtils.getDevicesInfo(vm);
        if (devices.isEmpty()) {
            throw new CoreException(
                    StatusFactory.createErrorStatus(NLS.bind(Messages.Launch_Error_DeviceNotFound, vm.getId())));
        }
        if (!devices.contains(new DeviceInfo(bundleName, deviceName, simDir, configFileName))) {
            // JRE is changed, choose the default device instead
            DeviceInfo di = LaunchUtils.getDefaultDeviceInfo(vm);
            if (di != null) {
                bundleName = di.getBundleName();
                simDir = di.getDirectory();
                deviceName = di.getDeviceName();
                configFileName = di.getConfigName();
                // save the changes
                ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
                workingCopy.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_BUNDLE, bundleName);
                workingCopy.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_SIM_DIR, simDir);
                workingCopy.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_DEVICE, deviceName);
                workingCopy.setAttribute(IFledgeLaunchConstants.ATTR_GENERAL_CONFIG_FILE, configFileName);
                workingCopy.doSave();
            } else {
                throw new CoreException(StatusFactory
                        .createErrorStatus(NLS.bind(Messages.Launch_Error_DefaultDeviceNotFound, vm.getId())));
            }
        }
        return new DeviceInfo(bundleName, deviceName, simDir, configFileName);
    }

    /**
     * Close the given launch, it terminates the launch first (if supported) and remove it from launch manager.
     *
     * @param launch
     *            The launch to be closed
     * @throws DebugException
     */
    public static void closeLaunch(ILaunch launch) throws DebugException {
        if (launch != null) {
            if (launch.canTerminate()) {
                launch.terminate();
            }
            DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
        }
    }

    /**
     * Returns the VM name used in the given launch configuration.
     *
     * @param configuration
     *            The launch configuration
     * @return The VM name or "undefined" if the vm has been removed
     */
    public static String getVMNameFromConfiguration(ILaunchConfiguration configuration) {
        String vmName = "undefined";
        try {
            int vmType = configuration.getAttribute(IFledgeLaunchConstants.ATTR_JRE_TYPE,
                    IFledgeLaunchConstants.DEFAULT_JRE_TYPE);
            if (vmType == IFledgeLaunchConstants.JRE_TYPE_PROJECT) {
                Set<IProject> projects = getProjectsFromConfiguration(configuration);
                IVMInstall vm = getDefaultLaunchVM(projects);
                if (vm != null) {
                    vmName = vm.getName();
                }
            } else if (vmType == IFledgeLaunchConstants.JRE_TYPE_ALTERNATE) {
                vmName = configuration.getAttribute(IFledgeLaunchConstants.ATTR_JRE_ID, StringUtils.EMPTY);
            }
        } catch (CoreException e) {
            _logger.error(e);
        }
        return vmName;
    }
}