]> source.dussan.org Git - sonarqube.git/blob
7537a83a2edbfa8cec6c990d7b5246595a042e0f
[sonarqube.git] /
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.notification;
21
22 import com.google.common.collect.ImmutableSet;
23 import java.util.Objects;
24 import java.util.Optional;
25 import java.util.Set;
26 import javax.annotation.CheckForNull;
27 import javax.annotation.Nullable;
28 import javax.annotation.concurrent.Immutable;
29 import org.sonar.api.rule.RuleKey;
30 import org.sonar.api.rules.RuleType;
31 import org.sonar.core.issue.status.IssueStatus;
32
33 import static com.google.common.base.Preconditions.checkArgument;
34 import static java.util.Objects.requireNonNull;
35 import static java.util.Optional.ofNullable;
36
37 @Immutable
38 public class IssuesChangesNotificationBuilder {
39
40   private static final String KEY_CANT_BE_NULL_MESSAGE = "key can't be null";
41   private final Set<ChangedIssue> issues;
42   private final Change change;
43
44   public IssuesChangesNotificationBuilder(Set<ChangedIssue> issues, Change change) {
45     checkArgument(!issues.isEmpty(), "issues can't be empty");
46
47     this.issues = ImmutableSet.copyOf(issues);
48     this.change = requireNonNull(change, "change can't be null");
49   }
50
51   public Set<ChangedIssue> getIssues() {
52     return issues;
53   }
54
55   public Change getChange() {
56     return change;
57   }
58
59   @Immutable
60   public static final class ChangedIssue {
61     private final String key;
62     private final String newStatus;
63     private final IssueStatus newIssueStatus;
64     @CheckForNull
65     private final User assignee;
66     private final Rule rule;
67     private final Project project;
68
69     public ChangedIssue(Builder builder) {
70       this.key = requireNonNull(builder.key, KEY_CANT_BE_NULL_MESSAGE);
71       this.newStatus = requireNonNull(builder.newStatus, "newStatus can't be null");
72       this.newIssueStatus = builder.newIssueStatus;
73       this.assignee = builder.assignee;
74       this.rule = requireNonNull(builder.rule, "rule can't be null");
75       this.project = requireNonNull(builder.project, "project can't be null");
76     }
77
78     public String getKey() {
79       return key;
80     }
81
82     public String getNewStatus() {
83       return newStatus;
84     }
85
86     public Optional<IssueStatus> getNewIssueStatus() {
87       return ofNullable(newIssueStatus);
88     }
89
90     public Optional<User> getAssignee() {
91       return ofNullable(assignee);
92     }
93
94     public Rule getRule() {
95       return rule;
96     }
97
98     public Project getProject() {
99       return project;
100     }
101
102     public static class Builder {
103       private final String key;
104       @CheckForNull
105       private IssueStatus newIssueStatus;
106       private String newStatus;
107       @CheckForNull
108       private User assignee;
109       private Rule rule;
110       private Project project;
111
112       public Builder(String key) {
113         this.key = key;
114       }
115
116       public Builder setNewStatus(String newStatus) {
117         this.newStatus = newStatus;
118         return this;
119       }
120
121       public Builder setAssignee(@Nullable User assignee) {
122         this.assignee = assignee;
123         return this;
124       }
125
126       public Builder setNewIssueStatus(@Nullable IssueStatus newIssueStatus) {
127         this.newIssueStatus = newIssueStatus;
128         return this;
129       }
130
131       public Builder setRule(Rule rule) {
132         this.rule = rule;
133         return this;
134       }
135
136       public Builder setProject(Project project) {
137         this.project = project;
138         return this;
139       }
140
141       public ChangedIssue build() {
142         return new ChangedIssue(this);
143       }
144     }
145
146     @Override
147     public boolean equals(Object o) {
148       if (this == o) {
149         return true;
150       }
151       if (o == null || getClass() != o.getClass()) {
152         return false;
153       }
154       ChangedIssue that = (ChangedIssue) o;
155       return key.equals(that.key) &&
156         newStatus.equals(that.newStatus) &&
157         newIssueStatus == that.newIssueStatus &&
158         Objects.equals(assignee, that.assignee) &&
159         rule.equals(that.rule) &&
160         project.equals(that.project);
161     }
162
163     @Override
164     public int hashCode() {
165       return Objects.hash(key, newStatus, newIssueStatus, assignee, rule, project);
166     }
167
168     @Override
169     public String toString() {
170       return "ChangedIssue{" +
171         "key='" + key + '\'' +
172         ", newStatus='" + newStatus + '\'' +
173         ", newIssueStatus='" + newIssueStatus + '\'' +
174         ", assignee=" + assignee +
175         ", rule=" + rule +
176         ", project=" + project +
177         '}';
178     }
179   }
180
181   public static final class User {
182     private final String uuid;
183     private final String login;
184     @CheckForNull
185     private final String name;
186
187     public User(String uuid, String login, @Nullable String name) {
188       this.uuid = requireNonNull(uuid, "uuid can't be null");
189       this.login = requireNonNull(login, "login can't be null");
190       this.name = name;
191     }
192
193     public String getUuid() {
194       return uuid;
195     }
196
197     public String getLogin() {
198       return login;
199     }
200
201     public Optional<String> getName() {
202       return ofNullable(name);
203     }
204
205     @Override
206     public String toString() {
207       return "User{" +
208         "uuid='" + uuid + '\'' +
209         ", login='" + login + '\'' +
210         ", name='" + name + '\'' +
211         '}';
212     }
213
214     @Override
215     public boolean equals(Object o) {
216       if (this == o) {
217         return true;
218       }
219       if (o == null || getClass() != o.getClass()) {
220         return false;
221       }
222       User user = (User) o;
223       return uuid.equals(user.uuid) &&
224         login.equals(user.login) &&
225         Objects.equals(name, user.name);
226     }
227
228     @Override
229     public int hashCode() {
230       return Objects.hash(uuid, login, name);
231     }
232   }
233
234   @Immutable
235   public static final class Rule {
236     private final RuleKey key;
237     private final RuleType ruleType;
238     private final String name;
239
240     public Rule(RuleKey key, @Nullable String ruleType, String name) {
241       this(key, ruleType != null ? RuleType.valueOf(ruleType) : null, name);
242     }
243
244     public Rule(RuleKey key, @Nullable RuleType ruleType, String name) {
245       this.key = requireNonNull(key, KEY_CANT_BE_NULL_MESSAGE);
246       this.ruleType = ruleType;
247       this.name = requireNonNull(name, "name can't be null");
248     }
249
250     public RuleKey getKey() {
251       return key;
252     }
253
254     @CheckForNull
255     public RuleType getRuleType() {
256       return ruleType;
257     }
258
259     public String getName() {
260       return name;
261     }
262
263     @Override
264     public boolean equals(Object o) {
265       if (this == o) {
266         return true;
267       }
268       if (o == null || getClass() != o.getClass()) {
269         return false;
270       }
271       Rule that = (Rule) o;
272       return key.equals(that.key) && ruleType == that.ruleType && name.equals(that.name);
273     }
274
275     @Override
276     public int hashCode() {
277       return Objects.hash(key, ruleType, name);
278     }
279
280     @Override
281     public String toString() {
282       return "Rule{" +
283         "key=" + key +
284         ", type=" + ruleType +
285         ", name='" + name + '\'' +
286         '}';
287     }
288   }
289
290   @Immutable
291   public static final class Project {
292     private final String uuid;
293     private final String key;
294     private final String projectName;
295     @Nullable
296     private final String branchName;
297
298     public Project(Builder builder) {
299       this.uuid = requireNonNull(builder.uuid, "uuid can't be null");
300       this.key = requireNonNull(builder.key, KEY_CANT_BE_NULL_MESSAGE);
301       this.projectName = requireNonNull(builder.projectName, "projectName can't be null");
302       this.branchName = builder.branchName;
303     }
304
305     public String getUuid() {
306       return uuid;
307     }
308
309     public String getKey() {
310       return key;
311     }
312
313     public String getProjectName() {
314       return projectName;
315     }
316
317     public Optional<String> getBranchName() {
318       return ofNullable(branchName);
319     }
320
321     @Override
322     public boolean equals(Object o) {
323       if (this == o) {
324         return true;
325       }
326       if (o == null || getClass() != o.getClass()) {
327         return false;
328       }
329       Project project = (Project) o;
330       return uuid.equals(project.uuid) &&
331         key.equals(project.key) &&
332         projectName.equals(project.projectName) &&
333         Objects.equals(branchName, project.branchName);
334     }
335
336     @Override
337     public int hashCode() {
338       return Objects.hash(uuid, key, projectName, branchName);
339     }
340
341     @Override
342     public String toString() {
343       return "Project{" +
344         "uuid='" + uuid + '\'' +
345         ", key='" + key + '\'' +
346         ", projectName='" + projectName + '\'' +
347         ", branchName='" + branchName + '\'' +
348         '}';
349     }
350
351     public static class Builder {
352       private final String uuid;
353       private String key;
354       private String projectName;
355       @CheckForNull
356       private String branchName;
357
358       public Builder(String uuid) {
359         this.uuid = uuid;
360       }
361
362       public Builder setKey(String key) {
363         this.key = key;
364         return this;
365       }
366
367       public Builder setProjectName(String projectName) {
368         this.projectName = projectName;
369         return this;
370       }
371
372       public Builder setBranchName(@Nullable String branchName) {
373         this.branchName = branchName;
374         return this;
375       }
376
377       public Project build() {
378         return new Project(this);
379       }
380     }
381   }
382
383   public abstract static class Change {
384     protected final long date;
385
386     private Change(long date) {
387       this.date = date;
388     }
389
390     public long getDate() {
391       return date;
392     }
393
394     public abstract boolean isAuthorLogin(String login);
395   }
396
397   @Immutable
398   public static final class AnalysisChange extends Change {
399     public AnalysisChange(long date) {
400       super(date);
401     }
402
403     @Override
404     public boolean isAuthorLogin(String login) {
405       return false;
406     }
407
408     @Override
409     public boolean equals(Object o) {
410       if (this == o) {
411         return true;
412       }
413       if (o == null || getClass() != o.getClass()) {
414         return false;
415       }
416       Change change = (Change) o;
417       return date == change.date;
418     }
419
420     @Override
421     public int hashCode() {
422       return Objects.hash(date);
423     }
424
425     @Override
426     public String toString() {
427       return "AnalysisChange{" + date + '}';
428     }
429   }
430
431   @Immutable
432   public static final class UserChange extends Change {
433     private final User user;
434
435     public UserChange(long date, User user) {
436       super(date);
437       this.user = requireNonNull(user, "user can't be null");
438     }
439
440     public User getUser() {
441       return user;
442     }
443
444     @Override
445     public boolean isAuthorLogin(String login) {
446       return this.user.login.equals(login);
447     }
448
449     @Override
450     public boolean equals(Object o) {
451       if (this == o) {
452         return true;
453       }
454       if (o == null || getClass() != o.getClass()) {
455         return false;
456       }
457       UserChange that = (UserChange) o;
458       return date == that.date && user.equals(that.user);
459     }
460
461     @Override
462     public int hashCode() {
463       return Objects.hash(user, date);
464     }
465
466     @Override
467     public String toString() {
468       return "UserChange{" +
469         "date=" + date +
470         ", user=" + user +
471         '}';
472     }
473   }
474 }