]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10134 Remove QualityGates usage from copy action
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Tue, 5 Dec 2017 12:44:22 +0000 (13:44 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 14 Dec 2017 16:03:35 +0000 (17:03 +0100)
server/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGateUpdater.java
server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/CopyAction.java
server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java
server/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java

index 4e756c0ab9796bb078aef8bb4d8dd608dda1ae7f..0ef74ade3b3cf082c9b5ea9a9884e733b95e294d 100644 (file)
@@ -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<String> 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<String> 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<String> 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"));
     }
   }
 }
index 187e71c3436e4768d08201d0f853aea531697f19..2d2ecee9df91750b4a84278d0efc05c2d75d77c6 100644 (file)
@@ -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();
   }
 
 }
index a7eb5845be1b846fd0fb754b13200a7a97a70a45..5ee63742748468eb55c1829509d8f84074acf57c 100644 (file)
@@ -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")
index 5d009b84579aaebd9963d9fa68e2bd5c09651fc6..865ddb4f098330fc15e41d5242e6ba4c768e0142 100644 (file)
@@ -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();