Skip to content

Commit

Permalink
Issue spotbugs#387 reverted to using the deprecated ProfileDefinition
Browse files Browse the repository at this point in the history
Tentative fix for issue spotbugs#387 apparently caused by SONAR-15240
  • Loading branch information
gtoison committed Sep 20, 2021
1 parent 3c3fa0d commit 95f7f7b
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> patternLevel : filter.getPatternLevels(new FindbugsLevelUtils()).entrySet()) {
Rule rule = ruleFinder.findByKey(FindbugsRulesDefinition.REPOSITORY_KEY, patternLevel.getKey());
if (rule == null) {
Expand All @@ -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<String, String> 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<String, String> 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<Rule> rules() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
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) {
this.importer = 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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,32 @@
*/
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) {
this.importer = 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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -29,23 +31,23 @@
/**
* 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) {
this.importer = 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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,32 @@
*/
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) {
this.importer = 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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -30,22 +32,22 @@
* 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) {
this.importer = 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;
}
}

0 comments on commit 95f7f7b

Please sign in to comment.