diff --git a/src/main/java/org/sonar/plugins/findbugs/FindbugsProfileImporter.java b/src/main/java/org/sonar/plugins/findbugs/FindbugsProfileImporter.java index 629a2e85..08542afb 100644 --- a/src/main/java/org/sonar/plugins/findbugs/FindbugsProfileImporter.java +++ b/src/main/java/org/sonar/plugins/findbugs/FindbugsProfileImporter.java @@ -19,60 +19,64 @@ */ package org.sonar.plugins.findbugs; +import com.google.common.collect.Iterables; +import com.thoughtworks.xstream.XStream; import org.apache.commons.lang.StringUtils; -import org.sonar.api.ExtensionPoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.api.batch.ScannerSide; +import org.sonar.api.profiles.ProfileImporter; +import org.sonar.api.profiles.RulesProfile; import org.sonar.api.rule.Severity; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleFinder; import org.sonar.api.rules.RulePriority; import org.sonar.api.rules.RuleQuery; -import org.sonar.api.server.ServerSide; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.NewBuiltInActiveRule; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.NewBuiltInQualityProfile; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; +import org.sonar.api.utils.ValidationMessages; +import org.sonar.plugins.findbugs.language.Jsp; import org.sonar.plugins.findbugs.rules.FbContribRulesDefinition; import org.sonar.plugins.findbugs.rules.FindSecurityBugsJspRulesDefinition; import org.sonar.plugins.findbugs.rules.FindSecurityBugsRulesDefinition; import org.sonar.plugins.findbugs.rules.FindbugsRulesDefinition; import org.sonar.plugins.findbugs.xml.FindBugsFilter; +import org.sonar.plugins.java.Java; import java.io.Reader; import java.util.Map; -import javax.annotation.Nullable; - -import com.google.common.collect.Iterables; -import com.thoughtworks.xstream.XStream; - @ScannerSide -@ServerSide -@ExtensionPoint -public class FindbugsProfileImporter { +public class FindbugsProfileImporter extends ProfileImporter { private final RuleFinder ruleFinder; - private static final Logger LOGGER = Loggers.get(FindbugsProfileImporter.class); + private static final Logger LOG = LoggerFactory.getLogger(FindbugsProfileImporter.class); public FindbugsProfileImporter(RuleFinder ruleFinder) { + super(FindbugsRulesDefinition.REPOSITORY_KEY, FindbugsConstants.PLUGIN_NAME); + setSupportedLanguages(Java.KEY, Jsp.KEY); this.ruleFinder = ruleFinder; } - public void importProfile(Reader findbugsConf, NewBuiltInQualityProfile qualityProfile) { + @Override + public RulesProfile importProfile(Reader findbugsConf, ValidationMessages messages) { + RulesProfile profile = RulesProfile.create(); try { XStream xStream = FindBugsFilter.createXStream(); FindBugsFilter filter = (FindBugsFilter) xStream.fromXML(findbugsConf); - activateRulesByCategory(qualityProfile, filter); - activateRulesByCode(qualityProfile, filter); - activateRulesByPattern(qualityProfile, filter); + activateRulesByCategory(profile, filter, messages); + activateRulesByCode(profile, filter, messages); + activateRulesByPattern(profile, filter, messages); + + return profile; } catch (Exception e) { String errorMessage = "The Findbugs configuration file is not valid"; - LOGGER.error(errorMessage, e); + messages.addErrorText(errorMessage + " : " + e.getMessage()); + LOG.error(errorMessage, e); + return profile; } } - private void activateRulesByPattern(NewBuiltInQualityProfile profile, FindBugsFilter filter) { + private void activateRulesByPattern(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { for (Map.Entry patternLevel : filter.getPatternLevels(new FindbugsLevelUtils()).entrySet()) { Rule rule = ruleFinder.findByKey(FindbugsRulesDefinition.REPOSITORY_KEY, patternLevel.getKey()); if (rule == null) { @@ -85,68 +89,53 @@ private void activateRulesByPattern(NewBuiltInQualityProfile profile, FindBugsFi } } if (rule != null) { - activateRule(profile, rule, patternLevel.getValue()); + profile.activateRule(rule, getPriorityFromSeverity(patternLevel.getValue())); } else { - LOGGER.warn("Unable to activate unknown rule : '" + patternLevel.getKey() + "'"); + messages.addWarningText("Unable to activate unknown rule : '" + patternLevel.getKey() + "'"); } } } - private void activateRulesByCode(NewBuiltInQualityProfile profile, FindBugsFilter filter) { + private void activateRulesByCode(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { for (Map.Entry codeLevel : filter.getCodeLevels(new FindbugsLevelUtils()).entrySet()) { boolean someRulesHaveBeenActivated = false; for (Rule rule : rules()) { if (rule.getKey().equals(codeLevel.getKey()) || StringUtils.startsWith(rule.getKey(), codeLevel.getKey() + "_")) { someRulesHaveBeenActivated = true; - activateRule(profile, rule, codeLevel.getValue()); + profile.activateRule(rule, getPriorityFromSeverity(codeLevel.getValue())); } } if (!someRulesHaveBeenActivated) { - LOGGER.warn("Unable to find any rules associated to code : '" + codeLevel.getKey() + "'"); + messages.addWarningText("Unable to find any rules associated to code : '" + codeLevel.getKey() + "'"); } } } - private void activateRulesByCategory(NewBuiltInQualityProfile profile, FindBugsFilter filter) { + private void activateRulesByCategory(RulesProfile profile, FindBugsFilter filter, ValidationMessages messages) { for (Map.Entry categoryLevel : filter.getCategoryLevels(new FindbugsLevelUtils()).entrySet()) { boolean someRulesHaveBeenActivated = false; String sonarCateg = FindbugsCategory.findbugsToSonar(categoryLevel.getKey()); for (Rule rule : rules()) { if (sonarCateg != null && rule.getName().startsWith(sonarCateg)) { someRulesHaveBeenActivated = true; - activateRule(profile, rule, categoryLevel.getValue()); + profile.activateRule(rule, getPriorityFromSeverity(categoryLevel.getValue())); } } if (!someRulesHaveBeenActivated) { - LOGGER.warn("Unable to find any rules associated to category : '" + categoryLevel.getKey() + "'"); + messages.addWarningText("Unable to find any rules associated to category : '" + categoryLevel.getKey() + "'"); } } } - - private void activateRule(NewBuiltInQualityProfile profile, Rule rule, @Nullable String severity) { - NewBuiltInActiveRule r = profile.activateRule(rule.getRepositoryKey(), rule.getKey()); - if (severity == null) { - r.overrideSeverity(getSeverityFromPriority(rule.getSeverity())); - } else { - r.overrideSeverity(severity); - } - } - private static String getSeverityFromPriority(RulePriority priority) { - switch (priority) { - case INFO: - return Severity.INFO; - case MINOR: - return Severity.MINOR; - case MAJOR: - return Severity.MAJOR; - case CRITICAL: - return Severity.CRITICAL; - case BLOCKER: - return Severity.BLOCKER; - default: - return Severity.defaultSeverity(); + private static RulePriority getPriorityFromSeverity(String severity) { + if (Severity.INFO.equals(severity)) { + return RulePriority.INFO; + } else if (Severity.MAJOR.equals(severity)) { + return RulePriority.MAJOR; + } else if (Severity.BLOCKER.equals(severity)) { + return RulePriority.BLOCKER; } + return null; } private Iterable rules() { diff --git a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsContribProfile.java b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsContribProfile.java index 8a897062..9bd88b8b 100644 --- a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsContribProfile.java +++ b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsContribProfile.java @@ -1,15 +1,17 @@ package org.sonar.plugins.findbugs.profiles; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.utils.ValidationMessages; import org.sonar.plugins.findbugs.FindbugsProfileImporter; import org.sonar.plugins.java.Java; import java.io.InputStreamReader; import java.io.Reader; -public class FindbugsContribProfile implements BuiltInQualityProfilesDefinition { +public class FindbugsContribProfile extends ProfileDefinition { - public static final String FB_CONTRIB_PROFILE_NAME = "FindBugs + FB-Contrib"; + private static final String FB_CONTRIB_PROFILE_NAME = "FindBugs + FB-Contrib"; private final FindbugsProfileImporter importer; public FindbugsContribProfile(FindbugsProfileImporter importer) { @@ -17,13 +19,13 @@ public FindbugsContribProfile(FindbugsProfileImporter importer) { } @Override - public void define(Context context) { + public RulesProfile createProfile(ValidationMessages messages) { Reader findbugsProfile = new InputStreamReader(this.getClass().getResourceAsStream( "/org/sonar/plugins/findbugs/profile-findbugs-and-fb-contrib.xml")); - NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(FB_CONTRIB_PROFILE_NAME, Java.KEY); - importer.importProfile(findbugsProfile, profile); - - profile.done(); + RulesProfile profile = importer.importProfile(findbugsProfile, messages); + profile.setLanguage(Java.KEY); + profile.setName(FB_CONTRIB_PROFILE_NAME); + return profile; } } diff --git a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsProfile.java b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsProfile.java index c3d83572..94a7bd25 100644 --- a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsProfile.java +++ b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsProfile.java @@ -19,16 +19,18 @@ */ package org.sonar.plugins.findbugs.profiles; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.utils.ValidationMessages; import org.sonar.plugins.findbugs.FindbugsProfileImporter; import org.sonar.plugins.java.Java; import java.io.InputStreamReader; import java.io.Reader; -public class FindbugsProfile implements BuiltInQualityProfilesDefinition { +public class FindbugsProfile extends ProfileDefinition { - public static final String FINDBUGS_PROFILE_NAME = "FindBugs"; + private static final String FINDBUGS_PROFILE_NAME = "FindBugs"; private final FindbugsProfileImporter importer; public FindbugsProfile(FindbugsProfileImporter importer) { @@ -36,13 +38,13 @@ public FindbugsProfile(FindbugsProfileImporter importer) { } @Override - public void define(Context context) { + public RulesProfile createProfile(ValidationMessages messages) { Reader findbugsProfile = new InputStreamReader(this.getClass().getResourceAsStream( "/org/sonar/plugins/findbugs/profile-findbugs-only.xml")); - NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(FINDBUGS_PROFILE_NAME, Java.KEY); - importer.importProfile(findbugsProfile, profile); - - profile.done(); + RulesProfile profile = importer.importProfile(findbugsProfile, messages); + profile.setLanguage(Java.KEY); + profile.setName(FINDBUGS_PROFILE_NAME); + return profile; } } diff --git a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityAuditProfile.java b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityAuditProfile.java index 09bd4628..73ef9423 100644 --- a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityAuditProfile.java +++ b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityAuditProfile.java @@ -19,7 +19,9 @@ */ package org.sonar.plugins.findbugs.profiles; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.utils.ValidationMessages; import org.sonar.plugins.findbugs.FindbugsProfileImporter; import org.sonar.plugins.java.Java; @@ -29,9 +31,9 @@ /** * Security rules including informational rules. This profile is intend for in depth security code review. */ -public class FindbugsSecurityAuditProfile implements BuiltInQualityProfilesDefinition { +public class FindbugsSecurityAuditProfile extends ProfileDefinition { - public static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Audit"; + private static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Audit"; private final FindbugsProfileImporter importer; public FindbugsSecurityAuditProfile(FindbugsProfileImporter importer) { @@ -39,13 +41,13 @@ public FindbugsSecurityAuditProfile(FindbugsProfileImporter importer) { } @Override - public void define(Context context) { + public RulesProfile createProfile(ValidationMessages messages) { Reader findbugsProfile = new InputStreamReader(this.getClass().getResourceAsStream( "/org/sonar/plugins/findbugs/profile-findbugs-security-audit.xml")); - NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(FINDBUGS_SECURITY_AUDIT_PROFILE_NAME, Java.KEY); - importer.importProfile(findbugsProfile, profile); - - profile.done(); + RulesProfile profile = importer.importProfile(findbugsProfile, messages); + profile.setLanguage(Java.KEY); + profile.setName(FINDBUGS_SECURITY_AUDIT_PROFILE_NAME); + return profile; } } diff --git a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityJspProfile.java b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityJspProfile.java index 7e4a63d9..6cf3cd8e 100644 --- a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityJspProfile.java +++ b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityJspProfile.java @@ -19,16 +19,18 @@ */ package org.sonar.plugins.findbugs.profiles; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.utils.ValidationMessages; import org.sonar.plugins.findbugs.FindbugsProfileImporter; import org.sonar.plugins.findbugs.language.Jsp; import java.io.InputStreamReader; import java.io.Reader; -public class FindbugsSecurityJspProfile implements BuiltInQualityProfilesDefinition { +public class FindbugsSecurityJspProfile extends ProfileDefinition { - public static final String FINDBUGS_SECURITY_JSP_PROFILE_NAME = "FindBugs Security JSP"; + private static final String FINDBUGS_SECURITY_JSP_PROFILE_NAME = "FindBugs Security JSP"; private final FindbugsProfileImporter importer; public FindbugsSecurityJspProfile(FindbugsProfileImporter importer) { @@ -36,13 +38,13 @@ public FindbugsSecurityJspProfile(FindbugsProfileImporter importer) { } @Override - public void define(Context context) { + public RulesProfile createProfile(ValidationMessages messages) { Reader findbugsProfile = new InputStreamReader(this.getClass().getResourceAsStream( "/org/sonar/plugins/findbugs/profile-findbugs-security-jsp.xml")); - NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(FINDBUGS_SECURITY_JSP_PROFILE_NAME, Jsp.KEY); - importer.importProfile(findbugsProfile, profile); - - profile.done(); + RulesProfile profile = importer.importProfile(findbugsProfile, messages); + profile.setLanguage(Jsp.KEY); + profile.setName(FINDBUGS_SECURITY_JSP_PROFILE_NAME); + return profile; } } diff --git a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityMinimalProfile.java b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityMinimalProfile.java index 5a4c7c13..ec7e952a 100644 --- a/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityMinimalProfile.java +++ b/src/main/java/org/sonar/plugins/findbugs/profiles/FindbugsSecurityMinimalProfile.java @@ -19,7 +19,9 @@ */ package org.sonar.plugins.findbugs.profiles; -import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.utils.ValidationMessages; import org.sonar.plugins.findbugs.FindbugsProfileImporter; import org.sonar.plugins.java.Java; @@ -30,9 +32,9 @@ * Security rules with only the issue that require immediate analysis. It is intend for periodic scan that will trigger * a moderate number of false positive. */ -public class FindbugsSecurityMinimalProfile implements BuiltInQualityProfilesDefinition { +public class FindbugsSecurityMinimalProfile extends ProfileDefinition { - public static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Minimal"; + private static final String FINDBUGS_SECURITY_AUDIT_PROFILE_NAME = "FindBugs Security Minimal"; private final FindbugsProfileImporter importer; public FindbugsSecurityMinimalProfile(FindbugsProfileImporter importer) { @@ -40,12 +42,12 @@ public FindbugsSecurityMinimalProfile(FindbugsProfileImporter importer) { } @Override - public void define(Context context) { + public RulesProfile createProfile(ValidationMessages messages) { Reader findbugsProfile = new InputStreamReader(this.getClass().getResourceAsStream( "/org/sonar/plugins/findbugs/profile-findbugs-security-minimal.xml")); - NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(FINDBUGS_SECURITY_AUDIT_PROFILE_NAME, Java.KEY); - importer.importProfile(findbugsProfile, profile); - - profile.done(); + RulesProfile profile = importer.importProfile(findbugsProfile, messages); + profile.setLanguage(Java.KEY); + profile.setName(FINDBUGS_SECURITY_AUDIT_PROFILE_NAME); + return profile; } }