From: Stephane Gamard Date: Mon, 28 Apr 2014 15:30:14 +0000 (+0200) Subject: SONAR-5237 - Delegation from BaseIndex rather than BaseMapper X-Git-Tag: 4.4-RC1~1370 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=acf2f9c447cd5931a67f6aa2643dad4d919cc27d;p=sonarqube.git SONAR-5237 - Delegation from BaseIndex rather than BaseMapper --- diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/RulesProviderTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/RulesProviderTest.java index da1ad682f1a..49825359b6e 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/rule/RulesProviderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/rule/RulesProviderTest.java @@ -82,8 +82,7 @@ public class RulesProviderTest extends AbstractDaoTestCase { .setParentId(102)); durations = new Durations(new Settings().setProperty("sonar.technicalDebt.hoursInDay", 8), null); - WorkQueue queue = mock(WorkQueue.class); - ruleDao = new RuleDao(getMyBatis(),queue); + ruleDao = new RuleDao(getMyBatis()); provider = new RulesProvider(); } diff --git a/sonar-core/src/main/java/org/sonar/core/db/BaseDao.java b/sonar-core/src/main/java/org/sonar/core/db/BaseDao.java index 38c2c849ae0..36fef1aa611 100644 --- a/sonar-core/src/main/java/org/sonar/core/db/BaseDao.java +++ b/sonar-core/src/main/java/org/sonar/core/db/BaseDao.java @@ -20,7 +20,6 @@ package org.sonar.core.db; import org.apache.ibatis.session.SqlSession; -import org.sonar.core.cluster.WorkQueue; import org.sonar.core.persistence.MyBatis; import java.io.Serializable; @@ -29,36 +28,22 @@ public abstract class BaseDao, K extends Serializable> implements Dao { protected MyBatis mybatis; - private WorkQueue queue; - protected BaseDao(WorkQueue workQueue, MyBatis myBatis) { + protected BaseDao(MyBatis myBatis) { this.mybatis = myBatis; - this.queue = workQueue; } protected abstract String getIndexName(); - protected abstract void doInsert(E item, SqlSession session); - - protected abstract void doUpdate(E item, SqlSession session); - - protected abstract void doDelete(E item, SqlSession session); - - protected abstract void doDeleteByKey(E item, SqlSession session); - protected abstract E doGetByKey(K key, SqlSession session); - protected void enqueInsert(K key) { - this.queue.enqueInsert(this.getIndexName(), key); - } + protected abstract E doInsert(E item, SqlSession session); - protected void enqueUpdate(K key) { - this.queue.enqueUpdate(this.getIndexName(), key); - } + protected abstract E doUpdate(E item, SqlSession session); - protected void enqueDelete(K key) { - this.queue.enqueDelete(this.getIndexName(), key); - } + protected abstract void doDelete(E item, SqlSession session); + + protected abstract void doDeleteByKey(K key, SqlSession session); protected MyBatis getMyBatis() { return this.mybatis; @@ -72,58 +57,73 @@ public abstract class BaseDao, K extends Serializable> return item; } + @Override + public E update(E item, SqlSession session) { + //TODO add update record to session */ + return this.doUpdate(item, session); + } + @Override public E update(E item) { SqlSession session = getMyBatis().openSession(); try { - this.doUpdate(item, session); + this.update(item, session); session.commit(); - this.enqueUpdate(item.getKey()); return item; } finally { MyBatis.closeQuietly(session); } } + @Override + public E insert(E item, SqlSession session) { + //TODO add insert record to session */ + return this.doInsert(item, session); + } + @Override public E insert(E item) { SqlSession session = getMyBatis().openSession(); try { - this.doInsert(item, session); + this.insert(item, session); session.commit(); - this.enqueInsert(item.getKey()); return item; } finally { MyBatis.closeQuietly(session); } } - public void insert(E item, SqlSession session) { - - } - - public void update(E item, SqlSession session) { - - } - + @Override public void delete(E item, SqlSession session) { - + //TODO add delete record to session */ + this.doDelete(item, session); } @Override public void delete(E item) { - this.deleteByKey(item.getKey()); + SqlSession session = getMyBatis().openSession(); + try { + this.delete(item, session); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + @Override + public void deleteByKey(K key, SqlSession session) { + //TODO add delete record to session */ + this.doDeleteByKey(key, session); } @Override public void deleteByKey(K key) { SqlSession session = getMyBatis().openSession(); try { - this.deleteByKey(key); + this.doDeleteByKey(key, session); session.commit(); } finally { MyBatis.closeQuietly(session); - this.enqueDelete(key); } } } 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 5fc95d944d6..32ef3e2f611 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 @@ -19,21 +19,30 @@ */ 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> { - public E getByKey(K key); + E getByKey(K key); + + E update(E item); + + E update(E item, SqlSession session); + + E insert(E item); - public E update(E item); + E insert(E item, SqlSession session); - public E insert(E item); + void delete(E item); - public void delete(E item); + void delete(E item, SqlSession session); - public void deleteByKey(K key); + void deleteByKey(K key); - public Collection insertsSince(Long timestamp); + void deleteByKey(K key, SqlSession session); + Collection insertsSince(Long timestamp); } diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java index 249e0a01648..064d7d7e228 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java @@ -24,7 +24,11 @@ import com.google.common.io.Closeables; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.mapping.Environment; -import org.apache.ibatis.session.*; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.apache.ibatis.type.JdbcType; import org.slf4j.LoggerFactory; @@ -32,10 +36,18 @@ import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; import org.sonar.api.database.model.MeasureMapper; import org.sonar.api.database.model.MeasureModel; +import org.sonar.core.cluster.WorkQueue; import org.sonar.core.component.ComponentDto; import org.sonar.core.component.db.ComponentMapper; import org.sonar.core.config.Logback; -import org.sonar.core.dashboard.*; +import org.sonar.core.dashboard.ActiveDashboardDto; +import org.sonar.core.dashboard.ActiveDashboardMapper; +import org.sonar.core.dashboard.DashboardDto; +import org.sonar.core.dashboard.DashboardMapper; +import org.sonar.core.dashboard.WidgetDto; +import org.sonar.core.dashboard.WidgetMapper; +import org.sonar.core.dashboard.WidgetPropertyDto; +import org.sonar.core.dashboard.WidgetPropertyMapper; import org.sonar.core.dependency.DependencyDto; import org.sonar.core.dependency.DependencyMapper; import org.sonar.core.dependency.ResourceSnapshotDto; @@ -44,22 +56,58 @@ import org.sonar.core.duplication.DuplicationMapper; import org.sonar.core.duplication.DuplicationUnitDto; import org.sonar.core.graph.jdbc.GraphDto; import org.sonar.core.graph.jdbc.GraphDtoMapper; -import org.sonar.core.issue.db.*; +import org.sonar.core.issue.db.ActionPlanDto; +import org.sonar.core.issue.db.ActionPlanMapper; +import org.sonar.core.issue.db.ActionPlanStatsDto; +import org.sonar.core.issue.db.ActionPlanStatsMapper; +import org.sonar.core.issue.db.IssueChangeDto; +import org.sonar.core.issue.db.IssueChangeMapper; +import org.sonar.core.issue.db.IssueDto; +import org.sonar.core.issue.db.IssueFilterDto; +import org.sonar.core.issue.db.IssueFilterFavouriteDto; +import org.sonar.core.issue.db.IssueFilterFavouriteMapper; +import org.sonar.core.issue.db.IssueFilterMapper; +import org.sonar.core.issue.db.IssueMapper; +import org.sonar.core.issue.db.IssueStatsMapper; import org.sonar.core.measure.db.MeasureDataDto; import org.sonar.core.measure.db.MeasureDataMapper; import org.sonar.core.measure.db.MeasureFilterDto; import org.sonar.core.measure.db.MeasureFilterMapper; import org.sonar.core.notification.db.NotificationQueueDto; import org.sonar.core.notification.db.NotificationQueueMapper; -import org.sonar.core.permission.*; +import org.sonar.core.permission.GroupWithPermissionDto; +import org.sonar.core.permission.PermissionTemplateDto; +import org.sonar.core.permission.PermissionTemplateGroupDto; +import org.sonar.core.permission.PermissionTemplateMapper; +import org.sonar.core.permission.PermissionTemplateUserDto; +import org.sonar.core.permission.UserWithPermissionDto; import org.sonar.core.properties.PropertiesMapper; import org.sonar.core.properties.PropertyDto; import org.sonar.core.purge.PurgeMapper; import org.sonar.core.purge.PurgeableSnapshotDto; -import org.sonar.core.qualitygate.db.*; -import org.sonar.core.qualityprofile.db.*; -import org.sonar.core.resource.*; -import org.sonar.core.rule.*; +import org.sonar.core.qualitygate.db.ProjectQgateAssociationDto; +import org.sonar.core.qualitygate.db.ProjectQgateAssociationMapper; +import org.sonar.core.qualitygate.db.QualityGateConditionDto; +import org.sonar.core.qualitygate.db.QualityGateConditionMapper; +import org.sonar.core.qualitygate.db.QualityGateDto; +import org.sonar.core.qualitygate.db.QualityGateMapper; +import org.sonar.core.qualityprofile.db.ActiveRuleDto; +import org.sonar.core.qualityprofile.db.ActiveRuleMapper; +import org.sonar.core.qualityprofile.db.ActiveRuleParamDto; +import org.sonar.core.qualityprofile.db.QualityProfileDto; +import org.sonar.core.qualityprofile.db.QualityProfileMapper; +import org.sonar.core.resource.ResourceDto; +import org.sonar.core.resource.ResourceIndexDto; +import org.sonar.core.resource.ResourceIndexerMapper; +import org.sonar.core.resource.ResourceKeyUpdaterMapper; +import org.sonar.core.resource.ResourceMapper; +import org.sonar.core.resource.SnapshotDto; +import org.sonar.core.rule.RuleDto; +import org.sonar.core.rule.RuleMapper; +import org.sonar.core.rule.RuleParamDto; +import org.sonar.core.rule.RuleRuleTagDto; +import org.sonar.core.rule.RuleTagDto; +import org.sonar.core.rule.RuleTagMapper; import org.sonar.core.source.db.SnapshotDataDto; import org.sonar.core.source.db.SnapshotDataMapper; import org.sonar.core.source.db.SnapshotSourceMapper; @@ -69,7 +117,16 @@ import org.sonar.core.technicaldebt.db.RequirementDto; import org.sonar.core.technicaldebt.db.RequirementMapper; import org.sonar.core.template.LoadedTemplateDto; import org.sonar.core.template.LoadedTemplateMapper; -import org.sonar.core.user.*; +import org.sonar.core.user.AuthorDto; +import org.sonar.core.user.AuthorMapper; +import org.sonar.core.user.GroupDto; +import org.sonar.core.user.GroupMembershipDto; +import org.sonar.core.user.GroupMembershipMapper; +import org.sonar.core.user.GroupRoleDto; +import org.sonar.core.user.RoleMapper; +import org.sonar.core.user.UserDto; +import org.sonar.core.user.UserMapper; +import org.sonar.core.user.UserRoleDto; import java.io.InputStream; @@ -78,10 +135,12 @@ public class MyBatis implements BatchComponent, ServerComponent { private final Database database; private final Logback logback; private SqlSessionFactory sessionFactory; + private WorkQueue queue; - public MyBatis(Database database, Logback logback) { + public MyBatis(Database database, Logback logback, WorkQueue queue) { this.database = database; this.logback = logback; + this.queue = queue; } public MyBatis start() { 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 2c2ee23e1ee..8053e3ccd9d 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 @@ -19,15 +19,13 @@ */ package org.sonar.core.rule; -import org.sonar.core.db.UnsuportedException; - import com.google.common.collect.Lists; import org.apache.ibatis.session.SqlSession; import org.sonar.api.BatchComponent; import org.sonar.api.ServerComponent; import org.sonar.api.rule.RuleKey; -import org.sonar.core.cluster.WorkQueue; import org.sonar.core.db.BaseDao; +import org.sonar.core.db.UnsuportedException; import org.sonar.core.persistence.MyBatis; import javax.annotation.CheckForNull; @@ -40,8 +38,8 @@ import static com.google.common.collect.Lists.newArrayList; public class RuleDao extends BaseDao implements BatchComponent, ServerComponent { - public RuleDao(MyBatis mybatis, WorkQueue queue) { - super(queue, mybatis); + public RuleDao(MyBatis mybatis) { + super(mybatis); } @Override @@ -50,13 +48,21 @@ public class RuleDao extends BaseDao } @Override - protected void doInsert(RuleDto item, SqlSession session) { + @CheckForNull + protected RuleDto doGetByKey(RuleKey key, SqlSession session) { + return getMapper(session).selectByKey(key); + } + + @Override + protected RuleDto doInsert(RuleDto item, SqlSession session) { session.getMapper(RuleMapper.class).insert(item); + return item; } @Override - protected void doUpdate(RuleDto item, SqlSession session) { + protected RuleDto doUpdate(RuleDto item, SqlSession session) { session.getMapper(RuleMapper.class).update(item); + return item; } @Override @@ -65,16 +71,10 @@ public class RuleDao extends BaseDao } @Override - protected void doDeleteByKey(RuleDto item, SqlSession session) { + protected void doDeleteByKey(RuleKey key, SqlSession session) { throw new UnsuportedException("Rules cannot be deleted"); } - @Override - @CheckForNull - protected RuleDto doGetByKey(RuleKey key, SqlSession session) { - return getMapper(session).selectByKey(key); - } - public List selectAll() { SqlSession session = mybatis.openSession(); try { @@ -136,21 +136,12 @@ public class RuleDao extends BaseDao } } - /** - * - * @deprecated use {@link getByKey(RuleKey key, SqlSession session)} instead. - */ - @Deprecated @CheckForNull public RuleDto selectByKey(RuleKey ruleKey, SqlSession session) { return getMapper(session).selectByKey(ruleKey); } - /** - * - * @deprecated use {@link getByKey(RuleKey key)} instead. - */ - @Deprecated + @CheckForNull public RuleDto selectByKey(RuleKey ruleKey) { SqlSession session = mybatis.openSession(); diff --git a/sonar-core/src/main/java/org/sonar/core/rule/RuleDto.java b/sonar-core/src/main/java/org/sonar/core/rule/RuleDto.java index 78dd41c99a5..e7d871fa2a3 100644 --- a/sonar-core/src/main/java/org/sonar/core/rule/RuleDto.java +++ b/sonar-core/src/main/java/org/sonar/core/rule/RuleDto.java @@ -69,7 +69,6 @@ public final class RuleDto implements Dto{ return RuleKey.of(this.getRepositoryKey(), this.getRuleKey()); } - @Deprecated public Integer getId() { return id; } diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java b/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java index 3445aaa1c9b..26843e8e90d 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java @@ -19,6 +19,8 @@ */ package org.sonar.core.persistence; +import org.sonar.core.cluster.WorkQueue; + import com.google.common.collect.Maps; import com.google.common.io.Closeables; import org.apache.commons.io.FileUtils; @@ -53,6 +55,8 @@ import java.sql.SQLException; import java.util.Map; import java.util.Properties; +import static org.mockito.Mockito.mock; + import static org.junit.Assert.fail; public abstract class AbstractDaoTestCase { @@ -61,6 +65,8 @@ public abstract class AbstractDaoTestCase { private static DatabaseCommands databaseCommands; private static IDatabaseTester databaseTester; private static MyBatis myBatis; + private WorkQueue queue = mock(WorkQueue.class); + @Before public void startDatabase() throws Exception { @@ -84,7 +90,7 @@ public abstract class AbstractDaoTestCase { databaseCommands = DatabaseCommands.forDialect(database.getDialect()); databaseTester = new DataSourceDatabaseTester(database.getDataSource()); - myBatis = new MyBatis(database, new Logback()); + myBatis = new MyBatis(database, new Logback(),queue); myBatis.start(); } diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/MyBatisTest.java b/sonar-core/src/test/java/org/sonar/core/persistence/MyBatisTest.java index 49f4ab0d09b..26e56f19347 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/MyBatisTest.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/MyBatisTest.java @@ -19,6 +19,8 @@ */ package org.sonar.core.persistence; +import org.sonar.core.cluster.WorkQueue; + import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.hamcrest.core.Is; @@ -27,7 +29,6 @@ import org.junit.BeforeClass; import org.junit.Test; import org.sonar.core.config.Logback; import org.sonar.core.rule.RuleMapper; - import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; @@ -35,6 +36,7 @@ import static org.mockito.Mockito.mock; public class MyBatisTest { private static H2Database database; private Logback logback = mock(Logback.class); + private WorkQueue queue = mock(WorkQueue.class); @BeforeClass public static void start() { @@ -49,7 +51,7 @@ public class MyBatisTest { @Test public void shouldConfigureMyBatis() { - MyBatis myBatis = new MyBatis(database, logback); + MyBatis myBatis = new MyBatis(database, logback, queue); myBatis.start(); Configuration conf = myBatis.getSessionFactory().getConfiguration(); @@ -60,7 +62,7 @@ public class MyBatisTest { @Test public void shouldOpenBatchSession() { - MyBatis myBatis = new MyBatis(database, logback); + MyBatis myBatis = new MyBatis(database, logback, queue); myBatis.start(); SqlSession session = myBatis.openBatchSession(); diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java b/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java index 003649a00c0..a8c5dd16d5c 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java @@ -19,6 +19,8 @@ */ package org.sonar.core.persistence; +import org.sonar.core.cluster.WorkQueue; + import com.google.common.collect.Maps; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.dbutils.DbUtils; @@ -62,6 +64,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import static org.mockito.Mockito.mock; + import static org.junit.Assert.fail; /** @@ -76,6 +80,7 @@ public class TestDatabase extends ExternalResource { private DatabaseCommands commands; private IDatabaseTester tester; private MyBatis myBatis; + private WorkQueue queue = mock(WorkQueue.class); private String schemaPath = null; public TestDatabase schema(Class baseClass, String filename) { @@ -109,7 +114,7 @@ public class TestDatabase extends ExternalResource { commands = DatabaseCommands.forDialect(db.getDialect()); tester = new DataSourceDatabaseTester(db.getDataSource()); - myBatis = new MyBatis(db, new Logback()); + myBatis = new MyBatis(db, new Logback(), queue); myBatis.start(); commands.truncateDatabase(db.getDataSource()); 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 152447530c9..6386962c054 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 @@ -30,14 +30,12 @@ import org.sonar.api.rule.Severity; import org.sonar.api.rules.Rule; import org.sonar.api.utils.DateUtils; import org.sonar.check.Cardinality; -import org.sonar.core.cluster.WorkQueue; import org.sonar.core.persistence.AbstractDaoTestCase; import java.util.List; import static com.google.common.collect.Lists.newArrayList; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Mockito.mock; public class RuleDaoTest extends AbstractDaoTestCase { @@ -45,8 +43,7 @@ public class RuleDaoTest extends AbstractDaoTestCase { @Before public void createDao() throws Exception { - WorkQueue queue = mock(WorkQueue.class); - dao = new RuleDao(getMyBatis(), queue); + dao = new RuleDao(getMyBatis()); } @Test diff --git a/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index 6707ea13852..91ab6c14618 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -97,10 +97,9 @@ public class RegisterRulesTest extends AbstractDaoTestCase { @Before public void before() { system = mock(System2.class); - queue = mock(WorkQueue.class); when(system.now()).thenReturn(date.getTime()); myBatis = getMyBatis(); - ruleDao = new RuleDao(myBatis, queue); + ruleDao = new RuleDao(myBatis); ruleTagDao = new RuleTagDao(myBatis); activeRuleDao = new ActiveRuleDao(myBatis); ruleTagOperations = new RuleTagOperations(ruleTagDao, esRuleTags);