001 /* 002 * Sonar, open source software quality management tool. 003 * Copyright (C) 2008-2011 SonarSource 004 * mailto:contact AT sonarsource DOT com 005 * 006 * Sonar is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU Lesser General Public 008 * License as published by the Free Software Foundation; either 009 * version 3 of the License, or (at your option) any later version. 010 * 011 * Sonar is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * Lesser General Public License for more details. 015 * 016 * You should have received a copy of the GNU Lesser General Public 017 * License along with Sonar; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 019 */ 020 package org.sonar.plugins.checkstyle; 021 022 import com.puppycrawl.tools.checkstyle.ConfigurationLoader; 023 import com.puppycrawl.tools.checkstyle.DefaultConfiguration; 024 import com.puppycrawl.tools.checkstyle.PropertiesExpander; 025 import com.puppycrawl.tools.checkstyle.api.CheckstyleException; 026 import org.apache.commons.io.IOUtils; 027 import org.apache.commons.lang.CharEncoding; 028 import org.slf4j.Logger; 029 import org.slf4j.LoggerFactory; 030 import org.sonar.api.BatchExtension; 031 import org.sonar.api.CoreProperties; 032 import org.sonar.api.Property; 033 import org.sonar.api.config.Settings; 034 import org.sonar.api.profiles.RulesProfile; 035 import org.sonar.api.resources.Java; 036 import org.sonar.api.resources.ProjectFileSystem; 037 import org.sonar.api.utils.SonarException; 038 039 import java.io.*; 040 import java.nio.charset.Charset; 041 import java.util.List; 042 import java.util.Locale; 043 import java.util.Properties; 044 045 @org.sonar.api.Properties({ 046 @Property(key = CheckstyleConfiguration.PROPERTY_GENERATE_XML, 047 defaultValue = "false", 048 name = "Generate XML Report", 049 project = false, global = false)}) 050 public class CheckstyleConfiguration implements BatchExtension { 051 052 private static final Logger LOG = LoggerFactory.getLogger(CheckstyleConfiguration.class); 053 public static final String PROPERTY_GENERATE_XML = "sonar.checkstyle.generateXml"; 054 055 private CheckstyleProfileExporter confExporter; 056 private RulesProfile profile; 057 private Settings conf; 058 private ProjectFileSystem fileSystem; 059 060 public CheckstyleConfiguration(Settings conf, CheckstyleProfileExporter confExporter, RulesProfile profile, ProjectFileSystem fileSystem) { 061 this.conf = conf; 062 this.confExporter = confExporter; 063 this.profile = profile; 064 this.fileSystem = fileSystem; 065 } 066 067 public File getXMLDefinitionFile() { 068 Writer writer = null; 069 File xmlFile = new File(fileSystem.getSonarWorkingDirectory(), "checkstyle.xml"); 070 try { 071 writer = new OutputStreamWriter(new FileOutputStream(xmlFile, false), CharEncoding.UTF_8); 072 confExporter.exportProfile(profile, writer); 073 writer.flush(); 074 return xmlFile; 075 076 } catch (IOException e) { 077 throw new SonarException("Fail to save the Checkstyle configuration to " + xmlFile.getPath(), e); 078 079 } finally { 080 IOUtils.closeQuietly(writer); 081 } 082 } 083 084 public List<File> getSourceFiles() { 085 return fileSystem.getSourceFiles(Java.INSTANCE); 086 } 087 088 public File getTargetXMLReport() { 089 if (conf.getBoolean(PROPERTY_GENERATE_XML)) { 090 return new File(fileSystem.getSonarWorkingDirectory(), "checkstyle-result.xml"); 091 } 092 return null; 093 } 094 095 public com.puppycrawl.tools.checkstyle.api.Configuration getCheckstyleConfiguration() throws IOException, CheckstyleException { 096 File xmlConfig = getXMLDefinitionFile(); 097 098 LOG.info("Checkstyle configuration: " + xmlConfig.getAbsolutePath()); 099 com.puppycrawl.tools.checkstyle.api.Configuration configuration = toCheckstyleConfiguration(xmlConfig); 100 defineCharset(configuration); 101 return configuration; 102 } 103 104 static com.puppycrawl.tools.checkstyle.api.Configuration toCheckstyleConfiguration(File xmlConfig) throws CheckstyleException { 105 return ConfigurationLoader.loadConfiguration(xmlConfig.getAbsolutePath(), new PropertiesExpander(new Properties())); 106 } 107 108 private void defineCharset(com.puppycrawl.tools.checkstyle.api.Configuration configuration) { 109 com.puppycrawl.tools.checkstyle.api.Configuration[] modules = configuration.getChildren(); 110 for (com.puppycrawl.tools.checkstyle.api.Configuration module : modules) { 111 if ("Checker".equals(module.getName()) || "com.puppycrawl.tools.checkstyle.Checker".equals(module.getName())) { 112 if (module instanceof DefaultConfiguration) { 113 Charset charset = getCharset(); 114 LOG.info("Checkstyle charset: " + charset.name()); 115 ((DefaultConfiguration) module).addAttribute("charset", charset.name()); 116 } 117 } 118 } 119 } 120 121 public Locale getLocale() { 122 return new Locale(conf.getString(CoreProperties.CORE_VIOLATION_LOCALE_PROPERTY)); 123 } 124 125 public Charset getCharset() { 126 Charset charset = fileSystem.getSourceCharset(); 127 if (charset == null) { 128 charset = Charset.forName(System.getProperty("file.encoding", CharEncoding.UTF_8)); 129 } 130 return charset; 131 } 132 }