1
2
3
4 package net.sourceforge.pmd.processor;
5
6 import java.io.BufferedInputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.util.List;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 import net.sourceforge.pmd.PMDConfiguration;
14 import net.sourceforge.pmd.PMD;
15 import net.sourceforge.pmd.PMDException;
16 import net.sourceforge.pmd.Report;
17 import net.sourceforge.pmd.RuleContext;
18 import net.sourceforge.pmd.RuleSetFactory;
19 import net.sourceforge.pmd.RuleSets;
20 import net.sourceforge.pmd.SourceCodeProcessor;
21 import net.sourceforge.pmd.renderers.Renderer;
22 import net.sourceforge.pmd.util.datasource.DataSource;
23
24
25
26
27
28 public final class MonoThreadProcessor extends AbstractPMDProcessor {
29
30 public MonoThreadProcessor(PMDConfiguration configuration) {
31 super(configuration);
32 }
33
34 private static final Logger LOG = Logger.getLogger(MonoThreadProcessor.class.getName());
35
36 public void processFiles(RuleSetFactory ruleSetFactory, List<DataSource> files,
37 RuleContext ctx, List<Renderer> renderers) {
38
39
40
41 RuleSets rs = createRuleSets(ruleSetFactory);
42 SourceCodeProcessor processor = new SourceCodeProcessor(configuration);
43
44 for (DataSource dataSource : files) {
45 String niceFileName = filenameFrom(dataSource);
46
47 Report report = PMD.setupReport(rs, ctx, niceFileName);
48
49 if (LOG.isLoggable(Level.FINE)) {
50 LOG.fine("Processing " + ctx.getSourceCodeFilename());
51 }
52 rs.start(ctx);
53
54 for (Renderer r : renderers) {
55 r.startFileAnalysis(dataSource);
56 }
57
58 try {
59 InputStream stream = new BufferedInputStream(dataSource.getInputStream());
60 ctx.setLanguageVersion(null);
61 processor.processSourceCode(stream, rs, ctx);
62 } catch (PMDException pmde) {
63 LOG.log(Level.FINE, "Error while processing file", pmde.getCause());
64
65 report.addError(new Report.ProcessingError(pmde.getMessage(), niceFileName));
66 } catch (IOException ioe) {
67
68 addError(report, "Unable to read source file", ioe, niceFileName);
69 } catch (RuntimeException re) {
70
71 addError(report, "RuntimeException while processing file", re, niceFileName);
72 }
73
74 rs.end(ctx);
75 super.renderReports(renderers, ctx.getReport());
76 }
77 }
78
79 private void addError(Report report, String msg, Exception ex, String fileName) {
80 LOG.log(Level.FINE, msg, ex);
81 report.addError(
82 new Report.ProcessingError(ex.getMessage(),
83 fileName)
84 );
85 }
86 }