requireNonNull(this.ruleKey, "Rule key is mandatory on external issue");
checkState(primaryLocation != null, "Primary location is mandatory on every external issue");
checkState(primaryLocation.inputComponent().isFile(), "External issues must be located in files");
+ checkState(primaryLocation.message() != null, "External issues must have a message");
checkState(severity != null, "Severity is mandatory on every external issue");
checkState(type != null, "Type is mandatory on every external issue");
storage.store(this);
exception.expectMessage("External issues must be located in files");
issue.save();
}
+
+ @Test
+ public void fail_to_store_if_primary_location_has_no_message() {
+ SensorStorage storage = mock(SensorStorage.class);
+ DefaultExternalIssue issue = new DefaultExternalIssue(storage)
+ .at(new DefaultIssueLocation()
+ .on(inputFile)
+ .at(inputFile.selectLine(1)))
+ .forRule(RuleKey.of("repo", "rule"))
+ .remediationEffortMinutes(10l)
+ .type(RuleType.BUG)
+ .severity(Severity.BLOCKER);
+
+ exception.expect(IllegalStateException.class);
+ exception.expectMessage("External issues must have a message");
+ issue.save();
+ }
@Test
public void fail_to_store_if_no_severity() {
int issueCount = 0;
for (Issue issue : report.issues) {
- NewExternalIssue externalIssue = context.newExternalIssue()
- .forRule(RuleKey.of(issue.engineId, issue.ruleId))
- .severity(Severity.valueOf(issue.severity))
- .remediationEffortMinutes(20L)
- .type(RuleType.valueOf(issue.type));
-
- NewIssueLocation primary = fillLocation(context, externalIssue.newLocation(), issue.primaryLocation);
- if (primary != null) {
- knownFiles.add(issue.primaryLocation.filePath);
- externalIssue.at(primary);
- if (issue.secondaryLocations != null) {
- for (Location l : issue.secondaryLocations) {
- NewIssueLocation secondary = fillLocation(context, externalIssue.newLocation(), l);
- if (secondary != null) {
- externalIssue.addLocation(secondary);
- }
- }
- }
+ if (importIssue(issue)) {
issueCount++;
- externalIssue.save();
- } else {
- unknownFiles.add(issue.primaryLocation.filePath);
}
}
}
}
+ private boolean importIssue(Issue issue) {
+ NewExternalIssue externalIssue = context.newExternalIssue()
+ .forRule(RuleKey.of(issue.engineId, issue.ruleId))
+ .severity(Severity.valueOf(issue.severity))
+ .remediationEffortMinutes(20L)
+ .type(RuleType.valueOf(issue.type));
+
+ NewIssueLocation primary = fillLocation(context, externalIssue.newLocation(), issue.primaryLocation);
+ if (primary != null) {
+ knownFiles.add(issue.primaryLocation.filePath);
+ externalIssue.at(primary);
+ if (issue.secondaryLocations != null) {
+ for (Location l : issue.secondaryLocations) {
+ NewIssueLocation secondary = fillLocation(context, externalIssue.newLocation(), l);
+ if (secondary != null) {
+ externalIssue.addLocation(secondary);
+ }
+ }
+ }
+ externalIssue.save();
+ return true;
+ } else {
+ unknownFiles.add(issue.primaryLocation.filePath);
+ return false;
+ }
+ }
+
private static String pluralize(String msg, int count) {
if (count == 1) {
return msg;
}
@CheckForNull
- private InputFile findFile(SensorContext context, String filePath) {
+ private static InputFile findFile(SensorContext context, String filePath) {
return context.fileSystem().inputFile(context.fileSystem().predicates().hasPath(filePath));
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT 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 02110-1301, USA.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.scanner.externalissue;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
}
private static ScannerReport.ExternalIssue createReportExternalIssue(ExternalIssue issue, int componentRef) {
- String primaryMessage = Strings.isNullOrEmpty(issue.primaryLocation().message()) ? issue.ruleKey().toString() : issue.primaryLocation().message();
+ // primary location of an external issue must have a message
+ String primaryMessage = issue.primaryLocation().message();
Severity severity = Severity.valueOf(issue.severity().name());
IssueType issueType = IssueType.valueOf(issue.type().name());
-
+
ScannerReport.ExternalIssue.Builder builder = ScannerReport.ExternalIssue.newBuilder();
ScannerReport.IssueLocation.Builder locationBuilder = IssueLocation.newBuilder();
ScannerReport.TextRange.Builder textRangeBuilder = ScannerReport.TextRange.newBuilder();