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.

IssueDoc.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 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.server.issue.index;
  21. import com.google.common.collect.Maps;
  22. import java.util.Collection;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Map;
  26. import javax.annotation.CheckForNull;
  27. import javax.annotation.Nullable;
  28. import org.sonar.api.issue.impact.SoftwareQuality;
  29. import org.sonar.api.rule.Severity;
  30. import org.sonar.api.rules.RuleType;
  31. import org.sonar.api.utils.Duration;
  32. import org.sonar.server.es.BaseDoc;
  33. import org.sonar.server.permission.index.AuthorizationDoc;
  34. import org.sonar.server.security.SecurityStandards;
  35. import org.sonar.server.security.SecurityStandards.VulnerabilityProbability;
  36. import static org.sonar.server.issue.index.IssueIndexDefinition.SUB_FIELD_SOFTWARE_QUALITY;
  37. import static org.sonar.server.issue.index.IssueIndexDefinition.SUB_FIELD_SEVERITY;
  38. import static org.sonar.server.issue.index.IssueIndexDefinition.TYPE_ISSUE;
  39. public class IssueDoc extends BaseDoc {
  40. public IssueDoc(Map<String, Object> fields) {
  41. super(TYPE_ISSUE, fields);
  42. }
  43. public IssueDoc() {
  44. super(TYPE_ISSUE, Maps.newHashMapWithExpectedSize(32));
  45. }
  46. @Override
  47. public String getId() {
  48. return key();
  49. }
  50. public String key() {
  51. return getField(IssueIndexDefinition.FIELD_ISSUE_KEY);
  52. }
  53. public String componentUuid() {
  54. return getField(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID);
  55. }
  56. public String projectUuid() {
  57. return getField(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID);
  58. }
  59. public String branchUuid() {
  60. return getField(IssueIndexDefinition.FIELD_ISSUE_BRANCH_UUID);
  61. }
  62. public boolean isMainBranch() {
  63. return getField(IssueIndexDefinition.FIELD_ISSUE_IS_MAIN_BRANCH);
  64. }
  65. public String ruleUuid() {
  66. return getField(IssueIndexDefinition.FIELD_ISSUE_RULE_UUID);
  67. }
  68. public IssueScope scope() {
  69. return IssueScope.valueOf(getField(IssueIndexDefinition.FIELD_ISSUE_SCOPE));
  70. }
  71. public String language() {
  72. return getField(IssueIndexDefinition.FIELD_ISSUE_LANGUAGE);
  73. }
  74. public String severity() {
  75. return getField(IssueIndexDefinition.FIELD_ISSUE_SEVERITY);
  76. }
  77. public String cleanCodeAttributeCategory() {
  78. return getField(IssueIndexDefinition.FIELD_ISSUE_CLEAN_CODE_ATTRIBUTE_CATEGORY);
  79. }
  80. public Collection<Map<String, String>> impacts() {
  81. return getField(IssueIndexDefinition.FIELD_ISSUE_IMPACTS);
  82. }
  83. @CheckForNull
  84. public Integer line() {
  85. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_LINE);
  86. }
  87. public String status() {
  88. return getField(IssueIndexDefinition.FIELD_ISSUE_STATUS);
  89. }
  90. @CheckForNull
  91. public String resolution() {
  92. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_RESOLUTION);
  93. }
  94. @CheckForNull
  95. public String assigneeUuid() {
  96. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE_UUID);
  97. }
  98. /**
  99. * Functional date
  100. */
  101. public Date creationDate() {
  102. return getFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT);
  103. }
  104. /**
  105. * Functional date
  106. */
  107. public Date updateDate() {
  108. return getFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_UPDATED_AT);
  109. }
  110. @CheckForNull
  111. public Date closeDate() {
  112. return getNullableFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_CLOSED_AT);
  113. }
  114. @CheckForNull
  115. public String authorLogin() {
  116. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_AUTHOR_LOGIN);
  117. }
  118. @Deprecated
  119. public RuleType type() {
  120. return RuleType.valueOf(getField(IssueIndexDefinition.FIELD_ISSUE_TYPE));
  121. }
  122. @CheckForNull
  123. public Duration effort() {
  124. Number effort = getNullableField(IssueIndexDefinition.FIELD_ISSUE_EFFORT);
  125. return (effort != null) ? Duration.create(effort.longValue()) : null;
  126. }
  127. @CheckForNull
  128. public String filePath() {
  129. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_FILE_PATH);
  130. }
  131. @CheckForNull
  132. public String directoryPath() {
  133. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH);
  134. }
  135. public IssueDoc setKey(@Nullable String s) {
  136. setField(IssueIndexDefinition.FIELD_ISSUE_KEY, s);
  137. return this;
  138. }
  139. public IssueDoc setComponentUuid(@Nullable String s) {
  140. setField(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, s);
  141. return this;
  142. }
  143. public IssueDoc setProjectUuid(String s) {
  144. setField(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, s);
  145. setParent(AuthorizationDoc.idOf(s));
  146. return this;
  147. }
  148. public IssueDoc setBranchUuid(String s) {
  149. setField(IssueIndexDefinition.FIELD_ISSUE_BRANCH_UUID, s);
  150. return this;
  151. }
  152. public IssueDoc setIsMainBranch(boolean b) {
  153. setField(IssueIndexDefinition.FIELD_ISSUE_IS_MAIN_BRANCH, b);
  154. return this;
  155. }
  156. public IssueDoc setRuleUuid(String s) {
  157. setField(IssueIndexDefinition.FIELD_ISSUE_RULE_UUID, s);
  158. return this;
  159. }
  160. public IssueDoc setScope(IssueScope s) {
  161. setField(IssueIndexDefinition.FIELD_ISSUE_SCOPE, s.toString());
  162. return this;
  163. }
  164. public IssueDoc setLanguage(@Nullable String s) {
  165. setField(IssueIndexDefinition.FIELD_ISSUE_LANGUAGE, s);
  166. return this;
  167. }
  168. @Deprecated
  169. public IssueDoc setSeverity(@Nullable String s) {
  170. setField(IssueIndexDefinition.FIELD_ISSUE_SEVERITY, s);
  171. setField(IssueIndexDefinition.FIELD_ISSUE_SEVERITY_VALUE, Severity.ALL.indexOf(s));
  172. return this;
  173. }
  174. public IssueDoc setCleanCodeAttributeCategory(@Nullable String s) {
  175. setField(IssueIndexDefinition.FIELD_ISSUE_CLEAN_CODE_ATTRIBUTE_CATEGORY, s);
  176. return this;
  177. }
  178. public IssueDoc setLine(@Nullable Integer i) {
  179. setField(IssueIndexDefinition.FIELD_ISSUE_LINE, i);
  180. return this;
  181. }
  182. public IssueDoc setStatus(@Nullable String s) {
  183. setField(IssueIndexDefinition.FIELD_ISSUE_STATUS, s);
  184. return this;
  185. }
  186. public IssueDoc setResolution(@Nullable String s) {
  187. setField(IssueIndexDefinition.FIELD_ISSUE_RESOLUTION, s);
  188. return this;
  189. }
  190. public IssueDoc setAssigneeUuid(@Nullable String s) {
  191. setField(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE_UUID, s);
  192. return this;
  193. }
  194. public IssueDoc setFuncUpdateDate(@Nullable Date d) {
  195. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_UPDATED_AT, d);
  196. return this;
  197. }
  198. public IssueDoc setFuncCreationDate(@Nullable Date d) {
  199. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT, d);
  200. return this;
  201. }
  202. public IssueDoc setFuncCloseDate(@Nullable Date d) {
  203. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_CLOSED_AT, d);
  204. return this;
  205. }
  206. public IssueDoc setAuthorLogin(@Nullable String s) {
  207. setField(IssueIndexDefinition.FIELD_ISSUE_AUTHOR_LOGIN, s);
  208. return this;
  209. }
  210. public IssueDoc setEffort(@Nullable Long l) {
  211. setField(IssueIndexDefinition.FIELD_ISSUE_EFFORT, l);
  212. return this;
  213. }
  214. public IssueDoc setFilePath(@Nullable String s) {
  215. setField(IssueIndexDefinition.FIELD_ISSUE_FILE_PATH, s);
  216. return this;
  217. }
  218. public IssueDoc setDirectoryPath(@Nullable String s) {
  219. setField(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, s);
  220. return this;
  221. }
  222. @CheckForNull
  223. public Collection<String> getTags() {
  224. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_TAGS);
  225. }
  226. public IssueDoc setTags(@Nullable Collection<String> tags) {
  227. setField(IssueIndexDefinition.FIELD_ISSUE_TAGS, tags);
  228. return this;
  229. }
  230. @Deprecated
  231. public IssueDoc setType(RuleType type) {
  232. setField(IssueIndexDefinition.FIELD_ISSUE_TYPE, type.toString());
  233. return this;
  234. }
  235. public IssueDoc setImpacts(Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> softwareQualities) {
  236. List<Map<String, String>> convertedMap = softwareQualities
  237. .entrySet()
  238. .stream()
  239. .map(entry -> Map.of(
  240. SUB_FIELD_SOFTWARE_QUALITY, entry.getKey().name(),
  241. SUB_FIELD_SEVERITY, entry.getValue().name()))
  242. .toList();
  243. setField(IssueIndexDefinition.FIELD_ISSUE_IMPACTS, convertedMap);
  244. return this;
  245. }
  246. @CheckForNull
  247. public Collection<String> getPciDss32() {
  248. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_32);
  249. }
  250. public IssueDoc setPciDss32(@Nullable Collection<String> o) {
  251. setField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_32, o);
  252. return this;
  253. }
  254. public IssueDoc setPciDss40(@Nullable Collection<String> o) {
  255. setField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_40, o);
  256. return this;
  257. }
  258. @CheckForNull
  259. public Collection<String> getPciDss40() {
  260. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_40);
  261. }
  262. public IssueDoc setOwaspAsvs40(@Nullable Collection<String> o) {
  263. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_ASVS_40, o);
  264. return this;
  265. }
  266. @CheckForNull
  267. public Collection<String> getOwaspAsvs40() {
  268. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_ASVS_40);
  269. }
  270. @CheckForNull
  271. public Collection<String> getOwaspTop10() {
  272. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10);
  273. }
  274. public IssueDoc setOwaspTop10(@Nullable Collection<String> o) {
  275. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10, o);
  276. return this;
  277. }
  278. @CheckForNull
  279. public Collection<String> getOwaspTop10For2021() {
  280. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10_2021);
  281. }
  282. public IssueDoc setOwaspTop10For2021(@Nullable Collection<String> o) {
  283. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10_2021, o);
  284. return this;
  285. }
  286. @CheckForNull
  287. public Collection<String> getSansTop25() {
  288. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_SANS_TOP_25);
  289. }
  290. public IssueDoc setSansTop25(@Nullable Collection<String> s) {
  291. setField(IssueIndexDefinition.FIELD_ISSUE_SANS_TOP_25, s);
  292. return this;
  293. }
  294. @CheckForNull
  295. public Collection<String> getCwe() {
  296. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_CWE);
  297. }
  298. public IssueDoc setCwe(@Nullable Collection<String> c) {
  299. setField(IssueIndexDefinition.FIELD_ISSUE_CWE, c);
  300. return this;
  301. }
  302. @CheckForNull
  303. public SecurityStandards.SQCategory getSonarSourceSecurityCategory() {
  304. String key = getNullableField(IssueIndexDefinition.FIELD_ISSUE_SQ_SECURITY_CATEGORY);
  305. return SecurityStandards.SQCategory.fromKey(key).orElse(null);
  306. }
  307. public IssueDoc setSonarSourceSecurityCategory(@Nullable SecurityStandards.SQCategory c) {
  308. setField(IssueIndexDefinition.FIELD_ISSUE_SQ_SECURITY_CATEGORY, c == null ? null : c.getKey());
  309. return this;
  310. }
  311. @CheckForNull
  312. public VulnerabilityProbability getVulnerabilityProbability() {
  313. Integer score = getNullableField(IssueIndexDefinition.FIELD_ISSUE_VULNERABILITY_PROBABILITY);
  314. return VulnerabilityProbability.byScore(score).orElse(null);
  315. }
  316. public IssueDoc setVulnerabilityProbability(@Nullable VulnerabilityProbability v) {
  317. setField(IssueIndexDefinition.FIELD_ISSUE_VULNERABILITY_PROBABILITY, v == null ? null : v.getScore());
  318. return this;
  319. }
  320. public boolean isNewCodeReference() {
  321. return getField(IssueIndexDefinition.FIELD_ISSUE_NEW_CODE_REFERENCE);
  322. }
  323. public IssueDoc setIsNewCodeReference(boolean b) {
  324. setField(IssueIndexDefinition.FIELD_ISSUE_NEW_CODE_REFERENCE, b);
  325. return this;
  326. }
  327. @CheckForNull
  328. public Collection<String> getCodeVariants() {
  329. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_CODE_VARIANTS);
  330. }
  331. public IssueDoc setCodeVariants(@Nullable Collection<String> codeVariants) {
  332. setField(IssueIndexDefinition.FIELD_ISSUE_CODE_VARIANTS, codeVariants);
  333. return this;
  334. }
  335. }