diff options
140 files changed, 1868 insertions, 717 deletions
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 index 00000000000..fa836bd72b6 --- /dev/null +++ b/microbenchmark-template/src/main/java/org/sonar/microbenchmark/LoggingBenchmark.java @@ -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(); + } +} diff --git a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/EmailNotificationChannel.java b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/EmailNotificationChannel.java index 5ae23c21b22..a11154370cb 100644 --- a/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/EmailNotificationChannel.java +++ b/plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/EmailNotificationChannel.java @@ -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) diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java index e9963f83845..fcdb738e46d 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/CoveragePerTestSensor.java @@ -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"; diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java index a1012002896..1c558ff24c6 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/DependencySensor.java @@ -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"; diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java index a890b63ac9d..7469d9ff2cf 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/MeasureSensor.java @@ -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"; diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java index 8d14771bab4..5cc2ea832f9 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SymbolReferencesSensor.java @@ -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"; diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java index 004c186b208..549a655573e 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/SyntaxHighlightingSensor.java @@ -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"; diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java index a406a20a9ca..f7b38976489 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/lang/TestCaseSensor.java @@ -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"; diff --git a/server/sonar-search/pom.xml b/server/sonar-search/pom.xml index 9f836ef23ba..48b37cee245 100644 --- a/server/sonar-search/pom.xml +++ b/server/sonar-search/pom.xml @@ -37,12 +37,10 @@ <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 --> diff --git a/server/sonar-server/pom.xml b/server/sonar-server/pom.xml index 5f76c8e1f50..12419aa2142 100644 --- a/server/sonar-server/pom.xml +++ b/server/sonar-server/pom.xml @@ -17,6 +17,18 @@ <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> </dependency> <dependency> diff --git a/server/sonar-server/src/main/java/org/sonar/core/computation/dbcleaner/ProjectCleaner.java b/server/sonar-server/src/main/java/org/sonar/core/computation/dbcleaner/ProjectCleaner.java index dd9a2d955ec..6c341d54e0e 100644 --- a/server/sonar-server/src/main/java/org/sonar/core/computation/dbcleaner/ProjectCleaner.java +++ b/server/sonar-server/src/main/java/org/sonar/core/computation/dbcleaner/ProjectCleaner.java @@ -20,12 +20,12 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java b/server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java index 89b3a09377a..1a308b1bfb1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java +++ b/server/sonar-server/src/main/java/org/sonar/server/app/EmbeddedTomcat.java @@ -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()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/app/StartupLogs.java b/server/sonar-server/src/main/java/org/sonar/server/app/StartupLogs.java index 7fcf0295552..abbce664d8e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/app/StartupLogs.java +++ b/server/sonar-server/src/main/java/org/sonar/server/app/StartupLogs.java @@ -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 { diff --git a/server/sonar-server/src/main/java/org/sonar/server/app/TomcatAccessLog.java b/server/sonar-server/src/main/java/org/sonar/server/app/TomcatAccessLog.java index 69b80a51d69..eb34606780f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/app/TomcatAccessLog.java +++ b/server/sonar-server/src/main/java/org/sonar/server/app/TomcatAccessLog.java @@ -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); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/app/Webapp.java b/server/sonar-server/src/main/java/org/sonar/server/app/Webapp.java index b32b009896f..f2be0473d45 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/app/Webapp.java +++ b/server/sonar-server/src/main/java/org/sonar/server/app/Webapp.java @@ -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; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/charts/ChartFactory.java b/server/sonar-server/src/main/java/org/sonar/server/charts/ChartFactory.java index 7035fd7e9f1..0c80acb0ef3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/charts/ChartFactory.java +++ b/server/sonar-server/src/main/java/org/sonar/server/charts/ChartFactory.java @@ -20,16 +20,17 @@ 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(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/charts/ChartsServlet.java b/server/sonar-server/src/main/java/org/sonar/server/charts/ChartsServlet.java index 2994d371222..5a6cc9ae262 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/charts/ChartsServlet.java +++ b/server/sonar-server/src/main/java/org/sonar/server/charts/ChartsServlet.java @@ -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 diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java b/server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java index 2e532ee99ea..409cbc84208 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java @@ -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); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java index 2f8f2cce6ca..b0f60f1d6b7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThread.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThread.java index eecd6613e20..07c9a23e3a0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThread.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThread.java @@ -20,9 +20,10 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThreadLauncher.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThreadLauncher.java index 5354930c3a7..c19b80a0a7b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThreadLauncher.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationThreadLauncher.java @@ -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(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/ScmAccountCacheLoader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/ScmAccountCacheLoader.java index 4f6d1aeb6d3..2d51c5b5526 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/ScmAccountCacheLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/ScmAccountCacheLoader.java @@ -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 diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java index 6df408a0aac..042f13e7c4a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java @@ -21,10 +21,10 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java index 8a934738231..1fe29ad23c4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java b/server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java index 1b3fc5aeedd..81bd8088099 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java @@ -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(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/EmbeddedDatabase.java b/server/sonar-server/src/main/java/org/sonar/server/db/EmbeddedDatabase.java index 51d8b6dd593..ef0ab6c5ed1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/EmbeddedDatabase.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/EmbeddedDatabase.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/DatabaseMigrator.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/DatabaseMigrator.java index 9b69826fcd4..e13c246802d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/DatabaseMigrator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/DatabaseMigrator.java @@ -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); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/SqlUtil.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/SqlUtil.java index 0a02368b43d..17b0f16b1de 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/SqlUtil.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/SqlUtil.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/Progress.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/Progress.java index 5ae8b86c689..0e4c2e08273 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/Progress.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/Progress.java @@ -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) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/ViolationMigration.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/ViolationMigration.java index b1f752991ad..c5e955b2c94 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/ViolationMigration.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v36/ViolationMigration.java @@ -19,10 +19,11 @@ */ 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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java index a695592cba2..e7092c1f07a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java +++ b/server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelBackup.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java index 21ed0c37e41..4925a050ba0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java @@ -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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/IndexCreator.java b/server/sonar-server/src/main/java/org/sonar/server/es/IndexCreator.java index 65888f72610..909fd00bcba 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/IndexCreator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/IndexCreator.java @@ -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 diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java index d29e4a4eabe..0ec177045a3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterEngine.java b/server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterEngine.java index 280ab6e2197..c935e136b1d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterEngine.java +++ b/server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterEngine.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationCenter.java b/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationCenter.java index 9a3fb0565d3..4f68514f3e5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationCenter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationCenter.java @@ -20,13 +20,14 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationService.java b/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationService.java index 97764e97a47..f832d51127d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/notifications/NotificationService.java @@ -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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java b/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java index abd3c838ebb..b8f87770142 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java @@ -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(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ClassLoaderUtils.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ClassLoaderUtils.java index d9d0f57d3e3..989c79561c5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ClassLoaderUtils.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ClassLoaderUtils.java @@ -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); } } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java b/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java index 7675bee941a..94066a1eaa9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java @@ -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"); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java b/server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java index a23eab31aa9..e8e65acbee8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerFileSystem.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/MasterServletFilter.java b/server/sonar-server/src/main/java/org/sonar/server/platform/MasterServletFilter.java index ee7790e938a..cb4567267c0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/MasterServletFilter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/MasterServletFilter.java @@ -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) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index dc1ce4f53b9..bbc3cc6b083 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -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); } } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java b/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java index 9b6aa28c4d7..c034a78ee38 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/RailsAppsDeployer.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdGenerator.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdGenerator.java index 7979bca8a8c..cd9cb3229ed 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdGenerator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerIdGenerator.java @@ -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; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java index 8da34aad46a..991ceb18d1d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerImpl.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerLifecycleNotifier.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerLifecycleNotifier.java index ebed1d422b0..823f4a5d880 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerLifecycleNotifier.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerLifecycleNotifier.java @@ -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 index fbc46101522..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/SwitchLogbackAppender.java +++ /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); - } - -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartHandler.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartHandler.java index d32623de5a5..79c0d51cbad 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartHandler.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ws/RestartHandler.java @@ -19,14 +19,15 @@ */ 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"); diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java index 0263c928fcf..18de6b9e09c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/PluginDownloader.java @@ -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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarsInstaller.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarsInstaller.java index 2c80dcd6695..1d23bfebe59 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarsInstaller.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginJarsInstaller.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java index 71ab9c41f44..16028617966 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/ServerPluginRepository.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java index 41e0d2a4570..8d24a1ae5f0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java @@ -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 diff --git a/server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java b/server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java index 7af55f4a1f5..3895d6d7a40 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java +++ b/server/sonar-server/src/main/java/org/sonar/server/plugins/UpdateCenterClient.java @@ -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 { diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java index 0f8016fc22c..7ee0390bc9e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/RegisterQualityProfiles.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java b/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java index e54002f4bc9..563bcb1ae18 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java index 8f123326ed4..2d16e250dce 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java index c0d0d57256f..6ad59c20601 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/ActiveRuleCompleter.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java b/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java index 460e7b2ff48..4492b24a937 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/Facets.java b/server/sonar-server/src/main/java/org/sonar/server/search/Facets.java index 09b99fc1795..58f6b140bc4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/Facets.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/Facets.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java index 2944ac89701..1ad5214180d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java index 1afa9eb55b1..2aaa1e874b7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java b/server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java index 18d7841dc9a..0a6d74e96ea 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java @@ -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); diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/CopyRequirementsFromCharacteristicsToRules.java b/server/sonar-server/src/main/java/org/sonar/server/startup/CopyRequirementsFromCharacteristicsToRules.java index e40a54ba10e..cdefebfdd23 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/CopyRequirementsFromCharacteristicsToRules.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/CopyRequirementsFromCharacteristicsToRules.java @@ -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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java b/server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java index a3e95c1c9a9..cf6ea5dd47d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java @@ -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 diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java index 0e3a32b20cc..6848c52aa21 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDashboards.java @@ -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"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java index e922638a831..1319f3463b4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterDebtModel.java @@ -20,15 +20,16 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java index 5e5b6cfc582..01160def8fb 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterMetrics.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java index 84c53745e9b..02c173aa621 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewMeasureFilters.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java index df115467d1c..bf468fdf55f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java @@ -20,10 +20,11 @@ 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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/RenameDeprecatedPropertyKeys.java b/server/sonar-server/src/main/java/org/sonar/server/startup/RenameDeprecatedPropertyKeys.java index f74e9b1898a..8111277c509 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/RenameDeprecatedPropertyKeys.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/RenameDeprecatedPropertyKeys.java @@ -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()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/startup/ServerMetadataPersister.java b/server/sonar-server/src/main/java/org/sonar/server/startup/ServerMetadataPersister.java index 64712848ac7..8e6e6c9c08f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/startup/ServerMetadataPersister.java +++ b/server/sonar-server/src/main/java/org/sonar/server/startup/ServerMetadataPersister.java @@ -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(), diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java index 9318df53313..f7a3a25875f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java @@ -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() { diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyProfiling.java b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyProfiling.java index c142a49c0ef..3d8f3930cea 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyProfiling.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyProfiling.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/NewUserNotifier.java b/server/sonar-server/src/main/java/org/sonar/server/user/NewUserNotifier.java index 1a8fce0e8f2..a3b8da575d8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/NewUserNotifier.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/NewUserNotifier.java @@ -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); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java b/server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java index dfe9017e2ab..c6f9cd806d9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/SecurityRealmFactory.java @@ -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(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java b/server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java index 68fced94686..c7e3c95f658 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/UserSession.java @@ -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; diff --git a/server/sonar-server/src/main/java/org/sonar/server/util/ProgressLogger.java b/server/sonar-server/src/main/java/org/sonar/server/util/ProgressLogger.java index de0ba605c9b..660dfcd4ded 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/util/ProgressLogger.java +++ b/server/sonar-server/src/main/java/org/sonar/server/util/ProgressLogger.java @@ -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); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java b/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java index fe12f49acd7..c27b2bb7132 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceEngine.java @@ -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()))); } } diff --git a/server/sonar-server/src/test/java/org/sonar/core/computation/dbcleaner/ProjectCleanerTest.java b/server/sonar-server/src/test/java/org/sonar/core/computation/dbcleaner/ProjectCleanerTest.java index f2a58bd6107..d72ffb96335 100644 --- a/server/sonar-server/src/test/java/org/sonar/core/computation/dbcleaner/ProjectCleanerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/core/computation/dbcleaner/ProjectCleanerTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/app/StartupLogsTest.java b/server/sonar-server/src/test/java/org/sonar/server/app/StartupLogsTest.java index b4906a5ca14..1d85a118a00 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/app/StartupLogsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/app/StartupLogsTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/app/TomcatAccessLogTest.java b/server/sonar-server/src/test/java/org/sonar/server/app/TomcatAccessLogTest.java index 7e081214eb3..0e64c81de60 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/app/TomcatAccessLogTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/app/TomcatAccessLogTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/ScmAccountCacheLoaderTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/ScmAccountCacheLoaderTest.java index fd070959266..faa52fcbec6 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/ScmAccountCacheLoaderTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/ScmAccountCacheLoaderTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/SqlUtilTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/SqlUtilTest.java index b3bcc72ead8..2e18a4531b5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/SqlUtilTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/SqlUtilTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v36/ProgressTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v36/ProgressTest.java index d7800ebf86a..4ce1d029507 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v36/ProgressTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v36/ProgressTest.java @@ -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 index de87f67f688..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/SwitchLogbackAppenderTest.java +++ /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(); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/startup/ActivityServerIdTest.java b/server/sonar-server/src/test/java/org/sonar/server/startup/ActivityServerIdTest.java index 96ecafa0193..8e5466dfeda 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/startup/ActivityServerIdTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/startup/ActivityServerIdTest.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java b/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java index e444f2be0fa..3644a921813 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java +++ b/server/sonar-server/src/test/java/org/sonar/server/tester/ServerTester.java @@ -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; diff --git a/server/sonar-server/src/test/java/org/sonar/server/util/ProgressLoggerTest.java b/server/sonar-server/src/test/java/org/sonar/server/util/ProgressLoggerTest.java index 2fde99f4572..1ce230c21f3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/util/ProgressLoggerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/util/ProgressLoggerTest.java @@ -20,14 +20,12 @@ 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 index 7e59f112353..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/invalid-switch.xml +++ /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 index e9021148527..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/platform/SwitchLogbackAppenderTest/valid-switch.xml +++ /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> diff --git a/sonar-batch/pom.xml b/sonar-batch/pom.xml index d96777a8b16..7d1559266c3 100644 --- a/sonar-batch/pom.xml +++ b/sonar-batch/pom.xml @@ -92,6 +92,18 @@ <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> <scope>provided</scope> diff --git a/sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java b/sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java index a00b9f909f5..bb434c22737 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java @@ -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; diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java b/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java index 744c5caa5ba..e5125616e9c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java @@ -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; diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/LastLineHashes.java b/sonar-batch/src/main/java/org/sonar/batch/scan/LastLineHashes.java index 2f8cb99d172..5dc690a9da6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/LastLineHashes.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/LastLineHashes.java @@ -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; diff --git a/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java index cab746aa79b..d9e7f18193b 100644 --- a/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java @@ -21,14 +21,18 @@ 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; diff --git a/sonar-core/src/main/java/org/sonar/core/purge/PurgeProfiler.java b/sonar-core/src/main/java/org/sonar/core/purge/PurgeProfiler.java index 41d68ae2f64..e3552b5b66c 100644 --- a/sonar-core/src/main/java/org/sonar/core/purge/PurgeProfiler.java +++ b/sonar-core/src/main/java/org/sonar/core/purge/PurgeProfiler.java @@ -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; diff --git a/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java index a65dda0382d..35d53aba1bf 100644 --- a/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java @@ -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; diff --git a/sonar-core/src/test/java/org/sonar/core/purge/PurgeProfilerTest.java b/sonar-core/src/test/java/org/sonar/core/purge/PurgeProfilerTest.java index cbbe9088e83..fa80b2ea735 100644 --- a/sonar-core/src/test/java/org/sonar/core/purge/PurgeProfilerTest.java +++ b/sonar-core/src/test/java/org/sonar/core/purge/PurgeProfilerTest.java @@ -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; diff --git a/sonar-deprecated/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java b/sonar-deprecated/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java index acf870597af..6a458a3ba72 100644 --- a/sonar-deprecated/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java +++ b/sonar-deprecated/src/main/java/org/sonar/api/rules/AnnotationRuleParser.java @@ -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(); diff --git a/sonar-duplications/src/test/java/org/sonar/duplications/DuplicationsTestUtil.java b/sonar-duplications/src/test/java/org/sonar/duplications/DuplicationsTestUtil.java index 8d9adaa5411..24e006078e7 100644 --- a/sonar-duplications/src/test/java/org/sonar/duplications/DuplicationsTestUtil.java +++ b/sonar-duplications/src/test/java/org/sonar/duplications/DuplicationsTestUtil.java @@ -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; } } diff --git a/sonar-plugin-api/pom.xml b/sonar-plugin-api/pom.xml index 6eeb77a9630..fef2a0bed26 100644 --- a/sonar-plugin-api/pom.xml +++ b/sonar-plugin-api/pom.xml @@ -34,10 +34,22 @@ <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> @@ -46,6 +58,12 @@ <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 @@ -54,11 +72,16 @@ <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> @@ -96,18 +119,12 @@ <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> @@ -133,6 +150,16 @@ <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> @@ -141,11 +168,6 @@ <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> <scope>test</scope> diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java index 6fc76d56d9a..655edcdbecb 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/maven/MavenUtils.java @@ -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(); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentKeys.java b/sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentKeys.java index 3a603649e3b..56de51f17e1 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentKeys.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/platform/ComponentKeys.java @@ -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 diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java b/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java index 62590f42f36..055b3897c1d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/resources/Languages.java @@ -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(); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/rules/Violation.java b/sonar-plugin-api/src/main/java/org/sonar/api/rules/Violation.java index 3d963373c22..7f19e8214cd 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/rules/Violation.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/rules/Violation.java @@ -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; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinition.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinition.java index f26cad3ae4c..6caa31b5217 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinition.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinition.java @@ -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); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinitionAnnotationLoader.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinitionAnnotationLoader.java index 0c2a08f3dcc..d7b49912f4d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinitionAnnotationLoader.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RulesDefinitionAnnotationLoader.java @@ -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() diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java index b0cce8cdbc2..054ba773196 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/server/ws/internal/ValidatingRequest.java @@ -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(); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/HttpDownloader.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/HttpDownloader.java index 2df7765ff2b..ee0ba26214c 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/HttpDownloader.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/HttpDownloader.java @@ -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); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/LocalizedMessages.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/LocalizedMessages.java index 55df7e312ee..00ba41a1d4b 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/LocalizedMessages.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/LocalizedMessages.java @@ -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; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/TimeProfiler.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/TimeProfiler.java index 10b264d5124..ce86e880cdb 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/TimeProfiler.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/TimeProfiler.java @@ -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) { diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java index 4dffb8e57a7..e2455ef29e2 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java @@ -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; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/XpathParser.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/XpathParser.java index 4b40db12e86..e206847699b 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/XpathParser.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/XpathParser.java @@ -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 { diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/command/CommandExecutor.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/command/CommandExecutor.java index 799d8896a21..e395c8ab820 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/command/CommandExecutor.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/command/CommandExecutor.java @@ -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 index 00000000000..7dbec222096 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/BaseLogger.java @@ -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 index 00000000000..21247843ed2 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleFormatter.java @@ -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 index 00000000000..93af4ef8785 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLogger.java @@ -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 index 00000000000..a6a2f2524a0 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ConsoleLoggers.java @@ -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 index 00000000000..94aa6dad39a --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/ListInterceptor.java @@ -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 index 00000000000..aab01e6a359 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogInterceptor.java @@ -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 index 00000000000..9ee625e0c62 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogTester.java @@ -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 { + * @Rule + * public LogTester logTester = new LogTester(); + * + * @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 index 00000000000..7313a2fc2a5 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLogger.java @@ -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 index 00000000000..e4490a79e3a --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/LogbackLoggers.java @@ -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); + } +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Logger.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Logger.java index dab1503bce8..834dc235661 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Logger.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Logger.java @@ -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); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java index 6a9f278e112..4f2627fc5e9 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/Loggers.java @@ -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 index 00000000000..63e0d9ab847 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/NullInterceptor.java @@ -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 index b7f2fa061de..00000000000 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/InMemoryLogger.java +++ /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 index d1cfadd2bf5..00000000000 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/internal/Slf4jLoggers.java +++ /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 index 00000000000..a2aedc1a627 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/log/package-info.java @@ -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; + diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentKeysTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentKeysTest.java index cb38cde6f6f..2a882663993 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentKeysTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/platform/ComponentKeysTest.java @@ -20,13 +20,11 @@ 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 { diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/TimeProfilerTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/TimeProfilerTest.java index 713b4677abf..3d7e3ac6177 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/utils/TimeProfilerTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/TimeProfilerTest.java @@ -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; diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java index a00847874c8..7a4e3468362 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java @@ -20,14 +20,11 @@ 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 index 00000000000..4e2280fe775 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleFormatterTest.java @@ -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 index 00000000000..68d4d02bac3 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggerTest.java @@ -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 index 00000000000..64fa4cc7b96 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/ConsoleLoggersTest.java @@ -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 index 00000000000..32bb1000bd6 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogTesterTest.java @@ -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 index 00000000000..2c8c3680eb7 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LogbackLoggerTest.java @@ -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 index 00000000000..b26094ce16a --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/LoggersTest.java @@ -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 index 00000000000..d25d04d1dcd --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/log/NullInterceptorTest.java @@ -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)); + } +} |