diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2012-03-07 22:13:35 +0100 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2012-03-07 23:30:28 +0100 |
commit | 0a608327b220e0d89a380fa4499af5247e1e85d5 (patch) | |
tree | f2e9b8ca5253606ff1a6c03fbd08f2364268d55b /sonar-server | |
parent | 6cc1508a6207bf923da34659722e23e2e5c17599 (diff) | |
download | sonarqube-0a608327b220e0d89a380fa4499af5247e1e85d5.tar.gz sonarqube-0a608327b220e0d89a380fa4499af5247e1e85d5.zip |
SONAR-3292 improve messages when database is not up-to-date
Diffstat (limited to 'sonar-server')
8 files changed, 133 insertions, 36 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/configuration/Backup.java b/sonar-server/src/main/java/org/sonar/server/configuration/Backup.java index 8620bfd44ca..8b6583a959f 100644 --- a/sonar-server/src/main/java/org/sonar/server/configuration/Backup.java +++ b/sonar-server/src/main/java/org/sonar/server/configuration/Backup.java @@ -30,7 +30,7 @@ import org.apache.commons.lang.CharEncoding; import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import org.sonar.api.database.DatabaseSession; -import org.sonar.jpa.entity.SchemaMigration; +import org.sonar.core.persistence.DatabaseVersion; import javax.annotation.Nullable; import java.io.IOException; @@ -144,7 +144,7 @@ public class Backup { * Utils methods */ protected int getVersion() { - return SchemaMigration.LAST_VERSION; + return DatabaseVersion.LAST_VERSION; } protected Date getCurrentDate() { diff --git a/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java b/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java new file mode 100644 index 00000000000..7a1a925f2a3 --- /dev/null +++ b/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java @@ -0,0 +1,45 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.server.platform; + +import org.slf4j.LoggerFactory; +import org.sonar.api.ServerComponent; +import org.sonar.core.persistence.BadDatabaseVersion; +import org.sonar.core.persistence.DatabaseVersion; + +public class DatabaseServerCompatibility implements ServerComponent { + + private DatabaseVersion version; + + public DatabaseServerCompatibility(DatabaseVersion version) { + this.version = version; + } + + public void start() { + DatabaseVersion.Status status = version.getStatus(); + if (status== DatabaseVersion.Status.REQUIRES_DOWNGRADE) { + throw new BadDatabaseVersion("Database relates to a more recent version of sonar. Please check your settings."); + } + if (status== DatabaseVersion.Status.REQUIRES_UPGRADE) { + LoggerFactory.getLogger(DatabaseServerCompatibility.class).info("Database must be upgraded. Please browse /setup"); + } + } + +} diff --git a/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java b/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java index 64c47d5c880..3aebf626cb1 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java @@ -22,8 +22,7 @@ package org.sonar.server.platform; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.sonar.api.platform.ServerUpgradeStatus; -import org.sonar.jpa.entity.SchemaMigration; -import org.sonar.jpa.session.DatabaseConnector; +import org.sonar.core.persistence.DatabaseVersion; /** * @since 2.5 @@ -31,22 +30,23 @@ import org.sonar.jpa.session.DatabaseConnector; public final class DefaultServerUpgradeStatus implements ServerUpgradeStatus { private int initialDbVersion; - private DatabaseConnector dbConnector; + private DatabaseVersion dbVersion; - public DefaultServerUpgradeStatus(DatabaseConnector dbConnector) { - this.dbConnector = dbConnector; + public DefaultServerUpgradeStatus(DatabaseVersion dbVersion) { + this.dbVersion = dbVersion; } public void start() { - this.initialDbVersion = dbConnector.getDatabaseVersion(); + Integer v = dbVersion.getVersion(); + this.initialDbVersion = (v != null ? v : -1); } public boolean isUpgraded() { - return !isFreshInstall() &&(initialDbVersion < SchemaMigration.LAST_VERSION); + return !isFreshInstall() && (initialDbVersion < DatabaseVersion.LAST_VERSION); } public boolean isFreshInstall() { - return initialDbVersion <= 0; + return initialDbVersion<0; } public int getInitialDbVersion() { diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index 13f29b6b079..ce7193fd5b0 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -40,10 +40,7 @@ import org.sonar.core.i18n.I18nManager; import org.sonar.core.i18n.RuleI18nManager; import org.sonar.core.metric.DefaultMetricFinder; import org.sonar.core.notification.DefaultNotificationManager; -import org.sonar.core.persistence.DaoUtils; -import org.sonar.core.persistence.DatabaseMigrator; -import org.sonar.core.persistence.DefaultDatabase; -import org.sonar.core.persistence.MyBatis; +import org.sonar.core.persistence.*; import org.sonar.core.qualitymodel.DefaultModelFinder; import org.sonar.core.rule.DefaultRuleFinder; import org.sonar.core.user.DefaultUserFinder; @@ -108,9 +105,9 @@ public final class Platform { } public void start() { - if (!started && isUpToDateDatabase()) { + if (!started && getDatabaseStatus()== DatabaseVersion.Status.UP_TO_DATE) { try { - TimeProfiler profiler = new TimeProfiler().start("Start services"); + TimeProfiler profiler = new TimeProfiler().start("Start components"); startCoreComponents(); startServiceComponents(); executeStartupTasks(); @@ -133,22 +130,24 @@ public final class Platform { rootContainer.addSingleton(EmbeddedDatabaseFactory.class); rootContainer.addSingleton(DefaultDatabase.class); rootContainer.addSingleton(MyBatis.class); - rootContainer.addSingleton(DefaultDatabaseConnector.class); rootContainer.addSingleton(DefaultServerUpgradeStatus.class); + rootContainer.addSingleton(DatabaseServerCompatibility.class); rootContainer.addSingleton(DatabaseMigrator.class); + rootContainer.addSingleton(DatabaseVersion.class); for (Class daoClass : DaoUtils.getDaoClasses()) { rootContainer.addSingleton(daoClass); } rootContainer.startComponents(); } - private boolean isUpToDateDatabase() { - DefaultDatabaseConnector databaseConnector = getContainer().getComponentByType(DefaultDatabaseConnector.class); - return databaseConnector.isOperational(); + private DatabaseVersion.Status getDatabaseStatus() { + DatabaseVersion version = getContainer().getComponentByType(DatabaseVersion.class); + return version.getStatus(); } private void startCoreComponents() { coreContainer = rootContainer.createChild(); + coreContainer.addSingleton(DefaultDatabaseConnector.class); coreContainer.addSingleton(PluginDeployer.class); coreContainer.addSingleton(DefaultServerPluginRepository.class); coreContainer.addSingleton(ServerExtensionInstaller.class); diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/README.txt b/sonar-server/src/main/webapp/WEB-INF/db/migrate/README.txt index 1a2dcc99bc4..f1d93735e13 100644 --- a/sonar-server/src/main/webapp/WEB-INF/db/migrate/README.txt +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/README.txt @@ -5,7 +5,7 @@ HOW TO ADD A MIGRATION + sonar-core/src/main/resources/org/sonar/core/persistence/schema-derby.ddl + sonar-core/src/main/resources/org/sonar/core/persistence/rows-derby.sql : - add "INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('<THE MIGRATION ID>')" -* Update the migration id defined in sonar-core/src/main/java/org/sonar/jpa/entity/SchemaMigration.java +* Update the migration id defined in sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java * If a table is added or removed, then edit sonar-core/src/main/java/org/sonar/core/persistence/DatabaseUtils.java diff --git a/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java b/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java new file mode 100644 index 00000000000..7ff5a20bc00 --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java @@ -0,0 +1,54 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ +package org.sonar.server.platform; + +import org.junit.Test; +import org.sonar.core.persistence.BadDatabaseVersion; +import org.sonar.core.persistence.DatabaseVersion; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class DatabaseServerCompatibilityTest { + + @Test(expected = BadDatabaseVersion.class) + public void shouldFailIfRequiresDowngrade() { + DatabaseVersion version = mock(DatabaseVersion.class); + when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_DOWNGRADE); + new DatabaseServerCompatibility(version).start(); + } + + @Test + public void shouldLogWarningIfRequiresUpgrade() { + DatabaseVersion version = mock(DatabaseVersion.class); + when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_UPGRADE); + new DatabaseServerCompatibility(version).start(); + // oh well... how to simply test logging ? + // Let's assume that this test verifies that no error is raised. + } + + @Test + public void shouldDoNothingIfUpToDate() { + DatabaseVersion version = mock(DatabaseVersion.class); + when(version.getStatus()).thenReturn(DatabaseVersion.Status.UP_TO_DATE); + new DatabaseServerCompatibility(version).start(); + // no error + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java b/sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java index dc271ffca8f..2b59007390c 100644 --- a/sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java +++ b/sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java @@ -20,8 +20,7 @@ package org.sonar.server.platform; import org.junit.Test; -import org.sonar.jpa.entity.SchemaMigration; -import org.sonar.jpa.session.DatabaseConnector; +import org.sonar.core.persistence.DatabaseVersion; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; @@ -32,10 +31,10 @@ public class DefaultServerUpgradeStatusTest { @Test public void shouldBeFreshInstallation() { - DatabaseConnector connector = mock(DatabaseConnector.class); - when(connector.getDatabaseVersion()).thenReturn(-1); + DatabaseVersion dbVersion = mock(DatabaseVersion.class); + when(dbVersion.getVersion()).thenReturn(null); - DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(connector); + DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(dbVersion); status.start(); assertThat(status.isFreshInstall(), is(true)); @@ -45,10 +44,10 @@ public class DefaultServerUpgradeStatusTest { @Test public void shouldBeUpgraded() { - DatabaseConnector connector = mock(DatabaseConnector.class); - when(connector.getDatabaseVersion()).thenReturn(50); + DatabaseVersion dbVersion = mock(DatabaseVersion.class); + when(dbVersion.getVersion()).thenReturn(50); - DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(connector); + DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(dbVersion); status.start(); assertThat(status.isFreshInstall(), is(false)); @@ -58,14 +57,14 @@ public class DefaultServerUpgradeStatusTest { @Test public void shouldNotBeUpgraded() { - DatabaseConnector connector = mock(DatabaseConnector.class); - when(connector.getDatabaseVersion()).thenReturn(SchemaMigration.LAST_VERSION); + DatabaseVersion dbVersion = mock(DatabaseVersion.class); + when(dbVersion.getVersion()).thenReturn(DatabaseVersion.LAST_VERSION); - DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(connector); + DefaultServerUpgradeStatus status = new DefaultServerUpgradeStatus(dbVersion); status.start(); - + assertThat(status.isFreshInstall(), is(false)); assertThat(status.isUpgraded(), is(false)); - assertThat(status.getInitialDbVersion(), is(SchemaMigration.LAST_VERSION)); + assertThat(status.getInitialDbVersion(), is(DatabaseVersion.LAST_VERSION)); } } diff --git a/sonar-server/src/test/java/org/sonar/server/startup/DeleteDeprecatedMeasuresTest.java b/sonar-server/src/test/java/org/sonar/server/startup/DeleteDeprecatedMeasuresTest.java index f7a0a3e04a9..67479445563 100644 --- a/sonar-server/src/test/java/org/sonar/server/startup/DeleteDeprecatedMeasuresTest.java +++ b/sonar-server/src/test/java/org/sonar/server/startup/DeleteDeprecatedMeasuresTest.java @@ -22,7 +22,7 @@ package org.sonar.server.startup; import org.junit.Test; import org.sonar.api.database.model.MeasureModel; import org.sonar.api.platform.ServerUpgradeStatus; -import org.sonar.jpa.entity.SchemaMigration; +import org.sonar.core.persistence.DatabaseVersion; import org.sonar.jpa.test.AbstractDbUnitTestCase; import java.sql.SQLException; @@ -98,7 +98,7 @@ public class DeleteDeprecatedMeasuresTest extends AbstractDbUnitTestCase { public void shouldNotDoPurgeOnStandardStartup() { ServerUpgradeStatus upgradeStatus = mock(ServerUpgradeStatus.class); when(upgradeStatus.isUpgraded()).thenReturn(false); - when(upgradeStatus.getInitialDbVersion()).thenReturn(SchemaMigration.LAST_VERSION); + when(upgradeStatus.getInitialDbVersion()).thenReturn(DatabaseVersion.LAST_VERSION); final DeleteDeprecatedMeasures purge = new DeleteDeprecatedMeasures(getSessionFactory(), upgradeStatus); assertThat(purge.mustDoPurge(), is(false)); |