Skip to content

Commit 2dc9003

Browse files
Peijie LiuFrederik Boster
authored andcommitted
Fixed Pull Request comments automatic deletion
1.Extend parsing of Bitbucket comments and tasks from REST response 2.Add API for deletion of Bitbucket tasks 3.Delete Bitbucket tasks and sub-comments recursively before removing a comment
1 parent 49b0891 commit 2dc9003

File tree

4 files changed

+146
-1
lines changed

4 files changed

+146
-1
lines changed

src/main/java/se/bjurr/violations/comments/bitbucketserver/lib/BitbucketServerCommentsProvider.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@
1010
import com.google.common.annotations.VisibleForTesting;
1111
import com.google.common.cache.CacheLoader;
1212
import com.google.common.cache.LoadingCache;
13+
import java.util.ArrayDeque;
1314
import java.util.ArrayList;
15+
import java.util.Collection;
16+
import java.util.Deque;
17+
import java.util.Iterator;
1418
import java.util.List;
1519
import se.bjurr.violations.comments.bitbucketserver.lib.client.BitbucketServerClient;
1620
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerComment;
1721
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerDiff;
1822
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerDiffResponse;
23+
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerTask;
1924
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.DiffDestination;
2025
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.DiffHunk;
2126
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.Line;
@@ -136,6 +141,11 @@ public void removeComments(final List<Comment> comments) {
136141
try {
137142
commentId = Integer.valueOf(comment.getIdentifier());
138143
commentVersion = Integer.valueOf(comment.getSpecifics().get(0));
144+
145+
BitbucketServerComment bitbucketServerComment = client.pullRequestComment((long) commentId);
146+
removeAllSubCommentsAndTasksOfComment(bitbucketServerComment);
147+
148+
removeAllTasksOfComment(bitbucketServerComment);
139149
client.pullRequestRemoveComment(commentId, commentVersion);
140150
} catch (final Exception e) {
141151
violationsLogger.log(
@@ -212,4 +222,34 @@ public Optional<String> findCommentTemplate() {
212222
public boolean shouldKeepOldComments() {
213223
return violationCommentsToBitbucketApi.getShouldKeepOldComments();
214224
}
225+
226+
private void removeAllTasksOfComment(final BitbucketServerComment bitbucketServerComment) {
227+
List<BitbucketServerTask> bitbucketServerTasks = bitbucketServerComment.getTasks();
228+
229+
for (BitbucketServerTask bitbucketServerTask : bitbucketServerTasks) {
230+
client.removeTask(bitbucketServerTask);
231+
}
232+
}
233+
234+
private void removeAllSubCommentsAndTasksOfComment(
235+
final BitbucketServerComment bitbucketServerComment) {
236+
final Deque<BitbucketServerComment> commentStack = new ArrayDeque<>();
237+
Collection<BitbucketServerComment> subComments = bitbucketServerComment.getComments();
238+
while (subComments != null && !subComments.isEmpty()) {
239+
commentStack.addAll(subComments);
240+
final Collection<BitbucketServerComment> currentSubComments = subComments;
241+
242+
subComments = new ArrayList<>();
243+
for (final BitbucketServerComment subComment : currentSubComments) {
244+
subComments.addAll(subComment.getComments());
245+
}
246+
}
247+
248+
final Iterator<BitbucketServerComment> commentIt = commentStack.descendingIterator();
249+
while (commentIt.hasNext()) {
250+
final BitbucketServerComment comment = commentIt.next();
251+
removeAllTasksOfComment(comment);
252+
client.pullRequestRemoveComment(comment.getId(), comment.getVersion());
253+
}
254+
}
215255
}

src/main/java/se/bjurr/violations/comments/bitbucketserver/lib/client/BitbucketServerClient.java

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@
1111
import com.jayway.jsonpath.JsonPath;
1212
import java.io.File;
1313
import java.io.UnsupportedEncodingException;
14+
import java.util.ArrayList;
1415
import java.util.LinkedHashMap;
1516
import java.util.List;
17+
import net.minidev.json.JSONArray;
1618
import se.bjurr.violations.comments.bitbucketserver.lib.client.BitbucketServerInvoker.Method;
1719
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerComment;
1820
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerDiffResponse;
21+
import se.bjurr.violations.comments.bitbucketserver.lib.client.model.BitbucketServerTask;
1922
import se.bjurr.violations.comments.lib.ViolationsLogger;
2023

2124
public class BitbucketServerClient {
@@ -171,6 +174,15 @@ public BitbucketServerComment pullRequestComment(
171174
return toBitbucketServerComment(parsed);
172175
}
173176

177+
public BitbucketServerComment pullRequestComment(final Long commentId) {
178+
String url = getBitbucketServerPullRequestBase() + "/comments/" + commentId;
179+
180+
final LinkedHashMap<?, ?> parsed =
181+
invokeAndParse(url, BitbucketServerInvoker.Method.GET, null, "$");
182+
183+
return toBitbucketServerComment(parsed);
184+
}
185+
174186
public List<BitbucketServerComment> pullRequestComments(final String changedFile) {
175187
try {
176188
final String encodedChangedFile = encode(changedFile, UTF_8.name());
@@ -228,6 +240,13 @@ public void pullRequestRemoveComment(final Integer commentId, final Integer comm
228240
null);
229241
}
230242

243+
public void removeTask(final BitbucketServerTask task) {
244+
doInvokeUrl(
245+
getBitbucketServerApiBase() + "/tasks/" + task.getId(),
246+
BitbucketServerInvoker.Method.DELETE,
247+
null);
248+
}
249+
231250
public void commentCreateTask(
232251
final BitbucketServerComment comment, String changedFile, int line) {
233252
final String changedFileName = new File(changedFile).getName();
@@ -263,6 +282,47 @@ private BitbucketServerComment toBitbucketServerComment(LinkedHashMap<?, ?> pars
263282
final String text = (String) parsed.get("text");
264283
final Integer id = (Integer) parsed.get("id");
265284

266-
return new BitbucketServerComment(version, text, id);
285+
final JSONArray jsonArrayTasks = (JSONArray) parsed.get("tasks");
286+
final JSONArray jsonArraySubComments = (JSONArray) parsed.get("comments");
287+
288+
List<LinkedHashMap<?, ?>> tasks = new ArrayList<>();
289+
List<LinkedHashMap<?, ?>> subComments = new ArrayList<>();
290+
291+
for (Object jsonArrayTask : jsonArrayTasks) {
292+
LinkedHashMap<?, ?> linkedHashMap = (LinkedHashMap<?, ?>) jsonArrayTask;
293+
tasks.add(linkedHashMap);
294+
}
295+
296+
for (Object jsonArraySubComment : jsonArraySubComments) {
297+
LinkedHashMap<?, ?> linkedHashMap = (LinkedHashMap<?, ?>) jsonArraySubComment;
298+
subComments.add(linkedHashMap);
299+
}
300+
301+
final List<BitbucketServerTask> bitbucketServerTasks = toBitbucketServerTasks(tasks);
302+
final List<BitbucketServerComment> bitbucketServerSubComments =
303+
toBitbucketServerComments(subComments);
304+
305+
BitbucketServerComment constructedComment = new BitbucketServerComment(version, text, id);
306+
307+
constructedComment.setTasks(bitbucketServerTasks);
308+
constructedComment.setComments(bitbucketServerSubComments);
309+
310+
return constructedComment;
311+
}
312+
313+
private BitbucketServerTask toBitbucketServerTask(LinkedHashMap<?, ?> parsed) {
314+
final Integer id = (Integer) parsed.get("id");
315+
final String text = (String) parsed.get("text");
316+
return new BitbucketServerTask(id, text);
317+
}
318+
319+
private List<BitbucketServerTask> toBitbucketServerTasks(List<LinkedHashMap<?, ?>> parsed) {
320+
List<BitbucketServerTask> bitbucketServerTasks = new ArrayList<>();
321+
322+
for (LinkedHashMap<?, ?> parsedTask : parsed) {
323+
bitbucketServerTasks.add(toBitbucketServerTask(parsedTask));
324+
}
325+
326+
return bitbucketServerTasks;
267327
}
268328
}

src/main/java/se/bjurr/violations/comments/bitbucketserver/lib/client/model/BitbucketServerComment.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
package se.bjurr.violations.comments.bitbucketserver.lib.client.model;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
5+
36
public class BitbucketServerComment {
47

58
private final Integer id;
69
private final String text;
710
private final Integer version;
11+
private List<BitbucketServerTask> tasks;
12+
private List<BitbucketServerComment> comments;
813

914
public BitbucketServerComment() {
1015
this.id = null;
1116
this.text = null;
1217
this.version = null;
18+
this.tasks = null;
19+
this.comments = null;
1320
}
1421

1522
public BitbucketServerComment(Integer version, String text, Integer id) {
1623
this.version = version;
1724
this.text = text;
1825
this.id = id;
26+
this.tasks = new ArrayList<>();
27+
this.comments = new ArrayList<>();
1928
}
2029

2130
public Integer getId() {
@@ -29,4 +38,20 @@ public String getText() {
2938
public Integer getVersion() {
3039
return this.version;
3140
}
41+
42+
public List<BitbucketServerTask> getTasks() {
43+
return tasks;
44+
}
45+
46+
public List<BitbucketServerComment> getComments() {
47+
return comments;
48+
}
49+
50+
public void setTasks(List<BitbucketServerTask> tasks) {
51+
this.tasks = tasks;
52+
}
53+
54+
public void setComments(List<BitbucketServerComment> comments) {
55+
this.comments = comments;
56+
}
3257
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package se.bjurr.violations.comments.bitbucketserver.lib.client.model;
2+
3+
public class BitbucketServerTask {
4+
private final Integer id;
5+
6+
private final String text;
7+
8+
public BitbucketServerTask(Integer id, String text) {
9+
this.text = text;
10+
this.id = id;
11+
}
12+
13+
public Integer getId() {
14+
return id;
15+
}
16+
17+
public String getText() {
18+
return text;
19+
}
20+
}

0 commit comments

Comments
 (0)