/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php * * 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.adt.project; import com.android.ide.eclipse.adt.AdtPlugin; import com.android.ide.eclipse.adt.launch.LaunchConfigDelegate; 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.jdt.launching.IJavaLaunchConfigurationConstants; import java.util.ArrayList; /** * Class to fix the launch configuration of a project if the java package * defined in the manifest has been changed.<br> * This fix can be done synchronously, or asynchronously.<br> * <code>start()</code> will start a thread that will do the fix.<br> * <code>run()</code> will do the fix in the current thread.<br><br> * By default, the fix first display a dialog to the user asking if he/she wants to * do the fix. This can be overriden by calling <code>setDisplayPrompt(false)</code>. * */ public class FixLaunchConfig extends Thread { private IProject mProject; private String mOldPackage; private String mNewPackage; private boolean mDisplayPrompt = true; public FixLaunchConfig(IProject project, String oldPackage, String newPackage) { super(); mProject = project; mOldPackage = oldPackage; mNewPackage = newPackage; } /** * Set the display prompt. If true run()/start() first ask the user if he/she wants * to fix the Launch Config * @param displayPrompt */ public void setDisplayPrompt(boolean displayPrompt) { mDisplayPrompt = displayPrompt; } /** * Fix the Launch configurations. */ @Override public void run() { if (mDisplayPrompt) { // ask the user if he really wants to fix the launch config boolean res = AdtPlugin.displayPrompt( "Launch Configuration Update", "The package definition in the manifest changed.\nDo you want to update your Launch Configuration(s)?"); if (res == false) { return; } } // get the list of config for the project String projectName = mProject.getName(); ILaunchConfiguration[] configs = findConfigs(mProject.getName()); // loop through all the config and update the package for (ILaunchConfiguration config : configs) { try { // get the working copy so that we can make changes. ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy(); // get the attributes for the activity String activity = config.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, ""); //$NON-NLS-1$ // manifests can define activities that are not in the defined package, // so we need to make sure the activity is inside the old package. if (activity.startsWith(mOldPackage)) { // create the new activity activity = mNewPackage + activity.substring(mOldPackage.length()); // put it in the copy copy.setAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, activity); // save the config copy.doSave(); } } catch (CoreException e) { // couldn't get the working copy. we output the error in the console String msg = String.format("Failed to modify %1$s: %2$s", projectName, e.getMessage()); AdtPlugin.printErrorToConsole(mProject, msg); } } } /** * Looks for and returns all existing Launch Configuration object for a * specified project. * @param projectName The name of the project * @return all the ILaunchConfiguration object. If none are present, an empty array is * returned. */ private static ILaunchConfiguration[] findConfigs(String projectName) { // get the launch manager ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager(); // now get the config type for our particular android type. ILaunchConfigurationType configType = manager. getLaunchConfigurationType(LaunchConfigDelegate.ANDROID_LAUNCH_TYPE_ID); // create a temp list to hold all the valid configs ArrayList<ILaunchConfiguration> list = new ArrayList<ILaunchConfiguration>(); try { ILaunchConfiguration[] configs = manager.getLaunchConfigurations(configType); for (ILaunchConfiguration config : configs) { if (config.getAttribute( IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "").equals(projectName)) { //$NON-NLS-1$ list.add(config); } } } catch (CoreException e) { } return list.toArray(new ILaunchConfiguration[list.size()]); } }