PHP HTML injection
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / refactoring / move / MoveGroovyScriptProcessor.java
1 /*
2  * Copyright 2000-2009 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 package org.jetbrains.plugins.groovy.refactoring.move;
18
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.util.Ref;
21 import com.intellij.psi.PsiClass;
22 import com.intellij.psi.PsiElement;
23 import com.intellij.psi.PsiManager;
24 import com.intellij.refactoring.MoveDestination;
25 import com.intellij.refactoring.listeners.RefactoringElementListener;
26 import com.intellij.refactoring.move.MoveCallback;
27 import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesProcessor;
28 import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil;
29 import com.intellij.refactoring.util.NonCodeUsageInfo;
30 import com.intellij.refactoring.util.RefactoringUIUtil;
31 import com.intellij.usageView.UsageInfo;
32 import com.intellij.usageView.UsageViewUtil;
33 import com.intellij.util.IncorrectOperationException;
34 import com.intellij.util.containers.HashMap;
35 import com.intellij.util.containers.MultiMap;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
38 import org.jetbrains.plugins.groovy.refactoring.GroovyChangeContextUtil;
39
40 import java.util.*;
41
42 /**
43  * @author Maxim.Medvedev
44  */
45 public class MoveGroovyScriptProcessor extends MoveClassesOrPackagesProcessor {
46   public MoveGroovyScriptProcessor(Project project,
47                                    PsiElement[] elements,
48                                    MoveDestination moveDestination,
49                                    boolean searchInComments,
50                                    boolean searchInNonJavaFiles,
51                                    MoveCallback moveCallback) {
52     super(project, elements, moveDestination, searchInComments, searchInNonJavaFiles, moveCallback);
53   }
54
55   @NotNull
56   @Override
57   protected UsageInfo[] findUsages() {
58     List<UsageInfo> allUsages = new ArrayList<UsageInfo>();
59     MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
60     final List<PsiElement> elements = getElements();
61     for (PsiElement element : elements) {
62       final GroovyFile groovyFile = (GroovyFile)element;
63
64       final PsiClass scriptClass = groovyFile.getClasses()[0];
65       String newName = getTargetPackage().getQualifiedName() + scriptClass.getName();
66
67       final UsageInfo[] usages = MoveClassesOrPackagesUtil.findUsages(scriptClass, isSearchInComments(), isSearchInNonJavaFiles(), newName);
68       allUsages.addAll(new ArrayList<UsageInfo>(Arrays.asList(usages)));
69     }
70     myMoveDestination
71       .analyzeModuleConflicts(elements, conflicts, allUsages.toArray(new UsageInfo[allUsages.size()]));
72     if (!conflicts.isEmpty()) {
73       for (PsiElement element : conflicts.keySet()) {
74         allUsages.add(new ConflictsUsageInfo(element, conflicts.get(element)));
75       }
76     }
77
78     return UsageViewUtil.removeDuplicatedUsages(allUsages.toArray(new UsageInfo[allUsages.size()]));
79   }
80
81   @Override
82   protected boolean preprocessUsages(Ref<UsageInfo[]> refUsages) {
83     return showConflicts(new MultiMap<PsiElement, String>(), refUsages.get());
84   }
85
86   @Override
87   protected void performRefactoring(UsageInfo[] usages) {
88     try {
89       Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
90       final List<PsiElement> elements = getElements();
91       for (PsiElement element : elements) {
92         GroovyFile file = (GroovyFile)element;
93         final RefactoringElementListener elementListener = getTransaction().getElementListener(file);
94
95         PsiClass oldScriptClass = file.getClasses()[0];
96
97         GroovyChangeContextUtil.encodeContextInfo(file);
98         PsiManager.getInstance(myProject).moveFile(file, myMoveDestination.getTargetDirectory(file));
99         file.setPackageName(getTargetPackage().getQualifiedName());
100
101         PsiClass newScriptClass = file.getClasses()[0];
102         oldToNewElementsMapping.put(oldScriptClass, newScriptClass);
103
104         elementListener.elementMoved(file);
105       }
106
107       for (PsiElement element : elements) {
108         GroovyChangeContextUtil.decodeContextInfo(element, null, null);
109       }
110
111       myNonCodeUsages = retargetUsages(usages, oldToNewElementsMapping);
112     }
113     catch (IncorrectOperationException e) {
114       myNonCodeUsages = new NonCodeUsageInfo[0];
115       RefactoringUIUtil.processIncorrectOperation(myProject, e);
116     }
117   }
118 }