ExcludedFileIndex -> FileIndexFacade; use it in PsiClassImplUtil
[idea/community.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / actions / SvnExcludingIgnoredOperation.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 package org.jetbrains.idea.svn.actions;
17
18 import com.intellij.lifecycle.PeriodicalTasksCloser;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.FileIndexFacade;
21 import com.intellij.openapi.vcs.changes.ChangeListManager;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import org.tmatesoft.svn.core.SVNDepth;
24 import org.tmatesoft.svn.core.SVNException;
25
26 public class SvnExcludingIgnoredOperation {
27   private final Operation myImportAction;
28   private final SVNDepth myDepth;
29   private final Filter myFilter;
30
31   public SvnExcludingIgnoredOperation(final Project project, final Operation importAction, final SVNDepth depth) {
32     myImportAction = importAction;
33     myDepth = depth;
34
35     myFilter = new Filter(project);
36   }
37
38   public static class Filter {
39     private final Project myProject;
40     private final FileIndexFacade myIndex;
41     private final ChangeListManager myClManager;
42
43     public Filter(final Project project) {
44       myProject = project;
45
46       if (! project.isDefault()) {
47         myIndex = PeriodicalTasksCloser.getInstance().safeGetService(project, FileIndexFacade.class);
48         myClManager = ChangeListManager.getInstance(project);
49       } else {
50         myIndex = null;
51         myClManager = null;
52       }
53     }
54
55     public boolean accept(final VirtualFile file) {
56       if (! myProject.isDefault()) {
57         if (myIndex.isExcludedFile(file)) {
58           return false;
59         }
60         if (myClManager.isIgnoredFile(file)) {
61           return false;
62         }
63       }
64       return true;
65     }
66   }
67
68   private boolean operation(final VirtualFile file) throws SVNException {
69     if (! myFilter.accept(file)) return false;
70
71     myImportAction.doOperation(file);
72     return true;
73   }
74
75   private void executeDown(final VirtualFile file) throws SVNException {
76     if (! operation(file)) {
77       return;
78     }
79
80     for (VirtualFile child : file.getChildren()) {
81       executeDown(child);
82     }
83   }
84
85   public void execute(final VirtualFile file) throws SVNException {
86     if (SVNDepth.INFINITY.equals(myDepth)) {
87       executeDown(file);
88       return;
89     }
90
91     if (! operation(file)) {
92       return;
93     }
94
95     if (SVNDepth.EMPTY.equals(myDepth)) {
96       return;
97     }
98
99     for (VirtualFile child : file.getChildren()) {
100       if (SVNDepth.FILES.equals(myDepth) && child.isDirectory()) {
101         continue;
102       }
103       operation(child);
104     }
105   }
106
107   public interface Operation {
108     void doOperation(final VirtualFile file) throws SVNException;
109   }
110 }