### Eclipse Workspace Patch 1.0 #P org.eclipse.ltk.core.refactoring Index: src/org/eclipse/ltk/core/refactoring/resource/RenameProjectReferenceChange.java =================================================================== RCS file: src/org/eclipse/ltk/core/refactoring/resource/RenameProjectReferenceChange.java diff -N src/org/eclipse/ltk/core/refactoring/resource/RenameProjectReferenceChange.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ltk/core/refactoring/resource/RenameProjectReferenceChange.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,180 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ltk.core.refactoring.resource; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; + +import org.eclipse.ltk.core.refactoring.Change; +import org.eclipse.ltk.core.refactoring.ChangeDescriptor; +import org.eclipse.ltk.internal.core.refactoring.Messages; +import org.eclipse.ltk.internal.core.refactoring.RefactoringCoreMessages; + +/** + * {@link Change} that updates project references. + * + * @since 3.6 + */ +public class RenameProjectReferenceChange extends ResourceChange { + + private final String fProjectName; + private final String fOldReference; + private final String fNewReference; + private final long fStampToRestore; + + private ChangeDescriptor fDescriptor; + + /** + * Creates the change. + * + * @param projectName the name of the project to update + * @param oldReference the name of the old reference + * @param newReference the name of the new reference + */ + public RenameProjectReferenceChange(String projectName, + String oldReference, String newReference) { + this(projectName, oldReference, newReference, IResource.NULL_STAMP); + } + + /** + * Creates the change with a time stamp to restore. + * + * @param projectName the name of the project to update + * @param oldReference the name of the old reference + * @param newReference the name of the new reference + * @param stampToRestore the time stamp to restore or {@link IResource#NULL_STAMP} to not restore the + * time stamp. + */ + protected RenameProjectReferenceChange(String projectName, + String oldReference, String newReference, long stampToRestore) { + if (isEmpty(projectName) || isEmpty(oldReference) + || isEmpty(newReference)) { + throw new IllegalArgumentException(); + } + + fProjectName= projectName; + fOldReference= oldReference; + fNewReference= newReference; + fStampToRestore= stampToRestore; + fDescriptor= null; + setValidationMethod(VALIDATE_NOT_DIRTY); + } + + /** + * @param s string to check + * @return true if the specified string null or empty and false otherwise + */ + private static boolean isEmpty(String s) { + return s == null || s.length() == 0; + } + + /* (non-Javadoc) + * @see org.eclipse.ltk.core.refactoring.Change#getDescriptor() + */ + public ChangeDescriptor getDescriptor() { + return fDescriptor; + } + + /** + * Sets the change descriptor to be returned by {@link Change#getDescriptor()}. + * + * @param descriptor the change descriptor + */ + public void setDescriptor(ChangeDescriptor descriptor) { + fDescriptor= descriptor; + } + + /* (non-Javadoc) + * @see org.eclipse.ltk.core.refactoring.resource.ResourceChange#getModifiedResource() + */ + protected IResource getModifiedResource() { + return getProject(); + } + + /* (non-Javadoc) + * @see org.eclipse.ltk.core.refactoring.Change#getName() + */ + public String getName() { + return Messages.format(RefactoringCoreMessages.RenameProjectReferenceChange_name, fProjectName); + } + + /** + * Return the new reference name + * + * @return return the new reference name + */ + public String getNewReference() { + return fNewReference; + } + + /** + * Return the old reference name + * + * @return return the old reference name + */ + public String getOldReference() { + return fOldReference; + } + + /* (non-Javadoc) + * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor) + */ + public Change perform(IProgressMonitor pm) throws CoreException { + try { + pm.beginTask(Messages.format(RefactoringCoreMessages.RenameProjectReferenceChange_progress_description, fProjectName), 2); + + IProject project= getProject(); + long currentStamp= project.getModificationStamp(); + if (fStampToRestore != IResource.NULL_STAMP) { + project.revertModificationStamp(fStampToRestore); + } + IProjectDescription description= project.getDescription(); + List newProjects= new ArrayList(); + IProject[] oldProjects= description.getReferencedProjects(); + for (int i= 0; i < oldProjects.length; i++) { + IProject oldProject= oldProjects[i]; + if (oldProject.getName().equals(fOldReference)) { + IProject newProject= ResourcesPlugin.getWorkspace() + .getRoot().getProject(fNewReference); + newProjects.add(newProject); + } else { + newProjects.add(oldProject); + } + } + + description.setReferencedProjects((IProject[])newProjects + .toArray(new IProject[newProjects.size()])); + pm.worked(1); + project.setDescription(description, IResource.FORCE, + new SubProgressMonitor(pm, 1)); + + return new RenameProjectReferenceChange(fProjectName, + fNewReference, fOldReference, currentStamp); + } finally { + pm.done(); + } + } + + private IProject getProject() { + return ResourcesPlugin.getWorkspace().getRoot() + .getProject(fProjectName); + } + +} Index: src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.java,v retrieving revision 1.40 diff -u -r1.40 RefactoringCoreMessages.java --- src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.java 16 Nov 2009 16:50:14 -0000 1.40 +++ src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.java 28 Jun 2010 16:58:38 -0000 @@ -136,6 +136,10 @@ public static String Refactoring_execute_label; + public static String RenameProjectReferenceChange_name; + + public static String RenameProjectReferenceChange_progress_description; + public static String RenameResourceChange_name; public static String RenameResourceChange_progress_description; @@ -160,6 +164,8 @@ public static String RenameResourceProcessor_error_resource_already_exists; + public static String RenameResourceProcessor_update_references_change_name; + public static String Refactoring_redo_label; public static String Refactoring_undo_label; Index: src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.properties,v retrieving revision 1.55 diff -u -r1.55 RefactoringCoreMessages.properties --- src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.properties 20 May 2010 15:22:43 -0000 1.55 +++ src/org/eclipse/ltk/internal/core/refactoring/RefactoringCoreMessages.properties 28 Jun 2010 16:58:38 -0000 @@ -67,6 +67,8 @@ RefactoringUndoContext_label=Refactoring Undo Context Refactoring_execute_label=Refactoring - Execute +RenameProjectReferenceChange_name=Update ''{0}'' project references +RenameProjectReferenceChange_progress_description=Update ''{0}'' project references RenameResourceChange_name=Rename ''{0}'' to ''{1}'' RenameResourceChange_progress_description=Rename resource RenameResourceDescriptor_error_name_not_defined=The rename resource refactoring can not be performed as the new name is invalid @@ -79,6 +81,7 @@ RenameResourceProcessor_error_no_parent=Internal Error RenameResourceProcessor_error_resource_already_exists=A file or folder with this name already exists RenameResourceProcessor_processor_name=Rename Resource +RenameResourceProcessor_update_references_change_name=Update referencing projects Refactoring_undo_label=Refactoring - Undo Refactoring_redo_label=Refactoring - Redo Index: src/org/eclipse/ltk/internal/core/refactoring/resource/RenameResourceProcessor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.core.refactoring/src/org/eclipse/ltk/internal/core/refactoring/resource/RenameResourceProcessor.java,v retrieving revision 1.4 diff -u -r1.4 RenameResourceProcessor.java --- src/org/eclipse/ltk/internal/core/refactoring/resource/RenameResourceProcessor.java 11 Sep 2008 11:57:56 -0000 1.4 +++ src/org/eclipse/ltk/internal/core/refactoring/resource/RenameResourceProcessor.java 28 Jun 2010 16:58:38 -0000 @@ -10,16 +10,23 @@ *******************************************************************************/ package org.eclipse.ltk.internal.core.refactoring.resource; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory; import org.eclipse.ltk.core.refactoring.Change; +import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.RefactoringChangeDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; @@ -30,6 +37,7 @@ import org.eclipse.ltk.core.refactoring.participants.RenameProcessor; import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; import org.eclipse.ltk.core.refactoring.participants.SharableParticipants; +import org.eclipse.ltk.core.refactoring.resource.RenameProjectReferenceChange; import org.eclipse.ltk.core.refactoring.resource.RenameResourceChange; import org.eclipse.ltk.core.refactoring.resource.RenameResourceDescriptor; import org.eclipse.ltk.internal.core.refactoring.BasicElementLabels; @@ -123,7 +131,7 @@ * @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#checkFinalConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext) */ public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { - pm.beginTask("", 1); //$NON-NLS-1$ + pm.beginTask("", 2); //$NON-NLS-1$ try { fRenameArguments= new RenameArguments(getNewResourceName(), isUpdateReferences()); @@ -132,6 +140,17 @@ ResourceModifications.buildMoveDelta(deltaFactory, fResource, fRenameArguments); + pm.worked(1); + + IProject[] projects= getReferencingProjects(); + if (projects.length > 0) { + for (int i= 0; i < projects.length; i++) { + IFile descriptor = projects[i].getFile(IProjectDescription.DESCRIPTION_FILE_NAME); + deltaFactory.change(descriptor); + } + } + pm.worked(1); + return new RefactoringStatus(); } finally { pm.done(); @@ -186,16 +205,77 @@ try { RenameResourceChange change= new RenameResourceChange(fResource.getFullPath(), getNewResourceName()); change.setDescriptor(new RefactoringChangeDescriptor(createDescriptor())); + + if (isUpdateReferences()) { + IProject[] projects= getReferencingProjects(); + if (projects.length > 0) { + CompositeChange root= new CompositeChange(change.getName()); + root.markAsSynthetic(); + root.add(change); + root.add(createUpdateReferencesChange(projects)); + return root; + } + } + return change; } finally { pm.done(); } } + private Change createUpdateReferencesChange(IProject[] projects) { + String oldName= getResource().getName(); + String newName= getNewResourceName(); + + CompositeChange updateReferencesChange= new CompositeChange( + RefactoringCoreMessages.RenameResourceProcessor_update_references_change_name); + for (int i= 0; i < projects.length; i++) { + RenameProjectReferenceChange change= new RenameProjectReferenceChange( + projects[i].getName(), oldName, newName); + updateReferencesChange.add(change); + } + + return updateReferencesChange; + } + private String createNewPath(String newName) { return fResource.getFullPath().removeLastSegments(1).append(newName).toString(); } + /** + * If processed resource is a project this method return projects which refer to this one. + * Otherwise it return empty list + * + * @return list of the referencing projects + */ + private IProject[] getReferencingProjects() { + if (!(getResource() instanceof IProject)) { + return new IProject[0]; + } + String name= getResource().getName(); + IProject[] allProjects= ResourcesPlugin.getWorkspace().getRoot() + .getProjects(); + List projects= new ArrayList(allProjects.length); + for (int i= 0; i < allProjects.length; i++) { + IProject project= allProjects[i]; + if (project.exists() && project.isOpen()) { + try { + IProjectDescription descriptor= project.getDescription(); + IProject[] referencedProjects= descriptor + .getReferencedProjects(); + for (int j= 0; j < referencedProjects.length; j++) { + if (name.equals(referencedProjects[j].getName())) { + projects.add(project); + } + } + } catch (Exception e) { + // ignore problem projects + } + } + } + return (IProject[])projects.toArray(new IProject[projects.size()]); + } + /* (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#getElements() */ #P org.eclipse.ltk.ui.refactoring Index: src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.ui.refactoring/src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.java,v retrieving revision 1.61 diff -u -r1.61 RefactoringUIMessages.java --- src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.java 21 May 2010 07:16:51 -0000 1.61 +++ src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.java 28 Jun 2010 16:58:40 -0000 @@ -332,6 +332,8 @@ public static String RenameResourceWizard_page_title; + public static String RenameResourceWizard_update_references_field_label; + public static String RenameResourceWizard_window_title; public static String SelectRefactoringHistoryControl_deselect_all_label; Index: src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.ui.refactoring/src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.properties,v retrieving revision 1.105 diff -u -r1.105 RefactoringUIMessages.properties --- src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.properties 18 May 2010 09:30:23 -0000 1.105 +++ src/org/eclipse/ltk/internal/ui/refactoring/RefactoringUIMessages.properties 28 Jun 2010 16:58:40 -0000 @@ -190,6 +190,7 @@ RenameResourceHandler_title=Rename Resource RenameResourceWizard_name_field_label=New na&me: RenameResourceWizard_page_title=Rename Resource +RenameResourceWizard_update_references_field_label=Update &references RenameResourceWizard_window_title=Rename Resource AbstractRefactoringModelMerger_wizard_title=Pending Refactorings Index: src/org/eclipse/ltk/ui/refactoring/resource/RenameResourceWizard.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ltk.ui.refactoring/src/org/eclipse/ltk/ui/refactoring/resource/RenameResourceWizard.java,v retrieving revision 1.3 diff -u -r1.3 RenameResourceWizard.java --- src/org/eclipse/ltk/ui/refactoring/resource/RenameResourceWizard.java 31 Dec 2008 21:13:56 -0000 1.3 +++ src/org/eclipse/ltk/ui/refactoring/resource/RenameResourceWizard.java 28 Jun 2010 16:58:40 -0000 @@ -15,10 +15,12 @@ import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jface.wizard.IWizardPage; @@ -61,6 +63,7 @@ private final RenameResourceProcessor fRefactoringProcessor; private Text fNameField; + private Button fUpdateReferencesField; public RenameResourceRefactoringConfigurationPage(RenameResourceProcessor processor) { super("RenameResourceRefactoringInputPage"); //$NON-NLS-1$ @@ -89,8 +92,17 @@ validatePage(); } }); - fNameField.selectAll(); + + if (isNeedReferenceUpdate()) { + fUpdateReferencesField= new Button(composite, SWT.CHECK); + fUpdateReferencesField.setText(RefactoringUIMessages.RenameResourceWizard_update_references_field_label); + fUpdateReferencesField.setSelection(fRefactoringProcessor + .isUpdateReferences()); + fUpdateReferencesField.setLayoutData(new GridData(GridData.FILL, + GridData.BEGINNING, true, false, 2, 1)); + } + setPageComplete(false); setControl(composite); } @@ -108,6 +120,11 @@ setPageComplete(status); } + protected boolean isNeedReferenceUpdate() { + //only project have references + return fRefactoringProcessor.getResource() instanceof IProject; + } + /* (non-Javadoc) * @see org.eclipse.ltk.ui.refactoring.UserInputWizardPage#performFinish() */ @@ -131,6 +148,10 @@ private void initializeRefactoring() { fRefactoringProcessor.setNewResourceName(fNameField.getText()); + if (fUpdateReferencesField != null) { + fRefactoringProcessor.setUpdateReferences(fUpdateReferencesField + .getSelection()); + } } } } \ No newline at end of file