]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6366 SQ state check in RoR now uses Java DBMigration status
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 28 Apr 2015 13:57:49 +0000 (15:57 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 5 May 2015 07:18:54 +0000 (09:18 +0200)
use to be based on the RoR code handling the DB migration, it is now based on its Java replacement

server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
server/sonar-web/src/main/webapp/WEB-INF/app/controllers/application_controller.rb

index fd23abd532c1ba42d78e995ddf9139c391c8c32d..4c2ed9deef114d50293dd83f328e99d1fab2a5d9 100644 (file)
@@ -43,10 +43,12 @@ import org.sonar.api.web.Page;
 import org.sonar.api.web.RubyRailsWebservice;
 import org.sonar.api.web.Widget;
 import org.sonar.core.persistence.Database;
+import org.sonar.core.persistence.DatabaseVersion;
 import org.sonar.core.resource.ResourceIndexerDao;
 import org.sonar.core.timemachine.Periods;
 import org.sonar.process.ProcessProperties;
 import org.sonar.server.component.ComponentCleanerService;
+import org.sonar.server.db.migrations.DatabaseMigration;
 import org.sonar.server.db.migrations.DatabaseMigrator;
 import org.sonar.server.measure.MeasureFilterEngine;
 import org.sonar.server.measure.MeasureFilterResult;
@@ -375,4 +377,37 @@ public final class JRubyFacade {
   public String getPeriodAbbreviation(int periodIndex) {
     return get(Periods.class).abbreviation(periodIndex);
   }
+
+  /**
+   * Checks whether the SQ instance is up and running (ie. not in safemode and with an up-to-date database).
+   * <p>
+   * This method duplicates most of the logic code written in {@link org.sonar.server.platform.ws.UpgradesSystemWsAction}
+   * class. There is no need to refactor code to avoid this duplication since this method is only used by RoR code
+   * which will soon be replaced by pure JS code based on the {@link org.sonar.server.platform.ws.UpgradesSystemWsAction}
+   * WebService.
+   * </p>
+   */
+  public boolean isSonarAccessAllowed() {
+    ComponentContainer container = Platform.getInstance().getContainer();
+    DatabaseMigration databaseMigration = container.getComponentByType(DatabaseMigration.class);
+    if (databaseMigration.status() == DatabaseMigration.Status.RUNNING
+        || databaseMigration.status() == DatabaseMigration.Status.FAILED) {
+      return false;
+    }
+    if (databaseMigration.status() == DatabaseMigration.Status.SUCCEEDED) {
+      return true;
+    }
+
+    DatabaseVersion databaseVersion = container.getComponentByType(DatabaseVersion.class);
+    Integer currentVersion = databaseVersion.getVersion();
+    if (currentVersion == null) {
+      throw new IllegalStateException("Version can not be retrieved from Database. Database is either blank or corrupted");
+    }
+    if (currentVersion >= DatabaseVersion.LAST_VERSION) {
+      return true;
+    }
+
+    Database database = container.getComponentByType(Database.class);
+    return !database.getDialect().supportsMigration();
+  }
 }
index 620279a51f8b94c29f537f04c53e2f11e29fe88a..d1c1682b30e6f4b01a18f611e4eb7380a4f4f353 100644 (file)
@@ -87,7 +87,7 @@ class ApplicationController < ActionController::Base
   protected
 
   def check_database_version
-    unless DatabaseMigrationManager.instance.is_sonar_access_allowed?
+    unless java_facade.isSonarAccessAllowed()
       redirect_to :controller => 'maintenance', :action => 'index'
     end
   end