You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

IssueLocations.java 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.ce.task.projectanalysis.issue;
  21. import java.util.Objects;
  22. import java.util.stream.IntStream;
  23. import java.util.stream.Stream;
  24. import org.apache.commons.lang.StringUtils;
  25. import org.sonar.core.issue.DefaultIssue;
  26. import org.sonar.db.protobuf.DbCommons;
  27. import org.sonar.db.protobuf.DbIssues;
  28. public class IssueLocations {
  29. private IssueLocations() {
  30. // do not instantiate
  31. }
  32. /**
  33. * Extract the lines of all the locations in the specified component. All the flows and secondary locations
  34. * are taken into account. The lines present in multiple flows and locations are kept
  35. * duplicated. Ordering of results is not guaranteed.
  36. * <p>
  37. * TODO should be a method of DefaultIssue, as soon as it's no
  38. * longer in sonar-core and can access sonar-db-dao.
  39. */
  40. public static IntStream allLinesFor(DefaultIssue issue, String componentUuid) {
  41. DbIssues.Locations locations = issue.getLocations();
  42. if (locations == null) {
  43. return IntStream.empty();
  44. }
  45. Stream<DbCommons.TextRange> textRanges = Stream.concat(
  46. locations.hasTextRange() ? Stream.of(locations.getTextRange()) : Stream.empty(),
  47. locations.getFlowList().stream()
  48. .flatMap(f -> f.getLocationList().stream())
  49. .filter(l -> Objects.equals(componentIdOf(issue, l), componentUuid))
  50. .map(DbIssues.Location::getTextRange));
  51. return textRanges.flatMapToInt(range -> IntStream.rangeClosed(range.getStartLine(), range.getEndLine()));
  52. }
  53. private static String componentIdOf(DefaultIssue issue, DbIssues.Location location) {
  54. if (location.hasComponentId()) {
  55. return StringUtils.defaultIfEmpty(location.getComponentId(), issue.componentUuid());
  56. }
  57. return issue.componentUuid();
  58. }
  59. }