/*******************************************************************************
* Copyright (c) 2009 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation9
*******************************************************************************/
package org.eclipse.cdt.launch.internal.refactoring;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.launch.internal.ui.LaunchMessages;
import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.osgi.util.NLS;
/**
* A change to update a launch configuration with a new project name.
*
* @author Christian W. Damus (cdamus)
*
* @since 6.0
*/
class ProjectRenameChange extends AbstractLaunchConfigChange {
private String changeName;
private String oldName;
private String newName;
/**
* The project relative path of the .launch file if the launch config is a
* non-local one and is stored within the project.
*/
private IPath projectRelativePath;
/**
* Initializes me.
*
* @param launchConfig
* the launch configuration that I change
* @param oldName
* the old project name
* @param newName
* the new project name
*/
public ProjectRenameChange(ILaunchConfiguration launchConfig,
String oldName, String newName) {
super(launchConfig);
this.oldName = oldName;
this.newName = newName;
// keep the project relative path if launch config is contained in the old project
if (!launchConfig.isLocal()) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject oldProject = root.getProject(oldName);
IPath oldConfig = launchConfig.getFile().getLocation();
if (oldConfig != null && oldProject.getLocation().isPrefixOf(oldConfig)) {
projectRelativePath = oldConfig.makeRelativeTo(oldProject.getLocation());
}
}
}
@Override
public String getName() {
if (changeName == null) {
changeName = NLS.bind(LaunchMessages.ProjectRenameChange_name,
getLaunchConfiguration().getName());
}
return changeName;
}
@Override
public Change perform(IProgressMonitor pm) throws CoreException {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject oldProject = root.getProject(oldName);
IProject newProject = root.getProject(newName);
ILaunchConfiguration launchConfig = getLaunchConfiguration();
if (projectRelativePath != null) {
// If the launch config is non-local and lives in the project, we
// need to update its representation in the new project folder, not
// the old one
ILaunchManager mgr = DebugPlugin.getDefault().getLaunchManager();
launchConfig = mgr.getLaunchConfiguration(newProject.getFile(projectRelativePath));
}
ILaunchConfigurationWorkingCopy copy = launchConfig.getWorkingCopy();
IResource[] mapped = launchConfig.getMappedResources();
if ((oldProject != null) && (newProject != null)) {
if ((mapped != null) && (mapped.length > 0)) {
for (int i = 0; i < mapped.length; i++) {
if (oldProject.equals(mapped[i])) {
mapped[i] = newProject;
}
}
copy.setMappedResources(mapped);
}
}
copy.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME,
newName);
try {
// Note: for non-local LCs, this will end up updating the .launch
// file on disk but Eclipse's in memory representation will not
// get updated. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=288368#c1
// This comment can/should be removed when 288368 is fixed.
copy.doSave();
} catch (CoreException e) {
LaunchUIPlugin.log(new MultiStatus(LaunchUIPlugin.PLUGIN_ID, 0,
new IStatus[] { e.getStatus() }, NLS.bind(
LaunchMessages.ProjectRenameChange_saveFailed,
launchConfig.getName()), null));
return null; // not undoable, as we didn't effect our change
}
return new ProjectRenameChange(launchConfig, newName,
oldName);
}
}