1 19 package org.netbeans.modules.refactoring.java.plugins; 20 import com.sun.source.tree.CompilationUnitTree; 21 import com.sun.source.util.TreePath; 22 import java.io.IOException ; 23 import java.net.URL ; 24 import java.text.MessageFormat ; 25 import java.util.Collection ; 26 import java.util.Collections ; 27 import org.netbeans.api.java.source.CancellableTask; 28 import org.netbeans.api.java.source.JavaSource; 29 import org.netbeans.api.java.source.ModificationResult; 30 import org.netbeans.api.java.source.WorkingCopy; 31 import org.netbeans.api.project.FileOwnerQuery; 32 import org.netbeans.modules.refactoring.api.Problem; 33 import org.netbeans.modules.refactoring.api.SingleCopyRefactoring; 34 import org.netbeans.modules.refactoring.java.RetoucheUtils; 35 import org.netbeans.modules.refactoring.java.plugins.JavaRefactoringPlugin; 36 import org.netbeans.modules.refactoring.java.ui.tree.ElementGripFactory; 37 import org.netbeans.modules.refactoring.spi.RefactoringElementImplementation; 38 import org.netbeans.modules.refactoring.spi.RefactoringElementsBag; 39 import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImpl; 40 import org.openide.ErrorManager; 41 import org.openide.filesystems.FileObject; 42 import org.openide.filesystems.URLMapper; 43 import org.openide.text.PositionBounds; 44 import org.openide.util.NbBundle; 45 import org.openide.util.Utilities; 46 47 48 52 public class CopyClassRefactoringPlugin extends JavaRefactoringPlugin { 53 54 private final SingleCopyRefactoring refactoring; 55 56 59 CopyClassRefactoringPlugin(SingleCopyRefactoring refactoring) { 60 this.refactoring = refactoring; 61 } 62 63 66 public Problem preCheck() { 67 return null; 68 } 69 70 public Problem fastCheckParameters() { 71 if (!Utilities.isJavaIdentifier(refactoring.getNewName())) { 72 String msg = new MessageFormat (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "ERR_InvalidIdentifier")).format( 73 new Object [] {refactoring.getNewName()} 74 ); 75 return createProblem(null, true, msg); 76 } 77 URL target = refactoring.getTarget().lookup(URL .class); 78 String targetPackageName = RetoucheUtils.getPackageName(target); 79 if (!RetoucheUtils.isValidPackageName(targetPackageName)) { 80 String msg = new MessageFormat (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "ERR_InvalidPackage")).format( 81 new Object [] {targetPackageName} 82 ); 83 return createProblem(null, true, msg); 84 } 85 String name = targetPackageName.replace('.','/') + '/' + refactoring.getNewName() + ".java"; FileObject fo = URLMapper.findFileObject(target); 87 if (fo==null) { 88 return null; 89 } 90 if (fo.getFileObject(refactoring.getNewName(), (refactoring.getRefactoringSource().lookup(FileObject.class)).getExt()) != null) 91 return createProblem(null, true, new MessageFormat (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "ERR_ClassToMoveClashes")).format(new Object []{refactoring.getNewName()})); 92 return null; 93 } 94 95 public Problem checkParameters() { 96 return null; 97 } 98 99 public Problem prepare(RefactoringElementsBag refactoringElements) { 100 refactoringElements.add(refactoring, new CopyClass()); 101 return null; 102 } 103 104 private class CopyClass extends SimpleRefactoringElementImpl implements RefactoringElementImplementation{ 105 106 public CopyClass () { 107 } 108 109 public String getText() { 110 return getDisplayText (); 111 } 112 113 public String getDisplayText() { 114 return new MessageFormat (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "TXT_CopyClassToPackage")).format ( new Object [] {refactoring.getNewName(), getTargetPackageName(), getParentFile().getName()} 116 ); 117 } 118 119 public Object getComposite() { 120 return getParentFile(); 121 } 122 123 public PositionBounds getPosition() { 124 return null; 125 } 126 public String getTargetPackageName() { 127 return "test"; 128 } 129 130 public void performChange() { 131 try { 132 FileObject fo = RetoucheUtils.getOrCreateFolder(refactoring.getTarget().lookup(URL .class)); 133 FileObject source = refactoring.getRefactoringSource().lookup(FileObject.class); 134 String oldPackage = RetoucheUtils.getPackageName(source.getParent()); 135 136 FileObject newOne = refactoring.getContext().lookup(FileObject.class); 137 final Collection <ModificationResult> results = processFiles( 138 Collections.singleton(newOne), 139 new UpdateReferences( 140 !fo.equals(source.getParent()) && 141 FileOwnerQuery.getOwner(fo).equals(FileOwnerQuery.getOwner(source)) 142 , oldPackage)); 143 results.iterator().next().commit(); 144 } catch (Exception ioe) { 145 ErrorManager.getDefault().notify(ioe); 146 } 147 148 } 149 150 public FileObject getParentFile() { 151 return refactoring.getRefactoringSource().lookup(FileObject.class); 152 } 153 } 154 155 private class UpdateReferences implements CancellableTask<WorkingCopy> { 156 157 private boolean insertImport; 158 private String oldPackage; 159 public UpdateReferences(boolean insertImport, String oldPackage) { 160 this.insertImport = insertImport; 161 this.oldPackage = oldPackage; 162 } 163 164 public void cancel() { 165 } 166 167 public void run(WorkingCopy compiler) throws IOException { 168 compiler.toPhase(JavaSource.Phase.RESOLVED); 169 CompilationUnitTree cu = compiler.getCompilationUnit(); 170 if (cu == null) { 171 ErrorManager.getDefault().log(ErrorManager.ERROR, "compiler.getCompilationUnit() is null " + compiler); 172 return; 173 } 174 175 CopyTransformer findVisitor = new CopyTransformer(compiler, refactoring.getNewName(), insertImport, oldPackage); 176 findVisitor.scan(compiler.getCompilationUnit(), null); 177 178 for (TreePath tree : findVisitor.getUsages()) { 179 ElementGripFactory.getDefault().put(compiler.getFileObject(), tree, compiler); 180 } 181 fireProgressListenerStep(); 182 } 183 } 184 } 185 | Popular Tags |