1 11 package org.eclipse.jdt.internal.corext.refactoring.reorg; 12 13 import java.util.ArrayList ; 14 import java.util.Iterator ; 15 import java.util.List ; 16 import java.util.Map ; 17 18 import org.eclipse.text.edits.TextEdit; 19 20 import org.eclipse.core.runtime.Assert; 21 import org.eclipse.core.runtime.CoreException; 22 23 import org.eclipse.core.filebuffers.ITextFileBuffer; 24 25 import org.eclipse.core.resources.IFile; 26 import org.eclipse.core.resources.IFolder; 27 import org.eclipse.core.resources.IProject; 28 import org.eclipse.core.resources.IResource; 29 import org.eclipse.core.resources.IWorkspaceRoot; 30 31 import org.eclipse.ltk.core.refactoring.Change; 32 import org.eclipse.ltk.core.refactoring.CompositeChange; 33 import org.eclipse.ltk.core.refactoring.NullChange; 34 import org.eclipse.ltk.core.refactoring.TextChange; 35 import org.eclipse.ltk.core.refactoring.TextFileChange; 36 37 import org.eclipse.jdt.core.IClassFile; 38 import org.eclipse.jdt.core.ICompilationUnit; 39 import org.eclipse.jdt.core.IJavaElement; 40 import org.eclipse.jdt.core.IPackageFragment; 41 import org.eclipse.jdt.core.IPackageFragmentRoot; 42 import org.eclipse.jdt.core.ISourceManipulation; 43 import org.eclipse.jdt.core.dom.CompilationUnit; 44 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; 45 46 import org.eclipse.jdt.internal.corext.refactoring.Checks; 47 import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; 48 import org.eclipse.jdt.internal.corext.refactoring.changes.DeleteFileChange; 49 import org.eclipse.jdt.internal.corext.refactoring.changes.DeleteFolderChange; 50 import org.eclipse.jdt.internal.corext.refactoring.changes.DeleteFromClasspathChange; 51 import org.eclipse.jdt.internal.corext.refactoring.changes.DeletePackageFragmentRootChange; 52 import org.eclipse.jdt.internal.corext.refactoring.changes.DeleteSourceManipulationChange; 53 import org.eclipse.jdt.internal.corext.refactoring.changes.DynamicValidationStateChange; 54 import org.eclipse.jdt.internal.corext.refactoring.changes.TextChangeCompatibility; 55 import org.eclipse.jdt.internal.corext.refactoring.changes.UndoablePackageDeleteChange; 56 import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; 57 import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser; 58 import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringFileBuffers; 59 import org.eclipse.jdt.internal.corext.refactoring.util.TextChangeManager; 60 61 62 class DeleteChangeCreator { 63 private DeleteChangeCreator() { 64 } 66 67 73 static Change createDeleteChange(TextChangeManager manager, IResource[] resources, 74 IJavaElement[] javaElements, String changeName, List packageDeletes) throws CoreException { 75 82 DynamicValidationStateChange result; 83 if (packageDeletes.size() > 0) { 84 result= new UndoablePackageDeleteChange(changeName, packageDeletes); 85 } else { 86 result= new DynamicValidationStateChange(changeName); 87 } 88 89 for (int i= 0; i < javaElements.length; i++) { 90 IJavaElement element= javaElements[i]; 91 if (! ReorgUtils.isInsideCompilationUnit(element)) 92 result.add(createDeleteChange(element)); 93 } 94 95 for (int i= 0; i < resources.length; i++) { 96 result.add(createDeleteChange(resources[i])); 97 } 98 99 Map grouped= ReorgUtils.groupByCompilationUnit(getElementsSmallerThanCu(javaElements)); 100 if (grouped.size() != 0 ){ 101 Assert.isNotNull(manager); 102 for (Iterator iter= grouped.keySet().iterator(); iter.hasNext();) { 103 ICompilationUnit cu= (ICompilationUnit) iter.next(); 104 result.add(createDeleteChange(cu, (List )grouped.get(cu), manager)); 105 } 106 } 107 108 return result; 109 } 110 111 private static Change createDeleteChange(IResource resource) { 112 Assert.isTrue(! (resource instanceof IWorkspaceRoot)); Assert.isTrue(! (resource instanceof IProject)); if (resource instanceof IFile) 115 return new DeleteFileChange((IFile)resource, true); 116 if (resource instanceof IFolder) 117 return new DeleteFolderChange((IFolder)resource, true); 118 Assert.isTrue(false); return null; 120 } 121 122 125 private static Change createDeleteChange(ICompilationUnit cu, List javaElements, TextChangeManager manager) throws CoreException { 126 CompilationUnit cuNode= RefactoringASTParser.parseWithASTProvider(cu, false, null); 127 CompilationUnitRewrite rewriter= new CompilationUnitRewrite(cu, cuNode); 128 IJavaElement[] elements= (IJavaElement[]) javaElements.toArray(new IJavaElement[javaElements.size()]); 129 ASTNodeDeleteUtil.markAsDeleted(elements, rewriter, null); 130 return addTextEditFromRewrite(manager, cu, rewriter.getASTRewrite()); 131 } 132 133 private static TextChange addTextEditFromRewrite(TextChangeManager manager, ICompilationUnit cu, ASTRewrite rewrite) throws CoreException { 134 try { 135 ITextFileBuffer buffer= RefactoringFileBuffers.acquire(cu); 136 TextEdit resultingEdits= rewrite.rewriteAST(buffer.getDocument(), cu.getJavaProject().getOptions(true)); 137 TextChange textChange= manager.get(cu); 138 if (textChange instanceof TextFileChange) { 139 TextFileChange tfc= (TextFileChange) textChange; 140 if (cu.isWorkingCopy()) 141 tfc.setSaveMode(TextFileChange.LEAVE_DIRTY); 142 } 143 String message= RefactoringCoreMessages.DeleteChangeCreator_1; 144 TextChangeCompatibility.addTextEdit(textChange, message, resultingEdits); 145 return textChange; 146 } finally { 147 RefactoringFileBuffers.release(cu); 148 } 149 } 150 151 private static List getElementsSmallerThanCu(IJavaElement[] javaElements){ 153 List result= new ArrayList (); 154 for (int i= 0; i < javaElements.length; i++) { 155 IJavaElement element= javaElements[i]; 156 if (ReorgUtils.isInsideCompilationUnit(element)) 157 result.add(element); 158 } 159 return result; 160 } 161 162 private static Change createDeleteChange(IJavaElement javaElement) { 163 Assert.isTrue(! ReorgUtils.isInsideCompilationUnit(javaElement)); 164 165 switch(javaElement.getElementType()){ 166 case IJavaElement.PACKAGE_FRAGMENT_ROOT: 167 return createPackageFragmentRootDeleteChange((IPackageFragmentRoot)javaElement); 168 169 case IJavaElement.PACKAGE_FRAGMENT: 170 return createSourceManipulationDeleteChange((IPackageFragment)javaElement); 171 172 case IJavaElement.COMPILATION_UNIT: 173 return createSourceManipulationDeleteChange((ICompilationUnit)javaElement); 174 175 case IJavaElement.CLASS_FILE: 176 Assert.isTrue(((IClassFile)javaElement).getResource() instanceof IFile); 178 return createDeleteChange(((IClassFile)javaElement).getResource()); 179 180 case IJavaElement.JAVA_MODEL: Assert.isTrue(false); 182 return null; 183 184 case IJavaElement.JAVA_PROJECT: Assert.isTrue(false); 186 return null; 187 188 case IJavaElement.TYPE: 189 case IJavaElement.FIELD: 190 case IJavaElement.METHOD: 191 case IJavaElement.INITIALIZER: 192 case IJavaElement.PACKAGE_DECLARATION: 193 case IJavaElement.IMPORT_CONTAINER: 194 case IJavaElement.IMPORT_DECLARATION: 195 Assert.isTrue(false); default: 197 Assert.isTrue(false); return new NullChange(); 199 } 200 } 201 202 private static Change createSourceManipulationDeleteChange(ISourceManipulation element) { 203 if (element instanceof ICompilationUnit || element instanceof IPackageFragment){ 205 IResource resource; 206 if (element instanceof ICompilationUnit) 207 resource= ReorgUtils.getResource((ICompilationUnit)element); 208 else 209 resource= ((IPackageFragment)element).getResource(); 210 if (resource != null && resource.isLinked()) 211 return createDeleteChange(resource); 212 } 213 return new DeleteSourceManipulationChange(element, true); 214 } 215 216 private static Change createPackageFragmentRootDeleteChange(IPackageFragmentRoot root) { 217 IResource resource= root.getResource(); 218 if (resource != null && resource.isLinked()){ 219 CompositeChange composite= new DynamicValidationStateChange(RefactoringCoreMessages.DeleteRefactoring_delete_package_fragment_root); 223 224 composite.add(new DeleteFromClasspathChange(root)); 225 Assert.isTrue(! Checks.isClasspathDelete(root)); composite.add(createDeleteChange(resource)); 227 228 return composite; 229 } else { 230 Assert.isTrue(! root.isExternal()); 231 return new DeletePackageFragmentRootChange(root, true, null); 233 } 234 } 235 } 236 | Popular Tags |