blob: e311bfb0b8a7e58e6fd90c6fb6b89a8f5d26a7a8 [file] [log] [blame]
/*
* 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.internal.project;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.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()]);
}
}