aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java156
1 files changed, 156 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java
new file mode 100644
index 000000000..e311bfb0b
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/FixLaunchConfig.java
@@ -0,0 +1,156 @@
+/*
+ * 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()]);
+
+ }
+
+}