From 64a47c20892b32bd26aef41b07b1855ebe095b08 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 28 Apr 2014 18:53:34 +0200 Subject: [PATCH] SONAR-5237 implement RuleDao#keysOfRowsUpdatedAfter() --- .../src/main/java/org/sonar/core/db/Dao.java | 3 +- .../java/org/sonar/core/db/package-info.java | 23 +++++++++++++++ .../java/org/sonar/core/rule/RuleDao.java | 23 ++++++++++++--- .../java/org/sonar/core/rule/RuleMapper.java | 1 + .../org/sonar/core/rule/RuleMapper.xml | 6 ++++ .../java/org/sonar/core/rule/RuleDaoTest.java | 28 +++++++++++++++++++ .../server/rule/ws/RuleShowWsHandler.java | 4 +-- .../sonar/server/rule2/ws/SearchAction.java | 2 +- .../org/sonar/server/rule2/ws/ShowAction.java | 8 +++++- 9 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 sonar-core/src/main/java/org/sonar/core/db/package-info.java diff --git a/sonar-core/src/main/java/org/sonar/core/db/Dao.java b/sonar-core/src/main/java/org/sonar/core/db/Dao.java index 32ef3e2f611..8a6a95e42a2 100644 --- a/sonar-core/src/main/java/org/sonar/core/db/Dao.java +++ b/sonar-core/src/main/java/org/sonar/core/db/Dao.java @@ -22,7 +22,6 @@ package org.sonar.core.db; import org.apache.ibatis.session.SqlSession; import java.io.Serializable; -import java.util.Collection; public interface Dao, K extends Serializable> { @@ -44,5 +43,5 @@ public interface Dao, K extends Serializable> { void deleteByKey(K key, SqlSession session); - Collection insertsSince(Long timestamp); + Iterable keysOfRowsUpdatedAfter(long timestamp); } diff --git a/sonar-core/src/main/java/org/sonar/core/db/package-info.java b/sonar-core/src/main/java/org/sonar/core/db/package-info.java new file mode 100644 index 00000000000..cb50b641aa3 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/db/package-info.java @@ -0,0 +1,23 @@ +/* + * 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.core.db; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/sonar-core/src/main/java/org/sonar/core/rule/RuleDao.java b/sonar-core/src/main/java/org/sonar/core/rule/RuleDao.java index 8053e3ccd9d..9c6b060e846 100644 --- a/sonar-core/src/main/java/org/sonar/core/rule/RuleDao.java +++ b/sonar-core/src/main/java/org/sonar/core/rule/RuleDao.java @@ -20,6 +20,8 @@ package org.sonar.core.rule; import com.google.common.collect.Lists; +import org.apache.ibatis.session.ResultContext; +import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.SqlSession; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; @@ -29,9 +31,10 @@ import org.sonar.core.db.UnsuportedException; import org.sonar.core.persistence.MyBatis; import javax.annotation.CheckForNull; - +import java.sql.Timestamp; import java.util.Collection; import java.util.List; +import java.util.Map; import static com.google.common.collect.Lists.newArrayList; @@ -315,8 +318,20 @@ public class RuleDao extends BaseDao } @Override - public Collection insertsSince(Long timestamp) { - // TODO Auto-generated method stub - return null; + public Collection keysOfRowsUpdatedAfter(long timestamp) { + SqlSession session = mybatis.openSession(); + try { + final List keys = Lists.newArrayList(); + session.select("selectKeysOfRulesUpdatedSince", new Timestamp(timestamp), new ResultHandler() { + @Override + public void handleResult(ResultContext context) { + Map map = (Map) context.getResultObject(); + keys.add(RuleKey.of(map.get("repo"), map.get("rule"))); + } + }); + return keys; + } finally { + MyBatis.closeQuietly(session); + } } } diff --git a/sonar-core/src/main/java/org/sonar/core/rule/RuleMapper.java b/sonar-core/src/main/java/org/sonar/core/rule/RuleMapper.java index 75f3d4e62b1..d0d7975a9d0 100644 --- a/sonar-core/src/main/java/org/sonar/core/rule/RuleMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/rule/RuleMapper.java @@ -67,4 +67,5 @@ public interface RuleMapper { void updateTag(RuleRuleTagDto existingTag); List selectTagsByRuleIds(@Param("ruleIds") List ruleIds); + } diff --git a/sonar-core/src/main/resources/org/sonar/core/rule/RuleMapper.xml b/sonar-core/src/main/resources/org/sonar/core/rule/RuleMapper.xml index ce88ab8bdd5..ee7b13de0bd 100644 --- a/sonar-core/src/main/resources/org/sonar/core/rule/RuleMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/rule/RuleMapper.xml @@ -207,5 +207,11 @@ DELETE FROM rules_rule_tags WHERE id=#{tagId} + + diff --git a/sonar-core/src/test/java/org/sonar/core/rule/RuleDaoTest.java b/sonar-core/src/test/java/org/sonar/core/rule/RuleDaoTest.java index 6386962c054..3e3bc22abb5 100644 --- a/sonar-core/src/test/java/org/sonar/core/rule/RuleDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/rule/RuleDaoTest.java @@ -32,6 +32,7 @@ import org.sonar.api.utils.DateUtils; import org.sonar.check.Cardinality; import org.sonar.core.persistence.AbstractDaoTestCase; +import java.util.Arrays; import java.util.List; import static com.google.common.collect.Lists.newArrayList; @@ -371,6 +372,33 @@ public class RuleDaoTest extends AbstractDaoTestCase { assertThat(dao.selectTagsByRuleIds(newArrayList(3, 4))).hasSize(3); } + @Test + public void keysOfRowsUpdatedAfter() throws Exception { + setupData("empty"); + + RuleDto rule1 = new RuleDto() + .setId(1) + .setRepositoryKey("foo") + .setRuleKey("R1") + .setName("ROne") + .setCreatedAt(DateUtils.parseDate("2013-12-16")) + .setUpdatedAt(DateUtils.parseDate("2013-12-16")); + RuleDto rule2 = new RuleDto() + .setId(2) + .setRepositoryKey("foo") + .setRuleKey("R2") + .setName("RTwo") + .setCreatedAt(DateUtils.parseDate("2014-01-28")) + .setUpdatedAt(DateUtils.parseDate("2014-05-19")); + dao.insert(Arrays.asList(rule1, rule2)); + + assertThat(dao.keysOfRowsUpdatedAfter(DateUtils.parseDate("2014-06-01").getTime())).isEmpty(); + assertThat(dao.keysOfRowsUpdatedAfter(DateUtils.parseDate("2012-01-01").getTime())).hasSize(2); + Iterable keys = dao.keysOfRowsUpdatedAfter(DateUtils.parseDate("2014-05-17").getTime()); + assertThat(keys).hasSize(1); + assertThat(Iterables.getFirst(keys, null).rule()).isEqualTo("R2"); + } + private List idsFromRuleDtos(List ruleDtos){ return newArrayList(Iterables.transform(ruleDtos, new Function() { @Override diff --git a/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java b/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java index 7625c9244c2..6a76e65d384 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java +++ b/sonar-server/src/main/java/org/sonar/server/rule/ws/RuleShowWsHandler.java @@ -103,8 +103,7 @@ public class RuleShowWsHandler implements RequestHandler { json .prop("key", rule.ruleKey().toString()) .prop("name", rule.name()) - .prop("description", rule.description()) - ; + .prop("description", rule.description()); addLanguage(rule, json); addNote(rule, json); addDate(rule.createdAt(), "createdAt", json); @@ -119,7 +118,6 @@ public class RuleShowWsHandler implements RequestHandler { Language language = languages.get(languageKey); json.prop("language", language == null ? languageKey : language.getName()); } - } private void addNote(Rule rule, JsonWriter json) { diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java index 21f659a63f6..ccd61ea14b4 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java @@ -55,7 +55,7 @@ public class SearchAction implements RequestHandler { action .createParam("activation") - .setDescription("Only if 'qProfile' is set. Possible values are: true | false | all") + .setDescription("Used only if 'qProfile' is set. Possible values are: true | false | all") .setExampleValue("java:Sonar way"); } diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java index b844aad181f..0c9b75b1a49 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java @@ -43,11 +43,17 @@ public class ShowAction implements RequestHandler { .setSince("4.4") .setHandler(this); + action + .createParam("repo") + .setDescription("Repository key") + .setRequired(true) + .setExampleValue("javascript"); + action .createParam("key") .setDescription("Rule key") .setRequired(true) - .setExampleValue("javascript:EmptyBlock"); + .setExampleValue("EmptyBlock"); } @Override -- 2.39.5