*/
package org.sonar.ce.task.projectanalysis.issue;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
-import org.sonar.api.rules.RuleType;
-import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit;
import org.sonar.ce.task.projectanalysis.component.MergeAndTargetBranchComponentUuids;
import org.sonar.ce.task.projectanalysis.component.TypeAwareVisitorAdapter;
import org.sonar.ce.task.projectanalysis.util.cache.DiskCache;
import org.sonar.core.issue.DefaultIssue;
+import org.sonar.core.util.stream.MoreCollectors;
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;
private final IssueVisitors issueVisitors;
private final IssueTrackingDelegator issueTracking;
private final SiblingsIssueMerger issueStatusCopier;
- private final AnalysisMetadataHolder analysisMetadataHolder;
private final MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids;
- public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors,
- AnalysisMetadataHolder analysisMetadataHolder, IssueTrackingDelegator issueTracking, SiblingsIssueMerger issueStatusCopier,
- MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids) {
+ public IntegrateIssuesVisitor(IssueCache issueCache, IssueLifecycle issueLifecycle, IssueVisitors issueVisitors, IssueTrackingDelegator issueTracking,
+ SiblingsIssueMerger issueStatusCopier, MergeAndTargetBranchComponentUuids mergeAndTargetBranchComponentUuids) {
super(CrawlerDepthLimit.FILE, POST_ORDER);
this.issueCache = issueCache;
this.issueLifecycle = issueLifecycle;
this.issueVisitors = issueVisitors;
- this.analysisMetadataHolder = analysisMetadataHolder;
this.issueTracking = issueTracking;
this.issueStatusCopier = issueStatusCopier;
this.mergeAndTargetBranchComponentUuids = mergeAndTargetBranchComponentUuids;
}
private void fillNewOpenIssues(Component component, Stream<DefaultIssue> newIssues, DiskCache<DefaultIssue>.DiskAppender cacheAppender) {
- List<DefaultIssue> list = new ArrayList<>();
+ List<DefaultIssue> newIssuesList = newIssues
+ .peek(issueLifecycle::initNewOpenIssue)
+ .collect(MoreCollectors.toList());
- newIssues.forEach(issue -> {
- issueLifecycle.initNewOpenIssue(issue);
- if (analysisMetadataHolder.isLongLivingBranch() || issue.type() != RuleType.SECURITY_HOTSPOT) {
- list.add(issue);
- }
- });
-
- if (list.isEmpty()) {
+ if (newIssuesList.isEmpty()) {
return;
}
- issueStatusCopier.tryMerge(component, list);
+ issueStatusCopier.tryMerge(component, newIssuesList);
- for (DefaultIssue issue : list) {
+ for (DefaultIssue issue : newIssuesList) {
process(component, issue, cacheAppender);
}
}
DefaultIssue raw = entry.getKey();
DefaultIssue base = entry.getValue();
issueLifecycle.mergeExistingOpenIssue(raw, base);
- if (analysisMetadataHolder.isLongLivingBranch() || raw.type() != RuleType.SECURITY_HOTSPOT) {
- process(component, raw, cacheAppender);
- }
+ process(component, raw, cacheAppender);
}
}
treeRootHolder.setRoot(PROJECT);
issueCache = new IssueCache(temp.newFile(), System2.INSTANCE);
when(issueFilter.accept(any(DefaultIssue.class), eq(FILE))).thenReturn(true);
- underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, analysisMetadataHolder, trackingDelegator, issueStatusCopier, mergeAndTargetBranchComponentUuids);
+ underTest = new IntegrateIssuesVisitor(issueCache, issueLifecycle, issueVisitors, trackingDelegator, issueStatusCopier, mergeAndTargetBranchComponentUuids);
}
@Test
import java.io.IOException;
import java.io.InputStream;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
import org.sonar.scanner.bootstrap.ScannerWsClient;
-import org.sonar.scanner.scan.branch.BranchConfiguration;
import org.sonar.scanner.util.ScannerUtils;
import org.sonarqube.ws.Rules;
import org.sonarqube.ws.Rules.Active;
public class DefaultActiveRulesLoader implements ActiveRulesLoader {
private static final String RULES_SEARCH_URL = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives,createdAt,updatedAt&activation=true";
- private static final String RULES_SEARCH_NO_HOTSPOT_URL;
-
- static {
- // need to use static initializer because of https://bugs.openjdk.java.net/browse/JDK-8077605
- RULES_SEARCH_NO_HOTSPOT_URL = RULES_SEARCH_URL + "&types="
- + Arrays.stream(RuleType.values())
- .filter(t -> t != RuleType.SECURITY_HOTSPOT)
- .map(Enum::name)
- .collect(Collectors.joining(","));
- }
private final ScannerWsClient wsClient;
- private final BranchConfiguration branchConfiguration;
- public DefaultActiveRulesLoader(ScannerWsClient wsClient, BranchConfiguration branchConfiguration) {
+ public DefaultActiveRulesLoader(ScannerWsClient wsClient) {
this.wsClient = wsClient;
- this.branchConfiguration = branchConfiguration;
}
@Override
private String getUrl(String qualityProfileKey, int page, int pageSize) {
StringBuilder builder = new StringBuilder(1024);
- if (branchConfiguration.isShortOrPullRequest()) {
- builder.append(RULES_SEARCH_NO_HOTSPOT_URL);
- } else {
- builder.append(RULES_SEARCH_URL);
- }
+ builder.append(RULES_SEARCH_URL);
builder.append("&qprofile=").append(ScannerUtils.encodeForUrl(qualityProfileKey));
- builder.append("&p=").append(page);
builder.append("&ps=").append(pageSize);
+ builder.append("&p=").append(page);
return builder.toString();
}
import com.google.common.collect.ImmutableSortedMap;
import java.io.ByteArrayInputStream;
-import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.stream.IntStream;
private DefaultActiveRulesLoader loader;
private ScannerWsClient wsClient;
- private BranchConfiguration branchConfig;
@Before
public void setUp() {
wsClient = mock(ScannerWsClient.class);
- branchConfig = mock(BranchConfiguration.class);
+ BranchConfiguration branchConfig = mock(BranchConfiguration.class);
when(branchConfig.isShortOrPullRequest()).thenReturn(false);
- loader = new DefaultActiveRulesLoader(wsClient, branchConfig);
+ loader = new DefaultActiveRulesLoader(wsClient);
}
@Test
- public void feed_real_response_encode_qp() throws IOException {
+ public void feed_real_response_encode_qp() {
int total = PAGE_SIZE_1 + PAGE_SIZE_2;
- WsTestUtil.mockStream(wsClient, urlOfPage(1, false), responseOfSize(PAGE_SIZE_1, total));
- WsTestUtil.mockStream(wsClient, urlOfPage(2, false), responseOfSize(PAGE_SIZE_2, total));
+ WsTestUtil.mockStream(wsClient, urlOfPage(1), responseOfSize(PAGE_SIZE_1, total));
+ WsTestUtil.mockStream(wsClient, urlOfPage(2), responseOfSize(PAGE_SIZE_2, total));
Collection<LoadedActiveRule> activeRules = loader.load("c+-test_c+-values-17445");
assertThat(activeRules).hasSize(total);
.extracting(LoadedActiveRule::getSeverity)
.containsExactly(SEVERITY_VALUE);
- WsTestUtil.verifyCall(wsClient, urlOfPage(1, false));
- WsTestUtil.verifyCall(wsClient, urlOfPage(2, false));
+ WsTestUtil.verifyCall(wsClient, urlOfPage(1));
+ WsTestUtil.verifyCall(wsClient, urlOfPage(2));
verifyNoMoreInteractions(wsClient);
}
- @Test
- public void no_hotspots_on_pr_or_short_branches() throws IOException {
- when(branchConfig.isShortOrPullRequest()).thenReturn(true);
- int total = PAGE_SIZE_1 + PAGE_SIZE_2;
-
- WsTestUtil.mockStream(wsClient, urlOfPage(1, true), responseOfSize(PAGE_SIZE_1, total));
- WsTestUtil.mockStream(wsClient, urlOfPage(2, true), responseOfSize(PAGE_SIZE_2, total));
-
- Collection<LoadedActiveRule> activeRules = loader.load("c+-test_c+-values-17445");
- assertThat(activeRules).hasSize(total);
- assertThat(activeRules)
- .filteredOn(r -> r.getRuleKey().equals(EXAMPLE_KEY))
- .extracting(LoadedActiveRule::getParams)
- .extracting(p -> p.get(FORMAT_KEY))
- .containsExactly(FORMAT_VALUE);
- assertThat(activeRules)
- .filteredOn(r -> r.getRuleKey().equals(EXAMPLE_KEY))
- .extracting(LoadedActiveRule::getSeverity)
- .containsExactly(SEVERITY_VALUE);
-
- WsTestUtil.verifyCall(wsClient, urlOfPage(1, true));
- WsTestUtil.verifyCall(wsClient, urlOfPage(2, true));
-
- verifyNoMoreInteractions(wsClient);
- }
-
- private String urlOfPage(int page, boolean noHotspots) {
+ private String urlOfPage(int page) {
return "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives,createdAt,updatedAt&activation=true"
- + (noHotspots ? "&types=CODE_SMELL,BUG,VULNERABILITY" : "") + "&qprofile=c%2B-test_c%2B-values-17445&p=" + page
- + "&ps=500";
+ + ("") + "&qprofile=c%2B-test_c%2B-values-17445&ps=500&p=" + page + "";
}
/**