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.findbugs; 021 022 import java.io.Reader; 023 import java.util.Map; 024 025 import org.apache.commons.lang.StringUtils; 026 import org.slf4j.Logger; 027 import org.slf4j.LoggerFactory; 028 import org.sonar.api.profiles.ProfileImporter; 029 import org.sonar.api.profiles.RulesProfile; 030 import org.sonar.api.resources.Java; 031 import org.sonar.api.rules.Rule; 032 import org.sonar.api.rules.RuleFinder; 033 import org.sonar.api.rules.RulePriority; 034 import org.sonar.api.rules.RuleQuery; 035 import org.sonar.api.utils.ValidationMessages; 036 import org.sonar.plugins.findbugs.xml.FindBugsFilter; 037 038 import com.thoughtworks.xstream.XStream; 039 040 public class FindbugsProfileImporter extends ProfileImporter { 041 042 private final RuleFinder ruleFinder; 043 private static final Logger LOG = LoggerFactory.getLogger(FindbugsProfileImporter.class); 044 045 public FindbugsProfileImporter(RuleFinder ruleFinder) { 046 super(FindbugsConstants.REPOSITORY_KEY, FindbugsConstants.PLUGIN_NAME); 047 setSupportedLanguages(Java.KEY); 048 this.ruleFinder = ruleFinder; 049 } 050 051 @Override 052 public RulesProfile importProfile(Reader findbugsConf, ValidationMessages messages) { 053 RulesProfile profile = RulesProfile.create(); 054 try { 055 XStream xStream = FindBugsFilter.createXStream(); 056 FindBugsFilter filter = (FindBugsFilter) xStream.fromXML(findbugsConf); 057 058 activateRulesByCategory(profile, filter, messages); 059 activateRulesByCode(profile, filter, messages); 060 activateRulesByPattern(profile, filter, messages); 061 062 return profile; 063 } catch (Exception e) { 064 String errorMessage = "The Findbugs configuration file is not valid"; 065 messages.addErrorText(errorMessage + " : " + e.getMessage()); 066 LOG.error(errorMessage, e); 067 return profile; 068 } 069 } 070 071 private void activateRulesByPattern(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { 072 for (Map.Entry<String, RulePriority> patternLevel : filter.getPatternLevels(new FindbugsLevelUtils()).entrySet()) { 073 Rule rule = ruleFinder.findByKey(FindbugsConstants.REPOSITORY_KEY, patternLevel.getKey()); 074 if (rule != null) { 075 profile.activateRule(rule, patternLevel.getValue()); 076 } else { 077 messages.addWarningText("Unable to activate unknown rule : '" + patternLevel.getKey() + "'"); 078 } 079 } 080 } 081 082 private void activateRulesByCode(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { 083 for (Map.Entry<String, RulePriority> codeLevel : filter.getCodeLevels(new FindbugsLevelUtils()).entrySet()) { 084 boolean someRulesHaveBeenActivated = false; 085 for (Rule rule : ruleFinder.findAll(RuleQuery.create().withRepositoryKey(FindbugsConstants.REPOSITORY_KEY))) { 086 if (rule.getKey().equals(codeLevel.getKey()) || StringUtils.startsWith(rule.getKey(), codeLevel.getKey() + "_")) { 087 someRulesHaveBeenActivated = true; 088 profile.activateRule(rule, codeLevel.getValue()); 089 } 090 } 091 if ( !someRulesHaveBeenActivated) { 092 messages.addWarningText("Unable to find any rules associated to code : '" + codeLevel.getKey() + "'"); 093 } 094 } 095 } 096 097 private void activateRulesByCategory(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { 098 for (Map.Entry<String, RulePriority> categoryLevel : filter.getCategoryLevels(new FindbugsLevelUtils()).entrySet()) { 099 boolean someRulesHaveBeenActivated = false; 100 String sonarCateg = FindbugsCategory.findbugsToSonar(categoryLevel.getKey()); 101 for (Rule rule : ruleFinder.findAll(RuleQuery.create().withRepositoryKey(FindbugsConstants.REPOSITORY_KEY))) { 102 if (sonarCateg != null && rule.getName().startsWith(sonarCateg)) { 103 someRulesHaveBeenActivated = true; 104 profile.activateRule(rule, categoryLevel.getValue()); 105 } 106 } 107 if ( !someRulesHaveBeenActivated) { 108 messages.addWarningText("Unable to find any rules associated to category : '" + categoryLevel.getKey() + "'"); 109 } 110 } 111 } 112 }