Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 172939 Details for
Bug 2855
[ltk][rename] Referenced project wrong when renamed (1GJYKPZ)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Update referenced projects as part of the rename refactoring
ltk_referenced_projects.txt (text/plain), 19.11 KB, created by
Yuri Strot
on 2010-06-28 14:49:10 EDT
(
hide
)
Description:
Update referenced projects as part of the rename refactoring
Filename:
MIME Type:
Creator:
Yuri Strot
Created:
2010-06-28 14:49:10 EDT
Size:
19.11 KB
patch
obsolete
>### 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
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 2855
: 172939