From 3cd3a7dcc73cb3924d8c61f532423226bb38b38b Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Mon, 30 May 2011 14:58:02 +0200 Subject: SONAR-2404 Extend the Review web service API to create & update - Java client WS: create, update and delete queries - Added the ID of each comment on a review (JSON and XML) to be able to cleanly delete the last comment of a review --- .../java/org/sonar/wsclient/services/Review.java | 16 +- .../sonar/wsclient/services/ReviewCreateQuery.java | 141 +++++++++++++++++ .../sonar/wsclient/services/ReviewDeleteQuery.java | 82 ++++++++++ .../sonar/wsclient/services/ReviewUpdateQuery.java | 170 +++++++++++++++++++++ .../wsclient/unmarshallers/ReviewUnmarshaller.java | 3 +- .../wsclient/services/ReviewCreateQueryTest.java | 48 ++++++ .../wsclient/services/ReviewDeleteQueryTest.java | 36 +++++ .../wsclient/services/ReviewUpdateQueryTest.java | 54 +++++++ .../unmarshallers/ReviewUnmarshallerTest.java | 1 + .../src/test/resources/reviews/reviews-2.9.json | 2 +- 10 files changed, 548 insertions(+), 5 deletions(-) create mode 100644 sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewCreateQuery.java create mode 100644 sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewDeleteQuery.java create mode 100644 sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewUpdateQuery.java create mode 100644 sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewCreateQueryTest.java create mode 100644 sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewDeleteQueryTest.java create mode 100644 sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewUpdateQueryTest.java (limited to 'sonar-ws-client') diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/Review.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/Review.java index 91c84411c83..ba17f28d376 100644 --- a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/Review.java +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/Review.java @@ -251,8 +251,8 @@ public class Review extends Model { return comments; } - public Review addComments(Date updatedAt, String authorLogin, String text) { - this.comments.add(new Review.Comment(updatedAt, authorLogin, text)); + public Review addComments(Long id, Date updatedAt, String authorLogin, String text) { + this.comments.add(new Review.Comment(id, updatedAt, authorLogin, text)); return this; } @@ -261,16 +261,26 @@ public class Review extends Model { */ public static final class Comment extends Model { + private Long id = null; private String authorLogin = null; private Date updatedAt = null; private String text = null; - private Comment(Date updatedAt, String authorLogin, String text) { + private Comment(Long id, Date updatedAt, String authorLogin, String text) { + this.id = id; this.updatedAt = updatedAt; this.authorLogin = authorLogin; this.text = text; } + /** + * @since 2.9 + * @return the id + */ + public Long getId() { + return id; + } + /** * @return the authorLogin */ diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewCreateQuery.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewCreateQuery.java new file mode 100644 index 00000000000..96d7a57c66a --- /dev/null +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewCreateQuery.java @@ -0,0 +1,141 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +/** + * @since 2.9 + */ +public class ReviewCreateQuery extends UpdateQuery { + + private Long violationId; + private String text; + private String assignee; + private Boolean falsePositive; + + public ReviewCreateQuery() { + } + + /** + * Builds a request that will create a simple review on a violation, without any assignee. + * + * @param violationId + * The id of the violation that is reviewed + * @param text + * The comment of the review + */ + public static ReviewCreateQuery createSimpleReviewQuery(Long violationId, String text) { + ReviewCreateQuery query = new ReviewCreateQuery(); + query.setText(text); + query.setViolationId(violationId); + return query; + } + + /** + * Builds a request that will create a simple review on a violation and that will be assigned to the given user. + * + * @param violationId + * The id of the violation that is reviewed + * @param text + * The comment of the review + * @param userLogin + * The login of the user whom this review will be assigned to + */ + public static ReviewCreateQuery createAssignedReviewQuery(Long violationId, String text, String userLogin) { + ReviewCreateQuery query = createSimpleReviewQuery(violationId, text); + query.setAssignee(userLogin); + return query; + } + + /** + * Builds a request that will create a false-positive review on a violation. + * + * @param violationId + * The id of the violation that is reviewed + * @param text + * The comment of the review + */ + public static ReviewCreateQuery createFalsePositiveReviewQuery(Long violationId, String text) { + ReviewCreateQuery query = createSimpleReviewQuery(violationId, text); + query.setFalsePositive(Boolean.TRUE); + return query; + } + + public Long getViolationId() { + return violationId; + } + + public ReviewCreateQuery setViolationId(Long violationId) { + this.violationId = violationId; + return this; + } + + public String getText() { + return text; + } + + public ReviewCreateQuery setText(String text) { + this.text = text; + return this; + } + + public String getAssignee() { + return assignee; + } + + public ReviewCreateQuery setAssignee(String userLogin) { + this.assignee = userLogin; + return this; + } + + public Boolean getFalsePositive() { + return falsePositive; + } + + public ReviewCreateQuery setFalsePositive(Boolean falsePositive) { + this.falsePositive = falsePositive; + return this; + } + + @Override + public String getUrl() { + StringBuilder url = new StringBuilder(); + url.append(ReviewQuery.BASE_URL); + url.append("/"); + url.append('?'); + appendUrlParameter(url, "violation_id", getViolationId()); + appendUrlParameter(url, "text", getText()); + appendUrlParameter(url, "assignee", getAssignee()); + appendUrlParameter(url, "false_positive", getFalsePositive()); + return url.toString(); + } + + /** + * Property 'text' is transmitted through request body as content may exceed URL size allowed by the server. + */ + @Override + public String getBody() { + return text; + } + + @Override + public Class getModelClass() { + return Review.class; + } +} diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewDeleteQuery.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewDeleteQuery.java new file mode 100644 index 00000000000..fc919b00ea5 --- /dev/null +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewDeleteQuery.java @@ -0,0 +1,82 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +/** + * @since 2.9 + */ +public class ReviewDeleteQuery extends CreateQuery { + + private Long reviewId; + private Long commentId; + + public ReviewDeleteQuery() { + } + + /** + * Builds a request that will delete the comment of a review. For the moment, only the last comment can be deleted, and only the author of + * this comment is allowed to do so. + * + * @param reviewId + * the id of the review + * @param commentId + * the id of the comment to delete + */ + public static ReviewDeleteQuery deleteCommentQuery(Long reviewId, Long commentId) { + ReviewDeleteQuery query = new ReviewDeleteQuery(); + query.reviewId = reviewId; + query.commentId = commentId; + return query; + } + + public Long getReviewId() { + return reviewId; + } + + public ReviewDeleteQuery setReviewId(Long reviewId) { + this.reviewId = reviewId; + return this; + } + + public Long getCommentId() { + return commentId; + } + + public ReviewDeleteQuery setCommentId(Long commentId) { + this.commentId = commentId; + return this; + } + + @Override + public String getUrl() { + StringBuilder url = new StringBuilder(); + url.append(ReviewQuery.BASE_URL); + url.append("/"); + url.append('?'); + appendUrlParameter(url, "id", getReviewId()); + appendUrlParameter(url, "comment_id", getCommentId()); + return url.toString(); + } + + @Override + public Class getModelClass() { + return Review.class; + } +} diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewUpdateQuery.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewUpdateQuery.java new file mode 100644 index 00000000000..328ec295216 --- /dev/null +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/services/ReviewUpdateQuery.java @@ -0,0 +1,170 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +/** + * @since 2.9 + */ +public class ReviewUpdateQuery extends CreateQuery { + + private Long reviewId; + private String text; + private String newText; + private String assignee; + private Boolean falsePositive; + + public ReviewUpdateQuery() { + } + + /** + * Builds a request that will add a comment on a an existing review. + * + * @param reviewId + * The id of the review + * @param text + * The new comment + */ + public static ReviewUpdateQuery addCommentQuery(Long reviewId, String text) { + ReviewUpdateQuery query = new ReviewUpdateQuery(); + query.setReviewId(reviewId); + query.setNewText(text); + return query; + } + + /** + * Builds a request that will update the false-positive status of an existing review. + * + * @param reviewId + * The id of the review + * @param text + * The comment for this modification + * @param falsePositive + * the new false positive status of the review + */ + public static ReviewUpdateQuery updateFalsePositiveQuery(Long reviewId, String text, Boolean falsePositive) { + ReviewUpdateQuery query = addCommentQuery(reviewId, text); + query.setFalsePositive(falsePositive); + return query; + } + + /** + * Builds a request that will reassign an existing review to the given user.
+ *
+ * To unassign the review, simply pass "none" for the user login. + * + * @param reviewId + * The id of the review that is reviewed + * @param userLogin + * The login of the user whom this review will be assigned to, or "none" to unassign + */ + public static ReviewUpdateQuery reassignQuery(Long reviewId, String userLogin) { + ReviewUpdateQuery query = new ReviewUpdateQuery(); + query.setReviewId(reviewId); + query.setAssignee(userLogin); + return query; + } + + /** + * Builds a request that will edit the last comment of a an existing review (if the last comment belongs to the current user). + * + * @param reviewId + * The id of the review + * @param text + * The new text for the last comment + */ + public static ReviewUpdateQuery editLastCommentQuery(Long reviewId, String text) { + ReviewUpdateQuery query = new ReviewUpdateQuery(); + query.setReviewId(reviewId); + query.setText(text); + return query; + } + + public Long getReviewId() { + return reviewId; + } + + public ReviewUpdateQuery setReviewId(Long reviewId) { + this.reviewId = reviewId; + return this; + } + + public String getText() { + return text; + } + + public ReviewUpdateQuery setText(String text) { + this.text = text; + return this; + } + + public String getNewText() { + return newText; + } + + public ReviewUpdateQuery setNewText(String text) { + this.newText = text; + return this; + } + + public String getAssignee() { + return assignee; + } + + public ReviewUpdateQuery setAssignee(String userLogin) { + this.assignee = userLogin; + return this; + } + + public Boolean getFalsePositive() { + return falsePositive; + } + + public ReviewUpdateQuery setFalsePositive(Boolean falsePositive) { + this.falsePositive = falsePositive; + return this; + } + + @Override + public String getUrl() { + StringBuilder url = new StringBuilder(); + url.append(ReviewQuery.BASE_URL); + url.append("/"); + url.append('?'); + appendUrlParameter(url, "id", getReviewId()); + appendUrlParameter(url, "text", getText()); + appendUrlParameter(url, "new_text", getNewText()); + appendUrlParameter(url, "assignee", getAssignee()); + appendUrlParameter(url, "false_positive", getFalsePositive()); + return url.toString(); + } + + /** + * Properties 'text' or 'new_text' are transmitted through request body as content may exceed URL size allowed by the server. + */ + @Override + public String getBody() { + return text == null ? newText : text; + } + + @Override + public Class getModelClass() { + return Review.class; + } +} diff --git a/sonar-ws-client/src/main/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshaller.java b/sonar-ws-client/src/main/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshaller.java index 449d45b3f3b..f3fbb3a57e4 100644 --- a/sonar-ws-client/src/main/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshaller.java +++ b/sonar-ws-client/src/main/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshaller.java @@ -49,7 +49,8 @@ public class ReviewUnmarshaller extends AbstractUnmarshaller { if (comments != null) { for (int i = 0; i < utils.getArraySize(comments); i++) { Object comment = utils.getArrayElement(comments, i); - review.addComments(utils.getDateTime(comment, "updatedAt"), utils.getString(comment, "author"), utils.getString(comment, "text")); + review.addComments(utils.getLong(comment, "id"), utils.getDateTime(comment, "updatedAt"), utils.getString(comment, "author"), + utils.getString(comment, "text")); } } diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewCreateQueryTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewCreateQueryTest.java new file mode 100644 index 00000000000..fd3ae931612 --- /dev/null +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewCreateQueryTest.java @@ -0,0 +1,48 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +public class ReviewCreateQueryTest extends QueryTestCase { + + @Test + public void testCreateSimpleReview() { + ReviewCreateQuery query = ReviewCreateQuery.createSimpleReviewQuery(13L, "Hello World!"); + assertThat(query.getUrl(), is("/api/reviews/?violation_id=13&text=Hello+World%21&")); + assertThat(query.getModelClass().getName(), is(Review.class.getName())); + } + + @Test + public void testCreateAssignedReview() { + ReviewCreateQuery query = ReviewCreateQuery.createAssignedReviewQuery(13L, "Hello World!", "fabrice"); + assertThat(query.getUrl(), is("/api/reviews/?violation_id=13&text=Hello+World%21&assignee=fabrice&")); + } + + @Test + public void testCreateFalsePositiveReview() { + ReviewCreateQuery query = ReviewCreateQuery.createFalsePositiveReviewQuery(13L, "Hello World!"); + assertThat(query.getUrl(), is("/api/reviews/?violation_id=13&text=Hello+World%21&false_positive=true&")); + } + +} \ No newline at end of file diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewDeleteQueryTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewDeleteQueryTest.java new file mode 100644 index 00000000000..ff2b22dadf8 --- /dev/null +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewDeleteQueryTest.java @@ -0,0 +1,36 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +public class ReviewDeleteQueryTest extends QueryTestCase { + + @Test + public void testAddComment() { + ReviewDeleteQuery query = ReviewDeleteQuery.deleteCommentQuery(13L, 2L); + assertThat(query.getUrl(), is("/api/reviews/?id=13&comment_id=2&")); + assertThat(query.getModelClass().getName(), is(Review.class.getName())); + } + +} \ No newline at end of file diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewUpdateQueryTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewUpdateQueryTest.java new file mode 100644 index 00000000000..ee28a908ab6 --- /dev/null +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/services/ReviewUpdateQueryTest.java @@ -0,0 +1,54 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2011 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * Sonar is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.wsclient.services; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +public class ReviewUpdateQueryTest extends QueryTestCase { + + @Test + public void testAddComment() { + ReviewUpdateQuery query = ReviewUpdateQuery.addCommentQuery(13L, "Hello World!"); + assertThat(query.getUrl(), is("/api/reviews/?id=13&new_text=Hello+World%21&")); + assertThat(query.getModelClass().getName(), is(Review.class.getName())); + } + + @Test + public void testEditLastComment() { + ReviewUpdateQuery query = ReviewUpdateQuery.editLastCommentQuery(13L, "Hello World!"); + assertThat(query.getUrl(), is("/api/reviews/?id=13&text=Hello+World%21&")); + } + + @Test + public void testReassign() { + ReviewUpdateQuery query = ReviewUpdateQuery.reassignQuery(13L, "fabrice"); + assertThat(query.getUrl(), is("/api/reviews/?id=13&assignee=fabrice&")); + } + + @Test + public void testUpdateFalsePositive() { + ReviewUpdateQuery query = ReviewUpdateQuery.updateFalsePositiveQuery(13L, "Hello World!", Boolean.TRUE); + assertThat(query.getUrl(), is("/api/reviews/?id=13&new_text=Hello+World%21&false_positive=true&")); + } + +} \ No newline at end of file diff --git a/sonar-ws-client/src/test/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshallerTest.java b/sonar-ws-client/src/test/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshallerTest.java index d3f543b984c..d2c4cc73564 100644 --- a/sonar-ws-client/src/test/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshallerTest.java +++ b/sonar-ws-client/src/test/java/org/sonar/wsclient/unmarshallers/ReviewUnmarshallerTest.java @@ -58,6 +58,7 @@ public class ReviewUnmarshallerTest extends UnmarshallerTestCase { List comments = review.getComments(); assertThat(comments.size(), is(4)); Comment comment = comments.get(0); + assertThat(comment.getId(), is(1L)); assertNotNull(comment.getUpdatedAt()); assertThat(comment.getAuthorLogin(), is("admin")); assertThat(comment.getText(), is("This is a review.
And this is on multiple lines...

Wouhou!!!!!")); diff --git a/sonar-ws-client/src/test/resources/reviews/reviews-2.9.json b/sonar-ws-client/src/test/resources/reviews/reviews-2.9.json index 371a15119c9..707438bbd31 100644 --- a/sonar-ws-client/src/test/resources/reviews/reviews-2.9.json +++ b/sonar-ws-client/src/test/resources/reviews/reviews-2.9.json @@ -1 +1 @@ -[{"id":3,"createdAt":"2011-04-26T15:44:42+0200","updatedAt":"2011-04-26T15:44:42+0200","author":"admin","assignee":"admin","title":"'static' modifier out of order with the JLS suggestions.","falsePositive":false,"status":"OPEN","severity":"MINOR","resource":"org.codehaus.sonar:sonar-channel:org.sonar.channel.CodeReaderConfiguration","line":33,"comments":[{"author":"admin","updatedAt":"2011-04-26T15:44:42+0200","text":"This is a review.
And this is on multiple lines...

Wouhou!!!!!"},{"author":"admin","updatedAt":"2011-04-26T17:10:19+0200","text":"Bold on multiple line?"},{"author":"admin","updatedAt":"2011-04-26T17:11:02+0200","text":"And the bullets:
  • 1 bullet
  • \n
  • 2 bullets
"},{"author":"admin","updatedAt":"2011-04-26T17:27:37+0200","text":"Wazzaa"}]},{"id":9,"createdAt":"2011-04-27T14:37:20+0200","updatedAt":"2011-04-27T14:37:20+0200","author":"admin","title":"New exception is thrown in catch block, original stack trace may be lost","falsePositive":true,"status":"OPEN","severity":"MAJOR","resource":"org.codehaus.sonar:sonar-channel:org.sonar.channel.CodeReader","line":84,"comments":[{"author":"admin","updatedAt":"2011-04-27T14:37:20+0200","text":"Wazzaaaa"}]}] \ No newline at end of file +[{"id":3,"createdAt":"2011-04-26T15:44:42+0200","updatedAt":"2011-04-26T15:44:42+0200","author":"admin","assignee":"admin","title":"'static' modifier out of order with the JLS suggestions.","falsePositive":false,"status":"OPEN","severity":"MINOR","resource":"org.codehaus.sonar:sonar-channel:org.sonar.channel.CodeReaderConfiguration","line":33,"comments":[{"id":1,"author":"admin","updatedAt":"2011-04-26T15:44:42+0200","text":"This is a review.
And this is on multiple lines...

Wouhou!!!!!"},{"id":2,"author":"admin","updatedAt":"2011-04-26T17:10:19+0200","text":"Bold on multiple line?"},{"id":3,"author":"admin","updatedAt":"2011-04-26T17:11:02+0200","text":"And the bullets:
  • 1 bullet
  • \n
  • 2 bullets
"},{"id":4,"author":"admin","updatedAt":"2011-04-26T17:27:37+0200","text":"Wazzaa"}]},{"id":9,"createdAt":"2011-04-27T14:37:20+0200","updatedAt":"2011-04-27T14:37:20+0200","author":"admin","title":"New exception is thrown in catch block, original stack trace may be lost","falsePositive":true,"status":"OPEN","severity":"MAJOR","resource":"org.codehaus.sonar:sonar-channel:org.sonar.channel.CodeReader","line":84,"comments":[{"id":5,"author":"admin","updatedAt":"2011-04-27T14:37:20+0200","text":"Wazzaaaa"}]}] \ No newline at end of file -- cgit v1.2.3