]> source.dussan.org Git - sonarqube.git/commitdiff
Move custom measures in sonar-db
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 15 Jul 2015 15:44:56 +0000 (17:44 +0200)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Thu, 16 Jul 2015 07:04:58 +0000 (09:04 +0200)
36 files changed:
server/sonar-server/src/main/java/org/sonar/server/computation/step/CustomMeasuresCopyStep.java
server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/CustomMeasureDao.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/package-info.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CustomMeasureJsonWriter.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/CustomMeasureValidator.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/DeleteAction.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/measure/custom/ws/UpdateAction.java
server/sonar-server/src/main/java/org/sonar/server/metric/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/metric/ws/UpdateAction.java
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/CustomMeasuresCopyStepTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureDaoTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureTesting.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/CustomMeasureValidatorTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/DeleteActionTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/MetricsActionTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/SearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/measure/custom/ws/UpdateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/metric/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/metric/ws/DeleteActionTest.java
server/sonar-server/src/test/java/org/sonar/server/metric/ws/UpdateActionTest.java
sonar-db/src/main/java/org/sonar/db/DbClient.java
sonar-db/src/main/java/org/sonar/db/MyBatis.java
sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureDto.java [deleted file]
sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureMapper.java [deleted file]
sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDao.java [new file with mode: 0644]
sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDto.java [new file with mode: 0644]
sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureMapper.java [new file with mode: 0644]
sonar-db/src/main/resources/org/sonar/db/measure/CustomMeasureMapper.xml [deleted file]
sonar-db/src/main/resources/org/sonar/db/measure/custom/CustomMeasureMapper.xml [new file with mode: 0644]
sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureDaoTest.java [new file with mode: 0644]
sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureTesting.java [new file with mode: 0644]

index 1a530decd6d6bb8805f30dac3850b01bc7ba83f2..608bb3770b3af77bf736e3b6521f1aa01ba046a8 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.server.computation.step;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.List;
 import org.apache.commons.lang.math.NumberUtils;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
 import org.sonar.server.computation.component.Component;
index ff7dd58da366a4d7f56c18329b88435a12188687..25c758334e00a50290520fe8f1d664f900cc088f 100644 (file)
@@ -23,7 +23,7 @@ import java.util.Map;
 import org.sonar.db.Dao;
 import org.sonar.db.Database;
 import org.sonar.db.MyBatis;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.qualityprofile.db.ActiveRuleDao;
 import org.sonar.server.rule.db.RuleDao;
diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/CustomMeasureDao.java b/server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/CustomMeasureDao.java
deleted file mode 100644 (file)
index 9c816ce..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.server.measure.custom.persistence;
-
-import com.google.common.base.Function;
-import java.util.List;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-import org.apache.ibatis.session.RowBounds;
-import org.sonar.api.server.ServerSide;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.db.measure.CustomMeasureDto;
-import org.sonar.db.measure.CustomMeasureMapper;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-import org.sonar.server.es.SearchOptions;
-import org.sonar.server.exceptions.NotFoundException;
-
-@ServerSide
-public class CustomMeasureDao implements Dao {
-  public void insert(DbSession session, CustomMeasureDto customMeasureDto) {
-    mapper(session).insert(customMeasureDto);
-  }
-
-  public void update(DbSession session, CustomMeasureDto customMeasure) {
-    mapper(session).update(customMeasure);
-  }
-
-  public void delete(DbSession session, long id) {
-    mapper(session).delete(id);
-  }
-
-  public void deleteByMetricIds(final DbSession session, final List<Integer> metricIds) {
-    DatabaseUtils.executeLargeInputsWithoutOutput(metricIds, new Function<List<Integer>, Void>() {
-      @Override
-      public Void apply(@Nonnull List<Integer> input) {
-        mapper(session).deleteByMetricIds(metricIds);
-        return null;
-      }
-    });
-  }
-
-  @CheckForNull
-  public CustomMeasureDto selectNullableById(DbSession session, long id) {
-    return mapper(session).selectById(id);
-  }
-
-  public CustomMeasureDto selectById(DbSession session, long id) {
-    CustomMeasureDto customMeasure = selectNullableById(session, id);
-    if (customMeasure == null) {
-      throw new NotFoundException(String.format("Custom measure '%d' not found.", id));
-    }
-    return customMeasure;
-  }
-
-  public List<CustomMeasureDto> selectByMetricId(DbSession session, int metricId) {
-    return mapper(session).selectByMetricId(metricId);
-  }
-
-  public int countByComponentIdAndMetricId(DbSession session, String componentUuid, int metricId) {
-    return mapper(session).countByComponentIdAndMetricId(componentUuid, metricId);
-  }
-
-  public List<CustomMeasureDto> selectByComponentUuid(DbSession session, String componentUuid, SearchOptions searchOptions) {
-    return mapper(session).selectByComponentUuid(componentUuid, new RowBounds(searchOptions.getOffset(), searchOptions.getLimit()));
-  }
-
-  public List<CustomMeasureDto> selectByComponentUuid(DbSession session, String componentUuid) {
-    return mapper(session).selectByComponentUuid(componentUuid);
-  }
-
-  private CustomMeasureMapper mapper(DbSession session) {
-    return session.getMapper(CustomMeasureMapper.class);
-  }
-
-  public int countByComponentUuid(DbSession dbSession, String uuid) {
-    return mapper(dbSession).countByComponentUuid(uuid);
-  }
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/package-info.java b/server/sonar-server/src/main/java/org/sonar/server/measure/custom/persistence/package-info.java
deleted file mode 100644 (file)
index 08372c5..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.
- */
-
-@ParametersAreNonnullByDefault
-package org.sonar.server.measure.custom.persistence;
-
-import javax.annotation.ParametersAreNonnullByDefault;
index cb331120bde48d84fb1b7025c5ecde980dd92266..34cc26e4df6518793e638f834b53eb330257e5ba 100644 (file)
@@ -30,7 +30,7 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.db.DbClient;
index a52e5b7757758b91b3f3830f1639933aa086dfbd..b600a688b2b9c8ed64966de8e7c6b0d12931152c 100644 (file)
@@ -31,7 +31,7 @@ import org.sonar.api.measures.Metric;
 import org.sonar.api.user.User;
 import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.metric.ws.MetricJsonWriter;
 import org.sonar.server.user.ws.UserJsonWriter;
index 8166a713562d82f1434e5581b0bb1ff8560f75aa..457b5356af3abd8bcdc787df16626b3295e1c86d 100644 (file)
@@ -26,7 +26,7 @@ import org.sonar.api.server.ServerSide;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.TypeValidations;
index 9ad8f45fa6d23b53291817319873b2d7ad407e39..f4f2dd10eb715924427ab2b508fa7427d19e9dda 100644 (file)
@@ -28,7 +28,7 @@ import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
index 4f1ce7164190dbc271ca3de882ab27cf5e020885..d62c3894c01508248a1c1ddfb39823f95523a4a8 100644 (file)
@@ -38,7 +38,7 @@ import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.component.SnapshotDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.db.DbClient;
@@ -126,7 +126,7 @@ public class SearchAction implements CustomMeasuresWsAction {
   }
 
   private List<CustomMeasureDto> searchCustomMeasures(DbSession dbSession, ComponentDto project, SearchOptions searchOptions) {
-    return dbClient.customMeasureDao().selectByComponentUuid(dbSession, project.uuid(), searchOptions);
+    return dbClient.customMeasureDao().selectByComponentUuid(dbSession, project.uuid(), searchOptions.getOffset(), searchOptions.getLimit());
   }
 
   private void writeResponse(Response response, List<CustomMeasureDto> customMeasures, int nbCustomMeasures, ComponentDto project, Map<Integer, MetricDto> metricsById,
index 23ffd771c15958fc2bd03b17e5baefb502ac4a02..e1db533b5f6375e334edb57e9cdd21366425b3b8 100644 (file)
@@ -30,7 +30,7 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
index cc6f1127297c71a0e46a15b3ca5fdd74e8505b4e..9c161eedcc76e907f05fc0ee90d0f0811dde7689 100644 (file)
@@ -31,7 +31,7 @@ import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.db.DbSession;
 import org.sonar.db.MyBatis;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ServerException;
index c0b7a535ba3be4fcf2f09e33a45ded540b2c3852..9272ce1bf839aa071ebc34ae40ecaccfd8842d9b 100644 (file)
@@ -28,7 +28,7 @@ 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.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.db.DbSession;
index 5e2f3f54ecae0ae95cfa5d0ed9a36f2f59af3f57..fc0fd4cc1f81f06851adb4524d2322a366336393 100644 (file)
@@ -36,7 +36,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.db.EmbeddedDatabaseFactory;
 import org.sonar.server.db.migrations.MigrationStepModule;
 import org.sonar.server.issue.index.IssueIndex;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.platform.DatabaseServerCompatibility;
 import org.sonar.server.platform.DefaultServerFileSystem;
index 96a21b187ca120af5d47f4140f4f78f712cf7288..d8b81004777f61ced756173ae257bc261ae1e70a 100644 (file)
@@ -26,7 +26,7 @@ import org.junit.experimental.categories.Category;
 import org.mockito.ArgumentCaptor;
 import org.sonar.api.utils.System2;
 import org.sonar.db.DbTester;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.server.computation.batch.BatchReportReaderRule;
 import org.sonar.server.computation.component.Component;
 import org.sonar.server.computation.component.DumbComponent;
@@ -37,7 +37,7 @@ import org.sonar.server.computation.metric.Metric;
 import org.sonar.server.computation.metric.MetricImpl;
 import org.sonar.server.computation.metric.MetricRepository;
 import org.sonar.server.db.DbClient;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.test.DbTests;
 
 import static org.assertj.core.api.Assertions.assertThat;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureDaoTest.java
deleted file mode 100644 (file)
index 8107c1d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.server.measure.custom.persistence;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbSession;
-import org.sonar.db.DbTester;
-import org.sonar.db.measure.CustomMeasureDto;
-import org.sonar.server.db.DbClient;
-import org.sonar.test.DbTests;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.offset;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
-
-@Category(DbTests.class)
-public class CustomMeasureDaoTest {
-  @Rule
-  public DbTester db = DbTester.create(System2.INSTANCE);
-
-  CustomMeasureDao sut;
-  DbSession session;
-
-  @Before
-  public void setUp() {
-    DbClient dbClient = new DbClient(db.database(), db.myBatis(), new CustomMeasureDao());
-    session = dbClient.openSession(false);
-    sut = dbClient.customMeasureDao();
-    db.truncateTables();
-  }
-
-  @After
-  public void tearDown() {
-    session.close();
-  }
-
-  @Test
-  public void insert() {
-    CustomMeasureDto measure = newCustomMeasureDto();
-
-    sut.insert(session, measure);
-
-    CustomMeasureDto result = sut.selectNullableById(session, measure.getId());
-    assertThat(result.getId()).isEqualTo(measure.getId());
-    assertThat(result.getMetricId()).isEqualTo(measure.getMetricId());
-    assertThat(result.getComponentUuid()).isEqualTo(measure.getComponentUuid());
-    assertThat(result.getDescription()).isEqualTo(measure.getDescription());
-    assertThat(result.getUserLogin()).isEqualTo(measure.getUserLogin());
-    assertThat(result.getTextValue()).isEqualTo(measure.getTextValue());
-    assertThat(result.getValue()).isCloseTo(measure.getValue(), offset(0.001d));
-    assertThat(result.getCreatedAt()).isEqualTo(measure.getCreatedAt());
-    assertThat(result.getUpdatedAt()).isEqualTo(measure.getUpdatedAt());
-  }
-
-  @Test
-  public void delete() {
-    CustomMeasureDto measure = newCustomMeasureDto();
-    sut.insert(session, measure);
-    assertThat(sut.selectNullableById(session, measure.getId())).isNotNull();
-
-    sut.deleteByMetricIds(session, Arrays.asList(measure.getMetricId()));
-
-    assertThat(sut.selectNullableById(session, measure.getId())).isNull();
-  }
-
-  @Test
-  public void select_by_component_uuid() {
-    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
-    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
-    sut.insert(session, newCustomMeasureDto().setComponentUuid("u2"));
-    session.commit();
-
-    List<CustomMeasureDto> result = sut.selectByComponentUuid(session, "u1");
-
-    assertThat(result).hasSize(2);
-    assertThat(result).extracting("componentUuid").containsOnly("u1");
-  }
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureTesting.java b/server/sonar-server/src/test/java/org/sonar/server/measure/custom/persistence/CustomMeasureTesting.java
deleted file mode 100644 (file)
index 0de6d64..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.server.measure.custom.persistence;
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.sonar.api.utils.System2;
-import org.sonar.db.measure.CustomMeasureDto;
-
-public class CustomMeasureTesting {
-  private CustomMeasureTesting() {
-    // static stuff only
-  }
-
-  public static CustomMeasureDto newCustomMeasureDto() {
-    return new CustomMeasureDto()
-      .setDescription(RandomStringUtils.randomAlphanumeric(255))
-      .setTextValue(RandomStringUtils.randomAlphanumeric(255))
-      .setUserLogin(RandomStringUtils.randomAlphanumeric(255))
-      .setValue(RandomUtils.nextDouble())
-      .setMetricId(RandomUtils.nextInt())
-      .setComponentUuid(RandomStringUtils.randomAlphanumeric(50))
-      .setCreatedAt(System2.INSTANCE.now())
-      .setUpdatedAt(System2.INSTANCE.now());
-  }
-}
index ecf2acf19543b8b5e4b498f473afab6c35d985ef..1fc4fb5b97d0a91375743a0ae7c28edfedf6e1f1 100644 (file)
@@ -40,7 +40,7 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.component.ComponentTesting;
@@ -50,7 +50,7 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.exceptions.ServerException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.metric.ws.MetricTesting;
 import org.sonar.server.tester.UserSessionRule;
index dc6b6b8e054a43d9fdc52d8179201d8a934cffdc..9c637847457e6886acb3c7b9284a14bb2146dc0a 100644 (file)
@@ -24,9 +24,9 @@ import org.assertj.core.data.Offset;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureTesting;
+import org.sonar.db.measure.custom.CustomMeasureTesting;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.sonar.api.measures.Metric.Level.WARN;
index 088c6eecfc6a735c4c5c18d5c71b32857a3954cc..5d603612f14eb7513d72b5350e8156f09cb1ed1e 100644 (file)
@@ -33,18 +33,18 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 import org.sonar.test.DbTests;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
 import static org.sonar.server.measure.custom.ws.DeleteAction.PARAM_ID;
 
 @Category(DbTests.class)
@@ -102,7 +102,7 @@ public class DeleteActionTest {
 
   @Test
   public void fail_when_not_found_in_db() throws Exception {
-    expectedException.expect(NotFoundException.class);
+    expectedException.expect(IllegalArgumentException.class);
 
     newRequest().setParam(PARAM_ID, "42").execute();
   }
index ac6bb3fb6a8c6d9577c72e2045777c741cef8ffc..89aecef33a0565d81443433847916a19c339f091 100644 (file)
@@ -37,14 +37,14 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.index.UserDoc;
@@ -53,7 +53,7 @@ import org.sonar.server.ws.WsTester;
 import org.sonar.test.DbTests;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
 import static org.sonar.server.measure.custom.ws.CustomMeasuresWs.ENDPOINT;
 import static org.sonar.server.measure.custom.ws.MetricsAction.ACTION;
 import static org.sonar.server.metric.ws.MetricTesting.newMetricDto;
index 61b30a7dcc41a8a9b9e14426da99d27b22ef2f7d..479e4e29a66f63e490f3b4a8fbf1d8a5d6e9a948 100644 (file)
@@ -41,7 +41,7 @@ import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.component.SnapshotDao;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.component.ComponentTesting;
@@ -50,7 +50,7 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.user.index.UserDoc;
@@ -60,7 +60,7 @@ import org.sonar.server.user.ws.UserJsonWriter;
 import org.sonar.server.ws.WsTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
 import static org.sonar.server.metric.ws.MetricTesting.newMetricDto;
 
 public class SearchActionTest {
index e66f2e2d592608e48c9f4f82c0bfdc799a043842..bce9042fdf86eb18563fb92c06c2af3c141286a3 100644 (file)
@@ -36,16 +36,15 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.exceptions.ServerException;
 import org.sonar.server.exceptions.UnauthorizedException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.metric.ws.MetricTesting;
 import org.sonar.server.tester.UserSessionRule;
@@ -60,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.data.Offset.offset;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
 import static org.sonar.server.measure.custom.ws.UpdateAction.PARAM_DESCRIPTION;
 import static org.sonar.server.measure.custom.ws.UpdateAction.PARAM_ID;
 import static org.sonar.server.measure.custom.ws.UpdateAction.PARAM_VALUE;
@@ -244,7 +243,7 @@ public class UpdateActionTest {
 
   @Test
   public void fail_if_not_in_db() throws Exception {
-    expectedException.expect(NotFoundException.class);
+    expectedException.expect(IllegalArgumentException.class);
     expectedException.expectMessage("Custom measure '42' not found.");
 
     ws.newPostRequest(CustomMeasuresWs.ENDPOINT, UpdateAction.ACTION)
index 0f71a63385d279bce949f908f5d6d152eb45bc23..f488261e05b9d5d21929326dcf1c011c22f386d8 100644 (file)
@@ -35,8 +35,8 @@ import org.sonar.db.metric.MetricDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.ServerException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
-import org.sonar.server.measure.custom.persistence.CustomMeasureTesting;
+import org.sonar.db.measure.custom.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureTesting;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.ruby.RubyBridge;
 import org.sonar.server.tester.UserSessionRule;
index 06db2278d429b4b1f877da431cc385f4e2a0e1b7..35fcaad6b28cc38d9f97ff5f23a77a76227a806a 100644 (file)
@@ -32,12 +32,12 @@ import org.sonar.api.utils.System2;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
-import org.sonar.db.measure.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureDto;
 import org.sonar.db.metric.MetricDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
-import org.sonar.server.measure.custom.persistence.CustomMeasureTesting;
+import org.sonar.db.measure.custom.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureTesting;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.ruby.RubyBridge;
 import org.sonar.server.tester.UserSessionRule;
index 9399044fbba6ef47946a37efcfb0136b2b8dbcb0..c4c3f717188ecaaa83fd9359c903c690b4c3d123 100644 (file)
@@ -35,7 +35,7 @@ import org.sonar.db.metric.MetricDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.ServerException;
-import org.sonar.server.measure.custom.persistence.CustomMeasureDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.server.metric.persistence.MetricDao;
 import org.sonar.server.ruby.RubyBridge;
 import org.sonar.server.tester.UserSessionRule;
@@ -45,7 +45,7 @@ import org.sonar.test.DbTests;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
-import static org.sonar.server.measure.custom.persistence.CustomMeasureTesting.newCustomMeasureDto;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
 import static org.sonar.server.metric.ws.UpdateAction.PARAM_DESCRIPTION;
 import static org.sonar.server.metric.ws.UpdateAction.PARAM_DOMAIN;
 import static org.sonar.server.metric.ws.UpdateAction.PARAM_ID;
index 5c63a4ab3a88669419964699540ef6bf26c2bbb0..4ef128b94ec72a92ca9c5167e8f0ee94d5373b46 100644 (file)
@@ -46,6 +46,7 @@ import org.sonar.db.issue.IssueFilterFavouriteDao;
 import org.sonar.db.loadedtemplate.LoadedTemplateDao;
 import org.sonar.db.measure.MeasureDao;
 import org.sonar.db.measure.MeasureFilterDao;
+import org.sonar.db.measure.custom.CustomMeasureDao;
 import org.sonar.db.notification.NotificationQueueDao;
 import org.sonar.db.permission.PermissionDao;
 import org.sonar.db.permission.PermissionTemplateDao;
@@ -107,8 +108,9 @@ public class DbClient {
   private final ProjectQgateAssociationDao projectQgateAssociationDao;
   private final DuplicationDao duplicationDao;
   private final NotificationQueueDao notificationQueueDao;
+  private final CustomMeasureDao customMeasureDao;
 
-  public DbClient(Database database, MyBatis myBatis, Dao[] daos) {
+  public DbClient(Database database, MyBatis myBatis, Dao ... daos) {
     this.database = database;
     this.myBatis = myBatis;
 
@@ -156,6 +158,7 @@ public class DbClient {
     projectQgateAssociationDao = getDao(map, ProjectQgateAssociationDao.class);
     duplicationDao = getDao(map, DuplicationDao.class);
     notificationQueueDao = getDao(map, NotificationQueueDao.class);
+    customMeasureDao = getDao(map, CustomMeasureDao.class);
     doOnLoad(map);
   }
 
@@ -336,6 +339,10 @@ public class DbClient {
     return notificationQueueDao;
   }
 
+  public CustomMeasureDao customMeasureDao() {
+    return customMeasureDao;
+  }
+
   protected <K extends Dao> K getDao(Map<Class, Dao> map, Class<K> clazz) {
     return (K) map.get(clazz);
   }
index 8bf39f3dedf07e87183e3fd203e8d2232e52ae33..e1a6fd9dfd98f96fcb4df76aa948dca0eb178a51 100644 (file)
@@ -87,8 +87,8 @@ import org.sonar.db.issue.IssueFilterMapper;
 import org.sonar.db.issue.IssueMapper;
 import org.sonar.db.loadedtemplate.LoadedTemplateDto;
 import org.sonar.db.loadedtemplate.LoadedTemplateMapper;
-import org.sonar.db.measure.CustomMeasureDto;
-import org.sonar.db.measure.CustomMeasureMapper;
+import org.sonar.db.measure.custom.CustomMeasureDto;
+import org.sonar.db.measure.custom.CustomMeasureMapper;
 import org.sonar.db.measure.MeasureDto;
 import org.sonar.db.measure.MeasureFilterDto;
 import org.sonar.db.measure.MeasureFilterMapper;
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureDto.java b/sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureDto.java
deleted file mode 100644 (file)
index e7387d3..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.db.measure;
-
-public class CustomMeasureDto {
-  private long id;
-  private int metricId;
-  private String componentUuid;
-  private double value;
-  private String textValue;
-  private String userLogin;
-  private String description;
-  private long createdAt;
-  private long updatedAt;
-
-  public String getDescription() {
-    return description;
-  }
-
-  public CustomMeasureDto setDescription(String description) {
-    this.description = description;
-    return this;
-  }
-
-  public String getUserLogin() {
-    return userLogin;
-  }
-
-  public CustomMeasureDto setUserLogin(String userLogin) {
-    this.userLogin = userLogin;
-    return this;
-  }
-
-  public String getTextValue() {
-    return textValue;
-  }
-
-  public CustomMeasureDto setTextValue(String textValue) {
-    this.textValue = textValue;
-    return this;
-  }
-
-  public double getValue() {
-    return value;
-  }
-
-  public CustomMeasureDto setValue(double value) {
-    this.value = value;
-    return this;
-  }
-
-  public int getMetricId() {
-    return metricId;
-  }
-
-  public CustomMeasureDto setMetricId(int metricId) {
-    this.metricId = metricId;
-    return this;
-  }
-
-  public long getId() {
-    return id;
-  }
-
-  public CustomMeasureDto setId(long id) {
-    this.id = id;
-    return this;
-  }
-
-  public long getUpdatedAt() {
-    return updatedAt;
-  }
-
-  public CustomMeasureDto setUpdatedAt(long updatedAt) {
-    this.updatedAt = updatedAt;
-    return this;
-  }
-
-  public long getCreatedAt() {
-    return createdAt;
-  }
-
-  public CustomMeasureDto setCreatedAt(long createdAt) {
-    this.createdAt = createdAt;
-    return this;
-  }
-
-  public String getComponentUuid() {
-    return componentUuid;
-  }
-
-  public CustomMeasureDto setComponentUuid(String componentUuid) {
-    this.componentUuid = componentUuid;
-    return this;
-  }
-}
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureMapper.java b/sonar-db/src/main/java/org/sonar/db/measure/CustomMeasureMapper.java
deleted file mode 100644 (file)
index e5f4629..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 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.db.measure;
-
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.session.RowBounds;
-
-public interface CustomMeasureMapper {
-  void insert(CustomMeasureDto customMeasure);
-
-  void update(CustomMeasureDto customMeasure);
-
-  void delete(long id);
-
-  void deleteByMetricIds(@Param("metricIds") List<Integer> metricIds);
-
-  CustomMeasureDto selectById(long id);
-
-  List<CustomMeasureDto> selectByMetricId(int id);
-
-  List<CustomMeasureDto> selectByComponentUuid(String s);
-
-  List<CustomMeasureDto> selectByComponentUuid(String s, RowBounds rowBounds);
-
-  int countByComponentUuid(String componentUuid);
-
-  int countByComponentIdAndMetricId(@Param("componentUuid") String componentUuid, @Param("metricId") int metricId);
-}
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDao.java b/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDao.java
new file mode 100644 (file)
index 0000000..28af785
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.db.measure.custom;
+
+import com.google.common.base.Function;
+import java.util.List;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import org.apache.ibatis.session.RowBounds;
+import org.sonar.api.server.ServerSide;
+import org.sonar.db.Dao;
+import org.sonar.db.DatabaseUtils;
+import org.sonar.db.DbSession;
+
+@ServerSide
+public class CustomMeasureDao implements Dao {
+  public void insert(DbSession session, CustomMeasureDto customMeasureDto) {
+    mapper(session).insert(customMeasureDto);
+  }
+
+  public void update(DbSession session, CustomMeasureDto customMeasure) {
+    mapper(session).update(customMeasure);
+  }
+
+  public void delete(DbSession session, long id) {
+    mapper(session).delete(id);
+  }
+
+  public void deleteByMetricIds(final DbSession session, final List<Integer> metricIds) {
+    DatabaseUtils.executeLargeInputsWithoutOutput(metricIds, new Function<List<Integer>, Void>() {
+      @Override
+      public Void apply(@Nonnull List<Integer> input) {
+        mapper(session).deleteByMetricIds(metricIds);
+        return null;
+      }
+    });
+  }
+
+  @CheckForNull
+  public CustomMeasureDto selectNullableById(DbSession session, long id) {
+    return mapper(session).selectById(id);
+  }
+
+  public CustomMeasureDto selectById(DbSession session, long id) {
+    CustomMeasureDto customMeasure = selectNullableById(session, id);
+    if (customMeasure == null) {
+      throw new IllegalArgumentException(String.format("Custom measure '%d' not found.", id));
+    }
+    return customMeasure;
+  }
+
+  public List<CustomMeasureDto> selectByMetricId(DbSession session, int metricId) {
+    return mapper(session).selectByMetricId(metricId);
+  }
+
+  public int countByComponentIdAndMetricId(DbSession session, String componentUuid, int metricId) {
+    return mapper(session).countByComponentIdAndMetricId(componentUuid, metricId);
+  }
+
+  public List<CustomMeasureDto> selectByComponentUuid(DbSession session, String componentUuid, int offset, int limit) {
+    return mapper(session).selectByComponentUuid(componentUuid, new RowBounds(offset, limit));
+  }
+
+  public List<CustomMeasureDto> selectByComponentUuid(DbSession session, String componentUuid) {
+    return mapper(session).selectByComponentUuid(componentUuid);
+  }
+
+  private CustomMeasureMapper mapper(DbSession session) {
+    return session.getMapper(CustomMeasureMapper.class);
+  }
+
+  public int countByComponentUuid(DbSession dbSession, String uuid) {
+    return mapper(dbSession).countByComponentUuid(uuid);
+  }
+}
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDto.java b/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureDto.java
new file mode 100644 (file)
index 0000000..c17e022
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.db.measure.custom;
+
+public class CustomMeasureDto {
+  private long id;
+  private int metricId;
+  private String componentUuid;
+  private double value;
+  private String textValue;
+  private String userLogin;
+  private String description;
+  private long createdAt;
+  private long updatedAt;
+
+  public String getDescription() {
+    return description;
+  }
+
+  public CustomMeasureDto setDescription(String description) {
+    this.description = description;
+    return this;
+  }
+
+  public String getUserLogin() {
+    return userLogin;
+  }
+
+  public CustomMeasureDto setUserLogin(String userLogin) {
+    this.userLogin = userLogin;
+    return this;
+  }
+
+  public String getTextValue() {
+    return textValue;
+  }
+
+  public CustomMeasureDto setTextValue(String textValue) {
+    this.textValue = textValue;
+    return this;
+  }
+
+  public double getValue() {
+    return value;
+  }
+
+  public CustomMeasureDto setValue(double value) {
+    this.value = value;
+    return this;
+  }
+
+  public int getMetricId() {
+    return metricId;
+  }
+
+  public CustomMeasureDto setMetricId(int metricId) {
+    this.metricId = metricId;
+    return this;
+  }
+
+  public long getId() {
+    return id;
+  }
+
+  public CustomMeasureDto setId(long id) {
+    this.id = id;
+    return this;
+  }
+
+  public long getUpdatedAt() {
+    return updatedAt;
+  }
+
+  public CustomMeasureDto setUpdatedAt(long updatedAt) {
+    this.updatedAt = updatedAt;
+    return this;
+  }
+
+  public long getCreatedAt() {
+    return createdAt;
+  }
+
+  public CustomMeasureDto setCreatedAt(long createdAt) {
+    this.createdAt = createdAt;
+    return this;
+  }
+
+  public String getComponentUuid() {
+    return componentUuid;
+  }
+
+  public CustomMeasureDto setComponentUuid(String componentUuid) {
+    this.componentUuid = componentUuid;
+    return this;
+  }
+}
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureMapper.java b/sonar-db/src/main/java/org/sonar/db/measure/custom/CustomMeasureMapper.java
new file mode 100644 (file)
index 0000000..cb029d6
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.db.measure.custom;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.session.RowBounds;
+
+public interface CustomMeasureMapper {
+  void insert(CustomMeasureDto customMeasure);
+
+  void update(CustomMeasureDto customMeasure);
+
+  void delete(long id);
+
+  void deleteByMetricIds(@Param("metricIds") List<Integer> metricIds);
+
+  CustomMeasureDto selectById(long id);
+
+  List<CustomMeasureDto> selectByMetricId(int id);
+
+  List<CustomMeasureDto> selectByComponentUuid(String s);
+
+  List<CustomMeasureDto> selectByComponentUuid(String s, RowBounds rowBounds);
+
+  int countByComponentUuid(String componentUuid);
+
+  int countByComponentIdAndMetricId(@Param("componentUuid") String componentUuid, @Param("metricId") int metricId);
+}
diff --git a/sonar-db/src/main/resources/org/sonar/db/measure/CustomMeasureMapper.xml b/sonar-db/src/main/resources/org/sonar/db/measure/CustomMeasureMapper.xml
deleted file mode 100644 (file)
index 119cec1..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="org.sonar.db.measure.CustomMeasureMapper">
-  <sql id="selectColumns">
-    m.id,
-    m.metric_id as metricId,
-    m.component_uuid as componentUuid,
-    m.value,
-    m.text_value as textValue,
-    m.user_login as userLogin,
-    m.description,
-    m.created_at as createdAt,
-    m.updated_at as updatedAt
-  </sql>
-
-  <select id="selectById" resultType="CustomMeasure">
-    select
-    <include refid="selectColumns"/>
-    from manual_measures m
-    where m.id=#{id}
-  </select>
-
-  <select id="selectByMetricId" resultType="CustomMeasure">
-    select
-    <include refid="selectColumns"/>
-    from manual_measures m
-    where m.metric_id=#{metricId}
-  </select>
-
-  <select id="selectByComponentUuid" resultType="CustomMeasure">
-    select
-    <include refid="selectColumns"/>
-    from manual_measures m
-    where m.component_uuid=#{componentUuid}
-  </select>
-
-  <insert id="insert" parameterType="CustomMeasure" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-    INSERT INTO manual_measures (
-    metric_id, component_uuid, value, text_value, user_login, description, created_at, updated_at
-    )
-    VALUES (
-    #{metricId, jdbcType=INTEGER}, #{componentUuid, jdbcType=VARCHAR},
-    #{value, jdbcType=DOUBLE}, #{textValue, jdbcType=VARCHAR}, #{userLogin, jdbcType=VARCHAR},
-    #{description, jdbcType=VARCHAR}, #{createdAt, jdbcType=BIGINT}, #{updatedAt, jdbcType=BIGINT}
-    )
-  </insert>
-
-  <update id="update" parameterType="CustomMeasure">
-    update manual_measures
-    set value = #{value, jdbcType=DOUBLE},
-    text_value = #{textValue, jdbcType=VARCHAR},
-    description = #{description, jdbcType=VARCHAR},
-    user_login = #{userLogin, jdbcType=VARCHAR},
-    updated_at = #{updatedAt, jdbcType=BIGINT}
-    where id = #{id}
-  </update>
-
-  <delete id="deleteByMetricIds">
-    delete from manual_measures
-    where metric_id in
-    <foreach collection="metricIds" item="metricId" open="(" close=")" separator=",">
-      #{metricId}
-    </foreach>
-  </delete>
-
-  <delete id="delete">
-    delete from manual_measures
-    where id=#{id}
-  </delete>
-
-  <select id="countByComponentUuid" resultType="Integer">
-    select count(*)
-    from manual_measures m
-    where m.component_uuid=#{componentUuid}
-  </select>
-
-  <select id="countByComponentIdAndMetricId" resultType="Integer">
-    select count(*)
-    from manual_measures m
-    where m.metric_id=#{metricId} and m.component_uuid=#{componentUuid}
-  </select>
-</mapper>
diff --git a/sonar-db/src/main/resources/org/sonar/db/measure/custom/CustomMeasureMapper.xml b/sonar-db/src/main/resources/org/sonar/db/measure/custom/CustomMeasureMapper.xml
new file mode 100644 (file)
index 0000000..8c26479
--- /dev/null
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.sonar.db.measure.custom.CustomMeasureMapper">
+  <sql id="selectColumns">
+    m.id,
+    m.metric_id as metricId,
+    m.component_uuid as componentUuid,
+    m.value,
+    m.text_value as textValue,
+    m.user_login as userLogin,
+    m.description,
+    m.created_at as createdAt,
+    m.updated_at as updatedAt
+  </sql>
+
+  <select id="selectById" resultType="CustomMeasure">
+    select
+    <include refid="selectColumns"/>
+    from manual_measures m
+    where m.id=#{id}
+  </select>
+
+  <select id="selectByMetricId" resultType="CustomMeasure">
+    select
+    <include refid="selectColumns"/>
+    from manual_measures m
+    where m.metric_id=#{metricId}
+  </select>
+
+  <select id="selectByComponentUuid" resultType="CustomMeasure">
+    select
+    <include refid="selectColumns"/>
+    from manual_measures m
+    where m.component_uuid=#{componentUuid}
+  </select>
+
+  <insert id="insert" parameterType="CustomMeasure" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+    INSERT INTO manual_measures (
+    metric_id, component_uuid, value, text_value, user_login, description, created_at, updated_at
+    )
+    VALUES (
+    #{metricId, jdbcType=INTEGER}, #{componentUuid, jdbcType=VARCHAR},
+    #{value, jdbcType=DOUBLE}, #{textValue, jdbcType=VARCHAR}, #{userLogin, jdbcType=VARCHAR},
+    #{description, jdbcType=VARCHAR}, #{createdAt, jdbcType=BIGINT}, #{updatedAt, jdbcType=BIGINT}
+    )
+  </insert>
+
+  <update id="update" parameterType="CustomMeasure">
+    update manual_measures
+    set value = #{value, jdbcType=DOUBLE},
+    text_value = #{textValue, jdbcType=VARCHAR},
+    description = #{description, jdbcType=VARCHAR},
+    user_login = #{userLogin, jdbcType=VARCHAR},
+    updated_at = #{updatedAt, jdbcType=BIGINT}
+    where id = #{id}
+  </update>
+
+  <delete id="deleteByMetricIds">
+    delete from manual_measures
+    where metric_id in
+    <foreach collection="metricIds" item="metricId" open="(" close=")" separator=",">
+      #{metricId}
+    </foreach>
+  </delete>
+
+  <delete id="delete">
+    delete from manual_measures
+    where id=#{id}
+  </delete>
+
+  <select id="countByComponentUuid" resultType="Integer">
+    select count(*)
+    from manual_measures m
+    where m.component_uuid=#{componentUuid}
+  </select>
+
+  <select id="countByComponentIdAndMetricId" resultType="Integer">
+    select count(*)
+    from manual_measures m
+    where m.metric_id=#{metricId} and m.component_uuid=#{componentUuid}
+  </select>
+</mapper>
diff --git a/sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureDaoTest.java b/sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureDaoTest.java
new file mode 100644 (file)
index 0000000..559b477
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.db.measure.custom;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbSession;
+import org.sonar.db.DbTester;
+import org.sonar.test.DbTests;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.offset;
+import static org.sonar.db.measure.custom.CustomMeasureTesting.newCustomMeasureDto;
+
+@Category(DbTests.class)
+public class CustomMeasureDaoTest {
+  @Rule
+  public DbTester db = DbTester.create(System2.INSTANCE);
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  CustomMeasureDao sut;
+  DbSession session;
+
+  @Before
+  public void setUp() {
+    session = db.getSession();
+    sut = new CustomMeasureDao();
+    db.truncateTables();
+  }
+
+  @Test
+  public void insert() {
+    CustomMeasureDto measure = newCustomMeasureDto();
+
+    sut.insert(session, measure);
+
+    CustomMeasureDto result = sut.selectById(session, measure.getId());
+    assertThat(result.getId()).isEqualTo(measure.getId());
+    assertThat(result.getMetricId()).isEqualTo(measure.getMetricId());
+    assertThat(result.getComponentUuid()).isEqualTo(measure.getComponentUuid());
+    assertThat(result.getDescription()).isEqualTo(measure.getDescription());
+    assertThat(result.getUserLogin()).isEqualTo(measure.getUserLogin());
+    assertThat(result.getTextValue()).isEqualTo(measure.getTextValue());
+    assertThat(result.getValue()).isCloseTo(measure.getValue(), offset(0.001d));
+    assertThat(result.getCreatedAt()).isEqualTo(measure.getCreatedAt());
+    assertThat(result.getUpdatedAt()).isEqualTo(measure.getUpdatedAt());
+  }
+
+  @Test
+  public void delete_by_metric_id() {
+    CustomMeasureDto measure = newCustomMeasureDto();
+    sut.insert(session, measure);
+    assertThat(sut.selectNullableById(session, measure.getId())).isNotNull();
+
+    sut.deleteByMetricIds(session, Arrays.asList(measure.getMetricId()));
+
+    assertThat(sut.selectNullableById(session, measure.getId())).isNull();
+  }
+
+  @Test
+  public void update() {
+    CustomMeasureDto measure = newCustomMeasureDto().setDescription("old-description");
+    sut.insert(session, measure);
+    measure.setDescription("new-description");
+
+    sut.update(session, measure);
+
+    assertThat(sut.selectNullableById(session, measure.getId()).getDescription()).isEqualTo("new-description");
+  }
+
+  @Test
+  public void delete() {
+    CustomMeasureDto measure = newCustomMeasureDto();
+    sut.insert(session, measure);
+
+    sut.delete(session, measure.getId());
+    assertThat(sut.selectNullableById(session, measure.getId())).isNull();
+  }
+
+  @Test
+  public void select_by_component_uuid() {
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u2"));
+    session.commit();
+
+    List<CustomMeasureDto> result = sut.selectByComponentUuid(session, "u1");
+
+    assertThat(result).hasSize(2);
+    assertThat(result).extracting("componentUuid").containsOnly("u1");
+    assertThat(sut.countByComponentUuid(session, "u1")).isEqualTo(2);
+  }
+
+  @Test
+  public void select_by_component_uuid_with_options() {
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u1"));
+    sut.insert(session, newCustomMeasureDto().setComponentUuid("u2"));
+    session.commit();
+
+    List<CustomMeasureDto> result = sut.selectByComponentUuid(session, "u1", 0, 100);
+
+    assertThat(result).hasSize(2);
+    assertThat(result).extracting("componentUuid").containsOnly("u1");
+  }
+
+  @Test
+  public void select_by_metric_id() {
+    sut.insert(session, newCustomMeasureDto().setMetricId(123));
+    sut.insert(session, newCustomMeasureDto().setMetricId(123));
+
+    List<CustomMeasureDto> result = sut.selectByMetricId(session, 123);
+
+    assertThat(result).hasSize(2);
+  }
+
+  @Test
+  public void count_by_component_uuid_and_metric_id() {
+    sut.insert(session, newCustomMeasureDto().setMetricId(123).setComponentUuid("123"));
+    sut.insert(session, newCustomMeasureDto().setMetricId(123).setComponentUuid("123"));
+
+    int count = sut.countByComponentIdAndMetricId(session, "123", 123);
+
+    assertThat(count).isEqualTo(2);
+  }
+
+  @Test
+  public void select_by_id_fail_if_no_measure_found() {
+    expectedException.expect(IllegalArgumentException.class);
+
+    sut.selectById(session, 42L);
+  }
+
+}
diff --git a/sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureTesting.java b/sonar-db/src/test/java/org/sonar/db/measure/custom/CustomMeasureTesting.java
new file mode 100644 (file)
index 0000000..6f6dcf5
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.db.measure.custom;
+
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.sonar.api.utils.System2;
+
+public class CustomMeasureTesting {
+  private CustomMeasureTesting() {
+    // static stuff only
+  }
+
+  public static CustomMeasureDto newCustomMeasureDto() {
+    return new CustomMeasureDto()
+      .setDescription(RandomStringUtils.randomAlphanumeric(255))
+      .setTextValue(RandomStringUtils.randomAlphanumeric(255))
+      .setUserLogin(RandomStringUtils.randomAlphanumeric(255))
+      .setValue(RandomUtils.nextDouble())
+      .setMetricId(RandomUtils.nextInt())
+      .setComponentUuid(RandomStringUtils.randomAlphanumeric(50))
+      .setCreatedAt(System2.INSTANCE.now())
+      .setUpdatedAt(System2.INSTANCE.now());
+  }
+}