summaryrefslogtreecommitdiffstats
path: root/sonar-server
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@gmail.com>2012-03-07 22:13:35 +0100
committerSimon Brandhof <simon.brandhof@gmail.com>2012-03-07 23:30:28 +0100
commit0a608327b220e0d89a380fa4499af5247e1e85d5 (patch)
treef2e9b8ca5253606ff1a6c03fbd08f2364268d55b /sonar-server
parent6cc1508a6207bf923da34659722e23e2e5c17599 (diff)
downloadsonarqube-0a608327b220e0d89a380fa4499af5247e1e85d5.tar.gz
sonarqube-0a608327b220e0d89a380fa4499af5247e1e85d5.zip
SONAR-3292 improve messages when database is not up-to-date
Diffstat (limited to 'sonar-server')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/configuration/Backup.java4
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java45
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java16
-rw-r--r--sonar-server/src/main/java/org/sonar/server/platform/Platform.java19
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/db/migrate/README.txt2
-rw-r--r--sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java54
-rw-r--r--sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java25
-rw-r--r--sonar-server/src/test/java/org/sonar/server/startup/DeleteDeprecatedMeasuresTest.java4
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));