diff --git a/src/main/java/com/intellij/plugins/bodhi/pmd/PMDInvoker.java b/src/main/java/com/intellij/plugins/bodhi/pmd/PMDInvoker.java index 81527e0..4a9754d 100644 --- a/src/main/java/com/intellij/plugins/bodhi/pmd/PMDInvoker.java +++ b/src/main/java/com/intellij/plugins/bodhi/pmd/PMDInvoker.java @@ -8,16 +8,18 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.vcs.actions.VcsContextFactory; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.plugins.bodhi.pmd.core.PMDProgressRenderer; import com.intellij.plugins.bodhi.pmd.core.PMDResultCollector; import com.intellij.plugins.bodhi.pmd.tree.*; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.LinkedList; @@ -152,8 +154,9 @@ public void processFiles(Project project, final String ruleSetPaths, final List< ApplicationManager.getApplication().saveAll(); //Run PMD asynchronously - Runnable runnable = new Runnable() { - public void run() { + ProgressManager.getInstance().run(new Task.Backgroundable(project, "Running PMD", true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { //Show a progress indicator. ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); String[] ruleSetPathArray = ruleSetPaths.split(RULE_DELIMITER); @@ -165,15 +168,15 @@ public void run() { rootNode.setFileCount(files.size()); rootNode.setRuleSetCount(ruleSetPathArray.length); rootNode.setRunning(true); + PMDProgressRenderer progressRenderer = new PMDProgressRenderer(progress, files.size() * ruleSetPathArray.length); for (String ruleSetPath : ruleSetPathArray) { - //TODO: even better progress progress.setText("Running : " + ruleSetPath + " on " + files.size() + " file(s)"); //Create a result collector to get results PMDResultCollector collector = new PMDResultCollector(); //Get the tree nodes from result collector - List resultRuleNodes = collector.runPMDAndGetResults(files, ruleSetPath, projectComponent); + List resultRuleNodes = collector.runPMDAndGetResults(files, ruleSetPath, projectComponent, progressRenderer); // sort rules by priority, rule and suppressed nodes are comparable resultRuleNodes.sort(null); @@ -189,13 +192,15 @@ public void run() { rootNode.calculateCounts(); resultPanel.reloadResultTree(); } + if (progress.isCanceled()) { + break; + } } resultPanel.addProcessingErrorsNodeToRootIfHasAny(); // as last node rootNode.calculateCounts(); rootNode.setRunning(false); resultPanel.reloadResultTree(); } - }; - ProgressManager.getInstance().runProcessWithProgressSynchronously(runnable, "Running PMD", true, project); + }); } -} \ No newline at end of file +} diff --git a/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDProgressRenderer.java b/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDProgressRenderer.java new file mode 100644 index 0000000..3864961 --- /dev/null +++ b/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDProgressRenderer.java @@ -0,0 +1,47 @@ +package com.intellij.plugins.bodhi.pmd.core; + +import com.intellij.openapi.progress.ProgressIndicator; +import net.sourceforge.pmd.Report; +import net.sourceforge.pmd.renderers.AbstractRenderer; +import net.sourceforge.pmd.util.datasource.DataSource; + +import java.io.IOException; + +public class PMDProgressRenderer extends AbstractRenderer { + private final ProgressIndicator progress; + private final int totalFiles; + private int processedFiles = 0; + + public PMDProgressRenderer(ProgressIndicator progress, int totalFiles) { + super("Progress", "Reports progress to IntelliJ"); + + this.progress = progress; + this.totalFiles = totalFiles; + } + + @Override + public String defaultFileExtension() { + return null; + } + + @Override + public void start() throws IOException { + } + + @Override + public void startFileAnalysis(DataSource dataSource) { + processedFiles++; + progress.setFraction(processedFiles / (double) totalFiles); + progress.setText2(dataSource.getNiceFileName(true, null)); + } + + @Override + public void renderFileReport(Report report) throws IOException { + + } + + @Override + public void end() throws IOException { + + } +} diff --git a/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDResultCollector.java b/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDResultCollector.java index fd21104..d00b97d 100644 --- a/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDResultCollector.java +++ b/src/main/java/com/intellij/plugins/bodhi/pmd/core/PMDResultCollector.java @@ -1,5 +1,6 @@ package com.intellij.plugins.bodhi.pmd.core; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.plugins.bodhi.pmd.PMDConfigurationForm; import com.intellij.plugins.bodhi.pmd.PMDProjectComponent; @@ -54,11 +55,24 @@ public static Report getReport() { /** * Runs the given ruleSet(s) on given set of files and returns the result. * - * @param files The files to run PMD on - * @param ruleSetPath The path of the ruleSet to run + * @param files The files to run PMD on + * @param ruleSetPath The path of the ruleSet to run + * @param progressRenderer * @return list of results */ public List runPMDAndGetResults(List files, String ruleSetPath, PMDProjectComponent comp) { + return this.runPMDAndGetResults(files, ruleSetPath, comp, null); + } + + /** + * Runs the given ruleSet(s) on given set of files and returns the result. + * + * @param files The files to run PMD on + * @param ruleSetPath The path of the ruleSet to run + * @param progress Object to report progress to + * @return list of results + */ + public List runPMDAndGetResults(List files, String ruleSetPath, PMDProjectComponent comp, PMDProgressRenderer progressRenderer) { Map options = comp.getOptions(); Project project = comp.getCurrentProject(); @@ -78,6 +92,7 @@ public List runPMDAndGetResults(List files, String ru PMDJsonExportingRenderer exportingRenderer = addExportRenderer(options); if (exportingRenderer != null) renderers.add(exportingRenderer); + if (progressRenderer != null) renderers.add(progressRenderer ); try (PmdAnalysis pmd = PmdAnalysis.create(pmdConfig)) { files.forEach(file -> pmd.files().addFile(file.toPath()));