blob: 3ce1a66552c78672faaecaa8bdf9a07d54646dd0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2012 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Feng(Marvin) Wang <feng.wang@sybase.com> - bug 244395
*******************************************************************************/
package org.eclipse.jdt.internal.debug.core.refactoring;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.internal.launching.JavaMigrationDelegate;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.osgi.util.NLS;
/**
* The change for the main type project change of a launch configuration
*/
public class LaunchConfigurationProjectMainTypeChange extends Change {
private ILaunchConfiguration fLaunchConfiguration;
private String fNewMainTypeName;
private String fNewProjectName;
private String fNewLaunchConfigurationName;
private String fOldMainTypeName;
private String fOldProjectName;
private String fNewConfigContainerName;
/**
* LaunchConfigurationProjectMainTypeChange constructor.
* @param launchConfiguration the launch configuration to modify
* @param newMainTypeName the name of the new main type, or <code>null</code> if not modified.
* @param newProjectName the name of the project, or <code>null</code> if not modified.
*/
public LaunchConfigurationProjectMainTypeChange(ILaunchConfiguration launchConfiguration, String newMainTypeName, String newProjectName) throws CoreException {
fLaunchConfiguration = launchConfiguration;
fNewMainTypeName = newMainTypeName;
fNewProjectName = newProjectName;
fOldMainTypeName = fLaunchConfiguration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String) null);
fOldProjectName = fLaunchConfiguration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String) null);
if (fNewMainTypeName != null) {
// generate the new configuration name
String oldName = Signature.getSimpleName(fOldMainTypeName);
String newName = Signature.getSimpleName(fNewMainTypeName);
String lcname = fLaunchConfiguration.getName();
fNewLaunchConfigurationName = lcname.replaceAll(oldName, newName);
if (lcname.equals(fNewLaunchConfigurationName) || DebugPlugin.getDefault().getLaunchManager().isExistingLaunchConfigurationName(fNewLaunchConfigurationName)) {
fNewLaunchConfigurationName = null;
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#getModifiedElement()
*/
@Override
public Object getModifiedElement() {
return fLaunchConfiguration;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#getName()
*/
@Override
public String getName() {
if (fNewLaunchConfigurationName != null) {
return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_0, new String[] {fLaunchConfiguration.getName(), fNewLaunchConfigurationName});
}
if (fNewProjectName == null) {
return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_1, new String[] {fLaunchConfiguration.getName()});
}
if (fNewMainTypeName == null) {
return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_2, new String[] {fLaunchConfiguration.getName()});
}
return NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_3, new String[] {fLaunchConfiguration.getName()});
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void initializeValidationData(IProgressMonitor pm) {}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#isValid(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
if (fLaunchConfiguration.exists()) {
String typeName = fLaunchConfiguration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String)null);
String projectName = fLaunchConfiguration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
if(fOldMainTypeName != null) {
if (fOldMainTypeName.equals(typeName)) {
if (fOldProjectName.equals(projectName)) {
return new RefactoringStatus();
}
return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_4, new String[] {fLaunchConfiguration.getName(), fOldProjectName}));
}
return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_5, new String[] {fLaunchConfiguration.getName(), fOldMainTypeName}));
}
//need to catch the case for remote java LC's, they have no maintype
if (fOldProjectName.equals(projectName)) {
return new RefactoringStatus();
}
return RefactoringStatus.createWarningStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_4, new String[] {fLaunchConfiguration.getName(), fOldProjectName}));
}
return RefactoringStatus.createFatalErrorStatus(NLS.bind(RefactoringMessages.LaunchConfigurationProjectMainTypeChange_6, new String[] {fLaunchConfiguration.getName()}));
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public Change perform(IProgressMonitor pm) throws CoreException {
final ILaunchConfigurationWorkingCopy wc = fLaunchConfiguration.getWorkingCopy();
if (fNewConfigContainerName != null) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IProject project = root.getProject(fNewProjectName);
IContainer container = (IContainer) project.findMember(fNewConfigContainerName);
wc.setContainer(container);
}
String oldMainTypeName;
String oldProjectName;
if (fNewMainTypeName != null) {
oldMainTypeName = fOldMainTypeName;
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fNewMainTypeName);
}
else {
oldMainTypeName = null;
}
if (fNewProjectName != null) {
oldProjectName = fOldProjectName;
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fNewProjectName);
}
else {
oldProjectName = null;
}
if (fNewLaunchConfigurationName != null) {
wc.rename(fNewLaunchConfigurationName);
}
// update resource mapping
JavaMigrationDelegate.updateResourceMapping(wc);
if (wc.isDirty()) {
fLaunchConfiguration = wc.doSave();
}
// create the undo change
return new LaunchConfigurationProjectMainTypeChange(fLaunchConfiguration, oldMainTypeName, oldProjectName);
}
/**
* Sets the new container name
* @param newContainerName the new name for the container
*/
public void setNewContainerName(String newContainerName) {
fNewConfigContainerName = newContainerName;
}
}