From f4073f2ccd796ca138e6ca19fe3e6d4c33cf6cc4 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 7 May 2013 16:23:01 +0200 Subject: [PATCH] SONAR-3755 Manage action plan management console with Java instead of Ruby --- ...PlanFinder.java => ActionPlanManager.java} | 36 ++++++-- .../sonar/core/issue/DefaultActionPlan.java | 22 ++--- .../sonar/core/issue/db/ActionPlanDao.java | 30 +++++++ .../sonar/core/issue/db/ActionPlanDto.java | 17 +++- .../sonar/core/issue/db/ActionPlanMapper.java | 15 ++-- .../sonar/core/issue/db/ActionPlanMapper.xml | 30 +++++++ .../org/sonar/core/persistence/schema-h2.ddl | 1 - ...erTest.java => ActionPlanManagerTest.java} | 52 ++++++++--- .../core/issue/db/ActionPlanDaoTest.java | 30 +++++++ .../should_delete_action_plan-result.xml | 6 ++ .../should_delete_action_plan.xml | 9 ++ .../should_insert_new_action_plan-result.xml | 6 ++ .../should_update_action_plan-result.xml | 6 ++ .../should_update_action_plan.xml | 6 ++ .../java/org/sonar/api/issue/ActionPlan.java | 4 +- .../server/issue/ServerIssueActions.java | 8 +- .../sonar/server/issue/ServerIssueFinder.java | 10 +-- .../sonar/server/issue/WebIssuesInternal.java | 90 +++++++++++++++++-- .../org/sonar/server/platform/Platform.java | 4 +- .../api/action_plans_controller.rb | 33 +++++++ .../app/controllers/issue_controller.rb | 4 +- .../issues_action_plans_controller.rb | 54 +++++------ .../views/issues_action_plans/_new.html.erb | 13 +-- .../server/issue/ServerIssueFinderTest.java | 8 +- 24 files changed, 392 insertions(+), 102 deletions(-) rename sonar-core/src/main/java/org/sonar/core/issue/{ActionPlanFinder.java => ActionPlanManager.java} (81%) rename sonar-core/src/test/java/org/sonar/core/issue/{ActionPlanFinderTest.java => ActionPlanManagerTest.java} (71%) create mode 100644 sonar-core/src/test/resources/org/sonar/core/issue/db/ActionPlanDaoTest/should_delete_action_plan-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/issue/db/ActionPlanDaoTest/should_delete_action_plan.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/issue/db/ActionPlanDaoTest/should_insert_new_action_plan-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/issue/db/ActionPlanDaoTest/should_update_action_plan-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/issue/db/ActionPlanDaoTest/should_update_action_plan.xml create mode 100644 sonar-server/src/main/webapp/WEB-INF/app/controllers/api/action_plans_controller.rb diff --git a/sonar-core/src/main/java/org/sonar/core/issue/ActionPlanFinder.java b/sonar-core/src/main/java/org/sonar/core/issue/ActionPlanManager.java similarity index 81% rename from sonar-core/src/main/java/org/sonar/core/issue/ActionPlanFinder.java rename to sonar-core/src/main/java/org/sonar/core/issue/ActionPlanManager.java index bd52732b61d..56634d7dddd 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/ActionPlanFinder.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/ActionPlanManager.java @@ -35,6 +35,7 @@ import org.sonar.core.resource.ResourceQuery; import javax.annotation.Nullable; import java.util.Collection; +import java.util.Date; import java.util.List; import static com.google.common.collect.Lists.newArrayList; @@ -42,21 +43,41 @@ import static com.google.common.collect.Lists.newArrayList; /** * @since 3.6 */ -public class ActionPlanFinder implements ServerComponent { +public class ActionPlanManager implements ServerComponent { private final ActionPlanDao actionPlanDao; private final ActionPlanStatsDao actionPlanStatsDao; private final ResourceDao resourceDao; - public ActionPlanFinder(ActionPlanDao actionPlanDao, ActionPlanStatsDao actionPlanStatsDao, ResourceDao resourceDao) { + public ActionPlanManager(ActionPlanDao actionPlanDao, ActionPlanStatsDao actionPlanStatsDao, ResourceDao resourceDao) { this.actionPlanDao = actionPlanDao; this.actionPlanStatsDao = actionPlanStatsDao; this.resourceDao = resourceDao; } - public Collection findByKeys(Collection keys) { - Collection actionPlanDtos = actionPlanDao.findByKeys(keys); - return toActionPlans(actionPlanDtos); + public ActionPlan create(ActionPlan actionPlan, Integer projectId){ + actionPlanDao.save(ActionPlanDto.toActionDto(actionPlan, projectId)); + return actionPlan; + } + + public ActionPlan update(DefaultActionPlan actionPlan, Integer projectId){ + actionPlanDao.update(ActionPlanDto.toActionDto(actionPlan, projectId)); + return actionPlan; + } + + public void delete(String key){ + actionPlanDao.delete(key); + } + + public ActionPlan setStatus(String key, String status){ + ActionPlanDto actionPlanDto = actionPlanDao.findByKey(key); + if (actionPlanDto == null) { + throw new IllegalArgumentException("Action plan " + key + " has not been found."); + } + actionPlanDto.setStatus(status); + actionPlanDto.setCreatedAt(new Date()); + actionPlanDao.update(actionPlanDto); + return actionPlanDto.toActionPlan(); } public ActionPlan findByKey(String key) { @@ -67,6 +88,11 @@ public class ActionPlanFinder implements ServerComponent { return actionPlanDto.toActionPlan(); } + public Collection findByKeys(Collection keys) { + Collection actionPlanDtos = actionPlanDao.findByKeys(keys); + return toActionPlans(actionPlanDtos); + } + public Collection findOpenByProjectKey(String projectKey) { ResourceDto resourceDto = resourceDao.getResource(ResourceQuery.create().setKey(projectKey)); if (resourceDto == null) { diff --git a/sonar-core/src/main/java/org/sonar/core/issue/DefaultActionPlan.java b/sonar-core/src/main/java/org/sonar/core/issue/DefaultActionPlan.java index 3e3b3b24608..8c48c5c5f2c 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/DefaultActionPlan.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/DefaultActionPlan.java @@ -33,8 +33,8 @@ public class DefaultActionPlan implements ActionPlan { private String userLogin; private String status; private Date deadLine; - private Date creationDate; - private Date updateDate; + private Date createdAt; + private Date updatedAt; private DefaultActionPlan(){ @@ -46,7 +46,7 @@ public class DefaultActionPlan implements ActionPlan { Date now = new Date(); actionPlan.setName(name); actionPlan.setStatus(ActionPlan.STATUS_OPEN); - actionPlan.setCreationDate(now).setUpdateDate(now); + actionPlan.setCreatedAt(now).setUpdatedAt(now); return actionPlan; } @@ -104,21 +104,21 @@ public class DefaultActionPlan implements ActionPlan { return this; } - public Date creationDate() { - return creationDate; + public Date createdAt() { + return createdAt; } - public DefaultActionPlan setCreationDate(Date creationDate) { - this.creationDate = creationDate; + public DefaultActionPlan setCreatedAt(Date createdAt) { + this.createdAt = createdAt; return this; } - public Date updateDate() { - return updateDate; + public Date updatedAt() { + return updatedAt; } - public DefaultActionPlan setUpdateDate(Date updateDate) { - this.updateDate = updateDate; + public DefaultActionPlan setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; return this; } } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java index ceff877ce81..6c90a39bf05 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDao.java @@ -43,6 +43,36 @@ public class ActionPlanDao implements BatchComponent, ServerComponent { this.mybatis = mybatis; } + public void save(ActionPlanDto actionPlanDto) { + SqlSession session = mybatis.openSession(); + try { + session.getMapper(ActionPlanMapper.class).insert(actionPlanDto); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + public void update(ActionPlanDto actionPlanDto) { + SqlSession session = mybatis.openSession(); + try { + session.getMapper(ActionPlanMapper.class).update(actionPlanDto); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + public void delete(String key) { + SqlSession session = mybatis.openSession(); + try { + session.getMapper(ActionPlanMapper.class).delete(key); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + public ActionPlanDto findByKey(String key) { SqlSession session = mybatis.openSession(); try { diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDto.java b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDto.java index 9727acae0e9..cbdade5f633 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDto.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanDto.java @@ -22,6 +22,7 @@ package org.sonar.core.issue.db; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; +import org.sonar.api.issue.ActionPlan; import org.sonar.core.issue.DefaultActionPlan; import java.util.Date; @@ -162,7 +163,19 @@ public class ActionPlanDto { .setStatus(status) .setDeadLine(deadLine) .setUserLogin(userLogin) - .setCreationDate(createdAt) - .setUpdateDate(updatedAt); + .setCreatedAt(createdAt) + .setUpdatedAt(updatedAt); + } + + public static ActionPlanDto toActionDto(ActionPlan actionPlan, Integer projectId) { + return new ActionPlanDto().setKey(actionPlan.key()) + .setName(actionPlan.name()) + .setProjectId(projectId) + .setDescription(actionPlan.description()) + .setStatus(actionPlan.status()) + .setDeadLine(actionPlan.deadLine()) + .setUserLogin(actionPlan.userLogin()) + .setCreatedAt(actionPlan.createdAt()) + .setUpdatedAt(actionPlan.updatedAt()); } } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanMapper.java b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanMapper.java index b167fdc7f0a..6d28aaee479 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/ActionPlanMapper.java @@ -30,18 +30,15 @@ import java.util.List; */ public interface ActionPlanMapper { - /** - * @since3.6 - */ + void insert(ActionPlanDto actionPlanDto); + + void update(ActionPlanDto actionPlanDto); + + void delete(@Param("key") String key); + Collection findByKeys(@Param("keys") List > keys); - /** - * @since3.6 - */ ActionPlanDto findByKey(@Param("key") String key); - /** - * @since3.6 - */ Collection findOpenByProjectId(@Param("projectId") Long projectId); } diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/ActionPlanMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/ActionPlanMapper.xml index 973ed87acf1..3e9f7b85b20 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/ActionPlanMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/ActionPlanMapper.xml @@ -17,6 +17,36 @@ ap.updated_at as updatedAt + + INSERT INTO action_plans (kee, name, description, user_login, project_id, status, deadline, created_at, updated_at) + VALUES (#{kee}, #{name}, #{description}, #{userLogin}, #{projectId}, #{status}, #{deadLine}, #{createdAt}, #{updatedAt}) + + + + + + select issues_seq.NEXTVAL from DUAL + + INSERT INTO action_plans (id, kee, name, description, user_login, project_id, status, deadline, created_at, updated_at) + VALUES (#{id}, #{kee}, #{name}, #{description}, #{userLogin}, #{projectId}, #{status}, #{deadLine}, #{createdAt}, #{updatedAt}) + + + + update action_plans set + name=#{name}, + description=#{description}, + user_login=#{userLogin}, + project_id=#{projectId}, + status=#{status}, + deadline=#{deadLine}, + updated_at=current_timestamp + where kee = #{kee} + + + + delete from action_plans where kee=#{key} + + - + -

<%= @action_plan && @action_plan.key ? message('action_plans.edit_action_plan') : message('action_plans.create_new_action_plan') -%>

+

<%= @action_plan && @action_plan.key() ? message('action_plans.edit_action_plan') : message('action_plans.create_new_action_plan') -%>

<%= message('action_plans.col.name') -%>:
- + <%= message('action_plans.col.due_for') -%>:
- + <% deadline = Api::Utils.to_date(plan.deadLine()) if @action_plan && @action_plan.deadLine() %> +
<%= message('action_plans.date_format_help') -%> @@ -26,12 +27,12 @@ <%= message('action_plans.col.description') -%>:
- + - + diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueFinderTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueFinderTest.java index 11e1821c352..2654bf42fcd 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueFinderTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ServerIssueFinderTest.java @@ -31,7 +31,7 @@ import org.sonar.api.issue.IssueQuery; import org.sonar.api.rules.Rule; import org.sonar.api.web.UserRole; import org.sonar.core.component.ComponentDto; -import org.sonar.core.issue.ActionPlanFinder; +import org.sonar.core.issue.ActionPlanManager; import org.sonar.core.issue.DefaultActionPlan; import org.sonar.core.issue.db.IssueDao; import org.sonar.core.issue.db.IssueDto; @@ -61,8 +61,8 @@ public class ServerIssueFinderTest { AuthorizationDao authorizationDao = mock(AuthorizationDao.class); DefaultRuleFinder ruleFinder = mock(DefaultRuleFinder.class); ResourceDao resourceDao = mock(ResourceDao.class); - ActionPlanFinder actionPlanFinder = mock(ActionPlanFinder.class); - ServerIssueFinder finder = new ServerIssueFinder(mybatis, issueDao, authorizationDao, ruleFinder, resourceDao, actionPlanFinder); + ActionPlanManager actionPlanManager = mock(ActionPlanManager.class); + ServerIssueFinder finder = new ServerIssueFinder(mybatis, issueDao, authorizationDao, ruleFinder, resourceDao, actionPlanManager); @Test public void should_find_issues() { @@ -228,7 +228,7 @@ public class ServerIssueFinderTest { List dtoList = newArrayList(issue1, issue2); when(issueDao.selectIssueIdsAndComponentsId(eq(query), any(SqlSession.class))).thenReturn(dtoList); when(issueDao.selectByIds(anyCollection(), any(SqlSession.class))).thenReturn(dtoList); - when(actionPlanFinder.findByKeys(anyCollection())).thenReturn(newArrayList(actionPlan1, actionPlan2)); + when(actionPlanManager.findByKeys(anyCollection())).thenReturn(newArrayList(actionPlan1, actionPlan2)); IssueFinder.Results results = finder.find(query, null, UserRole.USER); assertThat(results.issues()).hasSize(2); -- 2.39.5