10cae69bf12d725f5c4532754274fbefcce74662
[idea/community.git] / java / java-impl / src / com / intellij / refactoring / move / moveClassesOrPackages / MoveJavaFileHandler.java
1 /*
2  * Copyright 2000-2011 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*
18  * User: anna
19  * Date: 05-Aug-2009
20  */
21 package com.intellij.refactoring.move.moveClassesOrPackages;
22
23 import com.intellij.codeInsight.ChangeContextUtil;
24 import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
25 import com.intellij.openapi.diagnostic.Logger;
26 import com.intellij.openapi.util.text.StringUtil;
27 import com.intellij.psi.*;
28 import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFileHandler;
29 import com.intellij.refactoring.util.MoveRenameUsageInfo;
30 import com.intellij.usageView.UsageInfo;
31 import com.intellij.util.IncorrectOperationException;
32
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.List;
36 import java.util.Map;
37
38 public class MoveJavaFileHandler extends MoveFileHandler {
39   private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MoveJavaFileHandler");
40
41   @Override
42   public boolean canProcessElement(PsiFile element) {
43     return element instanceof PsiJavaFile &&
44            !JspPsiUtil.isInJspFile(element) &&
45            !CollectHighlightsUtil.isOutsideSourceRoot(element);
46   }
47
48   @Override
49   public void prepareMovedFile(PsiFile file, PsiDirectory moveDestination, Map<PsiElement, PsiElement> oldToNewMap) {
50     final PsiJavaFile javaFile = (PsiJavaFile)file;
51     ChangeContextUtil.encodeContextInfo(javaFile, true);
52     for (PsiClass psiClass : javaFile.getClasses()) {
53       oldToNewMap.put(psiClass, MoveClassesOrPackagesUtil.doMoveClass(psiClass, moveDestination));
54     }
55   }
56
57   public List<UsageInfo> findUsages(PsiFile psiFile, PsiDirectory newParent, boolean searchInComments, boolean searchInNonJavaFiles) {
58     final List<UsageInfo> result = new ArrayList<UsageInfo>();
59     final PsiPackage newParentPackage = JavaDirectoryService.getInstance().getPackage(newParent);
60     final String qualifiedName = newParentPackage == null ? "" : newParentPackage.getQualifiedName();
61     for (PsiClass aClass : ((PsiJavaFile)psiFile).getClasses()) {
62       Collections.addAll(result, MoveClassesOrPackagesUtil.findUsages(aClass, searchInComments, searchInNonJavaFiles,
63                                                                       StringUtil.getQualifiedName(qualifiedName, aClass.getName())));
64     }
65     return result.isEmpty() ? null : result;
66   }
67
68   @Override
69   public void retargetUsages(List<UsageInfo> usageInfos, Map<PsiElement, PsiElement> oldToNewMap) {
70     for (UsageInfo usage : usageInfos) {
71       if (usage instanceof MoveRenameUsageInfo) {
72         final MoveRenameUsageInfo moveRenameUsage = (MoveRenameUsageInfo)usage;
73         final PsiElement oldElement = moveRenameUsage.getReferencedElement();
74         final PsiElement newElement = oldToNewMap.get(oldElement);
75         final PsiReference reference = moveRenameUsage.getReference();
76         if (reference != null) {
77           try {
78             LOG.assertTrue(newElement != null, oldElement != null ? oldElement : reference);
79             reference.bindToElement(newElement);
80           } catch (IncorrectOperationException ex) {
81             LOG.error(ex);
82           }
83         }
84       }
85     }
86   }
87
88   @Override
89   public void updateMovedFile(PsiFile file) throws IncorrectOperationException {
90     ChangeContextUtil.decodeContextInfo(file, null, null);
91     final PsiDirectory containingDirectory = file.getContainingDirectory();
92     if (containingDirectory != null) {
93       final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(containingDirectory);
94       if (aPackage != null) {
95         final String qualifiedName = aPackage.getQualifiedName();
96         final PsiPackageStatement packageStatement = qualifiedName.length() > 0
97                                                      ? JavaPsiFacade.getElementFactory(file.getProject()).createPackageStatement(qualifiedName)
98                                                      : null;
99         if (file instanceof PsiJavaFile) {
100           final PsiPackageStatement filePackageStatement = ((PsiJavaFile)file).getPackageStatement();
101           if (filePackageStatement != null) {
102             if (packageStatement != null) {
103               filePackageStatement.getPackageReference().replace(packageStatement.getPackageReference());
104             } else {
105               filePackageStatement.delete();
106             }
107           }
108         }
109       }
110     }
111   }
112 }