Skip to content

Commit f920dfd

Browse files
authored
Merge pull request #149 from martenbohlin/run-in-background
Run in background
2 parents c6ba828 + 54c15a7 commit f920dfd

File tree

3 files changed

+77
-10
lines changed

3 files changed

+77
-10
lines changed

src/main/java/com/intellij/plugins/bodhi/pmd/PMDInvoker.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@
88
import com.intellij.openapi.fileEditor.FileEditorManager;
99
import com.intellij.openapi.progress.ProgressIndicator;
1010
import com.intellij.openapi.progress.ProgressManager;
11+
import com.intellij.openapi.progress.Task;
1112
import com.intellij.openapi.project.Project;
1213
import com.intellij.openapi.roots.ProjectRootManager;
13-
import com.intellij.openapi.vcs.actions.VcsContextFactory;
1414
import com.intellij.openapi.vfs.VfsUtil;
1515
import com.intellij.openapi.vfs.VirtualFile;
1616
import com.intellij.openapi.vfs.VirtualFileFilter;
1717
import com.intellij.openapi.wm.ToolWindow;
1818
import com.intellij.openapi.wm.ToolWindowManager;
19+
import com.intellij.plugins.bodhi.pmd.core.PMDProgressRenderer;
1920
import com.intellij.plugins.bodhi.pmd.core.PMDResultCollector;
2021
import com.intellij.plugins.bodhi.pmd.tree.*;
22+
import org.jetbrains.annotations.NotNull;
2123

2224
import java.io.File;
2325
import java.util.LinkedList;
@@ -152,8 +154,9 @@ public void processFiles(Project project, final String ruleSetPaths, final List<
152154
ApplicationManager.getApplication().saveAll();
153155

154156
//Run PMD asynchronously
155-
Runnable runnable = new Runnable() {
156-
public void run() {
157+
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Running PMD", true) {
158+
@Override
159+
public void run(@NotNull ProgressIndicator indicator) {
157160
//Show a progress indicator.
158161
ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator();
159162
String[] ruleSetPathArray = ruleSetPaths.split(RULE_DELIMITER);
@@ -165,15 +168,15 @@ public void run() {
165168
rootNode.setFileCount(files.size());
166169
rootNode.setRuleSetCount(ruleSetPathArray.length);
167170
rootNode.setRunning(true);
171+
PMDProgressRenderer progressRenderer = new PMDProgressRenderer(progress, files.size() * ruleSetPathArray.length);
168172
for (String ruleSetPath : ruleSetPathArray) {
169-
//TODO: even better progress
170173
progress.setText("Running : " + ruleSetPath + " on " + files.size() + " file(s)");
171174

172175
//Create a result collector to get results
173176
PMDResultCollector collector = new PMDResultCollector();
174177

175178
//Get the tree nodes from result collector
176-
List<PMDRuleSetEntryNode> resultRuleNodes = collector.runPMDAndGetResults(files, ruleSetPath, projectComponent);
179+
List<PMDRuleSetEntryNode> resultRuleNodes = collector.runPMDAndGetResults(files, ruleSetPath, projectComponent, progressRenderer);
177180
// sort rules by priority, rule and suppressed nodes are comparable
178181
resultRuleNodes.sort(null);
179182

@@ -189,13 +192,15 @@ public void run() {
189192
rootNode.calculateCounts();
190193
resultPanel.reloadResultTree();
191194
}
195+
if (progress.isCanceled()) {
196+
break;
197+
}
192198
}
193199
resultPanel.addProcessingErrorsNodeToRootIfHasAny(); // as last node
194200
rootNode.calculateCounts();
195201
rootNode.setRunning(false);
196202
resultPanel.reloadResultTree();
197203
}
198-
};
199-
ProgressManager.getInstance().runProcessWithProgressSynchronously(runnable, "Running PMD", true, project);
204+
});
200205
}
201-
}
206+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.intellij.plugins.bodhi.pmd.core;
2+
3+
import com.intellij.openapi.progress.ProgressIndicator;
4+
import net.sourceforge.pmd.Report;
5+
import net.sourceforge.pmd.renderers.AbstractRenderer;
6+
import net.sourceforge.pmd.util.datasource.DataSource;
7+
8+
import java.io.IOException;
9+
10+
public class PMDProgressRenderer extends AbstractRenderer {
11+
private final ProgressIndicator progress;
12+
private final int totalFiles;
13+
private int processedFiles = 0;
14+
15+
public PMDProgressRenderer(ProgressIndicator progress, int totalFiles) {
16+
super("Progress", "Reports progress to IntelliJ");
17+
18+
this.progress = progress;
19+
this.totalFiles = totalFiles;
20+
}
21+
22+
@Override
23+
public String defaultFileExtension() {
24+
return null;
25+
}
26+
27+
@Override
28+
public void start() throws IOException {
29+
}
30+
31+
@Override
32+
public void startFileAnalysis(DataSource dataSource) {
33+
processedFiles++;
34+
progress.setFraction(processedFiles / (double) totalFiles);
35+
progress.setText2(dataSource.getNiceFileName(true, null));
36+
}
37+
38+
@Override
39+
public void renderFileReport(Report report) throws IOException {
40+
41+
}
42+
43+
@Override
44+
public void end() throws IOException {
45+
46+
}
47+
}

src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDResultCollector.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.intellij.plugins.bodhi.pmd.core;
22

3+
import com.intellij.openapi.progress.ProgressIndicator;
34
import com.intellij.openapi.project.Project;
45
import com.intellij.plugins.bodhi.pmd.PMDConfigurationForm;
56
import com.intellij.plugins.bodhi.pmd.PMDProjectComponent;
@@ -54,11 +55,24 @@ public static Report getReport() {
5455
/**
5556
* Runs the given ruleSet(s) on given set of files and returns the result.
5657
*
57-
* @param files The files to run PMD on
58-
* @param ruleSetPath The path of the ruleSet to run
58+
* @param files The files to run PMD on
59+
* @param ruleSetPath The path of the ruleSet to run
60+
* @param progressRenderer
5961
* @return list of results
6062
*/
6163
public List<PMDRuleSetEntryNode> runPMDAndGetResults(List<File> files, String ruleSetPath, PMDProjectComponent comp) {
64+
return this.runPMDAndGetResults(files, ruleSetPath, comp, null);
65+
}
66+
67+
/**
68+
* Runs the given ruleSet(s) on given set of files and returns the result.
69+
*
70+
* @param files The files to run PMD on
71+
* @param ruleSetPath The path of the ruleSet to run
72+
* @param progress Object to report progress to
73+
* @return list of results
74+
*/
75+
public List<PMDRuleSetEntryNode> runPMDAndGetResults(List<File> files, String ruleSetPath, PMDProjectComponent comp, PMDProgressRenderer progressRenderer) {
6276
Map<String, String> options = comp.getOptions();
6377
Project project = comp.getCurrentProject();
6478

@@ -78,6 +92,7 @@ public List<PMDRuleSetEntryNode> runPMDAndGetResults(List<File> files, String ru
7892

7993
PMDJsonExportingRenderer exportingRenderer = addExportRenderer(options);
8094
if (exportingRenderer != null) renderers.add(exportingRenderer);
95+
if (progressRenderer != null) renderers.add(progressRenderer );
8196

8297
try (PmdAnalysis pmd = PmdAnalysis.create(pmdConfig)) {
8398
files.forEach(file -> pmd.files().addFile(file.toPath()));

0 commit comments

Comments
 (0)