org.sonar.plugins.pmd.PmdTemplate.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.plugins.pmd.PmdTemplate.java

Source

/*
 * SonarQube PMD Plugin
 * Copyright (C) 2012 SonarSource
 * sonarqube@googlegroups.com
 *
 * This program 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.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */
package org.sonar.plugins.pmd;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableMap;
import com.google.common.io.Closeables;
import net.sourceforge.pmd.PMDConfiguration;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.RuleSets;
import net.sourceforge.pmd.SourceCodeProcessor;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.java.JavaLanguageModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;

public class PmdTemplate {

    private static final Logger LOG = LoggerFactory.getLogger(PmdTemplate.class);

    private static final Map<String, String> JAVA_VERSIONS = ImmutableMap.<String, String>builder()
            .put("1.1", "1.3").put("1.2", "1.3").put("5", "1.5").put("6", "1.6").put("7", "1.7").put("8", "1.8")
            .build();

    private SourceCodeProcessor processor;
    private PMDConfiguration configuration;

    public static PmdTemplate create(String javaVersion, ClassLoader classloader, Charset charset) {
        PMDConfiguration configuration = new PMDConfiguration();
        configuration.setDefaultLanguageVersion(languageVersion(javaVersion));
        configuration.setClassLoader(classloader);
        configuration.setSourceEncoding(charset.name());
        SourceCodeProcessor processor = new SourceCodeProcessor(configuration);
        return new PmdTemplate(configuration, processor);
    }

    @VisibleForTesting
    PmdTemplate(PMDConfiguration configuration, SourceCodeProcessor processor) {
        this.configuration = configuration;
        this.processor = processor;
    }

    @VisibleForTesting
    PMDConfiguration configuration() {
        return configuration;
    }

    public void process(File file, RuleSets rulesets, RuleContext ruleContext) {
        ruleContext.setSourceCodeFilename(file.getAbsolutePath());
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            processor.processSourceCode(inputStream, rulesets, ruleContext);
        } catch (Throwable e) {
            LOG.error("Fail to execute PMD. Following file is ignored: " + file, e);
        } finally {
            Closeables.closeQuietly(inputStream);
        }
    }

    @VisibleForTesting
    static LanguageVersion languageVersion(String javaVersion) {
        String version = normalize(javaVersion);
        LanguageVersion languageVersion = new JavaLanguageModule().getVersion(version);
        if (languageVersion == null) {
            throw new IllegalArgumentException("Unsupported Java version for PMD: " + version);
        }
        LOG.info("Java version: " + version);
        return languageVersion;
    }

    private static String normalize(String version) {
        return Functions.forMap(JAVA_VERSIONS, version).apply(version);
    }

}