KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > refactoring > experimental > plugins > CopyClassRefactoringPlugin


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19 package org.netbeans.modules.refactoring.experimental.plugins;
20 import java.io.IOException JavaDoc;
21 import java.text.MessageFormat JavaDoc;
22 import java.util.Iterator JavaDoc;
23 import java.util.StringTokenizer JavaDoc;
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 /** Plugin that implements the core functionality of Copy Class Refactoring.
56  *
57  * @author Jan Becicka
58  */

59 public class CopyClassRefactoringPlugin extends JavaRefactoringPlugin {
60     /** Reference to the parent refactoring instance */
61     private final CopyClassRefactoring refactoring;
62     
63     /** Creates a new instance of PullUpRefactoringPlugin
64      * @param refactoring Parent refactoring instance.
65      */

66     CopyClassRefactoringPlugin(CopyClassRefactoring refactoring) {
67         this.refactoring = refactoring;
68     }
69     
70     /** Checks pre-conditions of the refactoring.
71      * @return Problems found or <code>null</code>.
72      */

73     public Problem preCheck() {
74         // fire operation start on the registered progress listeners (3 steps)
75
fireProgressListenerStart(AbstractRefactoring.PRE_CHECK, 4);
76         try {
77             Resource resource = refactoring.getResource();
78             
79             // check whether the element is valid
80
Problem result = isElementAvail(resource);
81             if (result != null) {
82                 // fatal error -> don't continue with further checks
83
return result;
84             }
85             
86             if (!CheckUtils.isElementInOpenProject(resource)) {
87                 return new Problem(true, NbBundle.getMessage(JavaRefactoringPlugin.class, "ERR_ProjectNotOpened"));
88             }
89             
90             // increase progress (step 1)
91
fireProgressListenerStep();
92             
93             
94             // increase progress (step 2)
95
fireProgressListenerStep();
96             
97             // increase progress (step 3)
98
fireProgressListenerStep();
99             
100             // all checks passed -> return null
101
return null;
102         } finally {
103             // fire operation end on the registered progress listeners
104
fireProgressListenerStop();
105         }
106     }
107     
108     public Problem fastCheckParameters() {
109         if (!Utilities.isJavaIdentifier(refactoring.getNewName())) {
110             String JavaDoc msg = new MessageFormat JavaDoc(NbBundle.getMessage(RenameRefactoring.class, "ERR_InvalidIdentifier")).format(
111                 new Object JavaDoc[] {refactoring.getNewName()}
112             );
113             return createProblem(null, true, msg);
114         }
115         if (!isValidPackageName(refactoring.getTargetPackageName())) {
116             String JavaDoc msg = new MessageFormat JavaDoc(NbBundle.getMessage(RenameRefactoring.class, "ERR_InvalidPackage")).format(
117                 new Object JavaDoc[] {refactoring.getTargetPackageName()}
118             );
119             return createProblem(null, true, msg);
120         }
121         String JavaDoc name = refactoring.getTargetPackageName().replace('.','/') + '/' + refactoring.getNewName() + ".java"; // NOI18N
122
if (refactoring.getTargetClassPathRoot().getFileObject(name) != null)
123             return createProblem(null, true, new MessageFormat JavaDoc(NbBundle.getMessage(MoveClassRefactoring.class, "ERR_ClassToMoveClashes")).format(new Object JavaDoc[]{refactoring.getNewName()}));
124         return null;
125     }
126     
127     private static boolean isValidPackageName(String JavaDoc name) {
128         StringTokenizer JavaDoc tokenizer = new StringTokenizer JavaDoc(name, "."); // NOI18N
129
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         //refactoringElements.add(refactoring, new InsertImport(refactoring.getResource(), refactoring.getResource().getPackageName(), false));
150
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 JavaDoc targetPackageName;
158         private String JavaDoc newName;
159         private Resource resource;
160         
161         public CopyClass (Resource resource, FileObject targetRoot, String JavaDoc packageName, String JavaDoc 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 JavaDoc getText() {
170             return getDisplayText ();
171         }
172     
173         public String JavaDoc getDisplayText() {
174             return new MessageFormat JavaDoc (NbBundle.getMessage(CopyClassRefactoringPlugin.class, "TXT_CopyClassToPackage")).format ( // NOI18N
175
new Object JavaDoc[] {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             //JavaMetamodel.getManager().registerExtChange(this);
189
String JavaDoc 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 JavaDoc ioe) {
197                 ErrorManager.getDefault().notify(ioe);
198             }
199             Resource r = JavaModel.getResource(objectToDelete.getPrimaryFile());
200             String JavaDoc 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 JavaDoc 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 JavaDoc newName;
224         protected boolean isNamed;
225         private PositionBounds bounds = null;
226         
227         protected Import addedImport = null;
228         
229         public InsertImport (Resource source, String JavaDoc 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 JavaDoc getText() {
237             return getDisplayText ();
238         }
239     
240         public String JavaDoc getDisplayText() {
241             return new MessageFormat JavaDoc (NbBundle.getMessage(MoveClassRefactoringPlugin.class, "LBL_InsertImport")).format ( // NOI18N
242
new Object JavaDoc[] {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