*/
package org.sonar.server.computation.issue;
+import com.google.common.base.Optional;
import java.util.Collection;
import java.util.Map;
import org.sonar.api.rule.RuleKey;
+import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
import org.sonar.db.rule.RuleDto;
-import org.sonar.server.db.DbClient;
import org.sonar.server.util.cache.CacheLoader;
public class RuleCacheLoader implements CacheLoader<RuleKey, Rule> {
public Rule load(RuleKey key) {
DbSession session = dbClient.openSession(false);
try {
- RuleDto dto = dbClient.deprecatedRuleDao().getNullableByKey(session, key);
- if (dto != null) {
- return new RuleImpl(dto);
+ Optional<RuleDto> dto = dbClient.ruleDao().selectByKey(session, key);
+ if (dto.isPresent()) {
+ return new RuleImpl(dto.get());
}
return null;
} finally {
import org.sonar.api.rule.RuleKey;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.rule.db.RuleDao;
import org.sonar.test.DbTests;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
@Category(DbTests.class)
public class RuleCacheLoaderTest {
@Test
public void load_by_key() {
dbTester.prepareDbUnit(getClass(), "shared.xml");
- DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new RuleDao(mock(System2.class)));
- RuleCacheLoader loader = new RuleCacheLoader(dbClient);
+ RuleCacheLoader loader = new RuleCacheLoader(dbTester.getDbClient());
Rule javaRule = loader.load(RuleKey.of("java", "JAV01"));
assertThat(javaRule.getName()).isEqualTo("Java One");
@Test
public void load_by_keys_is_not_supported() {
- DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new RuleDao(mock(System2.class)));
- RuleCacheLoader loader = new RuleCacheLoader(dbClient);
+ RuleCacheLoader loader = new RuleCacheLoader(dbTester.getDbClient());
try {
loader.loadAll(Collections.<RuleKey>emptyList());
fail();
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.issue.IssueDao;
+import org.sonar.db.rule.RuleDao;
import org.sonar.server.computation.batch.BatchReportReaderRule;
import org.sonar.server.computation.issue.IssueCache;
import org.sonar.server.computation.issue.RuleCacheLoader;
import org.sonar.server.computation.issue.RuleRepositoryImpl;
import org.sonar.server.computation.issue.UpdateConflictResolver;
import org.sonar.server.db.DbClient;
-import org.sonar.server.rule.db.RuleDao;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public void setup() throws Exception {
dbTester.truncateTables();
session = dbTester.myBatis().openSession(false);
- dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new IssueDao(dbTester.myBatis()), new RuleDao(system2));
+ dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new IssueDao(dbTester.myBatis()), new RuleDao());
issueCache = new IssueCache(temp.newFile(), System2.INSTANCE);
system2 = mock(System2.class);
when(system2.now()).thenReturn(NOW);
package org.sonar.db.rule;
import com.google.common.base.Function;
+import com.google.common.base.Optional;
import java.util.List;
import javax.annotation.Nonnull;
import org.sonar.api.rule.RuleKey;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
+import org.sonar.db.RowNotFoundException;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;
public class RuleDao implements Dao {
+ public Optional<RuleDto> selectByKey(DbSession session, RuleKey key) {
+ return Optional.fromNullable(mapper(session).selectByKey(key));
+ }
+
+ public RuleDto selectOrFailByKey(DbSession session, RuleKey key) {
+ RuleDto rule = mapper(session).selectByKey(key);
+ if (rule == null) {
+ throw new RowNotFoundException(String.format("Rule with key '%s' does not exist", key));
+ }
+ return rule;
+ }
+
/**
* Select rules by keys, whatever their status. Returns an empty list
* if the list of {@code keys} is empty, without any db round trip.
*/
- public List<RuleDto> selectByKeys(final DbSession session, List<RuleKey> keys) {
+ public List<RuleDto> selectByKeys(DbSession session, List<RuleKey> keys) {
return executeLargeInputs(keys, new KeyToDto(mapper(session)));
}
*/
package org.sonar.db.rule;
+import com.google.common.base.Optional;
import java.util.Collections;
import java.util.List;
import org.junit.Rule;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
+import org.sonar.db.RowNotFoundException;
import org.sonar.test.DbTests;
import static java.util.Arrays.asList;
RuleDao underTest = dbTester.getDbClient().ruleDao();
+ @Test
+ public void selectByKey() {
+ dbTester.prepareDbUnit(getClass(), "shared.xml");
+
+ assertThat(underTest.selectByKey(dbTester.getSession(), RuleKey.of("NOT", "FOUND")).isPresent()).isFalse();
+
+ Optional<RuleDto> rule = underTest.selectByKey(dbTester.getSession(), RuleKey.of("java", "S001"));
+ assertThat(rule.isPresent()).isTrue();
+ assertThat(rule.get().getId()).isEqualTo(1);
+ }
+
+ @Test
+ public void selectOrFailByKey() {
+ dbTester.prepareDbUnit(getClass(), "shared.xml");
+
+ RuleDto rule = underTest.selectOrFailByKey(dbTester.getSession(), RuleKey.of("java", "S001"));
+ assertThat(rule.getId()).isEqualTo(1);
+ }
+
+ @Test
+ public void selectOrFailByKey_fails_if_rule_not_found() {
+ thrown.expect(RowNotFoundException.class);
+ thrown.expectMessage("Rule with key 'NOT:FOUND' does not exist");
+
+ dbTester.prepareDbUnit(getClass(), "shared.xml");
+
+ underTest.selectOrFailByKey(dbTester.getSession(), RuleKey.of("NOT", "FOUND"));
+ }
+
@Test
public void selectByKeys() {
dbTester.prepareDbUnit(getClass(), "shared.xml");