]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5700 New logging API to remove coupling on SLF4J
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Sun, 15 Feb 2015 22:32:14 +0000 (23:32 +0100)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 19 Feb 2015 11:02:10 +0000 (12:02 +0100)
140 files changed:
microbenchmark-template/src/main/java/org/sonar/microbenchmark/LoggingBenchmark.java [new file with mode: 0644]
plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/EmailNotificationChannel.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java
plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java
server/sonar-search/pom.xml
server/sonar-server/pom.xml
server/sonar-server/src/main/java/org/sonar/core/computation/dbcleaner/ProjectCleaner.java
server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java
server/sonar-server/src/main/java/org/sonar/server/app/StartupLogs.java
server/sonar-server/src/main/java/org/sonar/server/app/TomcatAccessLog.java
server/sonar-server/src/main/java/org/sonar/server/app/Webapp.java
server/sonar-server/src/main/java/org/sonar/server/charts/ChartFactory.java
server/sonar-server/src/main/java/org/sonar/server/charts/ChartsServlet.java
server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThread.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThreadLauncher.java
server/sonar-server/src/main/java/org/sonar/server/computation/issue/ScmAccountCacheLoader.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java
server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java
server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java
server/sonar-server/src/main/java/org/sonar/server/db/EmbeddedDatabase.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/DatabaseMigrator.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/SqlUtil.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/Progress.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/ViolationMigration.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java
server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java
server/sonar-server/src/main/java/org/sonar/server/es/IndexCreator.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java
server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterEngine.java
server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationCenter.java
server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationService.java
server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java
server/sonar-server/src/main/java/org/sonar/server/platform/ClassLoaderUtils.java
server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java
server/sonar-server/src/main/java/org/sonar/server/platform/MasterServletFilter.java
server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java
server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdGenerator.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerLifecycleNotifier.java
server/sonar-server/src/main/java/org/sonar/server/platform/SwitchLogbackAppender.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartHandler.java
server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarsInstaller.java
server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java
server/sonar-server/src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java
server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java
server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java
server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java
server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
server/sonar-server/src/main/java/org/sonar/server/search/Facets.java
server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java
server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java
server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java
server/sonar-server/src/main/java/org/sonar/server/startup/CopyRequirementsFromCharacteristicsToRules.java
server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java
server/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java
server/sonar-server/src/main/java/org/sonar/server/startup/RenameDeprecatedPropertyKeys.java
server/sonar-server/src/main/java/org/sonar/server/startup/ServerMetadataPersister.java
server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
server/sonar-server/src/main/java/org/sonar/server/ui/JRubyProfiling.java
server/sonar-server/src/main/java/org/sonar/server/user/NewUserNotifier.java
server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java
server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java
server/sonar-server/src/main/java/org/sonar/server/util/ProgressLogger.java
server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java
server/sonar-server/src/test/java/org/sonar/core/computation/dbcleaner/ProjectCleanerTest.java
server/sonar-server/src/test/java/org/sonar/server/app/StartupLogsTest.java
server/sonar-server/src/test/java/org/sonar/server/app/TomcatAccessLogTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/issue/ScmAccountCacheLoaderTest.java
server/sonar-server/src/test/java/org/sonar/server/db/migrations/SqlUtilTest.java
server/sonar-server/src/test/java/org/sonar/server/db/migrations/v36/ProgressTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/SwitchLogbackAppenderTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/startup/ActivityServerIdTest.java
server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java
server/sonar-server/src/test/java/org/sonar/server/util/ProgressLoggerTest.java
server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/invalid-switch.xml [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/valid-switch.xml [deleted file]
sonar-batch/pom.xml
sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java
sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java
sonar-batch/src/main/java/org/sonar/batch/scan/LastLineHashes.java
sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java
sonar-core/src/main/java/org/sonar/core/purge/PurgeProfiler.java
sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java
sonar-core/src/test/java/org/sonar/core/purge/PurgeProfilerTest.java
sonar-deprecated/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java
sonar-duplications/src/test/java/org/sonar/duplications/DuplicationsTestUtil.java
sonar-plugin-api/pom.xml
sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java
sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentKeys.java
sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java
sonar-plugin-api/src/main/java/org/sonar/api/rules/Violation.java
sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinition.java
sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinitionAnnotationLoader.java
sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/HttpDownloader.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/LocalizedMessages.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/TimeProfiler.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/XpathParser.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/command/CommandExecutor.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/BaseLogger.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleFormatter.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLogger.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLoggers.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ListInterceptor.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogInterceptor.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogTester.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLogger.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLoggers.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Logger.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullInterceptor.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/InMemoryLogger.java [deleted file]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/Slf4jLoggers.java [deleted file]
sonar-plugin-api/src/main/java/org/sonar/api/utils/log/package-info.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentKeysTest.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/TimeProfilerTest.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleFormatterTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggerTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggersTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogTesterTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogbackLoggerTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LoggersTest.java [new file with mode: 0644]
sonar-plugin-api/src/test/java/org/sonar/api/utils/log/NullInterceptorTest.java [new file with mode: 0644]

diff --git a/microbenchmark-template/src/main/java/org/sonar/microbenchmark/LoggingBenchmark.java b/microbenchmark-template/src/main/java/org/sonar/microbenchmark/LoggingBenchmark.java
new file mode 100644 (file)
index 0000000..fa836bd
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.microbenchmark;
+
+import org.apache.commons.lang.StringUtils;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.slf4j.Logger;
+
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@State(Scope.Thread)
+@Fork(1)
+@Warmup(iterations = 3)
+@Measurement(iterations = 3)
+@BenchmarkMode(Mode.Throughput)
+public class LoggingBenchmark {
+
+  private Logger logger1 = org.slf4j.LoggerFactory.getLogger("microbenchmark1");
+  private Logger logger2 = org.slf4j.LoggerFactory.getLogger("microbenchmark2");
+
+  @Benchmark
+  public void logback_converters() throws Exception {
+    logger1.warn("many arguments {} {} {} {} {} {}", "foo", 7, 4.5, 1234567890L, true, new Date());
+  }
+
+  @Benchmark
+  public void string_converters() throws Exception {
+    logger2.warn(String.format("many arguments %s %d %f %d %b %tc", "foo", 7, 4.5, 1234567890L,  true, new Date()));
+  }
+
+  @Benchmark
+  public void logback_no_args() throws Exception {
+    logger1.warn("no args");
+    StringUtils.replaceOnce()
+  }
+
+
+  /**
+   * You can this benchmark with maven command-line (see run.sh) or by executing this method
+   * in IDE
+   */
+  public static void main(String[] args) throws RunnerException {
+    Options opt = new OptionsBuilder()
+      .include(LoggingBenchmark.class.getSimpleName())
+      .build();
+    new Runner(opt).run();
+  }
+}
index 5ae23c21b2221df744f6adc705c20299983def9a..a11154370cbebe3a761004c43c6242ef4ec086fd 100644 (file)
@@ -22,14 +22,14 @@ package org.sonar.plugins.emailnotifications;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.mail.EmailException;
 import org.apache.commons.mail.SimpleEmail;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.config.EmailSettings;
 import org.sonar.api.database.model.User;
 import org.sonar.api.notifications.Notification;
 import org.sonar.api.notifications.NotificationChannel;
 import org.sonar.api.security.UserFinder;
 import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.plugins.emailnotifications.api.EmailMessage;
 import org.sonar.plugins.emailnotifications.api.EmailTemplate;
 
@@ -48,7 +48,7 @@ import java.net.URL;
  */
 public class EmailNotificationChannel extends NotificationChannel {
 
-  private static final Logger LOG = LoggerFactory.getLogger(EmailNotificationChannel.class);
+  private static final Logger LOG = Loggers.get(EmailNotificationChannel.class);
 
   /**
    * @see org.apache.commons.mail.Email#setSocketConnectionTimeout(int)
index e9963f838450cf7e6f9e47fed727cf36d44cfbeb..fcdb738e46d61df90a18d33db2ce15830a4694d4 100644 (file)
@@ -22,14 +22,14 @@ package org.sonar.xoo.lang;
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.FilePredicates;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -43,7 +43,7 @@ import java.util.List;
  */
 public class CoveragePerTestSensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(CoveragePerTestSensor.class);
+  private static final Logger LOG = Loggers.get(CoveragePerTestSensor.class);
 
   private static final String COVER_PER_TEST_EXTENSION = ".coveragePerTest";
 
index a10120028961a2c8e02509305eea169c95f0520f..1c558ff24c695f14bb0c9cd5e7b0780d84ac4544 100644 (file)
@@ -22,14 +22,14 @@ package org.sonar.xoo.lang;
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.FilePredicates;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -42,7 +42,7 @@ import java.util.List;
  */
 public class DependencySensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(DependencySensor.class);
+  private static final Logger LOG = Loggers.get(DependencySensor.class);
 
   private static final String DEPS_EXTENSION = ".deps";
 
index a890b63ac9d0c126f0d66b3b50c41f9ecce59efe..7469d9ff2cfcb12d90781b6ad71697807c1b6a99 100644 (file)
@@ -21,14 +21,14 @@ package org.sonar.xoo.lang;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.measure.MetricFinder;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
 import org.sonar.api.batch.sensor.measure.NewMeasure;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -41,7 +41,7 @@ import java.util.List;
  */
 public class MeasureSensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(MeasureSensor.class);
+  private static final Logger LOG = Loggers.get(MeasureSensor.class);
 
   private static final String MEASURES_EXTENSION = ".measures";
 
index 8d14771bab48190f7d5e29e032f87aba5d2a85cd..5cc2ea832f9b46d33eaf2fb0a985d6bb92d05eb0 100644 (file)
@@ -22,14 +22,14 @@ package org.sonar.xoo.lang;
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
 import org.sonar.api.batch.sensor.symbol.Symbol;
 import org.sonar.api.batch.sensor.symbol.SymbolTableBuilder;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -42,7 +42,7 @@ import java.util.List;
  */
 public class SymbolReferencesSensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(SymbolReferencesSensor.class);
+  private static final Logger LOG = Loggers.get(SymbolReferencesSensor.class);
 
   private static final String SYMBOL_EXTENSION = ".symbol";
 
index 004c186b2089502db27bdc58ab5957c8bc761ea9..549a655573e7b678fe6bcb64b65c52cb74f57fe4 100644 (file)
@@ -22,14 +22,14 @@ package org.sonar.xoo.lang;
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
 import org.sonar.api.batch.sensor.highlighting.HighlightingBuilder;
 import org.sonar.api.batch.sensor.highlighting.TypeOfText;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -42,7 +42,7 @@ import java.util.List;
  */
 public class SyntaxHighlightingSensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(SyntaxHighlightingSensor.class);
+  private static final Logger LOG = Loggers.get(SyntaxHighlightingSensor.class);
 
   private static final String HIGHLIGHTING_EXTENSION = ".highlighting";
 
index a406a20a9ca59c3426c31f084cc82b0a53436fec..f7b38976489a090886ab20624c84ee33fbd8fc03 100644 (file)
@@ -22,8 +22,6 @@ package org.sonar.xoo.lang;
 import com.google.common.base.Splitter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.fs.FilePredicates;
 import org.sonar.api.batch.fs.FileSystem;
 import org.sonar.api.batch.fs.InputFile;
@@ -31,6 +29,8 @@ import org.sonar.api.batch.sensor.Sensor;
 import org.sonar.api.batch.sensor.SensorContext;
 import org.sonar.api.batch.sensor.SensorDescriptor;
 import org.sonar.api.batch.sensor.test.TestCaseExecution;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.xoo.Xoo;
 
 import java.io.File;
@@ -43,7 +43,7 @@ import java.util.List;
  */
 public class TestCaseSensor implements Sensor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(TestCaseSensor.class);
+  private static final Logger LOG = Loggers.get(TestCaseSensor.class);
 
   private static final String TESTPLAN_EXTENSION = ".testplan";
 
index 9f836ef23bade14bc04e02ce270982236caaf4ef..48b37cee245d3b4d12c260375a4508f1317c525e 100644 (file)
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
-      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-core</artifactId>
-      <scope>provided</scope>
     </dependency>
 
     <!-- testing -->
index 5f76c8e1f50fb65646e7c30159d7a19b77466b53..12419aa2142dec9822e1350a9e2fc4a8e6bef8c4 100644 (file)
   </properties>
 
   <dependencies>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>log4j-over-slf4j</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>jul-to-slf4j</artifactId>
index dd9a2d955ecb4675cefc1c84641bcfa569ae855d..6c341d54e0e3f59e018dd0fa93134a850db40b9b 100644 (file)
 
 package org.sonar.core.computation.dbcleaner;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.TimeUtils;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.purge.IdUuidPair;
@@ -37,12 +37,13 @@ import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.properties.ProjectSettingsFactory;
 
 import javax.annotation.Nullable;
+
 import java.util.Date;
 
 import static org.sonar.core.purge.PurgeConfiguration.newDefaultPurgeConfiguration;
 
 public class ProjectCleaner implements ServerComponent {
-  private static final Logger LOG = LoggerFactory.getLogger(ProjectCleaner.class);
+  private static final Logger LOG = Loggers.get(ProjectCleaner.class);
 
   private final PurgeProfiler profiler;
   private final PurgeListener purgeListener;
index 89b3a09377a621b6def7bbc3e155bb09173bdd71..1a308b1bfb1e7eb6765754fd7d2d7e9529f72d8e 100644 (file)
@@ -24,7 +24,7 @@ import org.apache.catalina.LifecycleException;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.commons.io.FileUtils;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 import org.sonar.process.Props;
 
@@ -60,7 +60,7 @@ class EmbeddedTomcat {
     webappContext = Webapp.configure(tomcat, props);
     try {
       tomcat.start();
-      new StartupLogs(props, LoggerFactory.getLogger(getClass())).log(tomcat);
+      new StartupLogs(props, Loggers.get(getClass())).log(tomcat);
     } catch (LifecycleException e) {
       Throwables.propagate(e);
     }
@@ -95,7 +95,7 @@ class EmbeddedTomcat {
         tomcat.stop();
         tomcat.destroy();
       } catch (Exception e) {
-        LoggerFactory.getLogger(EmbeddedTomcat.class).error("Fail to stop web server", e);
+        Loggers.get(EmbeddedTomcat.class).error("Fail to stop web server", e);
       }
     }
     FileUtils.deleteQuietly(tomcatBasedir());
index 7fcf02955523356887b54eb2af790b3ca55e36b5..abbce664d8efd47a35beb04954b3ed010ac58a8f 100644 (file)
@@ -23,7 +23,7 @@ import org.apache.catalina.connector.Connector;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.commons.lang.StringUtils;
 import org.apache.coyote.http11.AbstractHttp11JsseProtocol;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.process.Props;
 
 class StartupLogs {
index 69b80a51d69f198798669e3f5fda6d0da19e9404..eb34606780fecc707fa4db6d903a17eb04c1ec50 100644 (file)
@@ -24,8 +24,8 @@ import ch.qos.logback.core.FileAppender;
 import org.apache.catalina.LifecycleEvent;
 import org.apache.catalina.LifecycleListener;
 import org.apache.catalina.startup.Tomcat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.LogbackHelper;
 import org.sonar.process.Props;
 
@@ -36,7 +36,7 @@ class TomcatAccessLog {
 
   void configure(Tomcat tomcat, Props props) {
     tomcat.setSilent(true);
-    tomcat.getService().addLifecycleListener(new LifecycleLogger(LoggerFactory.getLogger(TomcatAccessLog.class)));
+    tomcat.getService().addLifecycleListener(new LifecycleLogger(Loggers.get(TomcatAccessLog.class)));
     configureLogbackAccess(tomcat, props);
   }
 
index b32b009896f336c4e8904b5e3156cc3e5bfb0794..f2be0473d454a38a036fd5630cb27fe3bf30a194 100644 (file)
@@ -23,7 +23,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 import org.sonar.process.Props;
 
@@ -90,7 +90,7 @@ class Webapp {
     if (props.valueAsBoolean("sonar.web.dev", false)) {
       context.addParameter(RAILS_ENV, "development");
       context.addParameter(JRUBY_MAX_RUNTIMES, "3");
-      LoggerFactory.getLogger(Webapp.class).warn("WEB DEVELOPMENT MODE IS ENABLED - DO NOT USE FOR PRODUCTION USAGE");
+      Loggers.get(Webapp.class).warn("WEB DEVELOPMENT MODE IS ENABLED - DO NOT USE FOR PRODUCTION USAGE");
     } else {
       context.addParameter(RAILS_ENV, "production");
       context.addParameter(JRUBY_MAX_RUNTIMES, "1");
@@ -102,7 +102,7 @@ class Webapp {
     if (StringUtils.isEmpty(webDir)) {
       webDir = new File(props.value(ProcessConstants.PATH_HOME), "web").getAbsolutePath();
     }
-    LoggerFactory.getLogger(Webapp.class).info(String.format("Webapp directory: %s", webDir));
+    Loggers.get(Webapp.class).info(String.format("Webapp directory: %s", webDir));
     return webDir;
   }
 }
index 7035fd7e9f1f62a6a41fa74a68e6bffef14564ec..0c80acb0ef308175eaff43d8cc781b09109b8995 100644 (file)
 package org.sonar.server.charts;
 
 import com.google.common.collect.Maps;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.charts.Chart;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.CheckForNull;
+
 import java.util.Map;
 
 public final class ChartFactory implements ServerComponent {
-  private static final Logger LOG = LoggerFactory.getLogger(ChartFactory.class);
+  private static final Logger LOG = Loggers.get(ChartFactory.class);
   private final Map<String, Chart> chartsByKey = Maps.newHashMap();
 
 
index 2994d3712227773f037a101efc82c9ead810a9e8..5a6cc9ae2626dcce1ad626e7b2fc0022d163bdd3 100644 (file)
@@ -22,10 +22,10 @@ package org.sonar.server.charts;
 import com.google.common.collect.Maps;
 import com.google.common.io.Closeables;
 import org.jfree.chart.encoders.KeypointPNGEncoderAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.charts.Chart;
 import org.sonar.api.charts.ChartParameters;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.charts.deprecated.BarChart;
 import org.sonar.server.charts.deprecated.BaseChartWeb;
 import org.sonar.server.charts.deprecated.CustomBarChart;
@@ -47,7 +47,7 @@ import java.util.Map;
 
 public class ChartsServlet extends HttpServlet {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ChartsServlet.class);
+  private static final Logger LOG = Loggers.get(ChartsServlet.class);
   private static final long serialVersionUID = 669857447198433893L;
 
   @Override
index 2e532ee99ea3ee26179f0fc9976f8d129d6235aa..409cbc84208c0fca441f0b8c1f58571bb0ae2912 100644 (file)
@@ -22,10 +22,10 @@ package org.sonar.server.component;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.component.Component;
 import org.sonar.api.utils.Paging;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.Collection;
 import java.util.List;
@@ -38,7 +38,7 @@ import static com.google.common.collect.Lists.newArrayList;
  */
 public class DefaultComponentFinder {
 
-  private static final Logger LOG = LoggerFactory.getLogger(DefaultComponentFinder.class);
+  private static final Logger LOG = Loggers.get(DefaultComponentFinder.class);
 
   public DefaultComponentQueryResult find(ComponentQuery query, List<Component> allComponents) {
     LOG.debug("ComponentQuery : {}", query);
index 2f8f2cce6ca28d8328ad6064c9095fdbab20fe0c..b0f60f1d6b7a01102af714fdddd8f00f281e2c86 100644 (file)
@@ -22,11 +22,11 @@ package org.sonar.server.computation;
 
 import com.google.common.base.Throwables;
 import org.apache.commons.lang.ArrayUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.utils.System2;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.activity.Activity;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
@@ -39,7 +39,7 @@ import org.sonar.server.db.DbClient;
 
 public class ComputationService implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ComputationService.class);
+  private static final Logger LOG = Loggers.get(ComputationService.class);
 
   private final DbClient dbClient;
   private final ComputationSteps steps;
index eecd6613e20e5d16a259c539b9c88dd86e89ab28..07c9a23e3a09e380f2b29578f8d893a2b69dd686 100644 (file)
 
 package org.sonar.server.computation;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.sonar.api.platform.ComponentContainer;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.server.computation.step.ComputationSteps;
 import org.sonar.server.platform.Platform;
@@ -31,7 +32,7 @@ import org.sonar.server.platform.Platform;
  * This thread pops queue of reports and processes the report if present
  */
 public class ComputationThread implements Runnable {
-  private static final Logger LOG = LoggerFactory.getLogger(ComputationThread.class);
+  private static final Logger LOG = Loggers.get(ComputationThread.class);
 
   private final AnalysisReportQueue queue;
 
index 5354930c3a7b90b62016e30748e2c52fa7ef5d6d..c19b80a0a7b4e8d468087c93f9f1e6beb93105e3 100644 (file)
@@ -45,7 +45,7 @@ public class ComputationThreadLauncher implements Startable, ServerComponent, Se
 
   public ComputationThreadLauncher(AnalysisReportQueue queue) {
     this.queue = queue;
-    this.executorService = Executors.newSingleThreadScheduledExecutor(threadFactoryWithSpecificNameForLogging());
+    this.executorService = Executors.newSingleThreadScheduledExecutor(newThreadFactory());
 
     this.delayBetweenTasks = 10;
     this.delayForFirstStart = 0;
@@ -55,7 +55,7 @@ public class ComputationThreadLauncher implements Startable, ServerComponent, Se
   @VisibleForTesting
   ComputationThreadLauncher(AnalysisReportQueue queue, long delayForFirstStart, long delayBetweenTasks, TimeUnit timeUnit) {
     this.queue = queue;
-    this.executorService = Executors.newSingleThreadScheduledExecutor(threadFactoryWithSpecificNameForLogging());
+    this.executorService = Executors.newSingleThreadScheduledExecutor(newThreadFactory());
 
     this.delayBetweenTasks = delayBetweenTasks;
     this.delayForFirstStart = delayForFirstStart;
@@ -81,10 +81,7 @@ public class ComputationThreadLauncher implements Startable, ServerComponent, Se
     executorService.scheduleAtFixedRate(new ComputationThread(queue), delayForFirstStart, delayBetweenTasks, timeUnit);
   }
 
-  /**
-   * @see org.sonar.server.platform.SwitchLogbackAppender
-   */
-  private ThreadFactory threadFactoryWithSpecificNameForLogging() {
+  private ThreadFactory newThreadFactory() {
     return new ThreadFactoryBuilder()
       .setNameFormat(THREAD_NAME_PREFIX + "%d").setPriority(Thread.MIN_PRIORITY).build();
   }
index 4f6d1aeb6d3970605666f0b24a3d0c2ca598e855..2d51c5b5526eea663262aac2ac95acf07ea4e3c1 100644 (file)
@@ -23,8 +23,8 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Collections2;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.util.cache.CacheLoader;
@@ -42,7 +42,7 @@ public class ScmAccountCacheLoader implements CacheLoader<String, String> {
   private final UserIndex index;
 
   public ScmAccountCacheLoader(UserIndex index) {
-    this(index, LoggerFactory.getLogger(ScmAccountCacheLoader.class));
+    this(index, Loggers.get(ScmAccountCacheLoader.class));
   }
 
   @VisibleForTesting
index 6df408a0aacc643229ff42f5058159caaeadc303..042f13e7c4ae343ba9c474589483cb593d8d82b0 100644 (file)
 package org.sonar.server.computation.step;
 
 import org.apache.commons.io.FileUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.utils.TempFolder;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.batch.protocol.output.BatchOutputReader;
 import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.core.computation.db.AnalysisReportDto;
@@ -38,7 +38,7 @@ import java.io.File;
 
 public class ParseReportStep implements ComputationStep {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ParseReportStep.class);
+  private static final Logger LOG = Loggers.get(ParseReportStep.class);
 
   private final IssueComputation issueComputation;
   private final DbClient dbClient;
index 8a9347382315f8f12bbbc10655703854722d3f67..1fe29ad23c4718f808c4f4db0f070db1cbe23d16 100644 (file)
@@ -24,23 +24,32 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.ibatis.session.ResultContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.System2;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.DaoComponent;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.Dto;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.search.DbSynchronizationHandler;
 import org.sonar.server.search.IndexDefinition;
-import org.sonar.server.search.action.*;
+import org.sonar.server.search.action.DeleteKey;
+import org.sonar.server.search.action.DeleteNestedItem;
+import org.sonar.server.search.action.InsertDto;
+import org.sonar.server.search.action.RefreshIndex;
+import org.sonar.server.search.action.UpsertDto;
+import org.sonar.server.search.action.UpsertNestedItem;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
 import java.io.Serializable;
 import java.sql.Timestamp;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
@@ -115,7 +124,7 @@ import static com.google.common.collect.Maps.newHashMap;
  */
 public abstract class BaseDao<MAPPER, DTO extends Dto<KEY>, KEY extends Serializable> implements Dao<DTO, KEY>, DaoComponent {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(BaseDao.class);
+  private static final Logger LOGGER = Loggers.get(BaseDao.class);
 
   protected IndexDefinition indexDefinition;
   private Class<MAPPER> mapperClass;
index 1b3fc5aeedd648bbebca0b0a12ca625d64cf7262..81bd80880998370b0c85dcfaa2e945742e477355 100644 (file)
@@ -23,7 +23,7 @@ import com.google.common.base.Throwables;
 import org.apache.commons.dbutils.DbUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.core.persistence.Database;
 import org.sonar.core.persistence.dialect.H2;
@@ -44,7 +44,7 @@ public class DatabaseChecker implements ServerComponent, Startable {
   public void start() {
     try {
       if (H2.ID.equals(db.getDialect().getId())) {
-        LoggerFactory.getLogger(DatabaseChecker.class).warn("H2 database should be used for evaluation purpose only");
+        Loggers.get(DatabaseChecker.class).warn("H2 database should be used for evaluation purpose only");
       } else if (Oracle.ID.equals(db.getDialect().getId())) {
         checkOracleDriverVersion();
       }
index 51d8b6dd593d95080b04ce0635bbe745b70193f3..ef0ab6c5ed1ca37c746b05130c0ad51a43d8d41a 100644 (file)
@@ -24,11 +24,11 @@ import org.apache.commons.lang.StringUtils;
 import org.h2.Driver;
 import org.h2.tools.Server;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.config.Settings;
 import org.sonar.api.database.DatabaseProperties;
 import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 
 import java.io.File;
@@ -36,7 +36,7 @@ import java.sql.DriverManager;
 import java.sql.SQLException;
 
 public class EmbeddedDatabase implements Startable {
-  private static final Logger LOG = LoggerFactory.getLogger(EmbeddedDatabase.class);
+  private static final Logger LOG = Loggers.get(EmbeddedDatabase.class);
   private final Settings settings;
   private Server server;
 
index 9b69826fcd4faf938b6edca6fe7a69f7f50838e3..e13c246802d289eea4e95c2b99b819412aed556c 100644 (file)
@@ -23,7 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.dbutils.DbUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.platform.ServerUpgradeStatus;
 import org.sonar.core.persistence.DdlUtils;
@@ -70,7 +70,7 @@ public class DatabaseMigrator implements ServerComponent, Startable {
   @VisibleForTesting
   boolean createDatabase() {
     if (DdlUtils.supportsDialect(dbClient.database().getDialect().getId()) && serverUpgradeStatus.isFreshInstall()) {
-      LoggerFactory.getLogger(getClass()).info("Create database");
+      Loggers.get(getClass()).info("Create database");
       SqlSession session = dbClient.openSession(false);
       Connection connection = null;
       try {
@@ -96,7 +96,7 @@ public class DatabaseMigrator implements ServerComponent, Startable {
     } catch (Exception e) {
       // duplication between log and exception because webapp does not correctly log initial stacktrace
       String msg = "Fail to execute database migration: " + className;
-      LoggerFactory.getLogger(getClass()).error(msg, e);
+      Loggers.get(getClass()).error(msg, e);
       throw new IllegalStateException(msg, e);
     }
   }
index 0a02368b43ddee4a0e666dfce4024a1370d65b81..17b0f16b1de190a44bd534c570c24a4f1e3c5892 100644 (file)
@@ -19,7 +19,8 @@
  */
 package org.sonar.server.db.migrations;
 
-import org.slf4j.Logger;
+
+import org.sonar.api.utils.log.Logger;
 
 import javax.annotation.CheckForNull;
 
index 5ae8b86c6895d66d312abbe36582ecbfa95ceff4..0e4c2e08273b4a82fc969de36b1b6fae72253c14 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.server.db.migrations.v36;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.TimerTask;
 import java.util.concurrent.atomic.AtomicLong;
@@ -46,7 +47,7 @@ class Progress extends TimerTask {
   }
 
   Progress(long totalViolations) {
-    this(totalViolations, LoggerFactory.getLogger(Progress.class), System.currentTimeMillis());
+    this(totalViolations, Loggers.get(Progress.class), System.currentTimeMillis());
   }
 
   void increment(int delta) {
index b1f752991ad8d0aabbff10d4407728cdcac2ebb5..c5e955b2c94dc59814bdac8a8351a15af199f218 100644 (file)
  */
 package org.sonar.server.db.migrations.v36;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.sonar.api.config.Settings;
 import org.sonar.api.utils.MessageException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.Database;
 import org.sonar.server.db.migrations.DatabaseMigration;
 import org.sonar.server.db.migrations.SqlUtil;
@@ -34,7 +35,7 @@ import java.sql.SQLException;
  */
 public class ViolationMigration implements DatabaseMigration {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(ViolationMigration.class);
+  private static final Logger LOGGER = Loggers.get(ViolationMigration.class);
 
   private static final String FAILURE_MESSAGE = "Fail to convert violations to issues";
 
index a695592cba2f9d82bf1a375839fe0b23fb35394e..e7092c1f07a8b8b33324b98c90cb866cf89b7313 100644 (file)
@@ -24,8 +24,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.ObjectUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.server.debt.DebtCharacteristic;
@@ -34,6 +32,8 @@ import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
 import org.sonar.api.server.rule.RulesDefinition;
 import org.sonar.api.utils.System2;
 import org.sonar.api.utils.ValidationMessages;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
@@ -58,7 +58,7 @@ import static com.google.common.collect.Lists.newArrayList;
 
 public class DebtModelBackup implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(DebtModelBackup.class);
+  private static final Logger LOG = Loggers.get(DebtModelBackup.class);
 
   private final DbClient dbClient;
   private final DebtModelOperations debtModelOperations;
index 21ed0c37e41d055bd803b9a88f7d248910b28f1d..4925a050ba0d4c619f6687b7e2aa4a5975a5a71b 100644 (file)
@@ -32,8 +32,8 @@ import org.elasticsearch.cluster.metadata.IndexMetaData;
 import org.elasticsearch.common.unit.ByteSizeUnit;
 import org.elasticsearch.common.unit.ByteSizeValue;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.util.ProgressLogger;
 
 import java.util.List;
@@ -49,7 +49,7 @@ import java.util.concurrent.atomic.AtomicLong;
  * </ul>
  */
 public class BulkIndexer implements Startable {
-  private static final Logger LOGGER = LoggerFactory.getLogger(BulkIndexer.class);
+  private static final Logger LOGGER = Loggers.get(BulkIndexer.class);
   private static final long FLUSH_BYTE_SIZE = new ByteSizeValue(5, ByteSizeUnit.MB).bytes();
   private static final String REFRESH_INTERVAL_SETTING = "index.refresh_interval";
   private static final String ALREADY_STARTED_MESSAGE = "Bulk indexing is already started";
index 65888f726109a373811d461dba35d4bc356c377e..909fd00bcbaa6cc779c7f9802f79ed7f27f4d46e 100644 (file)
@@ -25,9 +25,9 @@ import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
 import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.Map;
 
@@ -36,7 +36,7 @@ import java.util.Map;
  */
 public class IndexCreator implements ServerComponent, Startable {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreator.class);
+  private static final Logger LOGGER = Loggers.get(IndexCreator.class);
 
   /**
    * Internal setting stored on index to know its version. It's used to re-create index
index d29e4a4eabee5c2c780b45f2193b86f58f0ef49f..0ec177045a33f86468507cd84d5d5f57b7300f2f 100644 (file)
@@ -25,14 +25,14 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
 import org.sonar.api.notifications.NotificationManager;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rules.Rule;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.issue.db.IssueDto;
 import org.sonar.core.issue.db.IssueStorage;
@@ -63,7 +63,7 @@ import static com.google.common.collect.Sets.newHashSet;
 
 public class IssueBulkChangeService {
 
-  private static final Logger LOG = LoggerFactory.getLogger(IssueBulkChangeService.class);
+  private static final Logger LOG = Loggers.get(IssueBulkChangeService.class);
 
   private final DbClient dbClient;
   private final IssueService issueService;
index 280ab6e21971fb20cf13e17cd2e1311fd6700b01..c935e136b1d791e47fd5d1b2772a13b685983193 100644 (file)
@@ -21,9 +21,9 @@ package org.sonar.server.measure;
 
 import com.google.common.base.Joiner;
 import org.apache.commons.lang.SystemUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.profiling.Profiling;
 import org.sonar.core.profiling.Profiling.Level;
 import org.sonar.core.profiling.StopWatch;
@@ -35,7 +35,7 @@ import java.util.Map;
 
 public class MeasureFilterEngine implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger("org.sonar.MEASURE_FILTER");
+  private static final Logger LOG = Loggers.get("org.sonar.MEASURE_FILTER");
 
   private final MeasureFilterFactory factory;
   private final MeasureFilterExecutor executor;
index 9a3fb0565d38fc6f1e10534c66539a5c91089fc0..4f68514f3e531bcc99f05fa637d1168485118576 100644 (file)
 package org.sonar.server.notifications;
 
 import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.notifications.NotificationChannel;
 import org.sonar.api.notifications.NotificationDispatcherMetadata;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
+
 import java.util.Arrays;
 import java.util.List;
 
@@ -35,7 +36,7 @@ import java.util.List;
  */
 public class NotificationCenter implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(NotificationCenter.class);
+  private static final Logger LOG = Loggers.get(NotificationCenter.class);
 
   private final NotificationDispatcherMetadata[] dispatchersMetadata;
   private final NotificationChannel[] channels;
index 97764e97a47be6f6d8d2ba468320842403f549e4..f832d51127dd42ec86289a9bca7b42485bb269fd 100644 (file)
@@ -24,8 +24,6 @@ import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.SetMultimap;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.Properties;
 import org.sonar.api.Property;
 import org.sonar.api.ServerComponent;
@@ -34,6 +32,8 @@ import org.sonar.api.notifications.Notification;
 import org.sonar.api.notifications.NotificationChannel;
 import org.sonar.api.notifications.NotificationDispatcher;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.notification.DefaultNotificationManager;
 import org.sonar.server.db.DbClient;
 
@@ -65,7 +65,7 @@ import java.util.concurrent.TimeUnit;
 })
 public class NotificationService implements ServerComponent, Startable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(NotificationService.class);
+  private static final Logger LOG = Loggers.get(NotificationService.class);
 
   public static final String PROPERTY_DELAY = "sonar.notifications.delay";
   public static final String PROPERTY_DELAY_BEFORE_REPORTING_STATUS = "sonar.notifications.runningDelayBeforeReportingStatus";
index abd3c838ebb3072edac02eec59b7cd7d6af53789..b8f877701429d036d4d351bba8cd1ae471162352 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.server.platform;
 
 import org.apache.commons.dbutils.DbUtils;
 import org.elasticsearch.index.query.QueryBuilders;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.core.persistence.DatabaseVersion;
 import org.sonar.core.persistence.DbSession;
@@ -79,7 +79,7 @@ public class BackendCleanup implements ServerComponent {
   }
 
   public void clearIndexes() {
-    LoggerFactory.getLogger(getClass()).info("Truncate Elasticsearch indices");
+    Loggers.get(getClass()).info("Truncate Elasticsearch indices");
     try {
       esClient.prepareClearCache()
         .get();
index d9d0f57d3e3203189ea66129bfb2cd58de54f6f2..989c79561c50207e5e2d4aca3e9c1fe7cc878bba 100644 (file)
@@ -24,7 +24,7 @@ import com.google.common.collect.Lists;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.CharEncoding;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
 
@@ -128,7 +128,7 @@ class ClassLoaderUtils {
       try {
         jar.close();
       } catch (Exception e) {
-        LoggerFactory.getLogger(ClassLoaderUtils.class).error("Fail to close JAR file: " + jarPath, e);
+        Loggers.get(ClassLoaderUtils.class).error("Fail to close JAR file: " + jarPath, e);
       }
     }
   }
index 7675bee941a2f0d418bf47603468a524b070d8de..94066a1eaa9cc4de520a8a9217847329f162afbb 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.platform;
 
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.utils.MessageException;
 import org.sonar.core.persistence.DatabaseVersion;
 
@@ -39,7 +39,7 @@ public class DatabaseServerCompatibility implements Startable {
       throw MessageException.of("Database relates to a more recent version of sonar. Please check your settings.");
     }
     if (status == DatabaseVersion.Status.REQUIRES_UPGRADE) {
-      LoggerFactory.getLogger(DatabaseServerCompatibility.class).warn("Database must be upgraded. Please browse /setup");
+      Loggers.get(DatabaseServerCompatibility.class).warn("Database must be upgraded. Please browse /setup");
     }
   }
 
index a23eab31aa980dc4195df41901c4a3c8b4471b9b..e8e65acbee89c656ab1f8f8d80ee01d48fc0e97f 100644 (file)
@@ -22,11 +22,11 @@ package org.sonar.server.platform;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.filefilter.FileFilterUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.config.Settings;
 import org.sonar.api.platform.Server;
 import org.sonar.api.platform.ServerFileSystem;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 
 import java.io.File;
@@ -43,7 +43,7 @@ import java.util.List;
  */
 public class DefaultServerFileSystem implements ServerFileSystem, Startable {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(DefaultServerFileSystem.class);
+  private static final Logger LOGGER = Loggers.get(DefaultServerFileSystem.class);
 
   private final Server server;
   private File homeDir;
index ee7790e938aafe4bcdafbe68f71df50e9d2f1cf8..cb4567267c049f0c56523b085a21ae13bcf5f854 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.server.platform;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.web.ServletFilter;
 
 import javax.servlet.*;
@@ -63,7 +63,7 @@ public class MasterServletFilter implements Filter {
     List<Filter> filterList = Lists.newArrayList();
     for (ServletFilter extension : filterExtensions) {
       try {
-        LoggerFactory.getLogger(MasterServletFilter.class).info(String.format("Initializing servlet filter %s [pattern=%s]", extension, extension.doGetPattern()));
+        Loggers.get(MasterServletFilter.class).info(String.format("Initializing servlet filter %s [pattern=%s]", extension, extension.doGetPattern()));
         extension.init(config);
         filterList.add(extension);
       } catch (Exception e) {
index dc1ce4f53b9c8ea504aa78253ca48279cdebdc52..bbc3cc6b083c101729b9980b5863a5765864695b 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.server.platform;
 
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.platform.ComponentContainer;
 import org.sonar.api.platform.Server;
 import org.sonar.core.persistence.DatabaseVersion;
@@ -151,7 +151,7 @@ public class Platform {
         dbConnected = false;
         started = false;
       } catch (Exception e) {
-        LoggerFactory.getLogger(getClass()).debug("Fail to stop server - ignored", e);
+        Loggers.get(getClass()).debug("Fail to stop server - ignored", e);
       }
     }
   }
index 9b6aa28c4d790397e12f24b11b921dae9c7c67e9..c034a78ee38cfdf123e1f6d010a2f5bb431cb450 100644 (file)
@@ -24,14 +24,15 @@ import com.google.common.base.Function;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.Plugin;
 import org.sonar.api.platform.PluginMetadata;
 import org.sonar.api.platform.PluginRepository;
 import org.sonar.api.platform.ServerFileSystem;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
+
 import java.io.File;
 import java.io.IOException;
 
@@ -43,7 +44,7 @@ import java.io.IOException;
  */
 public class RailsAppsDeployer implements Startable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(RailsAppsDeployer.class);
+  private static final Logger LOG = Loggers.get(RailsAppsDeployer.class);
   private static final String ROR_PATH = "org/sonar/ror/";
 
   private final ServerFileSystem fileSystem;
index 7979bca8a8c9fbb750db8f9ccc6e06695359b5c2..cd9cb3229ed8352e845fbf94f08ba5b3d67d7ea5 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.server.platform;
 import com.google.common.collect.Lists;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 
 import java.io.UnsupportedEncodingException;
 import java.net.InetAddress;
@@ -121,7 +121,7 @@ public class ServerIdGenerator {
         }
       }
     } catch (SocketException e) {
-      LoggerFactory.getLogger(ServerIdGenerator.class).error("Fail to browse network interfaces", e);
+      Loggers.get(ServerIdGenerator.class).error("Fail to browse network interfaces", e);
     }
     return result;
   }
index 8da34aad46a39fbc690612a1ca1f3dd42f44d7a9..991ceb18d1db8b445f39569c99b5ca9855d86214 100644 (file)
@@ -26,11 +26,11 @@ import com.google.common.io.Resources;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.config.Settings;
 import org.sonar.api.platform.Server;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 
 import java.io.File;
@@ -42,7 +42,7 @@ import java.util.Date;
 import java.util.Properties;
 
 public final class ServerImpl extends Server implements Startable {
-  private static final Logger LOG = LoggerFactory.getLogger(ServerImpl.class);
+  private static final Logger LOG = Loggers.get(ServerImpl.class);
 
   private final Settings settings;
   private final Date startedAt;
index ebed1d422b0ac01758c4af28fc7878d3fae4583d..823f4a5d880ea8ff7cd7388bdb7d794b78d92dd5 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.platform;
 
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.platform.Server;
 import org.sonar.api.platform.ServerStartHandler;
 import org.sonar.api.platform.ServerStopHandler;
@@ -62,7 +62,7 @@ public class ServerLifecycleNotifier implements Startable {
   }
 
   public void notifyStart() {
-    LoggerFactory.getLogger(ServerLifecycleNotifier.class).debug("Notify " + ServerStartHandler.class.getSimpleName() + " handlers...");
+    Loggers.get(ServerLifecycleNotifier.class).debug("Notify " + ServerStartHandler.class.getSimpleName() + " handlers...");
     for (ServerStartHandler handler : startHandlers) {
       handler.onServerStart(server);
     }
@@ -70,7 +70,7 @@ public class ServerLifecycleNotifier implements Startable {
 
   @Override
   public void stop() {
-    LoggerFactory.getLogger(ServerLifecycleNotifier.class).debug("Notify " + ServerStopHandler.class.getSimpleName() + " handlers...");
+    Loggers.get(ServerLifecycleNotifier.class).debug("Notify " + ServerStopHandler.class.getSimpleName() + " handlers...");
     for (ServerStopHandler handler : stopHandlers) {
       handler.onServerStop(server);
     }
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/SwitchLogbackAppender.java b/server/sonar-server/src/main/java/org/sonar/server/platform/SwitchLogbackAppender.java
deleted file mode 100644 (file)
index fbc4610..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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.
- *
- * SonarQube 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.platform;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.AppenderBase;
-import ch.qos.logback.core.spi.AppenderAttachable;
-import ch.qos.logback.core.spi.AppenderAttachableImpl;
-import org.sonar.server.computation.ComputationThreadLauncher;
-
-import java.util.Iterator;
-
-public class SwitchLogbackAppender extends AppenderBase<ILoggingEvent> implements AppenderAttachable<ILoggingEvent> {
-
-  private AppenderAttachableImpl<ILoggingEvent> attachedAppenders = new AppenderAttachableImpl<>();
-  private Appender<ILoggingEvent> console = null;
-  private Appender<ILoggingEvent> analysisReports = null;
-
-  @Override
-  protected void append(ILoggingEvent event) {
-    if (Thread.currentThread().getName().startsWith(ComputationThreadLauncher.THREAD_NAME_PREFIX)) {
-      analysisReports.doAppend(event);
-      if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
-        console.doAppend(event);
-      }
-    } else {
-      console.doAppend(event);
-    }
-  }
-
-  @Override
-  public void addAppender(Appender<ILoggingEvent> newAppender) {
-    attachedAppenders.addAppender(newAppender);
-    if ("CONSOLE".equals(newAppender.getName())) {
-      console = newAppender;
-    } else if ("ANALYSIS_REPORTS".equals(newAppender.getName())) {
-      analysisReports = newAppender;
-    } else {
-      throw new IllegalArgumentException("Invalid appender name: " + newAppender.getName());
-    }
-  }
-
-  @Override
-  public Iterator<Appender<ILoggingEvent>> iteratorForAppenders() {
-    return attachedAppenders.iteratorForAppenders();
-  }
-
-  @Override
-  public Appender<ILoggingEvent> getAppender(String name) {
-    return attachedAppenders.getAppender(name);
-  }
-
-  @Override
-  public boolean isAttached(Appender<ILoggingEvent> appender) {
-    return attachedAppenders.isAttached(appender);
-  }
-
-  @Override
-  public void detachAndStopAllAppenders() {
-    attachedAppenders.detachAndStopAllAppenders();
-
-  }
-
-  @Override
-  public boolean detachAppender(Appender<ILoggingEvent> appender) {
-    return attachedAppenders.detachAppender(appender);
-  }
-
-  @Override
-  public boolean detachAppender(String name) {
-    return attachedAppenders.detachAppender(name);
-  }
-
-}
index d32623de5a5112bc80e9ae570dde3d0f905e579e..79c0d51cbade62888c4ec10b5a5b034efd5bd5b9 100644 (file)
  */
 package org.sonar.server.platform.ws;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.sonar.api.config.Settings;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.RequestHandler;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
 import org.sonar.api.utils.System2;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.platform.Platform;
 
@@ -54,7 +55,7 @@ public class RestartHandler implements RequestHandler {
   @Override
   public void handle(Request request, Response response) {
     if (canRestart()) {
-      Logger logger = LoggerFactory.getLogger(getClass());
+      Logger logger = Loggers.get(getClass());
       logger.info("Restart server");
       platform.restart();
       logger.info("Server restarted");
index 0263c928fcf5d1dedffa202b8c358951b7632cea..18de6b9e09c1e7a30445444a4a8dc4c7c1f8cb84 100644 (file)
@@ -22,10 +22,10 @@ package org.sonar.server.plugins;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.HttpDownloader;
 import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.platform.DefaultServerFileSystem;
 import org.sonar.updatecenter.common.Release;
 import org.sonar.updatecenter.common.Version;
@@ -40,7 +40,7 @@ import java.util.List;
 
 public class PluginDownloader implements Startable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(PluginDownloader.class);
+  private static final Logger LOG = Loggers.get(PluginDownloader.class);
   private static final String TMP_SUFFIX = "tmp";
   private static final String PLUGIN_EXTENSION = "jar";
 
index 2c80dcd6695386a7d3f63061d32f1fd0933cbf11..1d23bfebe592d679c04e08e699f833fbdb441dd1 100644 (file)
@@ -24,13 +24,13 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.platform.PluginMetadata;
 import org.sonar.api.platform.Server;
 import org.sonar.api.platform.ServerUpgradeStatus;
 import org.sonar.api.utils.MessageException;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.plugins.DefaultPluginMetadata;
 import org.sonar.server.platform.DefaultServerFileSystem;
 import org.sonar.updatecenter.common.PluginReferential;
@@ -46,7 +46,7 @@ import java.util.Set;
 
 public class ServerPluginJarsInstaller {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ServerPluginJarsInstaller.class);
+  private static final Logger LOG = Loggers.get(ServerPluginJarsInstaller.class);
 
   private final Server server;
   private final DefaultServerFileSystem fs;
index 71ab9c41f44d3822a8d8dd4123f37ab2b8fd4980..1602861796681495bf07167cab5da4351f832371 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.plugins;
 
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.Plugin;
 import org.sonar.api.platform.PluginMetadata;
 import org.sonar.api.platform.PluginRepository;
@@ -75,7 +75,7 @@ public class ServerPluginRepository implements PluginRepository, Startable {
         clazz = classloader.loadClass(classname);
 
       } catch (ClassNotFoundException e) {
-        LoggerFactory.getLogger(getClass()).warn("Class not found in plugin " + pluginKey + ": " + classname, e);
+        Loggers.get(getClass()).warn("Class not found in plugin " + pluginKey + ": " + classname, e);
       }
     }
     return clazz;
index 41e0d2a457010c2e4177c984fa005ae461f2df24..8d24a1ae5f07eafeb656c747ffe41b47255d8e55 100644 (file)
@@ -22,21 +22,22 @@ package org.sonar.server.plugins;
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.server.platform.Platform;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
 public class StaticResourcesServlet extends HttpServlet {
 
-  private static final Logger LOG = LoggerFactory.getLogger(StaticResourcesServlet.class);
+  private static final Logger LOG = Loggers.get(StaticResourcesServlet.class);
   private static final long serialVersionUID = -2577454614650178426L;
 
   @Override
index 7af55f4a1f5a235cc90656e66e7ac6ec852dc43b..3895d6d7a40eae61e2d9b31f9b902e90ec10c83e 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.server.plugins;
 
 import com.google.common.base.Charsets;
 import org.apache.commons.io.IOUtils;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.Properties;
 import org.sonar.api.Property;
 import org.sonar.api.PropertyType;
@@ -73,7 +73,7 @@ public class UpdateCenterClient {
   public UpdateCenterClient(UriReader uriReader, Settings settings) throws URISyntaxException {
     this.uriReader = uriReader;
     this.uri = new URI(settings.getString(URL_PROPERTY));
-    LoggerFactory.getLogger(getClass()).info("Update center: " + uriReader.description(uri));
+    Loggers.get(getClass()).info("Update center: " + uriReader.description(uri));
   }
 
   public UpdateCenter getUpdateCenter() {
@@ -106,7 +106,7 @@ public class UpdateCenterClient {
       return new UpdateCenterDeserializer(Mode.PROD, true).fromProperties(properties);
 
     } catch (Exception e) {
-      LoggerFactory.getLogger(getClass()).error("Fail to connect to update center", e);
+      Loggers.get(getClass()).error("Fail to connect to update center", e);
       return null;
 
     } finally {
index 0f8016fc22c59d298e6389d4cb200781dfa2e94a..7ee0390bc9e0a07ff24efc0ca5af4741a4a4d304 100644 (file)
@@ -25,8 +25,6 @@ import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.profiles.ProfileDefinition;
 import org.sonar.api.profiles.RulesProfile;
@@ -35,6 +33,8 @@ import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rules.ActiveRuleParam;
 import org.sonar.api.utils.TimeProfiler;
 import org.sonar.api.utils.ValidationMessages;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.core.template.LoadedTemplateDto;
@@ -54,7 +54,7 @@ import java.util.Set;
  */
 public class RegisterQualityProfiles implements ServerComponent {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(RegisterQualityProfiles.class);
+  private static final Logger LOGGER = Loggers.get(RegisterQualityProfiles.class);
   private static final String DEFAULT_PROFILE_NAME = "Sonar way";
 
   private final PersistentSettings settings;
index e54002f4bc9f89fc5b28a20bcd4cb589dab946af..563bcb1ae186b09ad9ba56a680bf7cc146d7302e 100644 (file)
@@ -23,8 +23,6 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -34,6 +32,8 @@ import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.server.rule.RuleParamType;
 import org.sonar.api.server.rule.RulesDefinition;
 import org.sonar.api.utils.ValidationMessages;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.i18n.RuleI18nManager;
 import org.sonar.server.debt.DebtModelPluginRepository;
 import org.sonar.server.debt.DebtModelXMLExporter;
@@ -54,7 +54,7 @@ import static org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
  */
 public class DeprecatedRulesDefinitionLoader implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(DeprecatedRulesDefinitionLoader.class);
+  private static final Logger LOG = Loggers.get(DeprecatedRulesDefinitionLoader.class);
 
   private final RuleI18nManager i18n;
   private final RuleRepository[] repositories;
index 8f123326ed483fc1bceb71bc46b1d8248b4859d7..2d16e250dce0fb041ebdbf2982e31f0cf3c8207b 100644 (file)
@@ -28,8 +28,6 @@ import com.google.common.collect.Sets;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
@@ -37,6 +35,8 @@ import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.server.rule.RulesDefinition;
 import org.sonar.api.utils.MessageException;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.qualityprofile.db.ActiveRuleDto;
 import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
@@ -52,7 +52,12 @@ import org.sonar.server.startup.RegisterDebtModel;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -61,7 +66,7 @@ import static com.google.common.collect.Lists.newArrayList;
  */
 public class RegisterRules implements Startable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(RegisterRules.class);
+  private static final Logger LOG = Loggers.get(RegisterRules.class);
 
   private final RuleDefinitionsLoader defLoader;
   private final RuleActivator ruleActivator;
index c0d0d57256f5d6f025f9ac82ad03afea717318ca..6ad59c206016ae066315692692a8dcca0bc21b50 100644 (file)
@@ -21,12 +21,12 @@ package org.sonar.server.rule.ws;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.qualityprofile.db.ActiveRuleKey;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
@@ -47,7 +47,7 @@ import java.util.Map;
  */
 public class ActiveRuleCompleter implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ActiveRuleCompleter.class);
+  private static final Logger LOG = Loggers.get(ActiveRuleCompleter.class);
 
   private final QProfileLoader loader;
   private final Languages languages;
index 460e7b2ff484c1adddbc5646a9ae020ad87dc293..4492b24a937c3623441f4b8079e53aae7c0f11bb 100644 (file)
@@ -26,14 +26,23 @@ import com.google.common.collect.Multimap;
 import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
 import org.elasticsearch.action.count.CountRequestBuilder;
 import org.elasticsearch.action.count.CountResponse;
-import org.elasticsearch.action.get.*;
+import org.elasticsearch.action.get.GetRequestBuilder;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.get.MultiGetItemResponse;
+import org.elasticsearch.action.get.MultiGetRequest;
+import org.elasticsearch.action.get.MultiGetRequestBuilder;
+import org.elasticsearch.action.get.MultiGetResponse;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.action.search.SearchScrollRequestBuilder;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.index.query.*;
+import org.elasticsearch.index.query.BoolFilterBuilder;
+import org.elasticsearch.index.query.FilterBuilder;
+import org.elasticsearch.index.query.FilterBuilders;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.aggregations.Aggregation;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
@@ -44,8 +53,8 @@ import org.elasticsearch.search.aggregations.metrics.max.Max;
 import org.elasticsearch.search.aggregations.metrics.valuecount.InternalValueCount;
 import org.elasticsearch.search.fetch.source.FetchSourceContext;
 import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.Dto;
 import org.sonar.server.exceptions.NotFoundException;
 
@@ -53,12 +62,22 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
 import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Queue;
 
 public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serializable>
   implements Index<DOMAIN, DTO, KEY> {
 
-  private static final Logger LOG = LoggerFactory.getLogger(BaseIndex.class);
+  private static final Logger LOG = Loggers.get(BaseIndex.class);
 
   private final SearchClient client;
   private final BaseNormalizer<DTO, KEY> normalizer;
index 09b99fc1795d3f4b3801a4304044c1c9e1374aad..58f6b140bc4f31d7984cf3c07d4678fcc9d1706c 100644 (file)
@@ -29,8 +29,8 @@ import org.elasticsearch.search.aggregations.HasAggregations;
 import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogram;
 import org.elasticsearch.search.aggregations.bucket.missing.Missing;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -39,7 +39,7 @@ import java.util.Map;
 
 class Facets {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(Facets.class);
+  private static final Logger LOGGER = Loggers.get(Facets.class);
 
   private final Multimap<String, FacetValue> facetValues;
 
index 2944ac897015eff05cb706334b3df9fa6a0c7375..1ad5214180d5ba6974a660182e5726eb2bc07d9e 100644 (file)
@@ -28,14 +28,18 @@ import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteRequest;
 import org.elasticsearch.action.index.IndexRequest;
 import org.elasticsearch.action.update.UpdateRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.platform.ComponentContainer;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.cluster.WorkQueue;
 import org.sonar.server.search.action.IndexAction;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -46,7 +50,7 @@ public class IndexQueue implements ServerComponent, WorkQueue<IndexAction<?>> {
   private final SearchClient searchClient;
   private final ComponentContainer container;
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(IndexQueue.class);
+  private static final Logger LOGGER = Loggers.get(IndexQueue.class);
 
   private static final Integer CONCURRENT_NORMALIZATION_FACTOR = 1;
 
index 1afa9eb55b1c795ba72ad95eb587cbdf59d659c3..2aaa1e874b702b4a37f23905d39eefb7325297ba 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.server.search;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.activity.index.ActivityIndex;
 import org.sonar.server.db.Dao;
@@ -37,7 +38,7 @@ import java.util.Date;
 
 public class IndexSynchronizer {
 
-  private static final Logger LOG = LoggerFactory.getLogger(IndexSynchronizer.class);
+  private static final Logger LOG = Loggers.get(IndexSynchronizer.class);
 
   private final DbClient db;
   private final IndexClient index;
index 18d7841dc9a634101c3ec30c3db36aa336f771dd..0a6d74e96eab35b55c8e7ddcffabd94575be0f91 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.source;
 
 import com.google.common.io.Closeables;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
 
@@ -89,7 +89,7 @@ class HtmlTextDecorator {
 
     } catch (IOException exception) {
       String errorMsg = "An exception occurred while highlighting the syntax of one of the project's files";
-      LoggerFactory.getLogger(HtmlTextDecorator.class).error(errorMsg);
+      Loggers.get(HtmlTextDecorator.class).error(errorMsg);
       throw new IllegalStateException(errorMsg, exception);
     } finally {
       Closeables.closeQuietly(stringBuffer);
index e40a54ba10e98a29502537d90de7092fc31eb5dc..cdefebfdd23397e24f95fd450d33407b20eb3539 100644 (file)
@@ -26,12 +26,12 @@ import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
 import org.apache.commons.lang.builder.EqualsBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.utils.Duration;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.rule.RuleDto;
@@ -59,7 +59,7 @@ import java.util.List;
  */
 public class CopyRequirementsFromCharacteristicsToRules implements ServerComponent {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(CopyRequirementsFromCharacteristicsToRules.class);
+  private static final Logger LOGGER = Loggers.get(CopyRequirementsFromCharacteristicsToRules.class);
 
   private static final String TEMPLATE_KEY = "CopyRequirementsFromCharacteristicsToRules";
 
index a3e95c1c9a90585305c4fe5765fec7d7ce067b05..cf6ea5dd47dfdc0bdc8eef7363bb79ff31f228cc 100644 (file)
@@ -20,9 +20,9 @@
 package org.sonar.server.startup;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
 
@@ -38,7 +38,7 @@ public final class LogServerId {
   }
 
   public void start() {
-    logServerId(LoggerFactory.getLogger(LogServerId.class));
+    logServerId(Loggers.get(LogServerId.class));
   }
 
   @VisibleForTesting
index 0e3a32b20ccae75238febd8735e5654c1ac75f92..6848c52aa216d47652124362c9efc7ad4367f96b 100644 (file)
@@ -22,9 +22,9 @@ package org.sonar.server.startup;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.web.Dashboard;
 import org.sonar.api.web.DashboardTemplate;
 import org.sonar.core.dashboard.ActiveDashboardDao;
@@ -45,7 +45,7 @@ import java.util.Map.Entry;
  * @since 2.13
  */
 public class RegisterDashboards implements Startable {
-  private static final Logger LOG = LoggerFactory.getLogger(RegisterDashboards.class);
+  private static final Logger LOG = Loggers.get(RegisterDashboards.class);
 
   static final String DEFAULT_DASHBOARD_NAME = "Dashboard";
 
index e922638a83150f34d93e3fc14cdd453b9d4066b6..1319f3463b41e1a940dee844784b34b9d4de0abe 100644 (file)
 
 package org.sonar.server.startup;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.technicaldebt.db.CharacteristicDao;
 import org.sonar.server.debt.DebtModelBackup;
 
 public class RegisterDebtModel {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(RegisterDebtModel.class);
+  private static final Logger LOGGER = Loggers.get(RegisterDebtModel.class);
 
   private final CharacteristicDao dao;
   private final DebtModelBackup debtModelBackup;
index 5e5b6cfc582090135b4ae0a815879a2099806598..01160def8fb90a2716c8f14aaa1e481ffbbcc0f7 100644 (file)
@@ -23,12 +23,12 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Metric;
 import org.sonar.api.measures.Metrics;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.qualitygate.db.QualityGateConditionDao;
 import org.sonar.jpa.dao.MeasuresDao;
 
@@ -39,7 +39,7 @@ import static com.google.common.collect.Lists.newArrayList;
 
 public class RegisterMetrics {
 
-  private static final Logger LOG = LoggerFactory.getLogger(RegisterMetrics.class);
+  private static final Logger LOG = Loggers.get(RegisterMetrics.class);
 
   private final MeasuresDao measuresDao;
   private final Metrics[] metricsRepositories;
index 84c53745e9b986cec9ee2c7f37a20185a4f33660..02c173aa6215b00f366193d19f9d92f6562696b0 100644 (file)
@@ -23,9 +23,9 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.web.Criterion;
 import org.sonar.api.web.Filter;
 import org.sonar.api.web.FilterColumn;
@@ -42,7 +42,7 @@ import java.util.List;
  * @since 3.1
  */
 public final class RegisterNewMeasureFilters {
-  private static final Logger LOG = LoggerFactory.getLogger(RegisterNewMeasureFilters.class);
+  private static final Logger LOG = Loggers.get(RegisterNewMeasureFilters.class);
 
   private final List<FilterTemplate> filterTemplates;
   private final MeasureFilterDao filterDao;
index df115467d1c7b434f1d45b90b67655f1aec25a11..bf468fdf55f673162a855b578131d1fa29a00a6c 100644 (file)
 
 package org.sonar.server.startup;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.permission.PermissionTemplateDao;
 import org.sonar.core.permission.PermissionTemplateDto;
@@ -38,7 +39,7 @@ public class RegisterPermissionTemplates {
   public static final String DEFAULT_TEMPLATE_PROPERTY = "sonar.permission.template.default";
   public static final String DEFAULT_PROJECTS_TEMPLATE_PROPERTY = "sonar.permission.template.TRK.default";
 
-  private static final Logger LOG = LoggerFactory.getLogger(RegisterPermissionTemplates.class);
+  private static final Logger LOG = Loggers.get(RegisterPermissionTemplates.class);
 
   private final LoadedTemplateDao loadedTemplateDao;
   private final PermissionTemplateDao permissionTemplateDao;
index f74e9b1898a9e7992e0b977912da92213e33072b..8111277c509d6f3da1d48dfd16d1dc2a96421903 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.startup;
 
 import com.google.common.base.Strings;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.config.PropertyDefinition;
 import org.sonar.api.config.PropertyDefinitions;
 import org.sonar.core.properties.PropertiesDao;
@@ -39,7 +39,7 @@ public class RenameDeprecatedPropertyKeys {
   }
 
   public void start() {
-    LoggerFactory.getLogger(RenameDeprecatedPropertyKeys.class).info("Rename deprecated property keys");
+    Loggers.get(RenameDeprecatedPropertyKeys.class).info("Rename deprecated property keys");
     for (PropertyDefinition definition : definitions.getAll()) {
       if (!Strings.isNullOrEmpty(definition.deprecatedKey())) {
         dao.renamePropertyKey(definition.deprecatedKey(), definition.key());
index 64712848ac7d5272c7f29857183fcd4a9262c92e..8e6e6c9c08f80628bf4aea2aeddebd88a500fecb 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.server.startup;
 
 import com.google.common.collect.ImmutableMap;
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.platform.Server;
 import org.sonar.server.platform.PersistentSettings;
@@ -40,7 +40,7 @@ public final class ServerMetadataPersister implements Startable {
 
   @Override
   public void start() {
-    LoggerFactory.getLogger(getClass()).debug("Persisting server metadata");
+    Loggers.get(getClass()).debug("Persisting server metadata");
     persistentSettings.saveProperties(ImmutableMap.of(
       CoreProperties.SERVER_ID, server.getId(),
       CoreProperties.SERVER_VERSION, server.getVersion(),
index 9318df5331356031e09c9b0c96198ca446c5e106..f7a3a25875fdea5138db7531f42cb6281634a2cb 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.server.ui;
 
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.config.License;
 import org.sonar.api.config.PropertyDefinitions;
 import org.sonar.api.config.Settings;
@@ -279,7 +279,7 @@ public final class JRubyFacade {
     try {
       return get(Class.forName(className));
     } catch (ClassNotFoundException e) {
-      LoggerFactory.getLogger(getClass()).error("Component not found: " + className, e);
+      Loggers.get(getClass()).error("Component not found: " + className, e);
       return null;
     }
   }
@@ -313,13 +313,13 @@ public final class JRubyFacade {
     try {
       get(ComponentCleanerService.class).delete(projectKey);
     } catch (RuntimeException e) {
-      LoggerFactory.getLogger(JRubyFacade.class).error("Fail to delete resource with key: " + projectKey, e);
+      Loggers.get(JRubyFacade.class).error("Fail to delete resource with key: " + projectKey, e);
       throw e;
     }
   }
 
   public void logError(String message) {
-    LoggerFactory.getLogger(getClass()).error(message);
+    Loggers.get(getClass()).error(message);
   }
 
   public boolean hasSecretKey() {
index c142a49c0efa77dc720406f52f7ab2a246fadbfb..3d8f3930cea1a8414161c4909b04a22b164d647d 100644 (file)
@@ -20,8 +20,9 @@
 
 package org.sonar.server.ui;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.profiling.Profiling;
 import org.sonar.core.profiling.Profiling.Level;
 import org.sonar.core.profiling.StopWatch;
@@ -31,7 +32,7 @@ import org.sonar.core.profiling.StopWatch;
  */
 public class JRubyProfiling {
 
-  private static final Logger LOG = LoggerFactory.getLogger(JRubyProfiling.class);
+  private static final Logger LOG = Loggers.get(JRubyProfiling.class);
 
   private Profiling profiling;
 
index 1a8fce0e8f2c3f1998d25cd2211636c486d12a47..a3b8da575d8323d11bf8c402be6f7a05c1e10bb3 100644 (file)
@@ -19,7 +19,7 @@
  */
 package org.sonar.server.user;
 
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.platform.NewUserHandler;
 
@@ -39,7 +39,7 @@ public class NewUserNotifier implements ServerComponent {
   }
 
   public void onNewUser(NewUserHandler.Context context) {
-    LoggerFactory.getLogger(NewUserNotifier.class).debug("User created: " + context.getLogin() + ". Notifying " + NewUserHandler.class.getSimpleName() + " handlers...");
+    Loggers.get(NewUserNotifier.class).debug("User created: " + context.getLogin() + ". Notifying " + NewUserHandler.class.getSimpleName() + " handlers...");
     for (NewUserHandler handler : handlers) {
       handler.doOnNewUser(context);
     }
index dfe9017e2abe595823bc0235cf2684756e76b09a..c6f9cd806d96d28f36806f903502963fff9d96ac 100644 (file)
@@ -21,14 +21,14 @@ package org.sonar.server.user;
 
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.config.Settings;
 import org.sonar.api.security.LoginPasswordAuthenticator;
 import org.sonar.api.security.SecurityRealm;
 import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 /**
  * @since 2.14
@@ -76,7 +76,7 @@ public class SecurityRealmFactory implements ServerComponent, Startable {
   @Override
   public void start() {
     if (realm != null) {
-      Logger logger = LoggerFactory.getLogger("org.sonar.INFO");
+      Logger logger = Loggers.get("org.sonar.INFO");
       try {
         logger.info("Security realm: " + realm.getName());
         realm.init();
index 68fced946867b5dfd19c8628f8e58541912c6978..c7e3c95f65826982ffb2eb682cd4a22eda42eeaf 100644 (file)
@@ -22,9 +22,9 @@ package org.sonar.server.user;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import com.google.common.collect.HashMultimap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.resource.ResourceDao;
 import org.sonar.core.resource.ResourceDto;
@@ -36,7 +36,13 @@ import org.sonar.server.platform.Platform;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
@@ -50,7 +56,7 @@ public class UserSession {
   public static final UserSession ANONYMOUS = new UserSession();
 
   private static final ThreadLocal<UserSession> THREAD_LOCAL = new ThreadLocal<UserSession>();
-  private static final Logger LOG = LoggerFactory.getLogger(UserSession.class);
+  private static final Logger LOG = Loggers.get(UserSession.class);
   private static final String INSUFFICIENT_PRIVILEGES_MESSAGE = "Insufficient privileges";
 
   private Integer userId;
index de0ba605c9b6c9168b76ff2dbd58ca757b85e6c7..660dfcd4ded935d50eb170db6b0c7ba0e677fe13 100644 (file)
@@ -19,8 +19,9 @@
  */
 package org.sonar.server.util;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.Timer;
 import java.util.TimerTask;
@@ -44,7 +45,7 @@ public class ProgressLogger {
 
   public static ProgressLogger create(Class clazz, AtomicLong counter) {
     String threadName = String.format("ProgressLogger[%s]", clazz.getSimpleName());
-    Logger logger = LoggerFactory.getLogger(clazz);
+    Logger logger = Loggers.get(clazz);
     return new ProgressLogger(threadName, counter, logger);
   }
 
index fe12f49acd7e3e10a6a948843d89825964ed5487..c27b2bb713266978c1c00823fa56699216e19f3f 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.server.ws;
 
 import com.google.common.base.Charsets;
 import org.picocontainer.Startable;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.server.ws.Request;
@@ -91,7 +91,8 @@ public class WebServiceEngine implements ServerComponent, Startable {
     } catch (ServerException e) {
       sendErrors(response, e.httpCode(), new Errors().add(Message.of(e.getMessage())));
     } catch (Exception e) {
-      LoggerFactory.getLogger(getClass()).error("Fail to process request " + request, e);
+      // TODO implement Request.toString()
+      Loggers.get(getClass()).error("Fail to process request " + request, e);
       sendErrors(response, 500, new Errors().add(Message.of(e.getMessage())));
     }
   }
index f2a58bd610784fa587205f0cb9a0012814c0910d..d72ffb963354a2e1636e2f80622afe73c65de3fa 100644 (file)
@@ -22,9 +22,9 @@ package org.sonar.core.computation.dbcleaner;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.config.Settings;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.purge.IdUuidPair;
index b4906a5ca1410a140d2bbedb60d640323ab0d6d4..1d85a118a00bfb6155f12a62f81acdd2b759ecf8 100644 (file)
@@ -24,7 +24,7 @@ import org.apache.catalina.startup.Tomcat;
 import org.apache.coyote.http11.AbstractHttp11JsseProtocol;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.process.Props;
 
 import java.util.Properties;
index 7e081214eb34f2986642ea8782afcaa49932cb74..0e64c81de60f8660c933368939a6ad47f23ee74a 100644 (file)
@@ -27,7 +27,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.mockito.Mockito;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.process.ProcessConstants;
 import org.sonar.process.Props;
 
index fd070959266ad95e1d37765a04b6547a00d24836..faa52fcbec68298e19f4b9dc237d46f0d68d4352 100644 (file)
@@ -22,8 +22,8 @@ package org.sonar.server.computation.issue;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
-import org.slf4j.Logger;
 import org.sonar.api.config.Settings;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.server.es.EsTester;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.user.index.UserIndexDefinition;
index b3bcc72ead86a3f2fd9b1ff2f5028b2144392a66..2e18a4531b5a80f13190b60a497a5b495645cdf5 100644 (file)
@@ -20,7 +20,7 @@
 package org.sonar.server.db.migrations;
 
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import java.sql.SQLException;
 
index d7800ebf86a83e3f538bc6e83c02d0b19331d32d..4ce1d029507a2a1c1d56976cdf51210bcf67dc7e 100644 (file)
@@ -21,12 +21,10 @@ package org.sonar.server.db.migrations.v36;
 
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.*;
 
 public class ProgressTest {
   @Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/SwitchLogbackAppenderTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/SwitchLogbackAppenderTest.java
deleted file mode 100644 (file)
index de87f67..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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.
- *
- * SonarQube 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.platform;
-
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.read.ListAppender;
-import ch.qos.logback.core.status.Status;
-import ch.qos.logback.core.util.StatusPrinter;
-import org.junit.Test;
-import org.sonar.server.computation.ComputationThreadLauncher;
-
-import java.net.URL;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class SwitchLogbackAppenderTest {
-
-  LoggerContext loggerContext = new LoggerContext();
-  Logger logger = loggerContext.getLogger(this.getClass().getName());
-  SwitchLogbackAppender switchAppender;
-  ListAppender<ILoggingEvent> console, analyisReports;
-
-  protected void configure(URL file) throws JoranException {
-    JoranConfigurator jc = new JoranConfigurator();
-    jc.setContext(loggerContext);
-    jc.doConfigure(file);
-
-    Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
-    switchAppender = (SwitchLogbackAppender) root.getAppender("SWITCH");
-    console = (ListAppender<ILoggingEvent>) switchAppender.getAppender("CONSOLE");
-    analyisReports = (ListAppender<ILoggingEvent>) switchAppender.getAppender("ANALYSIS_REPORTS");
-  }
-
-  /**
-   * Standard log goes to console only
-   */
-  @Test
-  public void standard_log() throws JoranException {
-    configure(getClass().getResource("SwitchLogbackAppenderTest/valid-switch.xml"));
-
-    logger.info("hello");
-
-    assertThat(console.list).hasSize(1);
-    assertThat(console.list.get(0).getMessage()).isEqualTo("hello");
-    assertThat(analyisReports.list).isEmpty();
-  }
-
-  /**
-   * Compute service log goes to dedicated appender. Warnings and errors are logged in both appenders.
-   */
-  @Test
-  public void compute_service_log_goes_to_dedicated_appender() throws JoranException {
-    configure(getClass().getResource("SwitchLogbackAppenderTest/valid-switch.xml"));
-
-    String initialThreadName = Thread.currentThread().getName();
-    Thread.currentThread().setName(ComputationThreadLauncher.THREAD_NAME_PREFIX + "test");
-    try {
-      logger.info("hello");
-      assertThat(analyisReports.list).hasSize(1);
-      assertThat(analyisReports.list.get(0).getMessage()).isEqualTo("hello");
-      assertThat(console.list).isEmpty();
-
-      logger.warn("a warning");
-      assertThat(analyisReports.list).hasSize(2);
-      assertThat(analyisReports.list.get(1).getMessage()).isEqualTo("a warning");
-      assertThat(console.list).hasSize(1);
-      assertThat(console.list.get(0).getMessage()).isEqualTo("a warning");
-
-      logger.error("an error");
-      assertThat(analyisReports.list).hasSize(3);
-      assertThat(analyisReports.list.get(2).getMessage()).isEqualTo("an error");
-      assertThat(console.list).hasSize(2);
-      assertThat(console.list.get(1).getMessage()).isEqualTo("an error");
-
-    } finally {
-      Thread.currentThread().setName(initialThreadName);
-    }
-  }
-
-  @Test
-  public void fail_if_bad_configuration() throws JoranException {
-    boolean foundError = false;
-    configure(getClass().getResource("SwitchLogbackAppenderTest/invalid-switch.xml"));
-    StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
-    for (Status status : loggerContext.getStatusManager().getCopyOfStatusList()) {
-      Throwable error = status.getThrowable();
-      if (error != null) {
-        assertThat(error).hasMessage("Invalid appender name: UNKNOWN");
-        foundError = true;
-      }
-    }
-    assertThat(foundError).isTrue();
-  }
-
-  @Test
-  public void test_logback_internals() throws Exception {
-    configure(getClass().getResource("SwitchLogbackAppenderTest/valid-switch.xml"));
-
-    assertThat(switchAppender.iteratorForAppenders()).hasSize(2);
-    assertThat(switchAppender.isAttached(console)).isTrue();
-
-    assertThat(switchAppender.detachAppender("CONSOLE")).isTrue();
-    assertThat(switchAppender.detachAppender(analyisReports)).isTrue();
-    switchAppender.detachAndStopAllAppenders();
-  }
-}
index 96ecafa019307dcda0bdeb5408f09b707775486d..8e5466dfeda6d88b912fe519aa6c1103e0bd84e0 100644 (file)
@@ -23,8 +23,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.slf4j.Logger;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.core.properties.PropertiesDao;
 import org.sonar.core.properties.PropertyDto;
 
index e444f2be0fa3206405a18a3c031b37b3e2dc0090..3644a921813a474c4241be2b094ab5bfbb2dee71 100644 (file)
@@ -25,10 +25,10 @@ import com.google.common.collect.Lists;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.junit.rules.ExternalResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.database.DatabaseProperties;
 import org.sonar.api.resources.Language;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.process.ProcessConstants;
 import org.sonar.server.es.EsServerHolder;
 import org.sonar.server.platform.BackendCleanup;
@@ -54,7 +54,7 @@ import java.util.Properties;
  */
 public class ServerTester extends ExternalResource {
 
-  private static final Logger LOG = LoggerFactory.getLogger(ServerTester.class);
+  private static final Logger LOG = Loggers.get(ServerTester.class);
   private static final String PROP_PREFIX = "mediumTests.";
 
   private Platform platform;
index 2fde99f4572c9ef142766121581d5c57edaa14ea..1ce230c21f3cc28011947abc7b7fa64b40dac9e9 100644 (file)
 package org.sonar.server.util;
 
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import java.util.concurrent.atomic.AtomicLong;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.*;
 
 public class ProgressLoggerTest {
 
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/invalid-switch.xml b/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/invalid-switch.xml
deleted file mode 100644 (file)
index 7e59f11..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<configuration debug="false">
-  <appender name="CONSOLE" class="ch.qos.logback.core.read.ListAppender" />
-  <appender name="UNKNOWN" class="ch.qos.logback.core.read.ListAppender" />
-
-  <appender name="SWITCH" class="org.sonar.server.platform.SwitchLogbackAppender">
-    <appender-ref ref="CONSOLE" />
-    <appender-ref ref="UNKNOWN" />
-  </appender>
-
-  <root level="DEBUG">
-    <appender-ref ref="SWITCH" />
-  </root>
-</configuration>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/valid-switch.xml b/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/valid-switch.xml
deleted file mode 100644 (file)
index e902114..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<configuration debug="false">
-  <appender name="CONSOLE" class="ch.qos.logback.core.read.ListAppender" />
-  <appender name="ANALYSIS_REPORTS" class="ch.qos.logback.core.read.ListAppender" />
-
-  <appender name="SWITCH" class="org.sonar.server.platform.SwitchLogbackAppender">
-    <!-- do not change appender names. See org.sonar.server.platform.SwitchLogbackAppender -->
-    <appender-ref ref="CONSOLE" />
-    <appender-ref ref="ANALYSIS_REPORTS" />
-  </appender>
-
-  <root level="DEBUG">
-    <appender-ref ref="SWITCH" />
-  </root>
-</configuration>
index d96777a8b16740ec451400067cdcb6c2a867fcac..7d1559266c3e5f171f56482c1d4000589fa1f3b1 100644 (file)
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>log4j-over-slf4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jul-to-slf4j</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-plugin-api</artifactId>
index a00b9f909f51b425e5d091656804af365bbd24b4..bb434c227378a7e909a071a78423caacc0d1b435 100644 (file)
@@ -23,13 +23,13 @@ package org.sonar.batch.debt;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import org.picocontainer.injectors.ProviderAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.debt.DebtCharacteristic;
 import org.sonar.api.batch.debt.DebtModel;
 import org.sonar.api.batch.debt.internal.DefaultDebtCharacteristic;
 import org.sonar.api.batch.debt.internal.DefaultDebtModel;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.technicaldebt.db.CharacteristicDao;
 import org.sonar.core.technicaldebt.db.CharacteristicDto;
 
@@ -39,7 +39,7 @@ import java.util.List;
 
 public class DebtModelProvider extends ProviderAdapter {
 
-  private static final Logger LOG = LoggerFactory.getLogger(DebtModelProvider.class);
+  private static final Logger LOG = Loggers.get(DebtModelProvider.class);
 
   private DebtModel model;
 
index 744c5caa5ba840eb165fb99b2d2af4643e34a34a..e5125616e9c4e25466b34571cc914c675131467e 100644 (file)
@@ -23,8 +23,6 @@ package org.sonar.batch.rule;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import org.picocontainer.injectors.ProviderAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.debt.DebtCharacteristic;
 import org.sonar.api.batch.debt.DebtModel;
 import org.sonar.api.batch.debt.DebtRemediationFunction;
@@ -35,6 +33,8 @@ import org.sonar.api.batch.rule.internal.RulesBuilder;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.utils.Durations;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.rule.RuleDao;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.core.rule.RuleParamDto;
@@ -48,7 +48,7 @@ import java.util.List;
  */
 public class RulesProvider extends ProviderAdapter {
 
-  private static final Logger LOG = LoggerFactory.getLogger(RulesProvider.class);
+  private static final Logger LOG = Loggers.get(RulesProvider.class);
 
   private Rules singleton = null;
 
index 2f8cb99d1727dae47f718c6eed96ffe5c699ec0a..5dc690a9da6b3388a9686b6758cb8a95f99a83db 100644 (file)
@@ -21,15 +21,15 @@ package org.sonar.batch.scan;
 
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterators;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.utils.TimeProfiler;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.batch.bootstrap.ServerClient;
 
 public class LastLineHashes implements BatchComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(LastLineHashes.class);
+  private static final Logger LOG = Loggers.get(LastLineHashes.class);
 
   private final ServerClient server;
 
index cab746aa79b78445ee34ede406a9a7741fd0f2bb..d9e7f18193b67501ffe4bd64a17d0704b2846e2a 100644 (file)
 package org.sonar.core.computation.dbcleaner;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.config.Settings;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.utils.TimeUtils;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner;
-import org.sonar.core.purge.*;
+import org.sonar.core.purge.IdUuidPair;
+import org.sonar.core.purge.PurgeConfiguration;
+import org.sonar.core.purge.PurgeDao;
+import org.sonar.core.purge.PurgeListener;
+import org.sonar.core.purge.PurgeProfiler;
 import org.sonar.core.resource.ResourceDao;
 import org.sonar.core.resource.ResourceDto;
 import org.sonar.plugins.dbcleaner.api.PurgeTask;
@@ -39,7 +43,7 @@ import static org.sonar.core.purge.PurgeConfiguration.newDefaultPurgeConfigurati
  * @since 2.14
  */
 public class DefaultPurgeTask implements PurgeTask {
-  private static final Logger LOG = LoggerFactory.getLogger(DefaultPurgeTask.class);
+  private static final Logger LOG = Loggers.get(DefaultPurgeTask.class);
   private final PurgeProfiler profiler;
   private final PurgeDao purgeDao;
   private final ResourceDao resourceDao;
index 41d68ae2f6498c42fe9f02c2319ef6bc5c42df7c..e3552b5b66cded12f58ecc8bf387cb86b236a1c2 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.core.purge;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
 import org.sonar.api.utils.TimeUtils;
+import org.sonar.api.utils.log.Logger;
 
 import java.util.ArrayList;
 import java.util.Collections;
index a65dda0382d28e4e9241aa623828eca49f148268..35d53aba1bfd01155578b52a56f1c8b3204547f0 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.sonar.core.computation.dbcleaner;
 
-import ch.qos.logback.classic.Logger;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentMatcher;
@@ -29,8 +28,13 @@ import org.sonar.api.config.PropertyDefinitions;
 import org.sonar.api.config.Settings;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.resources.Scopes;
+import org.sonar.api.utils.log.Logger;
 import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner;
-import org.sonar.core.purge.*;
+import org.sonar.core.purge.IdUuidPair;
+import org.sonar.core.purge.PurgeConfiguration;
+import org.sonar.core.purge.PurgeDao;
+import org.sonar.core.purge.PurgeListener;
+import org.sonar.core.purge.PurgeProfiler;
 import org.sonar.core.resource.ResourceDao;
 import org.sonar.core.resource.ResourceDto;
 
index cbbe9088e833f942e247a94e1282505bb5bed40d..fa80b2ea735e92654c9c2b18e2f14167136bf29f 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.core.purge;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import static org.mockito.Matchers.contains;
 import static org.mockito.Mockito.mock;
index acf870597afa1773bc6ba58681d12278d409d8c9..6a458a3ba722d869ab4fdd4f099601d385c21fd4 100644 (file)
@@ -25,13 +25,13 @@ import com.google.common.base.Functions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.PropertyType;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.utils.AnnotationUtils;
 import org.sonar.api.utils.FieldUtils2;
 import org.sonar.api.utils.SonarException;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.lang.reflect.Field;
 import java.util.Collection;
@@ -44,7 +44,7 @@ import java.util.List;
 @Deprecated
 public final class AnnotationRuleParser implements ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(AnnotationRuleParser.class);
+  private static final Logger LOG = Loggers.get(AnnotationRuleParser.class);
 
   public List<Rule> parse(String repositoryKey, Collection<Class> annotatedClasses) {
     List<Rule> rules = Lists.newArrayList();
index 8d9adaa5411143978a5c2486929a4ed4c0a52eca..24e006078e7f2008b0d760ab8030fd04775d33c0 100644 (file)
@@ -23,10 +23,13 @@ import java.io.File;
 
 public class DuplicationsTestUtil {
 
-  private static final File fileDir = new File("src/test/files/");
-
   public static File findFile(String relativePathToFile) {
-    return new File(fileDir, relativePathToFile);
+    File file = new File("src/test/files/", relativePathToFile);
+    if (!file.exists()) {
+      // IntellijIDEA resolves path from root module basedir
+      file = new File("sonar-duplications/src/test/files/", relativePathToFile);
+    }
+    return file;
   }
 
 }
index 6eeb77a9630a302116f4d9b0181ca38427995462..fef2a0bed26af32db72156dba84006e677c4df92 100644 (file)
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-colorizer</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-duplications</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
     <dependency>
       <groupId>org.codehaus.sonar</groupId>
       <artifactId>sonar-squid</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
 
     <!-- TODO we can't remove hibernate-annotations, because currently it's used
     <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-annotations</artifactId>
+      <scope>provided</scope>
       <exclusions>
         <exclusion>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-core</artifactId>
         </exclusion>
+          <exclusion>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+          </exclusion>
       </exclusions>
     </dependency>
 
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>log4j-over-slf4j</artifactId>
+      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>xpp3</groupId>
       <artifactId>xpp3</artifactId>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.codehaus.woodstox</groupId>
       <version>3.0.1</version>
       <optional>true</optional>
     </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <optional>true</optional>
+    </dependency>
 
     <!-- unit tests -->
     <dependency>
       <artifactId>sonar-testing-harness</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-      <scope>test</scope>
-    </dependency>
     <dependency>
       <groupId>xmlunit</groupId>
       <artifactId>xmlunit</artifactId>
index 6fc76d56d9a2a68da7f6abf3ce91c430d479be15..655edcdbecb4567944daba38dfd88f5edc710222 100644 (file)
@@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.project.MavenProject;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Loggers;
 
 import java.nio.charset.Charset;
 import java.util.Collection;
@@ -142,7 +142,7 @@ public final class MavenUtils {
         return Charset.forName(encoding);
 
       } catch (Exception e) {
-        LoggerFactory.getLogger(MavenUtils.class).warn("Can not get project charset", e);
+        Loggers.get(MavenUtils.class).warn("Can not get project charset", e);
       }
     }
     return Charset.defaultCharset();
index 3a603649e3b22a0275e81cf95a8325ad4165438f..56de51f17e1cca768c8a05d45beea24dc97e810b 100644 (file)
@@ -20,9 +20,9 @@
 package org.sonar.api.platform;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.internal.Uuids;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -37,7 +37,7 @@ class ComponentKeys {
   private final Set<Class> objectsWithoutToString = new HashSet<Class>();
 
   Object of(Object component) {
-    return of(component, LoggerFactory.getLogger(ComponentKeys.class));
+    return of(component, Loggers.get(ComponentKeys.class));
   }
 
   @VisibleForTesting
index 62590f42f360a59fb2f2ac6daf8e60e7e2df2c33..055b3897c1df799758a949fd35cb3b1298a58461 100644 (file)
@@ -21,10 +21,10 @@ package org.sonar.api.resources;
 
 import com.google.common.collect.Maps;
 import org.apache.commons.lang.ArrayUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.ServerComponent;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -39,7 +39,7 @@ import java.util.Map;
  */
 public class Languages implements BatchComponent, ServerComponent {
 
-  private static final Logger LOG = LoggerFactory.getLogger(Languages.class);
+  private static final Logger LOG = Loggers.get(Languages.class);
 
   private final Map<String, Language> map = Maps.newLinkedHashMap();
 
index 3d963373c22eef623753151a8ef056b0c7a42217..7f19e8214cdda91ce83cd309fe64fbf8e45cee1c 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.api.rules;
 
 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.resources.Resource;
+import org.sonar.api.utils.log.Loggers;
 
 import java.util.Date;
 
@@ -128,7 +128,7 @@ public class Violation {
   public Violation setLineId(Integer lineId) {
     if (lineId != null && lineId < 1) {
       // TODO this normalization was added in 2.8, throw exception in future versions - see http://jira.codehaus.org/browse/SONAR-2386
-      LoggerFactory.getLogger(getClass()).warn("line must not be less than 1 - in future versions this will cause IllegalArgumentException");
+      Loggers.get(getClass()).warn("line must not be less than 1 - in future versions this will cause IllegalArgumentException");
       this.lineId = null;
     } else {
       this.lineId = lineId;
index f26cad3ae4ca835fc64e220bdc08fa7b5040c94f..6caa31b52178fac5f8c8e75d3369276f340fb894 100644 (file)
@@ -23,11 +23,11 @@ import com.google.common.base.Strings;
 import com.google.common.collect.*;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerExtension;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.rule.Severity;
 import org.sonar.api.server.debt.DebtRemediationFunction;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
@@ -448,7 +448,7 @@ public interface RulesDefinition extends ServerExtension {
         // Should fail in a perfect world, but at the time being the Findbugs plugin
         // defines several times the rule EC_INCOMPATIBLE_ARRAY_COMPARE
         // See http://jira.codehaus.org/browse/SONARJAVA-428
-        LoggerFactory.getLogger(getClass()).warn(String.format("The rule '%s' of repository '%s' is declared several times", ruleKey, key));
+        Loggers.get(getClass()).warn(String.format("The rule '%s' of repository '%s' is declared several times", ruleKey, key));
       }
       NewRule newRule = new NewRule(key, ruleKey);
       newRules.put(ruleKey, newRule);
index 0c2a08f3dcc718c81a9631a7475f8c882cce0043..d7b49912f4db18870f3d19c496b4365f2076297a 100644 (file)
@@ -24,14 +24,15 @@ import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.utils.AnnotationUtils;
 import org.sonar.api.utils.FieldUtils2;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.sonar.check.Cardinality;
 
 import javax.annotation.CheckForNull;
+
 import java.lang.reflect.Field;
 import java.util.List;
 
@@ -44,7 +45,7 @@ import java.util.List;
  */
 public class RulesDefinitionAnnotationLoader {
 
-  private static final Logger LOG = LoggerFactory.getLogger(RulesDefinitionAnnotationLoader.class);
+  private static final Logger LOG = Loggers.get(RulesDefinitionAnnotationLoader.class);
 
   private static final Function<Class<?>, RuleParamType> TYPE_FOR_CLASS = Functions.forMap(
     ImmutableMap.<Class<?>, RuleParamType>builder()
index b0cce8cdbc2264e9c6f445311376d139c7fd5d64..054ba7731965ae813cba3fd4df19f1833b487be9 100644 (file)
@@ -22,9 +22,9 @@ package org.sonar.api.server.ws.internal;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.WebService;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
@@ -106,7 +106,7 @@ public abstract class ValidatingRequest extends Request {
   private String readParamOrDefaultValue(String key, @Nullable WebService.Param definition) {
     if (definition == null) {
       String message = String.format("BUG - parameter '%s' is undefined for action '%s'", key, action.key());
-      LoggerFactory.getLogger(getClass()).error(message);
+      Loggers.get(getClass()).error(message);
       throw new IllegalArgumentException(message);
     }
     String deprecatedKey = definition.deprecatedKey();
index 2df7765ff2bbc9d72148cf7fd93090200cbf6587..ee0ba26214c147a9685769fbc30509f1aadfc357 100644 (file)
@@ -32,11 +32,11 @@ import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.slf4j.LoggerFactory;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.ServerComponent;
 import org.sonar.api.config.Settings;
 import org.sonar.api.platform.Server;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
 
@@ -271,7 +271,7 @@ public class HttpDownloader extends UriReader.SchemeProcessor implements BatchCo
 
       @Override
       public InputStream getInput() throws IOException {
-        LoggerFactory.getLogger(getClass()).debug("Download: " + uri + " (" + getProxySynthesis(uri, ProxySelector.getDefault()) + ")");
+        Loggers.get(getClass()).debug("Download: " + uri + " (" + getProxySynthesis(uri, ProxySelector.getDefault()) + ")");
 
         HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection();
         connection.setRequestMethod(requestMethod);
index 55df7e312eefe96f0df0369d67f76d60dd50714b..00ba41a1d4b0b537eeb7d7193160681b8143cccf 100644 (file)
@@ -21,14 +21,22 @@ package org.sonar.api.utils;
 
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
 
 public class LocalizedMessages extends ResourceBundle {
 
-  private static final Logger LOG = LoggerFactory.getLogger(LocalizedMessages.class);
+  private static final Logger LOG = Loggers.get(LocalizedMessages.class);
 
   private Locale locale;
   private List<ResourceBundle> bundles;
index 10b264d51242c1d584556c79d1048d3ddb7e22e7..ce86e880cdbb18ab87f5e9c9e1f55655003af997 100644 (file)
@@ -19,8 +19,8 @@
  */
 package org.sonar.api.utils;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 /**
  * A very simple profiler to log the time elapsed performing some tasks.
@@ -39,15 +39,24 @@ public class TimeProfiler {
     this.logger = logger;
   }
 
+  /**
+   * @deprecated do not use SLF4J but org.sonar.api.utils.log.Logger
+   * @since 5.1
+   */
+  @Deprecated
+  public TimeProfiler(org.slf4j.Logger logger) {
+    this.logger = Loggers.get(logger.getName());
+  }
+
   public TimeProfiler(Class clazz) {
-    this.logger = LoggerFactory.getLogger(clazz);
+    this.logger = Loggers.get(clazz);
   }
 
   /**
    * Use the default Sonar logger
    */
   public TimeProfiler() {
-    this.logger = LoggerFactory.getLogger(getClass());
+    this.logger = Loggers.get(getClass());
   }
 
   public TimeProfiler start(String name) {
index 4dffb8e57a7b466b0523e386a5967a430db68591..e2455ef29e29c700b498e2f36dedf754d6e80f2e 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.api.utils;
 
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
index 4b40db12e86e32a237ccce10bcf076f15b17f8f6..e206847699b929a6d7a2e94f33bb1ce5aadf0e8a 100644 (file)
@@ -21,8 +21,8 @@ package org.sonar.api.utils;
 
 import org.apache.commons.io.Charsets;
 import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -78,7 +78,7 @@ public class XpathParser {
       bf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
       bf.setFeature("http://apache.org/xml/features/allow-java-encodings", true);
     } catch (ParserConfigurationException e) {
-      Logger log = LoggerFactory.getLogger(this.getClass().getName());
+      Logger log = Loggers.get(this.getClass().getName());
       log.error("Error occured during features set up.", e);
     }
     try {
index 799d8896a2127e743bbbec501c4b17f1ea11f631..e395c8ab82001a1a67db367d1a4158d1ae2fcf9d 100644 (file)
@@ -21,8 +21,8 @@ package org.sonar.api.utils.command;
 
 import com.google.common.base.Charsets;
 import com.google.common.io.Closeables;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
 
 import javax.annotation.Nullable;
 
@@ -44,7 +44,7 @@ import java.util.concurrent.TimeUnit;
  */
 public class CommandExecutor {
 
-  private static final Logger LOG = LoggerFactory.getLogger(CommandExecutor.class);
+  private static final Logger LOG = Loggers.get(CommandExecutor.class);
 
   private static final CommandExecutor INSTANCE = new CommandExecutor();
 
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/BaseLogger.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/BaseLogger.java
new file mode 100644 (file)
index 0000000..7dbec22
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import javax.annotation.Nullable;
+
+abstract class BaseLogger implements Logger {
+  @Override
+  public void debug(String msg) {
+    LogInterceptor.instance.log(msg);
+    doDebug(msg);
+  }
+
+  @Override
+  public void debug(String pattern, @Nullable Object arg) {
+    LogInterceptor.instance.log(pattern, arg);
+    doDebug(pattern, arg);
+  }
+
+  @Override
+  public void debug(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    LogInterceptor.instance.log(msg, arg1, arg2);
+    doDebug(msg, arg1, arg2);
+  }
+
+  @Override
+  public void debug(String msg, Object... args) {
+    LogInterceptor.instance.log(msg, args);
+    doDebug(msg, args);
+  }
+
+  @Override
+  public void info(String msg) {
+    LogInterceptor.instance.log(msg);
+    doInfo(msg);
+  }
+
+  @Override
+  public void info(String msg, @Nullable Object arg) {
+    LogInterceptor.instance.log(msg, arg);
+    doInfo(msg, arg);
+  }
+
+  @Override
+  public void info(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    LogInterceptor.instance.log(msg, arg1, arg2);
+    doInfo(msg, arg1, arg2);
+  }
+
+  @Override
+  public void info(String msg, Object... args) {
+    LogInterceptor.instance.log(msg, args);
+    doInfo(msg, args);
+  }
+
+  @Override
+  public void warn(String msg) {
+    LogInterceptor.instance.log(msg);
+    doWarn(msg);
+  }
+
+  @Override
+  public void warn(String msg, @Nullable Object arg) {
+    LogInterceptor.instance.log(msg, arg);
+    doWarn(msg, arg);
+  }
+
+  @Override
+  public void warn(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    LogInterceptor.instance.log(msg, arg1, arg2);
+    doWarn(msg, arg1, arg2);
+  }
+
+  @Override
+  public void warn(String msg, Object... args) {
+    LogInterceptor.instance.log(msg, args);
+    doWarn(msg, args);
+  }
+
+  @Override
+  public void error(String msg) {
+    LogInterceptor.instance.log(msg);
+    doError(msg);
+  }
+
+  @Override
+  public void error(String msg, @Nullable Object arg) {
+    LogInterceptor.instance.log(msg, arg);
+    doError(msg, arg);
+  }
+
+  @Override
+  public void error(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    LogInterceptor.instance.log(msg, arg1, arg2);
+    doError(msg, arg1, arg2);
+  }
+
+  @Override
+  public void error(String msg, Object... args) {
+    LogInterceptor.instance.log(msg, args);
+    doError(msg, args);
+  }
+
+  @Override
+  public void error(String msg, Throwable thrown) {
+    LogInterceptor.instance.log(msg, thrown);
+    doError(msg, thrown);
+  }
+
+  abstract void doDebug(String msg);
+
+  abstract void doDebug(String msg, @Nullable Object arg);
+
+  abstract void doDebug(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  abstract void doDebug(String msg, Object... args);
+
+  /**
+   * Logs an INFO level message.
+   */
+  abstract void doInfo(String msg);
+
+  abstract void doInfo(String msg, @Nullable Object arg);
+
+  abstract void doInfo(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  abstract void doInfo(String msg, Object... args);
+
+  /**
+   * Logs a WARN level message.
+   */
+  abstract void doWarn(String msg);
+
+  abstract void doWarn(String msg, @Nullable Object arg);
+
+  abstract void doWarn(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  abstract void doWarn(String msg, Object... args);
+
+  /**
+   * Logs an ERROR level message.
+   */
+  abstract void doError(String msg);
+
+  abstract void doError(String msg, @Nullable Object arg);
+
+  abstract void doError(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  abstract void doError(String msg, Object... args);
+
+  abstract void doError(String msg, Throwable thrown);
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleFormatter.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleFormatter.java
new file mode 100644 (file)
index 0000000..2124784
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.apache.commons.lang.StringUtils;
+
+import java.util.Objects;
+
+class ConsoleFormatter {
+
+  private ConsoleFormatter() {
+    // only static methods
+  }
+
+  static String format(String pattern, Object... args) {
+    String result = pattern;
+    for (Object arg : args) {
+      result = StringUtils.replaceOnce(result, "{}", Objects.toString(arg));
+    }
+    return result;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLogger.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLogger.java
new file mode 100644 (file)
index 0000000..93af4ef
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import javax.annotation.Nullable;
+
+import java.io.PrintStream;
+
+import static org.sonar.api.utils.log.ConsoleFormatter.format;
+
+/**
+ * Slow implementation based on {@link java.lang.System#out}. It is not production-ready and it must be used
+ * only for the tests that do not have logback dependency.
+ * <p/>Implementation of message patterns is naive. It does not support escaped '{' and '}'
+ * arguments.
+ */
+class ConsoleLogger extends BaseLogger {
+
+  private final PrintStream stream;
+
+  ConsoleLogger(String unusedName) {
+    this.stream = System.out;
+  }
+
+  ConsoleLogger(PrintStream stream) {
+    this.stream = stream;
+  }
+
+  @Override
+  public boolean isDebugEnabled() {
+    return Loggers.getFactory().isDebugEnabled();
+  }
+
+  @Override
+  protected void doDebug(String msg) {
+    if (isDebugEnabled()) {
+      log("DEBUG", msg);
+    }
+  }
+
+  @Override
+  protected void doDebug(String pattern, @Nullable Object arg) {
+    if (isDebugEnabled()) {
+      debug(format(pattern, arg));
+    }
+  }
+
+  @Override
+  protected void doDebug(String pattern, @Nullable Object arg1, @Nullable Object arg2) {
+    if (isDebugEnabled()) {
+      debug(format(pattern, arg1, arg2));
+    }
+  }
+
+  @Override
+  protected void doDebug(String pattern, Object... args) {
+    if (isDebugEnabled()) {
+      debug(format(pattern, args));
+    }
+  }
+
+  @Override
+  protected void doInfo(String msg) {
+    log("INFO ", msg);
+  }
+
+  @Override
+  protected void doInfo(String pattern, @Nullable Object arg) {
+    info(format(pattern, arg));
+  }
+
+  @Override
+  protected void doInfo(String pattern, @Nullable Object arg1, @Nullable Object arg2) {
+    info(format(pattern, arg1, arg2));
+  }
+
+  @Override
+  protected void doInfo(String pattern, Object... args) {
+    info(format(pattern, args));
+  }
+
+  @Override
+  protected void doWarn(String msg) {
+    log("WARN ", msg);
+  }
+
+  @Override
+  protected void doWarn(String pattern, @Nullable Object arg) {
+    warn(format(pattern, arg));
+  }
+
+  @Override
+  protected void doWarn(String pattern, @Nullable Object arg1, @Nullable Object arg2) {
+    warn(format(pattern, arg1, arg2));
+  }
+
+  @Override
+  protected void doWarn(String pattern, Object... args) {
+    warn(format(pattern, args));
+  }
+
+  @Override
+  protected void doError(String msg) {
+    log("ERROR", msg);
+  }
+
+  @Override
+  protected void doError(String pattern, @Nullable Object arg) {
+    error(format(pattern, arg));
+  }
+
+  @Override
+  protected void doError(String pattern, @Nullable Object arg1, @Nullable Object arg2) {
+    error(format(pattern, arg1, arg2));
+  }
+
+  @Override
+  protected void doError(String pattern, Object... args) {
+    error(format(pattern, args));
+  }
+
+  @Override
+  public void doError(String msg, Throwable thrown) {
+    doError(msg);
+    thrown.printStackTrace();
+  }
+
+  private void log(String level, String msg) {
+    this.stream.println(String.format("%s %s", level, msg));
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLoggers.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLoggers.java
new file mode 100644 (file)
index 0000000..a6a2f25
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+class ConsoleLoggers extends Loggers {
+
+  private boolean debugEnabled = false;
+
+  @Override
+  protected Logger newInstance(String name) {
+    return new ConsoleLogger(name);
+  }
+
+  @Override
+  protected boolean isDebugEnabled() {
+    return debugEnabled;
+  }
+
+  @Override
+  protected void enableDebug(boolean b) {
+    this.debugEnabled = b;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ListInterceptor.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ListInterceptor.java
new file mode 100644 (file)
index 0000000..94aa6da
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class ListInterceptor extends LogInterceptor {
+
+  private final List<String> logs = new ArrayList<>();
+
+  @Override
+  public void log(String msg) {
+    logs.add(msg);
+  }
+
+  @Override
+  public void log(String msg, Object arg) {
+    logs.add(ConsoleFormatter.format(msg, arg));
+  }
+
+  @Override
+  public void log(String msg, Object arg1, Object arg2) {
+    logs.add(ConsoleFormatter.format(msg, arg1, arg2));
+  }
+
+  @Override
+  public void log(String msg, Object... args) {
+    logs.add(ConsoleFormatter.format(msg, args));
+  }
+
+  @Override
+  public void log(String msg, Throwable thrown) {
+    logs.add(msg);
+  }
+
+  public List<String> logs() {
+    return logs;
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogInterceptor.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogInterceptor.java
new file mode 100644 (file)
index 0000000..aab01e6
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+abstract class LogInterceptor {
+
+  static LogInterceptor instance = NullInterceptor.NULL_INSTANCE;
+
+  abstract void log(String msg);
+
+  abstract void log(String msg, Object arg);
+
+  abstract void log(String msg, Object arg1, Object arg2);
+
+  abstract void log(String msg, Object... args);
+
+  abstract void log(String msg, Throwable thrown);
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogTester.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogTester.java
new file mode 100644 (file)
index 0000000..9ee625e
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.rules.ExternalResource;
+
+import java.util.List;
+
+/**
+ * <b>For tests only</b>
+ * <p/>
+ * This JUnit rule allows to configure and access logs in tests. By default
+ * debug logs are enabled.
+ * <p/>
+ * Warning - not compatible with parallel execution of tests.
+ * <p/>
+ * Example:
+ * <pre>
+ * public class MyClass {
+ *   private final Logger logger = Loggers.get("logger_name");
+ *
+ *   public void doSomething() {
+ *     logger.info("foo");
+ *   }
+ * }
+ *
+ * public class MyTest {
+ *   &#064;Rule
+ *   public LogTester logTester = new LogTester();
+ *
+ *   &#064;Test
+ *   public void test_log() {
+ *     new MyClass().doSomething();
+ *
+ *     assertThat(logTester.logs()).containsOnly("foo");
+ *   }
+ * }
+ * </pre>
+ *
+ * @since 5.1
+ */
+public class LogTester extends ExternalResource {
+
+  private boolean initialDebugMode;
+
+  @Override
+  protected void before() throws Throwable {
+    initialDebugMode = Loggers.getFactory().isDebugEnabled();
+
+    // this shared instance breaks compatibility with parallel execution of tests
+    LogInterceptor.instance = new ListInterceptor();
+    enableDebug(true);
+  }
+
+  @Override
+  protected void after() {
+    enableDebug(initialDebugMode);
+    LogInterceptor.instance = NullInterceptor.NULL_INSTANCE;
+  }
+
+  /**
+   * @see #enableDebug(boolean) 
+   */
+  public boolean isDebugEnabled() {
+    return Loggers.getFactory().isDebugEnabled();
+  }
+
+  /**
+   * Enable/disable debug logs. Info, warn and error logs are always enabled.
+   * By default debug logs are enabled when LogTester is started.
+   */
+  public LogTester enableDebug(boolean b) {
+    Loggers.getFactory().enableDebug(b);
+    return this;
+  }
+
+  /**
+   * Logs in chronological order (item at index 0 is the oldest one)
+   */
+  public List<String> logs() {
+    return ((ListInterceptor) LogInterceptor.instance).logs();
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLogger.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLogger.java
new file mode 100644 (file)
index 0000000..7313a2f
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import javax.annotation.Nullable;
+
+/**
+ * Note that logback is accessed through SLF4J
+ */
+class LogbackLogger extends BaseLogger {
+
+  private final transient org.slf4j.Logger slf4j;
+
+  LogbackLogger(org.slf4j.Logger slf4j) {
+    this.slf4j = slf4j;
+  }
+
+  @Override
+  public boolean isDebugEnabled() {
+    return slf4j.isDebugEnabled();
+  }
+
+  @Override
+  protected void doDebug(String msg) {
+    slf4j.debug(msg);
+  }
+
+  @Override
+  protected void doDebug(String msg, @Nullable Object arg) {
+    slf4j.debug(msg, arg);
+  }
+
+  @Override
+  protected void doDebug(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    slf4j.debug(msg, arg1, arg2);
+  }
+
+  @Override
+  protected void doDebug(String msg, Object... args) {
+    slf4j.debug(msg, args);
+  }
+
+  @Override
+  protected void doInfo(String msg) {
+    slf4j.info(msg);
+  }
+
+  @Override
+  protected void doInfo(String msg, @Nullable Object arg) {
+    slf4j.info(msg, arg);
+  }
+
+  @Override
+  protected void doInfo(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    slf4j.info(msg, arg1, arg2);
+  }
+
+  @Override
+  protected void doInfo(String msg, Object... args) {
+    slf4j.info(msg, args);
+  }
+
+  @Override
+  protected void doWarn(String msg) {
+    slf4j.warn(msg);
+  }
+
+  @Override
+  protected void doWarn(String msg, @Nullable Object arg) {
+    slf4j.warn(msg, arg);
+  }
+
+  @Override
+  protected void doWarn(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    slf4j.warn(msg, arg1, arg2);
+  }
+
+  @Override
+  protected void doWarn(String msg, Object... args) {
+    slf4j.warn(msg, args);
+  }
+
+  @Override
+  protected void doError(String msg) {
+    slf4j.error(msg);
+  }
+
+  @Override
+  protected void doError(String msg, @Nullable Object arg) {
+    slf4j.error(msg, arg);
+  }
+
+  @Override
+  protected void doError(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    slf4j.error(msg, arg1, arg2);
+  }
+
+  @Override
+  protected void doError(String msg, Object... args) {
+    slf4j.error(msg, args);
+  }
+
+  @Override
+  protected void doError(String msg, Throwable thrown) {
+    slf4j.error(msg, thrown);
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLoggers.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLoggers.java
new file mode 100644 (file)
index 0000000..e4490a7
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import ch.qos.logback.classic.Level;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Note that this is not "Slf4jLoggers" as there's a coupling on Logback
+ * in order to change level of root logger.
+ */
+class LogbackLoggers extends Loggers {
+
+  @Override
+  protected Logger newInstance(String name) {
+    return new LogbackLogger(LoggerFactory.getLogger(name));
+  }
+
+  @Override
+  protected boolean isDebugEnabled() {
+    return LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).isDebugEnabled();
+  }
+
+  @Override
+  protected void enableDebug(boolean b) {
+    ch.qos.logback.classic.Logger logback = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
+    logback.setLevel(b ? Level.DEBUG : Level.INFO);
+  }
+}
index dab1503bce818ae7ba670e73160d0df94c82f5ad..834dc2356614c1f9db98a1c4244f6977d19789ae 100644 (file)
@@ -1,16 +1,95 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
 
+import javax.annotation.Nullable;
+
+/**
+ * SonarQube plugins are not coupled with external logging libraries like SLF4J or Logback.
+ *
+ * Example:
+ * <pre>
+ * public class MyClass {
+ *   private final Logger logger = Loggers.get("logger_name");
+ *
+ *   public void doSomething() {
+ *     logger.info("something valuable for production environment");
+ *     logger.warn("message with arguments {} and {}", "foo", 42);
+ *   }
+ * }
+ * </pre>
+ *
+ * See {@link org.sonar.api.utils.log.LogTester} for testing facilities.
+ * @since 5.1
+ */
 public interface Logger {
 
   boolean isDebugEnabled();
 
-  void debug(String message);
+  /**
+   * Logs a DEBUG level message. Debug messages must
+   * be valuable for production environments and are not for development debugging.
+   */
+  void debug(String msg);
+
+  void debug(String pattern, @Nullable Object arg);
+
+  void debug(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  void debug(String msg, Object... args);
+
+  /**
+   * Logs an INFO level message.
+   */
+  void info(String msg);
+
+  void info(String msg, @Nullable Object arg);
+
+  void info(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  void info(String msg, Object... args);
+
+  /**
+   * Logs a WARN level message.
+   */
+  void warn(String msg);
+
+  void warn(String msg, @Nullable Object arg);
+
+  void warn(String msg, @Nullable Object arg1, @Nullable Object arg2);
+
+  void warn(String msg, Object... args);
+
+  /**
+   * Logs an ERROR level message.
+   */
+  void error(String msg);
 
-  void info(String message);
+  void error(String msg, @Nullable Object arg);
 
-  void warn(String message);
+  void error(String msg, @Nullable Object arg1, @Nullable Object arg2);
 
-  void error(String message);
+  void error(String msg, Object... args);
 
-  void error(String message, Throwable throwable);
+  /**
+   * Logs an ERROR level message.
+   */
+  void error(String msg, Throwable thrown);
 }
index 6a9f278e1125c8eee8719e6ed0224e24bc7214d6..4f2627fc5e93b8201e67665ecef4c497789aa549 100644 (file)
@@ -1,6 +1,57 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
 
-public class Loggers {
+/**
+ * @since 5.1
+ */
+public abstract class Loggers {
 
+  private static volatile Loggers factory;
+
+  static {
+    try {
+      Class.forName("org.slf4j.Logger");
+      factory = new LogbackLoggers();
+    } catch (Throwable e) {
+      // no slf4j -> testing environment
+      factory = new ConsoleLoggers();
+    }
+  }
+
+  public static Logger get(Class name) {
+    return factory.newInstance(name.getName());
+  }
+
+  public static Logger get(String name) {
+    return factory.newInstance(name);
+  }
+
+  static Loggers getFactory() {
+    return factory;
+  }
+
+  protected abstract Logger newInstance(String name);
+
+  protected abstract boolean isDebugEnabled();
+
+  protected abstract void enableDebug(boolean b);
 
 }
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullInterceptor.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullInterceptor.java
new file mode 100644 (file)
index 0000000..63e0d9a
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+/**
+ * Log interceptor that does nothing, so production-ready!
+ */
+class NullInterceptor extends LogInterceptor {
+
+  static final NullInterceptor NULL_INSTANCE = new NullInterceptor();
+
+  private NullInterceptor() {
+  }
+
+  @Override
+  void log(String msg) {
+    // nothing
+  }
+
+  @Override
+  void log(String msg, Object arg) {
+    // nothing
+  }
+
+  @Override
+  void log(String msg, Object arg1, Object arg2) {
+    // nothing
+  }
+
+  @Override
+  void log(String msg, Object... args) {
+    // nothing
+  }
+
+  @Override
+  void log(String msg, Throwable thrown) {
+    // nothing
+  }
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/InMemoryLogger.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/InMemoryLogger.java
deleted file mode 100644 (file)
index b7f2fa0..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.sonar.api.utils.log.internal;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
-import org.sonar.api.utils.log.Logger;
-
-import java.util.List;
-
-/**
- * Implementation of {@link org.sonar.api.utils.log.Logger} which keeps logs
- * in memory, so that they can be loaded after writing. It is helpful
- * for testing.
- */
-public class InMemoryLogger implements Logger {
-
-  private static enum Level {
-    DEBUG, INFO, WARN, ERROR
-  }
-
-  private boolean debugEnabled = false;
-  private final ArrayListMultimap<Level, String> logs = ArrayListMultimap.create();
-
-  @Override
-  public boolean isDebugEnabled() {
-    return debugEnabled;
-  }
-
-  public InMemoryLogger setDebugEnabled(boolean b) {
-    this.debugEnabled = b;
-    return this;
-  }
-
-  @Override
-  public void debug(String message) {
-    if (isDebugEnabled()) {
-      log(Level.DEBUG, message);
-    }
-  }
-
-  @Override
-  public void info(String message) {
-    log(Level.INFO, message);
-  }
-
-  @Override
-  public void warn(String message) {
-    log(Level.WARN, message);
-  }
-
-  @Override
-  public void error(String message) {
-    log(Level.ERROR, message);
-  }
-
-  @Override
-  public void error(String message, Throwable throwable) {
-    log(Level.ERROR, String.format("%s | %s", message, throwable.getMessage()));
-  }
-
-  public List<String> logs() {
-    return Lists.newArrayList(logs.values());
-  }
-
-  public List<String> debugLogs() {
-    return logs.get(Level.DEBUG);
-  }
-
-  public List<String> infoLogs() {
-    return logs.get(Level.INFO);
-  }
-
-  public List<String> warnLogs() {
-    return logs.get(Level.WARN);
-  }
-
-  public List<String> errorLogs() {
-    return logs.get(Level.ERROR);
-  }
-
-  public InMemoryLogger clear() {
-    logs.clear();
-    return this;
-  }
-
-  private void log(Level level, String message) {
-    logs.put(level, message);
-  }
-}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/Slf4jLoggers.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/Slf4jLoggers.java
deleted file mode 100644 (file)
index d1cfadd..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.sonar.api.utils.log.internal;
-
-
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.log.Logger;
-
-public class Slf4jLoggers {
-
-  public static class Slf4jLogger implements Logger {
-    private final org.slf4j.Logger slf4j;
-
-    public Slf4jLogger(org.slf4j.Logger slf4j) {
-      this.slf4j = slf4j;
-    }
-
-    @Override
-    public boolean isDebugEnabled() {
-      return slf4j.isDebugEnabled();
-    }
-
-    @Override
-    public void debug(String message) {
-      slf4j.debug(message);
-    }
-
-    @Override
-    public void info(String message) {
-      slf4j.info(message);
-    }
-
-    @Override
-    public void warn(String message) {
-      slf4j.warn(message);
-    }
-
-    @Override
-    public void error(String message) {
-      slf4j.error(message);
-    }
-
-    @Override
-    public void error(String message, Throwable throwable) {
-      slf4j.error(message, throwable);
-    }
-  }
-
-  public Slf4jLogger getLogger(String name) {
-    return new Slf4jLogger(LoggerFactory.getLogger(name));
-  }
-
-  public Slf4jLogger getLogger(Class name) {
-    return new Slf4jLogger(LoggerFactory.getLogger(name));
-  }
-}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/package-info.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/package-info.java
new file mode 100644 (file)
index 0000000..a2aedc1
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
index cb38cde6f6fe5c18e21b10427478c24a187185d5..2a882663993a55cad121d5553963d8388bbdbc62 100644 (file)
 package org.sonar.api.platform;
 
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.startsWith;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.*;
 
 public class ComponentKeysTest {
 
index 713b4677abf94666df59dd996c1c4f1a68e1a020..3d7e3ac617744162650396a04b2f8213043cf126 100644 (file)
@@ -21,7 +21,7 @@ package org.sonar.api.utils;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
index a00847874c87550794570bd229fe3339f32f6d53..7a4e34683626bd4c44116374f8e134fc7937bc09 100644 (file)
 package org.sonar.api.utils;
 
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.sonar.api.utils.log.Logger;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.*;
 
 public class ValidationMessagesTest {
 
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleFormatterTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleFormatterTest.java
new file mode 100644 (file)
index 0000000..4e2280f
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Test;
+import org.sonar.test.TestUtils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ConsoleFormatterTest {
+
+  @Test
+  public void format() throws Exception {
+    assertThat(ConsoleFormatter.format("foo")).isEqualTo("foo");
+    assertThat(ConsoleFormatter.format("arg: {}", "foo")).isEqualTo("arg: foo");
+    assertThat(ConsoleFormatter.format("two args: {} and {}", "foo", 42)).isEqualTo("two args: foo and 42");
+    assertThat(ConsoleFormatter.format("args: {}, {} and {}", true, 42, 2L)).isEqualTo("args: true, 42 and 2");
+  }
+
+  @Test
+  public void only_static_methods() throws Exception {
+    assertThat(TestUtils.hasOnlyPrivateConstructors(ConsoleFormatter.class)).isTrue();
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggerTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggerTest.java
new file mode 100644 (file)
index 0000000..68d4d02
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.io.PrintStream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.*;
+
+public class ConsoleLoggerTest {
+
+  PrintStream stream = mock(PrintStream.class);
+  ConsoleLogger sut = new ConsoleLogger(stream);
+
+  @Rule
+  public LogTester tester = new LogTester();
+
+  @Test
+  public void debug_enabled() throws Exception {
+    tester.enableDebug(true);
+    assertThat(sut.isDebugEnabled()).isTrue();
+    sut.debug("message");
+    sut.debug("message {}", "foo");
+    sut.debug("message {} {}", "foo", "bar");
+    sut.debug("message {} {} {}", "foo", "bar", "baz");
+    verify(stream, times(4)).println(anyString());
+  }
+
+  @Test
+  public void debug_disabled() throws Exception {
+    tester.enableDebug(false);
+    assertThat(sut.isDebugEnabled()).isFalse();
+    sut.debug("message");
+    sut.debug("message {}", "foo");
+    sut.debug("message {} {}", "foo", "bar");
+    sut.debug("message {} {} {}", "foo", "bar", "baz");
+    verifyZeroInteractions(stream);
+  }
+
+  @Test
+  public void log() throws Exception {
+    sut.info("message");
+    sut.info("message {}", "foo");
+    sut.info("message {} {}", "foo", "bar");
+    sut.info("message {} {} {}", "foo", "bar", "baz");
+    verify(stream, times(4)).println(startsWith("INFO "));
+
+    sut.warn("message");
+    sut.warn("message {}", "foo");
+    sut.warn("message {} {}", "foo", "bar");
+    sut.warn("message {} {} {}", "foo", "bar", "baz");
+    verify(stream, times(4)).println(startsWith("WARN "));
+
+    sut.error("message");
+    sut.error("message {}", "foo");
+    sut.error("message {} {}", "foo", "bar");
+    sut.error("message {} {} {}", "foo", "bar", "baz");
+    sut.error("message", new IllegalArgumentException());
+    verify(stream, times(5)).println(startsWith("ERROR "));
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggersTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggersTest.java
new file mode 100644 (file)
index 0000000..64fa4cc
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ConsoleLoggersTest {
+
+  ConsoleLoggers sut = new ConsoleLoggers();
+
+  @Test
+  public void newInstance() throws Exception {
+    Logger logger = sut.newInstance("foo");
+    assertThat(logger).isInstanceOf(ConsoleLogger.class);
+  }
+
+  @Test
+  public void debugMode() throws Exception {
+    // disabled by default
+    assertThat(sut.isDebugEnabled()).isFalse();
+
+    sut.enableDebug(true);
+    assertThat(sut.isDebugEnabled()).isTrue();
+
+    sut.enableDebug(false);
+    assertThat(sut.isDebugEnabled()).isFalse();
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogTesterTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogTesterTest.java
new file mode 100644 (file)
index 0000000..32bb100
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LogTesterTest {
+
+  LogTester sut = new LogTester();
+
+  @Test
+  public void debugLevel() throws Throwable {
+    boolean initial = sut.isDebugEnabled();
+
+    // when LogTester is used, then debug logs are enabled by default
+    sut.before();
+    assertThat(sut.isDebugEnabled()).isTrue();
+    assertThat(Loggers.getFactory().isDebugEnabled()).isTrue();
+
+    // change
+    sut.enableDebug(false);
+    assertThat(sut.isDebugEnabled()).isFalse();
+    assertThat(Loggers.getFactory().isDebugEnabled()).isFalse();
+
+    // reset to initial level
+    sut.after();
+    assertThat(sut.isDebugEnabled()).isEqualTo(initial);
+    assertThat(Loggers.getFactory().isDebugEnabled()).isEqualTo(initial);
+  }
+
+  @Test
+  public void intercept_logs() throws Throwable {
+    sut.before();
+    Loggers.get("logger1").info("an information");
+    Loggers.get("logger2").warn("warning: {}", 42);
+
+    assertThat(sut.logs()).containsExactly("an information", "warning: 42");
+
+    sut.after();
+    assertThat(LogInterceptor.instance).isSameAs(NullInterceptor.NULL_INSTANCE);
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogbackLoggerTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogbackLoggerTest.java
new file mode 100644 (file)
index 0000000..2c8c368
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LogbackLoggerTest {
+
+  LogbackLogger sut = new LogbackLogger(LoggerFactory.getLogger(getClass()));
+
+  @Rule
+  public LogTester tester = new LogTester();
+
+  @Test
+  public void debug_enabling() throws Exception {
+    tester.enableDebug(true);
+    assertThat(sut.isDebugEnabled()).isTrue();
+
+    tester.enableDebug(false);
+    assertThat(sut.isDebugEnabled()).isFalse();
+  }
+
+  @Test
+  public void log() throws Exception {
+    // no assertions. Simply verify that calls do not fail.
+    sut.debug("message");
+    sut.debug("message {}", "foo");
+    sut.debug("message {} {}", "foo", "bar");
+    sut.debug("message {} {} {}", "foo", "bar", "baz");
+
+    sut.info("message");
+    sut.info("message {}", "foo");
+    sut.info("message {} {}", "foo", "bar");
+    sut.info("message {} {} {}", "foo", "bar", "baz");
+
+    sut.warn("message");
+    sut.warn("message {}", "foo");
+    sut.warn("message {} {}", "foo", "bar");
+    sut.warn("message {} {} {}", "foo", "bar", "baz");
+
+    sut.error("message");
+    sut.error("message {}", "foo");
+    sut.error("message {} {}", "foo", "bar");
+    sut.error("message {} {} {}", "foo", "bar", "baz");
+    sut.error("message", new IllegalArgumentException(""));
+
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LoggersTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LoggersTest.java
new file mode 100644 (file)
index 0000000..b26094c
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Test;
+import org.sonar.api.SonarPlugin;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LoggersTest {
+
+  @Test
+  public void factory() throws Exception {
+    // logback is used by sonar-plugin-api
+    assertThat(Loggers.getFactory()).isInstanceOf(LogbackLoggers.class);
+
+    assertThat(Loggers.get("foo")).isInstanceOf(LogbackLogger.class);
+    assertThat(Loggers.get(SonarPlugin.class)).isInstanceOf(LogbackLogger.class);
+  }
+}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/NullInterceptorTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/NullInterceptorTest.java
new file mode 100644 (file)
index 0000000..d25d04d
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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.api.utils.log;
+
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+
+public class NullInterceptorTest {
+
+  @Test
+  public void do_nothing() throws Exception {
+    // verify that... it does nothing
+    NullInterceptor.NULL_INSTANCE.log("foo");
+    NullInterceptor.NULL_INSTANCE.log("foo {}", 42);
+    NullInterceptor.NULL_INSTANCE.log("foo {} {}", 42, 66);
+    NullInterceptor.NULL_INSTANCE.log("foo {} {} {}", 42, 66, 84);
+    NullInterceptor.NULL_INSTANCE.log("foo", mock(Exception.class));
+  }
+}