diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2013-05-02 16:53:25 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2013-05-02 18:30:44 +0200 |
commit | 1dbff7660b5957d1dc346f7e1da60be8d6ee6da6 (patch) | |
tree | 2bd7ce6932ec26501407d04927760aedaf5b6695 | |
parent | f61e0f6ea08c1ea5417a3e5e4327768bb70724df (diff) | |
download | sonarqube-1dbff7660b5957d1dc346f7e1da60be8d6ee6da6.tar.gz sonarqube-1dbff7660b5957d1dc346f7e1da60be8d6ee6da6.zip |
SONAR-3755 refactor comments
17 files changed, 228 insertions, 164 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/issue/FieldDiffs.java b/sonar-core/src/main/java/org/sonar/core/issue/FieldDiffs.java index a7004285ecd..f1ee89f083b 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/FieldDiffs.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/FieldDiffs.java @@ -25,22 +25,53 @@ import com.google.common.collect.Maps; import javax.annotation.Nullable; import java.io.Serializable; +import java.util.Date; import java.util.Map; -public class FieldDiffs extends IssueChange { +public class FieldDiffs implements Serializable { public static final Splitter FIELDS_SPLITTER = Splitter.on(',').omitEmptyStrings(); + private String userLogin; + private Date createdAt, updatedAt; private final Map<String, Diff> diffs = Maps.newLinkedHashMap(); - Map<String, Diff> diffs() { + public Map<String, Diff> diffs() { return diffs; } - Diff get(String field) { + public Diff get(String field) { return diffs.get(field); } + public String userLogin() { + return userLogin; + } + + public FieldDiffs setUserLogin(String s) { + this.userLogin = s; + return this; + } + + public Date createdAt() { + return createdAt; + } + + public FieldDiffs setCreatedAt(Date d) { + this.createdAt = d; + return this; + } + + public Date updatedAt() { + return updatedAt; + } + + public FieldDiffs setUpdatedAt(Date d) { + this.updatedAt = d; + return this; + } + + @SuppressWarnings("unchecked") public void setDiff(String field, @Nullable Serializable oldValue, @Nullable Serializable newValue) { Diff diff = diffs.get(field); diff --git a/sonar-core/src/main/java/org/sonar/core/issue/IssueChange.java b/sonar-core/src/main/java/org/sonar/core/issue/IssueChange.java deleted file mode 100644 index 527965cb442..00000000000 --- a/sonar-core/src/main/java/org/sonar/core/issue/IssueChange.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2013 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube 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. - * - * SonarQube 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 this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.core.issue; - -import java.io.Serializable; -import java.util.Date; - -public abstract class IssueChange implements Serializable { - private String userLogin; - private Date createdAt, updatedAt; - - public String userLogin() { - return userLogin; - } - - public IssueChange setUserLogin(String s) { - this.userLogin = s; - return this; - } - - public Date createdAt() { - return createdAt; - } - - public IssueChange setCreatedAt(Date d) { - this.createdAt = d; - return this; - } - - public Date updatedAt() { - return updatedAt; - } - - public IssueChange setUpdatedAt(Date d) { - this.updatedAt = d; - return this; - } -} diff --git a/sonar-core/src/main/java/org/sonar/core/issue/IssueComment.java b/sonar-core/src/main/java/org/sonar/core/issue/IssueComment.java index 975c9ae5978..a63bdd7de15 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/IssueComment.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/IssueComment.java @@ -20,11 +20,14 @@ package org.sonar.core.issue; import javax.annotation.Nullable; +import java.io.Serializable; import java.util.Date; import java.util.UUID; -public class IssueComment extends IssueChange { +public class IssueComment implements Serializable { + private String userLogin; + private Date createdAt, updatedAt; private String key; private String text; @@ -46,6 +49,33 @@ public class IssueComment extends IssueChange { return this; } + public String userLogin() { + return userLogin; + } + + public IssueComment setUserLogin(String userLogin) { + this.userLogin = userLogin; + return this; + } + + public Date createdAt() { + return createdAt; + } + + public IssueComment setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + return this; + } + + public Date updatedAt() { + return updatedAt; + } + + public IssueComment setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + return this; + } + public static IssueComment create(@Nullable String login, String text) { IssueComment comment = new IssueComment(); comment.setKey(UUID.randomUUID().toString()); diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/ChangeDtoConverter.java b/sonar-core/src/main/java/org/sonar/core/issue/db/ChangeDtoConverter.java index 9403cd08d1d..23015627eb7 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/ChangeDtoConverter.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/ChangeDtoConverter.java @@ -22,7 +22,6 @@ package org.sonar.core.issue.db; import com.google.common.collect.Lists; import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.FieldDiffs; -import org.sonar.core.issue.IssueChangeContext; import org.sonar.core.issue.IssueComment; import java.util.Date; @@ -30,16 +29,16 @@ import java.util.List; class ChangeDtoConverter { - static final String TYPE_FIELD_CHANGE = "diff"; + static final String TYPE_FIELD_CHANGE = "change"; static final String TYPE_COMMENT = "comment"; - static List<IssueChangeDto> toChangeDtos(DefaultIssue issue) { + static List<IssueChangeDto> extractChangeDtos(DefaultIssue issue) { List<IssueChangeDto> dtos = Lists.newArrayList(); for (IssueComment comment : issue.newComments()) { dtos.add(commentToDto(issue.key(), comment)); } if (issue.diffs() != null) { - dtos.add(diffsToDto(issue.key(), issue.diffs())); + dtos.add(changeToDto(issue.key(), issue.diffs())); } return dtos; } @@ -53,7 +52,7 @@ class ChangeDtoConverter { return dto; } - static IssueChangeDto diffsToDto(String issueKey, FieldDiffs diffs) { + static IssueChangeDto changeToDto(String issueKey, FieldDiffs diffs) { IssueChangeDto dto = newDto(issueKey); dto.setChangeType(TYPE_FIELD_CHANGE); dto.setChangeData(diffs.toString()); @@ -71,4 +70,21 @@ class ChangeDtoConverter { dto.setUpdatedAt(new Date()); return dto; } + + public static IssueComment dtoToComment(IssueChangeDto dto) { + return new IssueComment() + .setText(dto.getChangeData()) + .setKey(dto.getKey()) + .setCreatedAt(dto.getCreatedAt()) + .setUpdatedAt(dto.getUpdatedAt()) + .setUserLogin(dto.getUserLogin()); + } + + public static FieldDiffs dtoToChange(IssueChangeDto dto) { + FieldDiffs diffs = FieldDiffs.parse(dto.getChangeData()); + diffs.setUserLogin(dto.getUserLogin()); + diffs.setCreatedAt(dto.getCreatedAt()); + diffs.setUpdatedAt(dto.getUpdatedAt()); + return diffs; + } } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java index 42a213d02e8..2399ccd6425 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDao.java @@ -23,9 +23,10 @@ package org.sonar.core.issue.db; import org.apache.ibatis.session.SqlSession; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; +import org.sonar.core.issue.FieldDiffs; +import org.sonar.core.issue.IssueComment; import org.sonar.core.persistence.MyBatis; -import javax.annotation.CheckForNull; import java.util.List; /** @@ -39,28 +40,34 @@ public class IssueChangeDao implements BatchComponent, ServerComponent { this.mybatis = mybatis; } - @CheckForNull - public IssueChangeDto selectById(long id) { - SqlSession session = mybatis.openSession(); - try { - IssueChangeMapper mapper = session.getMapper(IssueChangeMapper.class); - return mapper.selectById(id); - } finally { - MyBatis.closeQuietly(session); + public IssueComment[] selectIssueComments(String issueKey) { + List<IssueChangeDto> dtos = selectByIssue(issueKey, ChangeDtoConverter.TYPE_COMMENT); + IssueComment[] result = new IssueComment[dtos.size()]; + for (int index = 0; index < dtos.size(); index++) { + result[index] = ChangeDtoConverter.dtoToComment(dtos.get(index)); } + return result; + } + + public FieldDiffs[] selectIssueChanges(String issueKey) { + List<IssueChangeDto> dtos = selectByIssue(issueKey, ChangeDtoConverter.TYPE_FIELD_CHANGE); + FieldDiffs[] result = new FieldDiffs[dtos.size()]; + for (int index = 0; index < dtos.size(); index++) { + result[index] = ChangeDtoConverter.dtoToChange(dtos.get(index)); + } + return result; } /** * Issue changes ordered by descending creation date. */ - public List<IssueChangeDto> selectByIssue(String issueKey) { + private List<IssueChangeDto> selectByIssue(String issueKey, String changeType) { SqlSession session = mybatis.openSession(); try { IssueChangeMapper mapper = session.getMapper(IssueChangeMapper.class); - return mapper.selectByIssue(issueKey); + return mapper.selectByIssueAndType(issueKey, changeType); } finally { MyBatis.closeQuietly(session); } } - } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDto.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDto.java index 1ab40848704..389f7c697ad 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDto.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeDto.java @@ -31,7 +31,7 @@ import java.util.Date; public final class IssueChangeDto { private Long id; - private String key; + private String kee; private String issueKey; private String userLogin; private String changeType; @@ -49,11 +49,11 @@ public final class IssueChangeDto { } public String getKey() { - return key; + return kee; } public IssueChangeDto setKey(String key) { - this.key = key; + this.kee = key; return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java index 077d1f37f40..7f54bc0899b 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueChangeMapper.java @@ -20,6 +20,8 @@ package org.sonar.core.issue.db; +import org.apache.ibatis.annotations.Param; + import java.util.List; /** @@ -29,11 +31,9 @@ public interface IssueChangeMapper { void insert(IssueChangeDto dto); - IssueChangeDto selectById(long id); - /** * Issue changes ordered by descending creation date. */ - List<IssueChangeDto> selectByIssue(String issueKey); + List<IssueChangeDto> selectByIssueAndType(@Param("issueKey") String issueKey, @Param("changeType") String changeType); } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueStorage.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueStorage.java index 25872741a9f..34bcec939d8 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueStorage.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueStorage.java @@ -67,7 +67,7 @@ public abstract class IssueStorage { conflicts.add(issue); } } - for (IssueChangeDto changeDto : ChangeDtoConverter.toChangeDtos(issue)) { + for (IssueChangeDto changeDto : ChangeDtoConverter.extractChangeDtos(issue)) { session.insert(MYBATIS_INSERT_CHANGE, changeDto); } } diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java b/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java index 8c97b86b38c..dbb79e2a583 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java @@ -24,6 +24,7 @@ import org.sonar.core.dashboard.ActiveDashboardDao; import org.sonar.core.dashboard.DashboardDao; import org.sonar.core.duplication.DuplicationDao; import org.sonar.core.graph.jdbc.GraphDao; +import org.sonar.core.issue.db.IssueChangeDao; import org.sonar.core.issue.db.IssueDao; import org.sonar.core.measure.MeasureFilterDao; import org.sonar.core.properties.PropertiesDao; @@ -57,6 +58,7 @@ public final class DaoUtils { DuplicationDao.class, GraphDao.class, IssueDao.class, + IssueChangeDao.class, LoadedTemplateDao.class, MeasureFilterDao.class, PropertiesDao.class, diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml index 3dd61b273e1..5ca7dd30001 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueChangeMapper.xml @@ -25,14 +25,14 @@ <mapper namespace="org.sonar.core.issue.db.IssueChangeMapper"> <sql id="issueChangeColumns"> - i.id, - i.kee as kee, - i.issue_key as issueKey, - i.user_login as userLogin, - i.change_type as changeType, - i.change_data as changeData, - i.created_at as createdAt, - i.updated_at as updatedAt + c.id, + c.kee as kee, + c.issue_key as issueKey, + c.user_login as userLogin, + c.change_type as changeType, + c.change_data as changeData, + c.created_at as createdAt, + c.updated_at as updatedAt </sql> <insert id="insert" parameterType="IssueChange" useGeneratedKeys="true" keyProperty="id"> @@ -49,19 +49,12 @@ VALUES (#{id}, #{key}, #{issueKey}, #{userLogin}, #{changeType}, #{changeData}, #{createdAt}, #{updatedAt}) </insert> - <select id="selectById" parameterType="long" resultType="IssueChange"> + <select id="selectByIssueAndType" parameterType="map" resultType="IssueChange"> select <include refid="issueChangeColumns"/> - from issue_changes i - where i.id=#{id} - </select> - - <select id="selectByIssue" parameterType="string" resultType="IssueChange"> - select - <include refid="issueChangeColumns"/> - from issue_changes i - where i.issue_key=#{issueKey} - order by i.created_at desc + from issue_changes c + where c.issue_key=#{issueKey} and c.change_type=#{changeType} + order by c.created_at desc </select> </mapper> diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/ChangeDtoConverterTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/ChangeDtoConverterTest.java index dec00ee6cf9..28721482da7 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/ChangeDtoConverterTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/ChangeDtoConverterTest.java @@ -51,10 +51,10 @@ public class ChangeDtoConverterTest { diffs.setDiff("severity", "INFO", "BLOCKER"); diffs.setUserLogin("emmerik"); - IssueChangeDto dto = ChangeDtoConverter.diffsToDto("ABCDE", diffs); + IssueChangeDto dto = ChangeDtoConverter.changeToDto("ABCDE", diffs); assertThat(dto.getChangeData()).isEqualTo("severity=INFO|BLOCKER"); - assertThat(dto.getChangeType()).isEqualTo("diff"); + assertThat(dto.getChangeType()).isEqualTo("change"); assertThat(dto.getCreatedAt()).isNotNull(); assertThat(dto.getUpdatedAt()).isNotNull(); assertThat(dto.getIssueKey()).isEqualTo("ABCDE"); @@ -69,10 +69,10 @@ public class ChangeDtoConverterTest { issue.setFieldDiff(context, "severity", "INFO", "BLOCKER"); issue.addComment(comment); - List<IssueChangeDto> changeDtos = ChangeDtoConverter.toChangeDtos(issue); + List<IssueChangeDto> changeDtos = ChangeDtoConverter.extractChangeDtos(issue); assertThat(changeDtos).hasSize(2); assertThat(changeDtos.get(0).getChangeType()).isEqualTo("comment"); - assertThat(changeDtos.get(1).getChangeType()).isEqualTo("diff"); + assertThat(changeDtos.get(1).getChangeType()).isEqualTo("change"); } } diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java index c3c23a7c4a1..a777e227e79 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueChangeDaoTest.java @@ -21,16 +21,15 @@ package org.sonar.core.issue.db; import org.junit.Before; import org.junit.Test; +import org.sonar.core.issue.FieldDiffs; +import org.sonar.core.issue.IssueComment; import org.sonar.core.persistence.AbstractDaoTestCase; -import java.util.Date; -import java.util.List; - import static org.fest.assertions.Assertions.assertThat; public class IssueChangeDaoTest extends AbstractDaoTestCase { - private IssueChangeDao dao; + IssueChangeDao dao; @Before public void createDao() { @@ -38,27 +37,28 @@ public class IssueChangeDaoTest extends AbstractDaoTestCase { } @Test - public void should_select_by_id() { + public void should_select_issue_comments() { setupData("shared"); - IssueChangeDto dto = dao.selectById(100L); - assertThat(dto.getId()).isEqualTo(100L); - assertThat(dto.getIssueKey()).isEqualTo("1000"); - assertThat(dto.getUserLogin()).isEqualTo("arthur"); - assertThat(dto.getChangeType()).isEqualTo("comment"); - assertThat(dto.getChangeData()).isEqualTo("this is a comment"); - assertThat(dto.getCreatedAt()).isNotNull(); - assertThat(dto.getUpdatedAt()).isNotNull(); + IssueComment[] comments = dao.selectIssueComments("1000"); + assertThat(comments).hasSize(2); + IssueComment first = comments[0]; + assertThat(first.text()).isEqualTo("recent comment"); + assertThat(first.userLogin()).isEqualTo("arthur"); + assertThat(first.key()).isEqualTo("FGHIJ"); + + IssueComment second = comments[1]; + assertThat(second.text()).isEqualTo("old comment"); } @Test - public void should_select_by_issue() { + public void should_select_issue_changes() { setupData("shared"); - List<IssueChangeDto> ordered = dao.selectByIssue("1000"); - assertThat(ordered).hasSize(2); - assertThat(ordered.get(0).getId()).isEqualTo(101); - assertThat(ordered.get(1).getId()).isEqualTo(100); + FieldDiffs[] ordered = dao.selectIssueChanges("1000"); + assertThat(ordered).hasSize(1); + FieldDiffs.Diff severityDiff = ordered[0].get("severity"); + assertThat(severityDiff.oldValue()).isEqualTo("MAJOR"); + assertThat(severityDiff.newValue()).isEqualTo("BLOCKER"); } - } diff --git a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueChangeDaoTest/shared.xml b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueChangeDaoTest/shared.xml index 739f6c802df..e9d0022f889 100644 --- a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueChangeDaoTest/shared.xml +++ b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueChangeDaoTest/shared.xml @@ -2,22 +2,34 @@ <issue_changes id="100" + kee="ABCDE" issue_key="1000" user_login="arthur" change_type="comment" - change_data="this is a comment" + change_data="old comment" created_at="2013-01-01" updated_at="2013-01-01" /> <issue_changes id="101" + kee="[null]" issue_key="1000" user_login="arthur" - change_type="fields" - change_data="severity:MAJOR,BLOCKER" + change_type="change" + change_data="severity=MAJOR|BLOCKER" created_at="2013-02-02" updated_at="2013-02-02" /> + <issue_changes + id="102" + kee="FGHIJ" + issue_key="1000" + user_login="arthur" + change_type="comment" + change_data="recent comment" + created_at="2013-05-05" + updated_at="2013-05-05" + /> </dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_insert_new_issues-result.xml b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_insert_new_issues-result.xml index 24140048336..c0861b3e305 100644 --- a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_insert_new_issues-result.xml +++ b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_insert_new_issues-result.xml @@ -6,5 +6,5 @@ attributes="foo=bar" /> <issue_changes id="1" kee="FGHIJ" issue_key="ABCDE" change_type="comment" user_login="emmerik" change_data="the comment" created_at="[null]" updated_at="[null]" /> - <issue_changes id="2" kee="[null]" issue_key="ABCDE" change_type="diff" user_login="emmerik" change_data="severity=INFO|BLOCKER" created_at="[null]" updated_at="[null]" /> + <issue_changes id="2" kee="[null]" issue_key="ABCDE" change_type="change" user_login="emmerik" change_data="severity=INFO|BLOCKER" created_at="[null]" updated_at="[null]" /> </dataset>
\ No newline at end of file diff --git a/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java b/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java index 32092c2139b..2dc008f801f 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java @@ -24,6 +24,7 @@ import org.sonar.api.issue.Issue; import org.sonar.api.rule.RuleKey; import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.DefaultIssueBuilder; +import org.sonar.core.issue.FieldDiffs; import org.sonar.core.issue.IssueComment; import org.sonar.core.issue.workflow.Transition; import org.sonar.server.platform.UserSession; @@ -58,14 +59,18 @@ public class JRubyInternalIssues implements ServerComponent { return actions.setSeverity(issueKey, severity, UserSession.get()); } - public DefaultIssue addComment(String issueKey, String comment) { + public IssueComment addComment(String issueKey, String comment) { return actions.addComment(issueKey, comment, UserSession.get()); } - public List<IssueComment> comments(String issueKey) { + public IssueComment[] comments(String issueKey) { return actions.comments(issueKey, UserSession.get()); } + public FieldDiffs[] changes(String issueKey) { + return actions.changes(issueKey, UserSession.get()); + } + public Issue create(Map<String, String> parameters) { String componentKey = parameters.get("component"); // TODO verify authorization diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueActions.java b/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueActions.java index 0c2d125c38f..56438a7fbd3 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueActions.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/ServerIssueActions.java @@ -22,10 +22,8 @@ package org.sonar.server.issue; import org.sonar.api.ServerComponent; import org.sonar.api.issue.Issue; import org.sonar.api.web.UserRole; -import org.sonar.core.issue.DefaultIssue; -import org.sonar.core.issue.IssueChangeContext; -import org.sonar.core.issue.IssueComment; -import org.sonar.core.issue.IssueUpdater; +import org.sonar.core.issue.*; +import org.sonar.core.issue.db.IssueChangeDao; import org.sonar.core.issue.db.IssueDao; import org.sonar.core.issue.db.IssueDto; import org.sonar.core.issue.db.IssueStorage; @@ -48,6 +46,7 @@ public class ServerIssueActions implements ServerComponent { private final IssueWorkflow workflow; private final IssueUpdater issueUpdater; private final IssueDao issueDao; + private final IssueChangeDao issueChangeDao; private final IssueStorage issueStorage; private final AuthorizationDao authorizationDao; @@ -55,12 +54,13 @@ public class ServerIssueActions implements ServerComponent { IssueDao issueDao, IssueStorage issueStorage, AuthorizationDao authorizationDao, - IssueUpdater issueUpdater) { + IssueUpdater issueUpdater, IssueChangeDao issueChangeDao) { this.workflow = workflow; this.issueDao = issueDao; this.issueStorage = issueStorage; this.issueUpdater = issueUpdater; this.authorizationDao = authorizationDao; + this.issueChangeDao = issueChangeDao; } public List<Transition> listTransitions(String issueKey, UserSession userSession) { @@ -105,17 +105,23 @@ public class ServerIssueActions implements ServerComponent { return issue; } - public DefaultIssue addComment(String issueKey, String comment, UserSession userSession) { + public IssueComment addComment(String issueKey, String comment, UserSession userSession) { DefaultIssue issue = loadIssue(issueKey, userSession); IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.login()); issueUpdater.addComment(issue, comment, context); issueStorage.save(issue); - return issue; + return issue.newComments().get(0); + } + + public IssueComment[] comments(String issueKey, UserSession userSession) { + // TODO verify authorization + return issueChangeDao.selectIssueComments(issueKey); } - public List<IssueComment> comments(String issueKey, UserSession userSession) { - throw new UnsupportedOperationException("TODO"); + public FieldDiffs[] changes(String issueKey, UserSession userSession) { + // TODO verify authorization + return issueChangeDao.selectIssueChanges(issueKey); } public Issue create(DefaultIssue issue, UserSession userSession) { diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb index 9f89bc7e9a9..a259731a5fb 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb @@ -29,11 +29,11 @@ class Api::IssuesController < Api::ApiController def search results = Api.issues.find(params) render :json => jsonp( - { - :securityExclusions => results.securityExclusions, - :paging => paging_to_json(results.paging), - :issues => results.issues.map { |issue| issue_to_json(issue) } - } + { + :securityExclusions => results.securityExclusions, + :paging => paging_to_json(results.paging), + :issues => results.issues.map { |issue| issue_to_json(issue) } + } ) end @@ -49,9 +49,9 @@ class Api::IssuesController < Api::ApiController issue_key = params[:issue] transitions = Internal.issues.listTransitions(issue_key) render :json => jsonp( - { - :transitions => transitions.map { |t| t.key() } - } + { + :transitions => transitions.map { |t| t.key() } + } ) end @@ -68,7 +68,7 @@ class Api::IssuesController < Api::ApiController issue = Internal.issues.doTransition(params[:issue], params[:transition]) if issue render :json => jsonp({ - :issue => issue_to_json(issue) + :issue => issue_to_json(issue) }) else render :status => 400 @@ -90,8 +90,25 @@ class Api::IssuesController < Api::ApiController require_parameters :issue, :text text = Api::Utils.read_post_request_param(params[:text]) - issue = Internal.issues.addComment(params[:issue], text) - render :json => jsonp({:comment => comment_to_json(issue.newComments().get(0))}) + comment = Internal.issues.addComment(params[:issue], text) + render :json => jsonp({:comment => comment_to_json(comment)}) + end + + # + # GET /api/issues/comments?issue=<key> + # + # -- Example + # curl -v -u admin:admin 'http://localhost:9000/api/issues/comments?issue=4a2881e7-825e-4140-a154-01f420c43d11' + # + def comments + require_parameters :issue + + comments = Internal.issues.comments(params[:issue]) + render :json => jsonp( + { + :comments => comments.map { |comment| comment_to_json(comment) } + } + ) end # @@ -160,11 +177,11 @@ class Api::IssuesController < Api::ApiController def issue_to_json(issue) json = { - :key => issue.key, - :component => issue.componentKey, - :rule => issue.ruleKey.toString(), - :resolution => issue.resolution, - :status => issue.status + :key => issue.key, + :component => issue.componentKey, + :rule => issue.ruleKey.toString(), + :resolution => issue.resolution, + :status => issue.status } json[:severity] = issue.severity if issue.severity json[:desc] = issue.description if issue.description @@ -182,19 +199,19 @@ class Api::IssuesController < Api::ApiController def comment_to_json(comment) { - :key => comment.key(), - :text => comment.text(), - :createdAt => format_java_datetime(comment.createdAt()), - :login => comment.userLogin() + :key => comment.key(), + :text => comment.text(), + :createdAt => format_java_datetime(comment.createdAt()), + :login => comment.userLogin() } end def paging_to_json(paging) { - :pageIndex => paging.pageIndex, - :pageSize => paging.pageSize, - :total => paging.total, - :pages => paging.pages + :pageIndex => paging.pageIndex, + :pageSize => paging.pageSize, + :total => paging.total, + :pages => paging.pages } end |