From 7fcd05dd2c759ee0fed1c6379cf1501ae746fd52 Mon Sep 17 00:00:00 2001 From: Guillaume Jambet Date: Tue, 5 Dec 2017 13:44:22 +0100 Subject: [PATCH] SONAR-10134 Remove QualityGates usage from copy action --- .../qualitygate/QualityGateUpdater.java | 32 +++++++++++++-- .../server/qualitygate/ws/CopyAction.java | 40 +++++++++++++++---- .../server/qualitygate/ws/CopyActionTest.java | 11 +++-- .../qualitygate/ws/QualityGatesWsTest.java | 10 ----- 4 files changed, 68 insertions(+), 25 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateUpdater.java index 4e756c0ab97..0ef74ade3b3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateUpdater.java @@ -27,12 +27,14 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.property.PropertyDto; +import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.util.Validation; import static com.google.common.base.Strings.isNullOrEmpty; import static java.lang.String.format; +import static org.sonar.server.util.Validation.IS_ALREADY_USED_MESSAGE; import static org.sonar.server.ws.WsUtils.checkRequest; public class QualityGateUpdater { @@ -48,7 +50,7 @@ public class QualityGateUpdater { } public QualityGateDto create(DbSession dbSession, OrganizationDto organizationDto, String name) { - validateQualityGate(dbSession, organizationDto, name); + validateQualityGateCreation(dbSession, organizationDto, name); QualityGateDto newQualityGate = new QualityGateDto() .setName(name) .setBuiltIn(false) @@ -58,6 +60,30 @@ public class QualityGateUpdater { return newQualityGate; } + public QualityGateDto copy(DbSession dbSession, QualityGateDto qualityGateDto, String destinationName) { + + validateQualityGateUpdate(dbSession, qualityGateDto.getId(), destinationName); + + QualityGateDto destinationGate = new QualityGateDto().setName(destinationName).setBuiltIn(false).setUuid(uuidFactory.create()); + dbClient.qualityGateDao().insert(dbSession, destinationGate); + + for (QualityGateConditionDto sourceCondition : dbClient.gateConditionDao().selectForQualityGate(dbSession, qualityGateDto.getId())) { + dbClient.gateConditionDao().insert(new QualityGateConditionDto().setQualityGateId(destinationGate.getId()) + .setMetricId(sourceCondition.getMetricId()).setOperator(sourceCondition.getOperator()) + .setWarningThreshold(sourceCondition.getWarningThreshold()).setErrorThreshold(sourceCondition.getErrorThreshold()).setPeriod(sourceCondition.getPeriod()), + dbSession); + } + + return destinationGate; + } + + private void validateQualityGateUpdate(DbSession dbSession, Long qualityGateId, String name) { + List errors = new ArrayList<>(); + checkQualityGateDoesNotAlreadyExist(dbSession, qualityGateId, name, errors); + checkRequest(errors.isEmpty(), errors); + } + + public void setDefault(DbSession dbSession, @Nullable QualityGateDto qualityGateDto) { if (qualityGateDto == null) { dbClient.propertiesDao().deleteGlobalProperty(SONAR_QUALITYGATE_PROPERTY, dbSession); @@ -75,7 +101,7 @@ public class QualityGateUpdater { } } - private void validateQualityGate(DbSession dbSession, OrganizationDto organizationDto, @Nullable String name) { + private void validateQualityGateCreation(DbSession dbSession, OrganizationDto organizationDto, @Nullable String name) { List errors = new ArrayList<>(); if (isNullOrEmpty(name)) { errors.add(format(Validation.CANT_BE_EMPTY_MESSAGE, "Name")); @@ -88,7 +114,7 @@ public class QualityGateUpdater { private void checkQualityGateDoesNotAlreadyExist(DbSession dbSession, OrganizationDto organizationDto, String name, List errors) { QualityGateDto existingQgate = dbClient.qualityGateDao().selectByOrganizationAndName(dbSession, organizationDto, name); if (existingQgate != null) { - errors.add(format(Validation.IS_ALREADY_USED_MESSAGE, "Name")); + errors.add(format(IS_ALREADY_USED_MESSAGE, "Name")); } } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/CopyAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/CopyAction.java index 187e71c3436..2d2ecee9df9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/CopyAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/CopyAction.java @@ -22,19 +22,32 @@ package org.sonar.server.qualitygate.ws; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; -import org.sonar.api.utils.text.JsonWriter; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; import org.sonar.db.qualitygate.QualityGateDto; -import org.sonar.server.qualitygate.QualityGates; +import org.sonar.server.organization.DefaultOrganizationProvider; +import org.sonar.server.qualitygate.QualityGateUpdater; +import org.sonar.server.user.UserSession; +import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES; +import static org.sonar.server.qualitygate.ws.QualityGatesWs.parseId; +import static org.sonar.server.qualitygate.ws.QualityGatesWs.writeQualityGate; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ID; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_NAME; +import static org.sonar.server.ws.WsUtils.checkFound; public class CopyAction implements QualityGatesWsAction { - private final QualityGates qualityGates; + private final DbClient dbClient; + private final UserSession userSession; + private final DefaultOrganizationProvider organizationProvider; + private final QualityGateUpdater qualityGateUpdater; - public CopyAction(QualityGates qualityGates) { - this.qualityGates = qualityGates; + public CopyAction(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider organizationProvider, QualityGateUpdater qualityGateUpdater) { + this.dbClient = dbClient; + this.userSession = userSession; + this.organizationProvider = organizationProvider; + this.qualityGateUpdater = qualityGateUpdater; } @Override @@ -59,9 +72,20 @@ public class CopyAction implements QualityGatesWsAction { @Override public void handle(Request request, Response response) { - QualityGateDto newQualityGate = qualityGates.copy(QualityGatesWs.parseId(request, PARAM_ID), request.mandatoryParam(PARAM_NAME)); - JsonWriter writer = response.newJsonWriter(); - QualityGatesWs.writeQualityGate(newQualityGate, writer).close(); + Long id = parseId(request, PARAM_ID); + String destinationName = request.mandatoryParam(PARAM_NAME); + + userSession.checkPermission(ADMINISTER_QUALITY_GATES, organizationProvider.get().getUuid()); + + QualityGateDto result; + try (DbSession dbSession = dbClient.openSession(false)) { + QualityGateDto qualityGateDto = dbClient.qualityGateDao().selectById(dbSession, id); + checkFound(qualityGateDto, "No quality gate has been found for id %s", (long) id); + result = qualityGateUpdater.copy(dbSession, qualityGateDto, destinationName); + dbSession.commit(); + } + + writeQualityGate(result, response.newJsonWriter()).close(); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java index a7eb5845be1..5ee63742748 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java @@ -35,7 +35,7 @@ import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; -import org.sonar.server.qualitygate.QualityGates; +import org.sonar.server.qualitygate.QualityGateUpdater; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsActionTester; @@ -57,10 +57,13 @@ public class CopyActionTest { @Rule public DbTester db = DbTester.create(System2.INSTANCE); - private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); - private CopyAction underTest = new CopyAction(new QualityGates(dbClient, userSession, defaultOrganizationProvider, UuidFactoryFast.getInstance())); + private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); + private QualityGateUpdater qualityGateUpdater = new QualityGateUpdater(dbClient, UuidFactoryFast.getInstance()); + private QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider); + + private CopyAction underTest = new CopyAction(dbClient, userSession, defaultOrganizationProvider, qualityGateUpdater); private WsActionTester ws = new WsActionTester(underTest); @Test @@ -145,7 +148,7 @@ public class CopyActionTest { userSession.addPermission(ADMINISTER_QUALITY_GATES, defaultOrganizationProvider.get().getUuid()); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("There is no quality gate with id=123"); + expectedException.expectMessage("No quality gate has been found for id 123"); ws.newRequest() .setParam(PARAM_ID, "123") diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java index 5d009b84579..865ddb4f098 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java @@ -71,7 +71,6 @@ public class QualityGatesWsTest { tester = new WsTester(new QualityGatesWs( new SearchAction(projectFinder), new CreateAction(null, null, null, null), - new CopyAction(qGates), new SetAsDefaultAction(qGates), selectAction, new DeselectAction(qGates, mock(DbClient.class), mock(ComponentFinder.class)))); @@ -85,15 +84,6 @@ public class QualityGatesWsTest { assertThat(controller.description()).isNotEmpty(); assertThat(controller.actions()).hasSize(7); - Action copy = controller.action("copy"); - assertThat(copy).isNotNull(); - assertThat(copy.handler()).isNotNull(); - assertThat(copy.since()).isEqualTo("4.3"); - assertThat(copy.isPost()).isTrue(); - assertThat(copy.param("id")).isNotNull(); - assertThat(copy.param("name")).isNotNull(); - assertThat(copy.isInternal()).isFalse(); - Action setDefault = controller.action("set_as_default"); assertThat(setDefault).isNotNull(); assertThat(setDefault.handler()).isNotNull(); -- 2.39.5