1 19 package org.netbeans.modules.refactoring.experimental.plugins; 20 import java.io.IOException ; 21 import java.text.MessageFormat ; 22 import java.util.Iterator ; 23 import java.util.StringTokenizer ; 24 import org.netbeans.jmi.javamodel.Element; 25 import org.netbeans.jmi.javamodel.Import; 26 import org.netbeans.jmi.javamodel.ImportClass; 27 import org.netbeans.jmi.javamodel.JavaClass; 28 import org.netbeans.jmi.javamodel.JavaModelPackage; 29 import org.netbeans.jmi.javamodel.Resource; 30 import org.netbeans.modules.javacore.JMManager; 31 import org.netbeans.modules.javacore.api.JavaModel; 32 import org.netbeans.modules.javacore.internalapi.JavaMetamodel; 33 import org.netbeans.modules.javacore.internalapi.JavaModelUtil; 34 import org.netbeans.modules.refactoring.CheckUtils; 35 import org.netbeans.modules.refactoring.api.AbstractRefactoring; 36 import org.netbeans.modules.refactoring.api.MoveClassRefactoring; 37 import org.netbeans.modules.refactoring.api.Problem; 38 import org.netbeans.modules.refactoring.api.RenameRefactoring; 39 import org.netbeans.modules.refactoring.experimental.CopyClassRefactoring; 40 import org.netbeans.modules.refactoring.plugins.JavaRefactoringPlugin; 41 import org.netbeans.modules.refactoring.plugins.MoveClassRefactoringPlugin; 42 import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImpl; 43 import org.netbeans.modules.refactoring.spi.RefactoringElementImplementation; 44 import org.netbeans.modules.refactoring.spi.RefactoringElementsBag; 45 import org.openide.ErrorManager; 46 import org.openide.filesystems.FileObject; 47 import org.openide.filesystems.FileUtil; 48 import org.openide.loaders.DataFolder; 49 import org.openide.loaders.DataObject; 50 import org.openide.text.PositionBounds; 51 import org.openide.util.NbBundle; 52 import org.openide.util.Utilities; 53 54 55 59 public class CopyClassRefactoringPlugin extends JavaRefactoringPlugin { 60 61 private final CopyClassRefactoring refactoring; 62 63 66 CopyClassRefactoringPlugin(CopyClassRefactoring refactoring) { 67 this.refactoring = refactoring; 68 } 69 70 73 public Problem preCheck() { 74 fireProgressListenerStart(AbstractRefactoring.PRE_CHECK, 4); 76 try { 77 Resource resource = refactoring.getResource(); 78 79 Problem result = isElementAvail(resource); 81 if (result != null) { 82 return result; 84 } 85 86 if (!CheckUtils.isElementInOpenProject(resource)) { 87 return new Problem(true, NbBundle.getMessage(JavaRefactoringPlugin.class, "ERR_ProjectNotOpened")); 88 } 89 90 fireProgressListenerStep(); 92 93 94 fireProgressListenerStep(); 96 97 fireProgressListenerStep(); 99 100 return null; 102 } finally { 103 fireProgressListenerStop(); 105 } 106 } 107 108 public Problem fastCheckParameters() { 109 if (!Utilities.isJavaIdentifier(refactoring.getNewName())) { 110 String msg = new MessageFormat (NbBundle.getMessage(RenameRefactoring.class, "ERR_InvalidIdentifier")).format( 111 new Object [] {refactoring.getNewName()} 112 ); 113 return createProblem(null, true, msg); 114 } 115 if (!isValidPackageName(refactoring.getTargetPackageName())) { 116 String msg = new MessageFormat (NbBundle.getMessage(RenameRefactoring.class, "ERR_InvalidPackage")).format( 117 new Object [] {refactoring.getTargetPackageName()} 118 ); 119 return createProblem(null, true, msg); 120 } 121 String name = refactoring.getTargetPackageName().replace('.','/') + '/' + refactoring.getNewName() + ".java"; if (refactoring.getTargetClassPathRoot().getFileObject(name) != null) 123 return createProblem(null, true, new MessageFormat (NbBundle.getMessage(MoveClassRefactoring.class, "ERR_ClassToMoveClashes")).format(new Object []{refactoring.getNewName()})); 124 return null; 125 } 126 127 private static boolean isValidPackageName(String name) { 128 StringTokenizer tokenizer = new StringTokenizer (name, "."); while (tokenizer.hasMoreTokens()) { 130 if (!Utilities.isJavaIdentifier(tokenizer.nextToken())) { 131 return false; 132 } 133 } 134 return true; 135 } 136 137 public Problem checkParameters() { 138 return null; 139 } 140 141 public Problem prepare(RefactoringElementsBag refactoringElements) { 142 refactoringElements.add(refactoring, 143 new CopyClass( 144 refactoring.getResource(), 145 refactoring.getTargetClassPathRoot(), 146 refactoring.getTargetPackageName(), 147 refactoring.getNewName() 148 )); 149 return null; 151 } 152 153 private static class CopyClass extends SimpleRefactoringElementImpl implements RefactoringElementImplementation{ 154 155 private DataObject source; 156 private FileObject targetRoot; 157 private String targetPackageName; 158 private String newName; 159 private Resource resource; 160 161 public CopyClass (Resource resource, FileObject targetRoot, String packageName, String newName) { 162 this.source = ((JMManager) JMManager.getManager()).getDataObject(resource); 163 this.resource = resource; 164 this.targetRoot = targetRoot; 165 this.targetPackageName = packageName; 166 this.newName = newName; 167 } 168 169 public String getText() { 170 return getDisplayText (); 171 } 172 173 public String getDisplayText() { 174 return new MessageFormat (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "TXT_CopyClassToPackage")).format ( new Object [] {newName, targetPackageName, resource.getName()} 176 ); 177 } 178 179 public Element getJavaElement() { 180 return null; 181 } 182 183 public PositionBounds getPosition() { 184 return null; 185 } 186 187 public void performChange() { 188 String nameAfterCopy = null; 190 try { 191 FileObject fo = FileUtil.createFolder(targetRoot, targetPackageName.replace('.','/')); 192 DataFolder folder = DataFolder.findFolder(fo); 193 objectToDelete = source.copy(folder); 194 nameAfterCopy = objectToDelete.getName(); 195 objectToDelete.rename(newName); 196 } catch (IOException ioe) { 197 ErrorManager.getDefault().notify(ioe); 198 } 199 Resource r = JavaModel.getResource(objectToDelete.getPrimaryFile()); 200 String name = resource.getPackageName(); 201 ImportClass proxy = ((JavaModelPackage) r.refOutermostPackage ()).getImport(); 202 Import addedImport = proxy.createImport (name, null, false, true); 203 r.addImport(addedImport); 204 for (Iterator i = r.getClassifiers().iterator(); i.hasNext(); ) { 205 JavaClass c = (JavaClass) i.next(); 206 if (c.getSimpleName().equals(nameAfterCopy)) { 207 c.setSimpleName(newName); 208 } 209 } 210 } 211 212 private DataObject objectToDelete = null; 213 214 public FileObject getParentFile() { 215 return source.getPrimaryFile(); 216 } 217 } 218 219 static class InsertImport extends SimpleRefactoringElementImpl { 220 221 protected ImportClass proxy; 222 protected Resource source; 223 protected String newName; 224 protected boolean isNamed; 225 private PositionBounds bounds = null; 226 227 protected Import addedImport = null; 228 229 public InsertImport (Resource source, String newName, boolean isNamed) { 230 this.source = source; 231 this.newName = newName; 232 this.isNamed = isNamed; 233 proxy = ((JavaModelPackage) source.refOutermostPackage ()).getImport (); 234 } 235 236 public String getText() { 237 return getDisplayText (); 238 } 239 240 public String getDisplayText() { 241 return new MessageFormat (NbBundle.getMessage(MoveClassRefactoringPlugin.class, "LBL_InsertImport")).format ( new Object [] {newName} 243 ); 244 } 245 246 public void performChange() { 247 addedImport = proxy.createImport (newName, null, false, !isNamed); 248 source.addImport(addedImport); 249 } 250 251 public Element getJavaElement() { 252 return source; 253 } 254 255 public PositionBounds getPosition() { 256 if (bounds == null) { 257 bounds = JavaMetamodel.getManager().getElementPosition(source); 258 } 259 return bounds; 260 } 261 262 public FileObject getParentFile() { 263 return null; 264 } 265 266 } 267 } 268 | Popular Tags |