Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Sonar, open source software quality management tool.
   * Copyright (C) 2009 SonarSource SA
   * mailto:contact AT sonarsource DOT com
   *
   * Sonar is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 3 of the License, or (at your option) any later version.
  *
  * Sonar is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with Sonar; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
  */
 package org.sonar.plugins.pmd;
 
 
 import java.io.*;
 import java.util.List;
 
 public class PmdExecutor implements BatchExtension {
 
   private static Logger LOG = LoggerFactory.getLogger(PmdExecutor.class);
 
   private Project project;
 
   public PmdExecutor(Project projectPmdConfiguration configuration) {
     this. = project;
     this. = configuration;
   }
 
   public File execute() throws IOExceptionPMDException {
     TimeProfiler profiler = new TimeProfiler().start("Execute PMD " + PmdVersion.getVersion());
 
     ClassLoader initialClassLoader = Thread.currentThread().getContextClassLoader();
     try {
       PMD pmd = new PMD();
       setJavaVersion(pmd);
       RuleContext ruleContext = new RuleContext();
       Report report = new Report();
       ruleContext.setReport(report);
 
       RuleSets rulesets = createRulesets();
       
       for (File file : .getFileSystem().getSourceFiles(.)) {
         ruleContext.setSourceCodeFilename(file.getAbsolutePath());
         Reader fileReader = new InputStreamReader(new FileInputStream(file), .getFileSystem().getSourceCharset());
         try {
           pmd.processFile(fileReaderrulesetsruleContext);
           
         } catch(PMDException e) {
           .error("Fail to execute PMD. Following file is ignored: " + filee.getCause());
 
         } catch(Exception e) {
           .error("Fail to execute PMD. Following file is ignored: " + filee);
 
         } finally {
           IOUtils.closeQuietly(fileReader);
         }
       }
 
       return writeXmlReport(report);
 
     } finally {
       profiler.stop();
       Thread.currentThread().setContextClassLoader(initialClassLoader);
     }
   }
 
   private RuleSets createRulesets() {
     RuleSets rulesets = new RuleSets();
     RuleSetFactory ruleSetFactory = new RuleSetFactory();
 
     List<StringrulesetPaths = .getRulesets();
     .info("PMD configuration: " + StringUtils.join(rulesetPaths", "));
 
     for (String rulesetPath : rulesetPaths) {
       InputStream rulesInput = openRuleset(rulesetPath);
       rulesets.addRuleSet(ruleSetFactory.createRuleSet(rulesInput));
       IOUtils.closeQuietly(rulesInput);
    }
    return rulesets;
  }
  private InputStream openRuleset(String rulesetPath) {
    try {
      File file = new File(rulesetPath);
      boolean found;
      if (file.exists()) {
        found = true;
      } else {
        file = new File(.getFileSystem().getBasedir(), rulesetPath);
        found = file.exists();
      }
      if (found) {
        return new FileInputStream(file);
      }
      InputStream stream = getClass().getResourceAsStream(rulesetPath);
      if (stream == null) {
        throw new RuntimeException("The PMD ruleset can not be found: " + rulesetPath);
      }
      return stream;
    } catch (FileNotFoundException e) {
      throw new RuntimeException("The PMD ruleset can not be found: " + rulesetPath);
    }
  }
  private File writeXmlReport(Project projectReport reportthrows IOException {
    Renderer xmlRenderer = new XMLRenderer();
    Writer stringwriter = new StringWriter();
    xmlRenderer.setWriter(stringwriter);
    xmlRenderer.start();
    xmlRenderer.renderFileReport(report);
    xmlRenderer.end();
    String buffer = stringwriter.toString();
    File xmlReport = new File(project.getFileSystem().getSonarWorkingDirectory(), "pmd-result.xml");
    .info("PMD output report: " + xmlReport.getAbsolutePath());
    Writer writer = new FileWriter(xmlReport);
    writer.write(buffer, 0, buffer.length());
    writer.close();
    return xmlReport;
  }
  private void setJavaVersion(PMD pmdProject project) {
    String javaVersion = ProjectUtils.getJavaSourceVersion(project);
    if (StringUtils.isNotBlank(javaVersion)) {
      if ("1.1".equals(javaVersion) || "1.2".equals(javaVersion)) {
        javaVersion = "1.3";
      }
    }
    if (javaVersion != null) {
      SourceType sourceType = SourceType.getSourceTypeForId("java " + javaVersion);
      if (sourceType != null) {
        .info("Java version: " + javaVersion);
        pmd.setJavaVersion(sourceType);
      } else {
        throw new RuntimeException("Unsupported Java version for PMD: " + javaVersion);
      }
    }
  }
New to GrepCode? Check out our FAQ X