Home | History | Annotate | Download | only in project
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.ide.eclipse.adt.internal.project;
     18 
     19 import com.android.ide.eclipse.adt.AdtPlugin;
     20 import com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate;
     21 
     22 import org.eclipse.core.resources.IProject;
     23 import org.eclipse.core.runtime.CoreException;
     24 import org.eclipse.debug.core.DebugPlugin;
     25 import org.eclipse.debug.core.ILaunchConfiguration;
     26 import org.eclipse.debug.core.ILaunchConfigurationType;
     27 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
     28 import org.eclipse.debug.core.ILaunchManager;
     29 import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
     30 
     31 import java.util.ArrayList;
     32 
     33 /**
     34  * Class to fix the launch configuration of a project if the java package
     35  * defined in the manifest has been changed.<br>
     36  * This fix can be done synchronously, or asynchronously.<br>
     37  * <code>start()</code> will start a thread that will do the fix.<br>
     38  * <code>run()</code> will do the fix in the current thread.<br><br>
     39  * By default, the fix first display a dialog to the user asking if he/she wants to
     40  * do the fix. This can be overriden by calling <code>setDisplayPrompt(false)</code>.
     41  *
     42  */
     43 public class FixLaunchConfig extends Thread {
     44 
     45     private IProject mProject;
     46     private String mOldPackage;
     47     private String mNewPackage;
     48 
     49     private boolean mDisplayPrompt = true;
     50 
     51     public FixLaunchConfig(IProject project, String oldPackage, String newPackage) {
     52         super();
     53 
     54         mProject = project;
     55         mOldPackage = oldPackage;
     56         mNewPackage = newPackage;
     57     }
     58 
     59     /**
     60      * Set the display prompt. If true run()/start() first ask the user if he/she wants
     61      * to fix the Launch Config
     62      * @param displayPrompt
     63      */
     64     public void setDisplayPrompt(boolean displayPrompt) {
     65         mDisplayPrompt = displayPrompt;
     66     }
     67 
     68     /**
     69      * Fix the Launch configurations.
     70      */
     71     @Override
     72     public void run() {
     73 
     74         if (mDisplayPrompt) {
     75             // ask the user if he really wants to fix the launch config
     76             boolean res = AdtPlugin.displayPrompt(
     77                     "Launch Configuration Update",
     78                     "The package definition in the manifest changed.\nDo you want to update your Launch Configuration(s)?");
     79 
     80             if (res == false) {
     81                 return;
     82             }
     83         }
     84 
     85         // get the list of config for the project
     86         String projectName = mProject.getName();
     87         ILaunchConfiguration[] configs = findConfigs(mProject.getName());
     88 
     89         // loop through all the config and update the package
     90         for (ILaunchConfiguration config : configs) {
     91             try {
     92                 // get the working copy so that we can make changes.
     93                 ILaunchConfigurationWorkingCopy copy = config.getWorkingCopy();
     94 
     95                 // get the attributes for the activity
     96                 String activity = config.getAttribute(LaunchConfigDelegate.ATTR_ACTIVITY,
     97                         ""); //$NON-NLS-1$
     98 
     99                 // manifests can define activities that are not in the defined package,
    100                 // so we need to make sure the activity is inside the old package.
    101                 if (activity.startsWith(mOldPackage)) {
    102                     // create the new activity
    103                     activity = mNewPackage + activity.substring(mOldPackage.length());
    104 
    105                     // put it in the copy
    106                     copy.setAttribute(LaunchConfigDelegate.ATTR_ACTIVITY, activity);
    107 
    108                     // save the config
    109                     copy.doSave();
    110                 }
    111             } catch (CoreException e) {
    112                 // couldn't get the working copy. we output the error in the console
    113                 String msg = String.format("Failed to modify %1$s: %2$s", projectName,
    114                         e.getMessage());
    115                 AdtPlugin.printErrorToConsole(mProject, msg);
    116             }
    117         }
    118 
    119     }
    120 
    121     /**
    122      * Looks for and returns all existing Launch Configuration object for a
    123      * specified project.
    124      * @param projectName The name of the project
    125      * @return all the ILaunchConfiguration object. If none are present, an empty array is
    126      * returned.
    127      */
    128     private static ILaunchConfiguration[] findConfigs(String projectName) {
    129         // get the launch manager
    130         ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
    131 
    132         // now get the config type for our particular android type.
    133         ILaunchConfigurationType configType = manager.
    134                 getLaunchConfigurationType(LaunchConfigDelegate.ANDROID_LAUNCH_TYPE_ID);
    135 
    136         // create a temp list to hold all the valid configs
    137         ArrayList<ILaunchConfiguration> list = new ArrayList<ILaunchConfiguration>();
    138 
    139         try {
    140             ILaunchConfiguration[] configs = manager.getLaunchConfigurations(configType);
    141 
    142             for (ILaunchConfiguration config : configs) {
    143                 if (config.getAttribute(
    144                         IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
    145                         "").equals(projectName)) {  //$NON-NLS-1$
    146                     list.add(config);
    147                 }
    148             }
    149         } catch (CoreException e) {
    150         }
    151 
    152         return list.toArray(new ILaunchConfiguration[list.size()]);
    153 
    154     }
    155 
    156 }
    157