diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-04-14 09:39:13 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-04-25 15:24:03 +0200 |
commit | ed81b6c7f2596a13068dbcddea71162cc69aaa8f (patch) | |
tree | 3e579a01b8e00059b40f976d0bf335babd7bd3cb /server | |
parent | 6187aa51a1e07a22242b32401c09877cff26a7c5 (diff) | |
download | sonarqube-ed81b6c7f2596a13068dbcddea71162cc69aaa8f.tar.gz sonarqube-ed81b6c7f2596a13068dbcddea71162cc69aaa8f.zip |
SONAR-7549 SONAR-6171 verifies UTF8 charset and case-sensitive collation
Diffstat (limited to 'server')
9 files changed, 117 insertions, 21 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAfterMigration.java b/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAfterMigration.java new file mode 100644 index 00000000000..6d8f25cff16 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAfterMigration.java @@ -0,0 +1,37 @@ +/* + * 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.server.db; + +import org.sonar.api.platform.ServerUpgradeStatus; +import org.sonar.db.charset.DatabaseCharsetChecker; + +public class VerifyDatabaseCharsetAfterMigration extends VerifyDatabaseCharsetAtStartup { + + public VerifyDatabaseCharsetAfterMigration(ServerUpgradeStatus upgradeStatus, DatabaseCharsetChecker charsetChecker) { + super(upgradeStatus, charsetChecker); + } + + @Override + public void start() { + if (getUpgradeStatus().isFreshInstall() || getUpgradeStatus().isUpgraded()) { + check(); + } + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAtStartup.java b/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAtStartup.java new file mode 100644 index 00000000000..aadd9ecad85 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/db/VerifyDatabaseCharsetAtStartup.java @@ -0,0 +1,54 @@ +/* + * 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.server.db; + +import org.picocontainer.Startable; +import org.sonar.api.platform.ServerUpgradeStatus; +import org.sonar.db.charset.DatabaseCharsetChecker; + +public class VerifyDatabaseCharsetAtStartup implements Startable { + + private final ServerUpgradeStatus upgradeStatus; + private final DatabaseCharsetChecker charsetChecker; + + public VerifyDatabaseCharsetAtStartup(ServerUpgradeStatus upgradeStatus, DatabaseCharsetChecker charsetChecker) { + this.upgradeStatus = upgradeStatus; + this.charsetChecker = charsetChecker; + } + + @Override + public void start() { + check(); + } + + @Override + public void stop() { + // do nothing + } + + protected void check() { + boolean enforceUtf8 = upgradeStatus.isFreshInstall(); + charsetChecker.check(enforceUtf8); + } + + protected ServerUpgradeStatus getUpgradeStatus() { + return upgradeStatus; + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/PlatformDatabaseMigration.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/PlatformDatabaseMigration.java index a003031e6d6..d4420506492 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/PlatformDatabaseMigration.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/PlatformDatabaseMigration.java @@ -63,7 +63,8 @@ public class PlatformDatabaseMigration implements DatabaseMigration { @Nullable private Throwable failureError; - public PlatformDatabaseMigration(RubyBridge rubyBridge, PlatformDatabaseMigrationExecutorService executorService, Platform platform) { + public PlatformDatabaseMigration(RubyBridge rubyBridge, + PlatformDatabaseMigrationExecutorService executorService, Platform platform) { this.rubyBridge = rubyBridge; this.executorService = executorService; this.platform = platform; @@ -93,7 +94,7 @@ public class PlatformDatabaseMigration implements DatabaseMigration { return; } - running.getAndSet(true); + running.set(true); executorService.execute(new Runnable() { @Override public void run() { diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java index f1ddb825890..6006d20c9f0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java @@ -24,6 +24,8 @@ import org.sonar.core.i18n.DefaultI18n; import org.sonar.core.i18n.RuleI18nManager; import org.sonar.core.platform.PluginClassloaderFactory; import org.sonar.core.platform.PluginLoader; +import org.sonar.db.charset.DatabaseCharsetChecker; +import org.sonar.server.db.VerifyDatabaseCharsetAtStartup; import org.sonar.server.db.migrations.DatabaseMigrator; import org.sonar.server.db.migrations.PlatformDatabaseMigration; import org.sonar.server.db.migrations.PlatformDatabaseMigrationExecutorServiceImpl; @@ -46,6 +48,8 @@ public class PlatformLevel2 extends PlatformLevel { add( DefaultServerUpgradeStatus.class, DatabaseMigrator.class, + DatabaseCharsetChecker.class, + VerifyDatabaseCharsetAtStartup.class, // depends on Ruby PlatformRubyBridge.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java index 6b614a41c9d..14c29a30859 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java @@ -21,7 +21,7 @@ package org.sonar.server.platform.platformlevel; import org.sonar.api.utils.UriReader; import org.sonar.core.util.DefaultHttpDownloader; -import org.sonar.db.CollationChecker; +import org.sonar.server.db.VerifyDatabaseCharsetAfterMigration; import org.sonar.server.platform.PersistentSettings; import org.sonar.server.platform.ServerIdGenerator; import org.sonar.server.startup.ServerMetadataPersister; @@ -34,7 +34,7 @@ public class PlatformLevel3 extends PlatformLevel { @Override protected void configureLevel() { add( - CollationChecker.class, + VerifyDatabaseCharsetAfterMigration.class, PersistentSettings.class, ServerMetadataPersister.class, DefaultHttpDownloader.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java index 218e9c6e8b4..1fb52f66f9e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelSafeMode.java @@ -23,8 +23,8 @@ import org.sonar.server.platform.ws.DbMigrationStatusAction; import org.sonar.server.platform.ws.MigrateDbAction; import org.sonar.server.platform.ws.StatusAction; import org.sonar.server.platform.ws.SystemWs; -import org.sonar.server.ws.WebServicesWs; import org.sonar.server.ws.WebServiceEngine; +import org.sonar.server.ws.WebServicesWs; public class PlatformLevelSafeMode extends PlatformLevel { public PlatformLevelSafeMode(PlatformLevel parent) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationAsynchronousTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationAsynchronousTest.java index 5cec2731897..4c5e407ac27 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationAsynchronousTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationAsynchronousTest.java @@ -33,15 +33,15 @@ public class PlatformDatabaseMigrationAsynchronousTest { * Implementation of execute wraps specified Runnable to add a delay of 200 ms before passing it * to a SingleThread executor to execute asynchronously. */ - private PlatformDatabaseMigrationExecutorService executorService = new PlatformDatabaseMigrationExecutorServiceAdaptor() { + PlatformDatabaseMigrationExecutorService executorService = new PlatformDatabaseMigrationExecutorServiceAdaptor() { @Override public void execute(final Runnable command) { taskSuppliedForAsyncProcess = true; } }; - private RubyBridge rubyBridge = mock(RubyBridge.class); - private Platform platform = mock(Platform.class); - private PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); + RubyBridge rubyBridge = mock(RubyBridge.class); + Platform platform = mock(Platform.class); + PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); @Test public void testName() throws Exception { diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationConcurrentAccessTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationConcurrentAccessTest.java index f524b6ac58c..d11dfffa2f7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationConcurrentAccessTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationConcurrentAccessTest.java @@ -61,7 +61,7 @@ public class PlatformDatabaseMigrationConcurrentAccessTest { /** * Implementation of RubyDatabaseMigration which trigger method increments a thread-safe counter and add a delay of 200ms */ - private RubyDatabaseMigration rubyDatabaseMigration = new RubyDatabaseMigration() { + RubyDatabaseMigration rubyDatabaseMigration = new RubyDatabaseMigration() { @Override public void trigger() { triggerCount.incrementAndGet(); @@ -72,10 +72,10 @@ public class PlatformDatabaseMigrationConcurrentAccessTest { } } }; - private RubyBridge rubyBridge = mock(RubyBridge.class); - private Platform platform = mock(Platform.class); - private RubyRailsRoutes railsRoutes = mock(RubyRailsRoutes.class); - private PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); + RubyBridge rubyBridge = mock(RubyBridge.class); + Platform platform = mock(Platform.class); + RubyRailsRoutes railsRoutes = mock(RubyRailsRoutes.class); + PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); @After public void tearDown() { diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationTest.java index 969b27f4c6f..c4251d4b504 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/PlatformDatabaseMigrationTest.java @@ -44,19 +44,19 @@ public class PlatformDatabaseMigrationTest { /** * Implementation of execute runs Runnable synchronously. */ - private PlatformDatabaseMigrationExecutorService executorService = new PlatformDatabaseMigrationExecutorServiceAdaptor() { + PlatformDatabaseMigrationExecutorService executorService = new PlatformDatabaseMigrationExecutorServiceAdaptor() { @Override public void execute(Runnable command) { command.run(); } }; - private RubyBridge rubyBridge = mock(RubyBridge.class); - private RubyDatabaseMigration rubyDatabaseMigration = mock(RubyDatabaseMigration.class); - private RubyRailsRoutes rubyRailsRoutes = mock(RubyRailsRoutes.class); - private Platform platform = mock(Platform.class); - private InOrder inOrder = inOrder(rubyDatabaseMigration, rubyBridge, rubyRailsRoutes, platform); + RubyBridge rubyBridge = mock(RubyBridge.class); + RubyDatabaseMigration rubyDatabaseMigration = mock(RubyDatabaseMigration.class); + RubyRailsRoutes rubyRailsRoutes = mock(RubyRailsRoutes.class); + Platform platform = mock(Platform.class); + InOrder inOrder = inOrder(rubyDatabaseMigration, rubyBridge, rubyRailsRoutes, platform); - private PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); + PlatformDatabaseMigration underTest = new PlatformDatabaseMigration(rubyBridge, executorService, platform); @Test public void status_is_NONE_when_component_is_created() { |