1 11 package org.eclipse.jdt.internal.corext.refactoring.rename; 12 13 import java.net.URI ; 14 15 import org.eclipse.core.filesystem.EFS; 16 import org.eclipse.core.filesystem.IFileStore; 17 18 import org.eclipse.core.runtime.Assert; 19 import org.eclipse.core.runtime.CoreException; 20 import org.eclipse.core.runtime.IPath; 21 import org.eclipse.core.runtime.IProgressMonitor; 22 23 import org.eclipse.core.resources.IFile; 24 import org.eclipse.core.resources.IResource; 25 import org.eclipse.core.resources.ResourcesPlugin; 26 27 import org.eclipse.ltk.core.refactoring.Change; 28 import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; 29 import org.eclipse.ltk.core.refactoring.RefactoringStatus; 30 import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; 31 import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments; 32 import org.eclipse.ltk.core.refactoring.participants.RenameArguments; 33 34 import org.eclipse.jdt.core.IJavaElement; 35 import org.eclipse.jdt.core.IJavaProject; 36 import org.eclipse.jdt.core.JavaCore; 37 import org.eclipse.jdt.core.refactoring.IJavaRefactorings; 38 import org.eclipse.jdt.core.refactoring.descriptors.RenameJavaElementDescriptor; 39 40 import org.eclipse.jdt.internal.corext.refactoring.JDTRefactoringDescriptor; 41 import org.eclipse.jdt.internal.corext.refactoring.JDTRefactoringDescriptorComment; 42 import org.eclipse.jdt.internal.corext.refactoring.JavaRefactoringArguments; 43 import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester; 44 import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; 45 import org.eclipse.jdt.internal.corext.refactoring.changes.DynamicValidationRefactoringChange; 46 import org.eclipse.jdt.internal.corext.refactoring.changes.RenameJavaProjectChange; 47 import org.eclipse.jdt.internal.corext.refactoring.code.ScriptableRefactoring; 48 import org.eclipse.jdt.internal.corext.refactoring.participants.JavaProcessors; 49 import org.eclipse.jdt.internal.corext.refactoring.tagging.IReferenceUpdating; 50 import org.eclipse.jdt.internal.corext.util.Messages; 51 import org.eclipse.jdt.internal.corext.util.Resources; 52 53 import org.eclipse.jdt.internal.ui.refactoring.RefactoringSaveHelper; 54 55 public final class RenameJavaProjectProcessor extends JavaRenameProcessor implements IReferenceUpdating { 56 57 private IJavaProject fProject; 58 private boolean fUpdateReferences; 59 60 public static final String IDENTIFIER= "org.eclipse.jdt.ui.renameJavaProjectProcessor"; 62 66 public RenameJavaProjectProcessor(IJavaProject project) { 67 fProject= project; 68 if (fProject != null) 69 setNewElementName(fProject.getElementName()); 70 fUpdateReferences= true; 71 } 72 73 public String getIdentifier() { 74 return IDENTIFIER; 75 } 76 77 public boolean isApplicable() throws CoreException { 78 return RefactoringAvailabilityTester.isRenameAvailable(fProject); 79 } 80 81 public String getProcessorName() { 82 return RefactoringCoreMessages.RenameJavaProjectRefactoring_rename; 83 } 84 85 protected String [] getAffectedProjectNatures() throws CoreException { 86 return JavaProcessors.computeAffectedNatures(fProject); 87 } 88 89 public Object [] getElements() { 90 return new Object [] {fProject}; 91 } 92 93 public Object getNewElement() throws CoreException { 94 IPath newPath= fProject.getPath().removeLastSegments(1).append(getNewElementName()); 95 return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().findMember(newPath)); 96 } 97 98 protected RenameModifications computeRenameModifications() throws CoreException { 99 RenameModifications result= new RenameModifications(); 100 result.rename(fProject, new RenameArguments(getNewElementName(), getUpdateReferences())); 101 return result; 102 } 103 104 protected IFile[] getChangedFiles() throws CoreException { 105 IFile projectFile= fProject.getProject().getFile(".project"); if (projectFile != null && projectFile.exists()) { 107 return new IFile[] {projectFile}; 108 } 109 return new IFile[0]; 110 } 111 112 public int getSaveMode() { 113 return RefactoringSaveHelper.SAVE_ALL; 114 } 115 116 118 public boolean canEnableUpdateReferences() { 119 return true; 120 } 121 122 public void setUpdateReferences(boolean update) { 123 fUpdateReferences= update; 124 } 125 126 public boolean getUpdateReferences() { 127 return fUpdateReferences; 128 } 129 130 132 public String getCurrentElementName() { 133 return fProject.getElementName(); 134 } 135 136 public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { 137 return new RefactoringStatus(); 138 } 139 140 public RefactoringStatus checkNewElementName(String newName) throws CoreException { 141 Assert.isNotNull(newName, "new name"); RefactoringStatus result= RefactoringStatus.create(ResourcesPlugin.getWorkspace().validateName(newName, IResource.PROJECT)); 143 if (result.hasFatalError()) 144 return result; 145 146 if (projectNameAlreadyExists(newName)) 147 return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.RenameJavaProjectRefactoring_already_exists); 148 if (projectFolderAlreadyExists(newName)) 149 return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.RenameJavaProjectProcessor_folder_already_exists); 150 151 return new RefactoringStatus(); 152 } 153 154 protected RefactoringStatus doCheckFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { 155 pm.beginTask("", 1); try{ 157 if (isReadOnly()){ 158 String message= Messages.format(RefactoringCoreMessages.RenameJavaProjectRefactoring_read_only, 159 fProject.getElementName()); 160 return RefactoringStatus.createErrorStatus(message); 161 } 162 return new RefactoringStatus(); 163 } finally{ 164 pm.done(); 165 } 166 } 167 168 private boolean isReadOnly() { 169 return Resources.isReadOnly(fProject.getResource()); 170 } 171 172 private boolean projectNameAlreadyExists(String newName){ 173 return ResourcesPlugin.getWorkspace().getRoot().getProject(newName).exists(); 174 } 175 176 private boolean projectFolderAlreadyExists(String newName) throws CoreException { 177 boolean isNotInWorkpace= fProject.getProject().getDescription().getLocationURI() != null; 178 if (isNotInWorkpace) 179 return false; URI locationURI= fProject.getProject().getLocationURI(); 181 IFileStore projectStore= EFS.getStore(locationURI); 182 IFileStore newProjectStore= projectStore.getParent().getChild(newName); 183 return newProjectStore.fetchInfo().exists(); 184 } 185 186 public Change createChange(IProgressMonitor monitor) throws CoreException { 187 try { 188 monitor.beginTask("", 1); final String description= Messages.format(RefactoringCoreMessages.RenameJavaProjectProcessor_descriptor_description_short, fProject.getElementName()); 190 final String header= Messages.format(RefactoringCoreMessages.RenameJavaProjectChange_descriptor_description, new String [] { fProject.getElementName(), getNewElementName()}); 191 final String comment= new JDTRefactoringDescriptorComment(null, this, header).asString(); 192 final int flags= RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE | RefactoringDescriptor.BREAKING_CHANGE; 193 final RenameJavaElementDescriptor descriptor= new RenameJavaElementDescriptor(IJavaRefactorings.RENAME_JAVA_PROJECT); 194 descriptor.setProject(null); 195 descriptor.setDescription(description); 196 descriptor.setComment(comment); 197 descriptor.setFlags(flags); 198 descriptor.setJavaElement(fProject); 199 descriptor.setNewName(getNewElementName()); 200 descriptor.setUpdateReferences(fUpdateReferences); 201 return new DynamicValidationRefactoringChange(descriptor, RefactoringCoreMessages.RenameJavaProjectRefactoring_rename, new Change[] { new RenameJavaProjectChange(fProject, getNewElementName(), fUpdateReferences)}); 202 } finally { 203 monitor.done(); 204 } 205 } 206 207 public RefactoringStatus initialize(RefactoringArguments arguments) { 208 if (arguments instanceof JavaRefactoringArguments) { 209 final JavaRefactoringArguments extended= (JavaRefactoringArguments) arguments; 210 final String handle= extended.getAttribute(JDTRefactoringDescriptor.ATTRIBUTE_INPUT); 211 if (handle != null) { 212 final IJavaElement element= JDTRefactoringDescriptor.handleToElement(extended.getProject(), handle, false); 213 if (element == null || !element.exists() || element.getElementType() != IJavaElement.JAVA_PROJECT) 214 return ScriptableRefactoring.createInputFatalStatus(element, getRefactoring().getName(), IJavaRefactorings.RENAME_JAVA_PROJECT); 215 else 216 fProject= (IJavaProject) element; 217 } else 218 return RefactoringStatus.createFatalErrorStatus(Messages.format(RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, JDTRefactoringDescriptor.ATTRIBUTE_INPUT)); 219 final String name= extended.getAttribute(JDTRefactoringDescriptor.ATTRIBUTE_NAME); 220 if (name != null && !"".equals(name)) setNewElementName(name); 222 else 223 return RefactoringStatus.createFatalErrorStatus(Messages.format(RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, JDTRefactoringDescriptor.ATTRIBUTE_NAME)); 224 final String references= extended.getAttribute(JDTRefactoringDescriptor.ATTRIBUTE_REFERENCES); 225 if (references != null) { 226 fUpdateReferences= Boolean.valueOf(references).booleanValue(); 227 } else 228 return RefactoringStatus.createFatalErrorStatus(Messages.format(RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, JDTRefactoringDescriptor.ATTRIBUTE_REFERENCES)); 229 } else 230 return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.InitializableRefactoring_inacceptable_arguments); 231 return new RefactoringStatus(); 232 } 233 } 234 | Popular Tags |