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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  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_SEVERITY;
  37. import static org.sonar.server.issue.index.IssueIndexDefinition.SUB_FIELD_SOFTWARE_QUALITY;
  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 issueStatus() {
  96. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_NEW_STATUS);
  97. }
  98. @CheckForNull
  99. public String assigneeUuid() {
  100. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE_UUID);
  101. }
  102. /**
  103. * Functional date
  104. */
  105. public Date creationDate() {
  106. return getFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT);
  107. }
  108. /**
  109. * Functional date
  110. */
  111. public Date updateDate() {
  112. return getFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_UPDATED_AT);
  113. }
  114. @CheckForNull
  115. public Date closeDate() {
  116. return getNullableFieldAsDate(IssueIndexDefinition.FIELD_ISSUE_FUNC_CLOSED_AT);
  117. }
  118. @CheckForNull
  119. public String authorLogin() {
  120. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_AUTHOR_LOGIN);
  121. }
  122. /**
  123. * @deprecated since 10.2
  124. */
  125. @Deprecated(since = "10.2")
  126. public RuleType type() {
  127. return RuleType.valueOf(getField(IssueIndexDefinition.FIELD_ISSUE_TYPE));
  128. }
  129. @CheckForNull
  130. public Duration effort() {
  131. Number effort = getNullableField(IssueIndexDefinition.FIELD_ISSUE_EFFORT);
  132. return (effort != null) ? Duration.create(effort.longValue()) : null;
  133. }
  134. @CheckForNull
  135. public String filePath() {
  136. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_FILE_PATH);
  137. }
  138. @CheckForNull
  139. public String directoryPath() {
  140. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH);
  141. }
  142. public IssueDoc setKey(@Nullable String s) {
  143. setField(IssueIndexDefinition.FIELD_ISSUE_KEY, s);
  144. return this;
  145. }
  146. public IssueDoc setComponentUuid(@Nullable String s) {
  147. setField(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, s);
  148. return this;
  149. }
  150. public IssueDoc setProjectUuid(String s) {
  151. setField(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, s);
  152. setParent(AuthorizationDoc.idOf(s));
  153. return this;
  154. }
  155. public IssueDoc setBranchUuid(String s) {
  156. setField(IssueIndexDefinition.FIELD_ISSUE_BRANCH_UUID, s);
  157. return this;
  158. }
  159. public IssueDoc setIsMainBranch(boolean b) {
  160. setField(IssueIndexDefinition.FIELD_ISSUE_IS_MAIN_BRANCH, b);
  161. return this;
  162. }
  163. public IssueDoc setRuleUuid(String s) {
  164. setField(IssueIndexDefinition.FIELD_ISSUE_RULE_UUID, s);
  165. return this;
  166. }
  167. public IssueDoc setScope(IssueScope s) {
  168. setField(IssueIndexDefinition.FIELD_ISSUE_SCOPE, s.toString());
  169. return this;
  170. }
  171. public IssueDoc setLanguage(@Nullable String s) {
  172. setField(IssueIndexDefinition.FIELD_ISSUE_LANGUAGE, s);
  173. return this;
  174. }
  175. /**
  176. * @deprecated since 10.2
  177. */
  178. @Deprecated(since = "10.2")
  179. public IssueDoc setSeverity(@Nullable String s) {
  180. setField(IssueIndexDefinition.FIELD_ISSUE_SEVERITY, s);
  181. setField(IssueIndexDefinition.FIELD_ISSUE_SEVERITY_VALUE, Severity.ALL.indexOf(s));
  182. return this;
  183. }
  184. public IssueDoc setCleanCodeAttributeCategory(@Nullable String s) {
  185. setField(IssueIndexDefinition.FIELD_ISSUE_CLEAN_CODE_ATTRIBUTE_CATEGORY, s);
  186. return this;
  187. }
  188. public IssueDoc setLine(@Nullable Integer i) {
  189. setField(IssueIndexDefinition.FIELD_ISSUE_LINE, i);
  190. return this;
  191. }
  192. public IssueDoc setStatus(@Nullable String s) {
  193. setField(IssueIndexDefinition.FIELD_ISSUE_STATUS, s);
  194. return this;
  195. }
  196. public IssueDoc setResolution(@Nullable String s) {
  197. setField(IssueIndexDefinition.FIELD_ISSUE_RESOLUTION, s);
  198. return this;
  199. }
  200. public IssueDoc setIssueStatus(String s) {
  201. setField(IssueIndexDefinition.FIELD_ISSUE_NEW_STATUS, s);
  202. return this;
  203. }
  204. public IssueDoc setAssigneeUuid(@Nullable String s) {
  205. setField(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE_UUID, s);
  206. return this;
  207. }
  208. public IssueDoc setFuncUpdateDate(@Nullable Date d) {
  209. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_UPDATED_AT, d);
  210. return this;
  211. }
  212. public IssueDoc setFuncCreationDate(@Nullable Date d) {
  213. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_CREATED_AT, d);
  214. return this;
  215. }
  216. public IssueDoc setFuncCloseDate(@Nullable Date d) {
  217. setField(IssueIndexDefinition.FIELD_ISSUE_FUNC_CLOSED_AT, d);
  218. return this;
  219. }
  220. public IssueDoc setAuthorLogin(@Nullable String s) {
  221. setField(IssueIndexDefinition.FIELD_ISSUE_AUTHOR_LOGIN, s);
  222. return this;
  223. }
  224. public IssueDoc setEffort(@Nullable Long l) {
  225. setField(IssueIndexDefinition.FIELD_ISSUE_EFFORT, l);
  226. return this;
  227. }
  228. public IssueDoc setFilePath(@Nullable String s) {
  229. setField(IssueIndexDefinition.FIELD_ISSUE_FILE_PATH, s);
  230. return this;
  231. }
  232. public IssueDoc setDirectoryPath(@Nullable String s) {
  233. setField(IssueIndexDefinition.FIELD_ISSUE_DIRECTORY_PATH, s);
  234. return this;
  235. }
  236. @CheckForNull
  237. public Collection<String> getTags() {
  238. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_TAGS);
  239. }
  240. public IssueDoc setTags(@Nullable Collection<String> tags) {
  241. setField(IssueIndexDefinition.FIELD_ISSUE_TAGS, tags);
  242. return this;
  243. }
  244. @Deprecated(since = "10.2")
  245. public IssueDoc setType(RuleType type) {
  246. setField(IssueIndexDefinition.FIELD_ISSUE_TYPE, type.toString());
  247. return this;
  248. }
  249. public IssueDoc setImpacts(Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts) {
  250. List<Map<String, String>> convertedMap = impacts
  251. .entrySet()
  252. .stream()
  253. .map(entry -> Map.of(
  254. SUB_FIELD_SOFTWARE_QUALITY, entry.getKey().name(),
  255. SUB_FIELD_SEVERITY, entry.getValue().name()))
  256. .toList();
  257. setField(IssueIndexDefinition.FIELD_ISSUE_IMPACTS, convertedMap);
  258. return this;
  259. }
  260. @CheckForNull
  261. public Collection<String> getPciDss32() {
  262. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_32);
  263. }
  264. public IssueDoc setPciDss32(@Nullable Collection<String> o) {
  265. setField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_32, o);
  266. return this;
  267. }
  268. public IssueDoc setPciDss40(@Nullable Collection<String> o) {
  269. setField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_40, o);
  270. return this;
  271. }
  272. @CheckForNull
  273. public Collection<String> getPciDss40() {
  274. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_PCI_DSS_40);
  275. }
  276. public IssueDoc setOwaspAsvs40(@Nullable Collection<String> o) {
  277. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_ASVS_40, o);
  278. return this;
  279. }
  280. @CheckForNull
  281. public Collection<String> getOwaspAsvs40() {
  282. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_ASVS_40);
  283. }
  284. @CheckForNull
  285. public Collection<String> getOwaspTop10() {
  286. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10);
  287. }
  288. public IssueDoc setOwaspTop10(@Nullable Collection<String> o) {
  289. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10, o);
  290. return this;
  291. }
  292. @CheckForNull
  293. public Collection<String> getOwaspTop10For2021() {
  294. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10_2021);
  295. }
  296. public IssueDoc setOwaspTop10For2021(@Nullable Collection<String> o) {
  297. setField(IssueIndexDefinition.FIELD_ISSUE_OWASP_TOP_10_2021, o);
  298. return this;
  299. }
  300. @CheckForNull
  301. public Collection<String> getSansTop25() {
  302. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_SANS_TOP_25);
  303. }
  304. public IssueDoc setSansTop25(@Nullable Collection<String> s) {
  305. setField(IssueIndexDefinition.FIELD_ISSUE_SANS_TOP_25, s);
  306. return this;
  307. }
  308. @CheckForNull
  309. public Collection<String> getCwe() {
  310. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_CWE);
  311. }
  312. public IssueDoc setCwe(@Nullable Collection<String> c) {
  313. setField(IssueIndexDefinition.FIELD_ISSUE_CWE, c);
  314. return this;
  315. }
  316. @CheckForNull
  317. public SecurityStandards.SQCategory getSonarSourceSecurityCategory() {
  318. String key = getNullableField(IssueIndexDefinition.FIELD_ISSUE_SQ_SECURITY_CATEGORY);
  319. return SecurityStandards.SQCategory.fromKey(key).orElse(null);
  320. }
  321. public IssueDoc setSonarSourceSecurityCategory(@Nullable SecurityStandards.SQCategory c) {
  322. setField(IssueIndexDefinition.FIELD_ISSUE_SQ_SECURITY_CATEGORY, c == null ? null : c.getKey());
  323. return this;
  324. }
  325. @CheckForNull
  326. public VulnerabilityProbability getVulnerabilityProbability() {
  327. Integer score = getNullableField(IssueIndexDefinition.FIELD_ISSUE_VULNERABILITY_PROBABILITY);
  328. return VulnerabilityProbability.byScore(score).orElse(null);
  329. }
  330. public IssueDoc setVulnerabilityProbability(@Nullable VulnerabilityProbability v) {
  331. setField(IssueIndexDefinition.FIELD_ISSUE_VULNERABILITY_PROBABILITY, v == null ? null : v.getScore());
  332. return this;
  333. }
  334. public boolean isNewCodeReference() {
  335. return getField(IssueIndexDefinition.FIELD_ISSUE_NEW_CODE_REFERENCE);
  336. }
  337. public IssueDoc setIsNewCodeReference(boolean b) {
  338. setField(IssueIndexDefinition.FIELD_ISSUE_NEW_CODE_REFERENCE, b);
  339. return this;
  340. }
  341. @CheckForNull
  342. public Collection<String> getCodeVariants() {
  343. return getNullableField(IssueIndexDefinition.FIELD_ISSUE_CODE_VARIANTS);
  344. }
  345. public IssueDoc setCodeVariants(@Nullable Collection<String> codeVariants) {
  346. setField(IssueIndexDefinition.FIELD_ISSUE_CODE_VARIANTS, codeVariants);
  347. return this;
  348. }
  349. }