KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > rename > RenameJavaProjectProcessor


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.corext.refactoring.rename;
12
13 import java.net.URI JavaDoc;
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 JavaDoc IDENTIFIER= "org.eclipse.jdt.ui.renameJavaProjectProcessor"; //$NON-NLS-1$
61

62     /**
63      * Creates a new rename java project processor.
64      * @param project the java project, or <code>null</code> if invoked by scripting
65      */

66     public RenameJavaProjectProcessor(IJavaProject project) {
67         fProject= project;
68         if (fProject != null)
69             setNewElementName(fProject.getElementName());
70         fUpdateReferences= true;
71     }
72
73     public String JavaDoc getIdentifier() {
74         return IDENTIFIER;
75     }
76     
77     public boolean isApplicable() throws CoreException {
78         return RefactoringAvailabilityTester.isRenameAvailable(fProject);
79     }
80     
81     public String JavaDoc getProcessorName() {
82         return RefactoringCoreMessages.RenameJavaProjectRefactoring_rename;
83     }
84     
85     protected String JavaDoc[] getAffectedProjectNatures() throws CoreException {
86         return JavaProcessors.computeAffectedNatures(fProject);
87     }
88     
89     public Object JavaDoc[] getElements() {
90         return new Object JavaDoc[] {fProject};
91     }
92
93     public Object JavaDoc 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"); //$NON-NLS-1$
106
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     //---- IReferenceUpdating --------------------------------------
117

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     //---- IRenameProcessor ----------------------------------------------
131

132     public String JavaDoc 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 JavaDoc newName) throws CoreException {
141         Assert.isNotNull(newName, "new name"); //$NON-NLS-1$
142
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); //$NON-NLS-1$
156
try{
157             if (isReadOnly()){
158                 String JavaDoc 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 JavaDoc newName){
173         return ResourcesPlugin.getWorkspace().getRoot().getProject(newName).exists();
174     }
175
176     private boolean projectFolderAlreadyExists(String JavaDoc newName) throws CoreException {
177         boolean isNotInWorkpace= fProject.getProject().getDescription().getLocationURI() != null;
178         if (isNotInWorkpace)
179             return false; // projects outside of the workspace are not renamed
180
URI JavaDoc 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); //$NON-NLS-1$
189
final String JavaDoc description= Messages.format(RefactoringCoreMessages.RenameJavaProjectProcessor_descriptor_description_short, fProject.getElementName());
190             final String JavaDoc header= Messages.format(RefactoringCoreMessages.RenameJavaProjectChange_descriptor_description, new String JavaDoc[] { fProject.getElementName(), getNewElementName()});
191             final String JavaDoc 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 JavaDoc 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 JavaDoc name= extended.getAttribute(JDTRefactoringDescriptor.ATTRIBUTE_NAME);
220             if (name != null && !"".equals(name)) //$NON-NLS-1$
221
setNewElementName(name);
222             else
223                 return RefactoringStatus.createFatalErrorStatus(Messages.format(RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, JDTRefactoringDescriptor.ATTRIBUTE_NAME));
224             final String JavaDoc 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