From 1af4105f69b467eca5233c164752923fce021884 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Thu, 15 Dec 2016 14:30:58 +0100 Subject: [PATCH] SONAR-8445 add a DAO for SCHEMA_MIGRATIONS and remove direct usages of MyBatis mapper --- .../ComputeEngineContainerImplTest.java | 2 +- .../history/MigrationHistoryImpl.java | 2 +- .../history/MigrationHistoryImplTest.java | 2 +- .../monitoring/DatabaseMonitorTest.java | 9 +-- .../src/main/java/org/sonar/db/DaoModule.java | 2 + .../src/main/java/org/sonar/db/DbClient.java | 7 ++ .../src/main/java/org/sonar/db/MyBatis.java | 4 +- .../schemamigration/SchemaMigrationDao.java | 43 ++++++++++ .../SchemaMigrationDto.java | 2 +- .../SchemaMigrationMapper.java | 2 +- .../db/schemamigration/package-info.java | 24 ++++++ .../org/sonar/db/version/DatabaseVersion.java | 27 +++---- .../SchemaMigrationMapper.xml | 2 +- .../test/java/org/sonar/db/DaoModuleTest.java | 2 +- .../SchemaMigrationDaoTest.java | 80 +++++++++++++++++++ .../sonar/db/version/DatabaseVersionTest.java | 20 +++-- .../DatabaseVersionTest/getVersion.xml | 8 -- .../getVersion_no_rows.xml | 1 - 18 files changed, 192 insertions(+), 47 deletions(-) create mode 100644 sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDao.java rename sonar-db/src/main/java/org/sonar/db/{version => schemamigration}/SchemaMigrationDto.java (96%) rename sonar-db/src/main/java/org/sonar/db/{version => schemamigration}/SchemaMigrationMapper.java (96%) create mode 100644 sonar-db/src/main/java/org/sonar/db/schemamigration/package-info.java rename sonar-db/src/main/resources/org/sonar/db/{version => schemamigration}/SchemaMigrationMapper.xml (85%) create mode 100644 sonar-db/src/test/java/org/sonar/db/schemamigration/SchemaMigrationDaoTest.java delete mode 100644 sonar-db/src/test/resources/org/sonar/db/version/DatabaseVersionTest/getVersion.xml delete mode 100644 sonar-db/src/test/resources/org/sonar/db/version/DatabaseVersionTest/getVersion_no_rows.xml diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java index 25c7fa6fe55..b17c2a2d183 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java @@ -106,7 +106,7 @@ public class ComputeEngineContainerImplTest { assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize( COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION + 27 // level 1 - + 47 // content of DaoModule + + 48 // content of DaoModule + 2 // content of EsSearchModule + 63 // content of CorePropertyDefinitions + 1 // content of CePropertyDefinitions diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImpl.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImpl.java index 9c00b983a8b..8e08992f19c 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImpl.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImpl.java @@ -28,7 +28,7 @@ import java.util.Optional; import org.sonar.db.DatabaseUtils; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.version.SchemaMigrationMapper; +import org.sonar.db.schemamigration.SchemaMigrationMapper; import org.sonar.server.platform.db.migration.step.RegisteredMigrationStep; import static com.google.common.base.Preconditions.checkState; diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImplTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImplTest.java index 6ece014caf8..fd7c849b124 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImplTest.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImplTest.java @@ -26,7 +26,7 @@ import org.junit.rules.ExpectedException; import org.sonar.api.utils.System2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.version.SchemaMigrationMapper; +import org.sonar.db.schemamigration.SchemaMigrationMapper; import org.sonar.server.platform.db.migration.step.MigrationStep; import org.sonar.server.platform.db.migration.step.RegisteredMigrationStep; diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/DatabaseMonitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/DatabaseMonitorTest.java index 5941af2a2ba..9fcd6f1e6ff 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/DatabaseMonitorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/DatabaseMonitorTest.java @@ -20,7 +20,6 @@ package org.sonar.server.platform.monitoring; import java.util.Map; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.sonar.api.utils.System2; @@ -34,13 +33,7 @@ public class DatabaseMonitorTest { @Rule public DbTester dbTester = DbTester.create(System2.INSTANCE); - DatabaseMonitor underTest; - - @Before - public void setUp() { - DatabaseVersion dbVersion = new DatabaseVersion(dbTester.myBatis()); - underTest = new DatabaseMonitor(dbVersion, dbTester.getDbClient()); - } + private DatabaseMonitor underTest = new DatabaseMonitor(new DatabaseVersion(dbTester.getDbClient()), dbTester.getDbClient()); @Test public void name_is_not_empty() { diff --git a/sonar-db/src/main/java/org/sonar/db/DaoModule.java b/sonar-db/src/main/java/org/sonar/db/DaoModule.java index 74ab7e4bd9d..72f66bf0c8f 100644 --- a/sonar-db/src/main/java/org/sonar/db/DaoModule.java +++ b/sonar-db/src/main/java/org/sonar/db/DaoModule.java @@ -58,6 +58,7 @@ import org.sonar.db.qualityprofile.QProfileChangeDao; import org.sonar.db.qualityprofile.QualityProfileDao; import org.sonar.db.rule.RuleDao; import org.sonar.db.rule.RuleRepositoryDao; +import org.sonar.db.schemamigration.SchemaMigrationDao; import org.sonar.db.source.FileSourceDao; import org.sonar.db.user.AuthorDao; import org.sonar.db.user.GroupDao; @@ -113,6 +114,7 @@ public class DaoModule extends Module { RuleDao.class, RuleRepositoryDao.class, SnapshotDao.class, + SchemaMigrationDao.class, UserDao.class, UserGroupDao.class, UserPermissionDao.class, diff --git a/sonar-db/src/main/java/org/sonar/db/DbClient.java b/sonar-db/src/main/java/org/sonar/db/DbClient.java index 02744a29ec1..bec93839279 100644 --- a/sonar-db/src/main/java/org/sonar/db/DbClient.java +++ b/sonar-db/src/main/java/org/sonar/db/DbClient.java @@ -58,6 +58,7 @@ import org.sonar.db.qualityprofile.QProfileChangeDao; import org.sonar.db.qualityprofile.QualityProfileDao; import org.sonar.db.rule.RuleDao; import org.sonar.db.rule.RuleRepositoryDao; +import org.sonar.db.schemamigration.SchemaMigrationDao; import org.sonar.db.source.FileSourceDao; import org.sonar.db.user.AuthorDao; import org.sonar.db.user.GroupDao; @@ -72,6 +73,7 @@ public class DbClient { private final Database database; private final MyBatis myBatis; + private final SchemaMigrationDao schemaMigrationDao; private final AuthorizationDao authorizationDao; private final OrganizationDao organizationDao; private final QualityProfileDao qualityProfileDao; @@ -126,6 +128,7 @@ public class DbClient { for (Dao dao : daos) { map.put(dao.getClass(), dao); } + schemaMigrationDao = getDao(map, SchemaMigrationDao.class); authorizationDao = getDao(map, AuthorizationDao.class); organizationDao = getDao(map, OrganizationDao.class); qualityProfileDao = getDao(map, QualityProfileDao.class); @@ -185,6 +188,10 @@ public class DbClient { return database; } + public SchemaMigrationDao schemaMigrationDao() { + return schemaMigrationDao; + } + public AuthorizationDao authorizationDao() { return authorizationDao; } diff --git a/sonar-db/src/main/java/org/sonar/db/MyBatis.java b/sonar-db/src/main/java/org/sonar/db/MyBatis.java index 27291ca9fe0..913c6898bb4 100644 --- a/sonar-db/src/main/java/org/sonar/db/MyBatis.java +++ b/sonar-db/src/main/java/org/sonar/db/MyBatis.java @@ -117,8 +117,8 @@ import org.sonar.db.user.UserMapper; import org.sonar.db.user.UserTokenCount; import org.sonar.db.user.UserTokenDto; import org.sonar.db.user.UserTokenMapper; -import org.sonar.db.version.SchemaMigrationDto; -import org.sonar.db.version.SchemaMigrationMapper; +import org.sonar.db.schemamigration.SchemaMigrationDto; +import org.sonar.db.schemamigration.SchemaMigrationMapper; import org.sonar.db.webhook.WebhookDeliveryMapper; public class MyBatis { diff --git a/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDao.java b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDao.java new file mode 100644 index 00000000000..2cd1ab9526d --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDao.java @@ -0,0 +1,43 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program 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. + * + * This program 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.schemamigration; + +import java.util.List; +import org.sonar.db.Dao; +import org.sonar.db.DbSession; + +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + +public class SchemaMigrationDao implements Dao { + public List selectVersions(DbSession dbSession) { + return getMapper(dbSession).selectVersions(); + } + + public void insert(DbSession dbSession, String version) { + requireNonNull(version, "version can't be null"); + checkArgument(!version.isEmpty(), "version can't be empty"); + getMapper(dbSession).insert(version); + } + + private static SchemaMigrationMapper getMapper(DbSession dbSession) { + return dbSession.getMapper(SchemaMigrationMapper.class); + } +} diff --git a/sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationDto.java b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDto.java similarity index 96% rename from sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationDto.java rename to sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDto.java index 00f5e07afc8..7f7911e4516 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationDto.java +++ b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationDto.java @@ -17,7 +17,7 @@ * 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.version; +package org.sonar.db.schemamigration; /** * Maps the table SCHEMA_MIGRATIONS that is fed by Ruby on Rails Migrations diff --git a/sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationMapper.java b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationMapper.java similarity index 96% rename from sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationMapper.java rename to sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationMapper.java index e2894ef5c89..cec3c56b746 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/SchemaMigrationMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/schemamigration/SchemaMigrationMapper.java @@ -17,7 +17,7 @@ * 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.version; +package org.sonar.db.schemamigration; import java.util.List; diff --git a/sonar-db/src/main/java/org/sonar/db/schemamigration/package-info.java b/sonar-db/src/main/java/org/sonar/db/schemamigration/package-info.java new file mode 100644 index 00000000000..4dc88d0aabb --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/schemamigration/package-info.java @@ -0,0 +1,24 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program 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. + * + * This program 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.db.schemamigration; + +import javax.annotation.ParametersAreNonnullByDefault; + diff --git a/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java b/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java index 13b24100a5d..6dcb89683e0 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java +++ b/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java @@ -25,8 +25,9 @@ import java.util.Collections; import java.util.List; import java.util.Set; import javax.annotation.Nullable; -import org.apache.ibatis.session.SqlSession; -import org.sonar.db.MyBatis; +import org.sonar.db.DatabaseUtils; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; public class DatabaseVersion { @@ -108,10 +109,10 @@ public class DatabaseVersion { "user_tokens", "webhook_deliveries"); - private MyBatis mybatis; + private final DbClient dbClient; - public DatabaseVersion(MyBatis mybatis) { - this.mybatis = mybatis; + public DatabaseVersion(DbClient dbClient) { + this.dbClient = dbClient; } @VisibleForTesting @@ -134,21 +135,17 @@ public class DatabaseVersion { } public Integer getVersion() { - SqlSession session = mybatis.openSession(false); - try { - List versions = session.getMapper(SchemaMigrationMapper.class).selectVersions(); + try (DbSession dbSession = dbClient.openSession(false)) { + if (!DatabaseUtils.tableExists("SCHEMA_MIGRATIONS", dbSession.getConnection())) { + return null; + } + + List versions = dbClient.schemaMigrationDao().selectVersions(dbSession); if (!versions.isEmpty()) { Collections.sort(versions); return versions.get(versions.size() - 1); } return null; - } catch (RuntimeException e) { - // The table SCHEMA_MIGRATIONS does not exist. - // Ignore this exception -> it will be created by MigrationHistoryTable class. - return null; - - } finally { - MyBatis.closeQuietly(session); } } diff --git a/sonar-db/src/main/resources/org/sonar/db/version/SchemaMigrationMapper.xml b/sonar-db/src/main/resources/org/sonar/db/schemamigration/SchemaMigrationMapper.xml similarity index 85% rename from sonar-db/src/main/resources/org/sonar/db/version/SchemaMigrationMapper.xml rename to sonar-db/src/main/resources/org/sonar/db/schemamigration/SchemaMigrationMapper.xml index cde37378a00..efe2333954b 100644 --- a/sonar-db/src/main/resources/org/sonar/db/version/SchemaMigrationMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/schemamigration/SchemaMigrationMapper.xml @@ -1,7 +1,7 @@ - +