2727import java .io .IOException ;
2828import java .io .InputStreamReader ;
2929import java .io .Reader ;
30+ import java .io .Writer ;
3031import java .util .ArrayList ;
3132import java .util .Arrays ;
3233import java .util .Collections ;
4748import org .eclipse .ui .IWorkingSet ;
4849import org .eclipse .ui .ResourceWorkingSetFilter ;
4950
50- import name .herlin .command .Timer ;
5151import net .sourceforge .pmd .PMD ;
5252import net .sourceforge .pmd .PMDConfiguration ;
5353import net .sourceforge .pmd .PMDException ;
54+ import net .sourceforge .pmd .PropertyDescriptor ;
55+ import net .sourceforge .pmd .Report ;
5456import net .sourceforge .pmd .Report .ProcessingError ;
57+ import net .sourceforge .pmd .Report .RuleConfigurationError ;
5558import net .sourceforge .pmd .Rule ;
5659import net .sourceforge .pmd .RuleContext ;
5760import net .sourceforge .pmd .RuleSet ;
5861import net .sourceforge .pmd .RuleSetFactory ;
5962import net .sourceforge .pmd .RuleSetNotFoundException ;
6063import net .sourceforge .pmd .RuleSets ;
6164import net .sourceforge .pmd .RuleViolation ;
62- import net .sourceforge .pmd .SourceCodeProcessor ;
6365import net .sourceforge .pmd .eclipse .plugin .PMDPlugin ;
6466import net .sourceforge .pmd .eclipse .runtime .PMDRuntimeConstants ;
6567import net .sourceforge .pmd .eclipse .runtime .properties .IProjectProperties ;
6971import net .sourceforge .pmd .lang .LanguageVersion ;
7072import net .sourceforge .pmd .lang .LanguageVersionDiscoverer ;
7173import net .sourceforge .pmd .lang .java .JavaLanguageModule ;
74+ import net .sourceforge .pmd .renderers .AbstractRenderer ;
7275import net .sourceforge .pmd .renderers .Renderer ;
7376import net .sourceforge .pmd .util .NumericConstants ;
7477import net .sourceforge .pmd .util .StringUtil ;
7578import net .sourceforge .pmd .util .datasource .DataSource ;
7679import net .sourceforge .pmd .util .datasource .ReaderDataSource ;
7780
81+ import name .herlin .command .Timer ;
82+
7883/**
7984 * Factor some useful features for visitors
8085 *
@@ -307,12 +312,56 @@ public synchronized RuleSets createRuleSets(String referenceString)
307312 };
308313 configuration ().setThreads (0 ); // need to disable multi threading, as the ruleset is not recreated and shared between threads...
309314 // but as we anyway have only one file to process, it won't hurt here.
310- PMD .processFiles (configuration (), ruleSetFactory , Arrays .asList (dataSource ), context , Collections .<Renderer >emptyList ());
315+ log .debug ("PMD running on file " + file .getName ());
316+ final Report collectingReport = new Report ();
317+ Renderer collectingRenderer = new AbstractRenderer ("collectingRenderer" , "Renderer that collect violations" ) {
318+ @ Override
319+ public void startFileAnalysis (DataSource dataSource ) {
320+ // TODO Auto-generated method stub
321+
322+ }
323+
324+ @ Override
325+ public void start () throws IOException {
326+ // TODO Auto-generated method stub
327+
328+ }
329+
330+ @ Override
331+ public void renderFileReport (Report report ) throws IOException {
332+ for (RuleViolation v : report ) {
333+ collectingReport .addRuleViolation (v );
334+ }
335+ for (Iterator <ProcessingError > it = report .errors (); it .hasNext (); ) {
336+ collectingReport .addError (it .next ());
337+ }
338+ for (Iterator <RuleConfigurationError > it = report .configErrors (); it .hasNext (); ) {
339+ collectingReport .addConfigError (it .next ());
340+ }
341+ }
342+
343+ @ Override
344+ public void end () throws IOException {
345+ // TODO Auto-generated method stub
346+
347+ }
348+
349+ @ Override
350+ public String defaultFileExtension () {
351+ // TODO Auto-generated method stub
352+ return null ;
353+ }
354+ };
355+
356+ PMD .processFiles (configuration (), ruleSetFactory , Arrays .asList (dataSource ), context , Arrays .asList (collectingRenderer ));
357+ log .debug ("PMD run finished." );
311358
312359 timer .stop ();
313360 pmdDuration += timer .getDuration ();
314361
315- if (context .getReport ().hasErrors ()) {
362+ log .debug ("PMD found " + collectingReport .size () + " violations for file " + file .getName ());
363+
364+ if (collectingReport .hasErrors ()) {
316365 StringBuilder message = new StringBuilder ("There were processing errors!\n " );
317366 Iterator <ProcessingError > errors = context .getReport ().errors ();
318367 while (errors .hasNext ()) {
@@ -323,7 +372,7 @@ public synchronized RuleSets createRuleSets(String referenceString)
323372 throw new PMDException (message .toString ());
324373 }
325374
326- updateMarkers (file , context , isUseTaskMarker ());
375+ updateMarkers (file , collectingReport . iterator () , isUseTaskMarker ());
327376
328377 worked (1 );
329378 fileCount ++;
@@ -406,21 +455,20 @@ private void prepareMarkerAccumulator(IFile file) {
406455 }
407456 }
408457
409- private void updateMarkers (IFile file , RuleContext context , boolean fTask )
458+ private void updateMarkers (IFile file , Iterator < RuleViolation > violations , boolean fTask )
410459 throws CoreException , PropertiesException {
411460
412461 Map <IFile , Set <MarkerInfo2 >> accumulator = getAccumulator ();
413462 Set <MarkerInfo2 > markerSet = new HashSet <MarkerInfo2 >();
414463 List <Review > reviewsList = findReviewedViolations (file );
415464 Review review = new Review ();
416- Iterator <RuleViolation > iter = context .getReport ().iterator ();
417465// final IPreferences preferences = PMDPlugin.getDefault().loadPreferences();
418466// final int maxViolationsPerFilePerRule = preferences.getMaxViolationsPerFilePerRule();
419467 Map <Rule , Integer > violationsByRule = new HashMap <Rule , Integer >();
420468
421469 Rule rule ;
422- while (iter .hasNext ()) {
423- RuleViolation violation = iter .next ();
470+ while (violations .hasNext ()) {
471+ RuleViolation violation = violations .next ();
424472 rule = violation .getRule ();
425473 review .ruleName = rule .getName ();
426474 review .lineNumber = violation .getBeginLine ();
0 commit comments