]> source.dussan.org Git - sonarqube.git/blob
6a904f15ee5a7b4039ff449d3f95d6732ce53b80
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2024 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.api.batch.sensor.issue.internal;
21
22 import java.util.EnumMap;
23 import java.util.Map;
24 import javax.annotation.CheckForNull;
25 import javax.annotation.Nullable;
26 import org.sonar.api.batch.fs.internal.DefaultInputProject;
27 import org.sonar.api.batch.rule.Severity;
28 import org.sonar.api.batch.sensor.internal.SensorStorage;
29 import org.sonar.api.batch.sensor.issue.ExternalIssue;
30 import org.sonar.api.batch.sensor.issue.NewExternalIssue;
31 import org.sonar.api.issue.impact.SoftwareQuality;
32 import org.sonar.api.rule.RuleKey;
33 import org.sonar.api.rules.CleanCodeAttribute;
34 import org.sonar.api.rules.RuleType;
35
36 import static java.lang.String.format;
37 import static java.util.Objects.requireNonNull;
38 import static org.sonar.api.utils.Preconditions.checkArgument;
39 import static org.sonar.api.utils.Preconditions.checkState;
40
41 public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIssue> implements ExternalIssue, NewExternalIssue {
42   private Long effort;
43   private Severity severity;
44   private RuleType type;
45   private String engineId;
46   private String ruleId;
47   private String cveId;
48   private Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts = new EnumMap<>(SoftwareQuality.class);
49   private CleanCodeAttribute cleanCodeAttribute;
50
51   public DefaultExternalIssue(DefaultInputProject project) {
52     this(project, null);
53   }
54
55   public DefaultExternalIssue(DefaultInputProject project, @Nullable SensorStorage storage) {
56     super(project, storage);
57   }
58
59   @Override
60   public DefaultExternalIssue remediationEffortMinutes(@Nullable Long effort) {
61     checkArgument(effort == null || effort >= 0, format("effort must be greater than or equal 0 (got %s)", effort));
62     this.effort = effort;
63     return this;
64   }
65
66   @Override
67   public DefaultExternalIssue severity(Severity severity) {
68     this.severity = severity;
69     return this;
70   }
71
72   @Override
73   public DefaultExternalIssue addImpact(SoftwareQuality softwareQuality, org.sonar.api.issue.impact.Severity severity) {
74     this.impacts.put(softwareQuality, severity);
75     return this;
76   }
77
78   @Override
79   public String engineId() {
80     return engineId;
81   }
82
83   @Override
84   public String ruleId() {
85     return ruleId;
86   }
87
88   public String cveId() {
89     return cveId;
90   }
91
92   @Override
93   public Severity severity() {
94     return this.severity;
95   }
96
97   @Override
98   public Long remediationEffort() {
99     return this.effort;
100   }
101
102   @Override
103   public void doSave() {
104     requireNonNull(this.engineId, "Engine id is mandatory on external issue");
105     requireNonNull(this.ruleId, "Rule id is mandatory on external issue");
106     checkState(primaryLocation != null, "Primary location is mandatory on every external issue");
107     checkState(primaryLocation.message() != null, "External issues must have a message");
108     storage.store(this);
109   }
110
111   @Override
112   public RuleType type() {
113     return type;
114   }
115
116   @Override
117   public Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts() {
118     return impacts;
119   }
120
121   @CheckForNull
122   @Override
123   public CleanCodeAttribute cleanCodeAttribute() {
124     return cleanCodeAttribute;
125   }
126
127   @Override
128   public NewExternalIssue engineId(String engineId) {
129     this.engineId = engineId;
130     return this;
131   }
132
133   @Override
134   public NewExternalIssue ruleId(String ruleId) {
135     this.ruleId = ruleId;
136     return this;
137   }
138
139   public NewExternalIssue cveId(String cveId) {
140     this.cveId = cveId;
141     return this;
142   }
143
144   @Override
145   public DefaultExternalIssue forRule(RuleKey ruleKey) {
146     this.engineId = ruleKey.repository();
147     this.ruleId = ruleKey.rule();
148     return this;
149   }
150
151   @Override
152   public RuleKey ruleKey() {
153     if (engineId != null && ruleId != null) {
154       return RuleKey.of(RuleKey.EXTERNAL_RULE_REPO_PREFIX + engineId, ruleId);
155     }
156     return null;
157   }
158
159   @Override
160   public DefaultExternalIssue type(RuleType type) {
161     this.type = type;
162     return this;
163   }
164
165   @Override
166   public DefaultExternalIssue cleanCodeAttribute(CleanCodeAttribute attribute) {
167     this.cleanCodeAttribute = attribute;
168     return this;
169   }
170
171 }