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;
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;
+++ /dev/null
-/*
- * 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);
- }
-}
+++ /dev/null
-/*
- * 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;
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;
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;
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;
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;
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;
}
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,
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;
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;
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;
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;
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;
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;
+++ /dev/null
-/*
- * 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");
- }
-}
+++ /dev/null
-/*
- * 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());
- }
-}
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.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;
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;
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)
@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();
}
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;
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;
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;
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;
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 {
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;
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;
@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)
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;
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;
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;
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;
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;
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;
projectQgateAssociationDao = getDao(map, ProjectQgateAssociationDao.class);
duplicationDao = getDao(map, DuplicationDao.class);
notificationQueueDao = getDao(map, NotificationQueueDao.class);
+ customMeasureDao = getDao(map, CustomMeasureDao.class);
doOnLoad(map);
}
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);
}
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;
+++ /dev/null
-/*
- * 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;
- }
-}
+++ /dev/null
-/*
- * 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);
-}
--- /dev/null
+/*
+ * 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);
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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);
+}
+++ /dev/null
-<?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>
--- /dev/null
+<?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>
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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());
+ }
+}