/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.eclipse.pdt.internal; import com.android.ide.eclipse.ddms.IDebuggerConnector; import org.eclipse.core.resources.IProject; 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.core.ILaunchManager; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import java.util.HashMap; import java.util.Map; /** * Implementation of the com.android.ide.ddms.debuggerConnector extension point. */ public class DebuggerConnector extends DevTreeProjectProvider implements IDebuggerConnector { private final static String ATTR_CONNECT_MAP_PORT = "port"; //$NON-NLS-1$ private final static String ATTR_CONNECT_MAP_HOSTNAME = "hostname"; //$NON-NLS-1$ @Override public boolean isWorkspaceApp(String appName) { return getProject() != null; } @Override public boolean connectDebugger(String appName, int appPort, int selectedPort) { IProject project = getProject(); if (project != null) { // get the launch manager ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); // get the config for the remote launch config. ILaunchConfigurationType configType = manager.getLaunchConfigurationType( IJavaLaunchConfigurationConstants.ID_REMOTE_JAVA_APPLICATION); String projectName = project.getName(); // look for an existing launch config ILaunchConfiguration config = findConfig(manager, configType, projectName, selectedPort); if (config == null) { // Didn't find a matching config, so we make one. // It'll be made in the "working copy" object first. ILaunchConfigurationWorkingCopy wc = null; try { // make the working copy object with a unique name wc = configType.newInstance(null, manager.generateUniqueLaunchConfigurationNameFrom(projectName)); // set the project name wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName); // set the connect map info Map<String, String> connectMap = new HashMap<String, String>(); connectMap.put(ATTR_CONNECT_MAP_PORT, Integer.toString(selectedPort)); connectMap.put(ATTR_CONNECT_MAP_HOSTNAME, "localhost"); //$NON-NLS-1$ wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, connectMap); // set the VM connector ID wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_CONNECTOR, IJavaLaunchConfigurationConstants.ID_SOCKET_ATTACH_VM_CONNECTOR); // save the working copy to get the launch config object which we return. config = wc.doSave(); } catch (CoreException e) { } } if (config != null) { DebugUITools.launch(config, ILaunchManager.DEBUG_MODE); return true; } } return false; } /** * Looks for and returns an existing {@link ILaunchConfiguration} object for a * specified project and connection port. * @param manager The {@link ILaunchManager}. * @param type The {@link ILaunchConfigurationType}. * @param projectName The name of the project * @param connectionPort the remote connection port. * @return an existing <code>ILaunchConfiguration</code> object matching the project, or * <code>null</code>. */ private static ILaunchConfiguration findConfig(ILaunchManager manager, ILaunchConfigurationType type, String projectName, int connectionPort) { try { ILaunchConfiguration[] configs = manager.getLaunchConfigurations(type); // look for one set up for the project with a debug equal to the selected debug port. for (ILaunchConfiguration config : configs) { Map<?, ?> attributes = config.getAttributes(); String name = (String) attributes.get( IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME); if (name == null || name.equals(projectName) == false) { continue; } Map<?, ?> connectMap = (Map<?, ?>) attributes.get( IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP); if (connectMap != null) { String portStr = (String) connectMap.get(ATTR_CONNECT_MAP_PORT); if (portStr != null) { Integer port = Integer.valueOf(portStr); if (connectionPort == port) { return config; } } } } } catch (CoreException e) { } // didn't find anything that matches. Return null return null; } }