diff options
28 files changed, 278 insertions, 402 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/FileCacheProvider.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/FileCacheProvider.java index 529b314e8d6..1fa925356f6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/FileCacheProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/FileCacheProvider.java @@ -23,7 +23,6 @@ import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.config.Settings; import org.sonar.home.cache.FileCache; import org.sonar.home.cache.FileCacheBuilder; -import org.sonar.home.log.Slf4jLog; public class FileCacheProvider extends ProviderAdapter { private FileCache cache; @@ -31,7 +30,7 @@ public class FileCacheProvider extends ProviderAdapter { public FileCache provide(Settings settings) { if (cache == null) { String home = settings.getString("sonar.userHome"); - cache = new FileCacheBuilder().setLog(new Slf4jLog(FileCache.class)).setUserHome(home).build(); + cache = new FileCacheBuilder(new Slf4jLogger()).setUserHome(home).build(); } return cache; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PersistentCacheProvider.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PersistentCacheProvider.java index 6821333b27f..be8cce1a11e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PersistentCacheProvider.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/PersistentCacheProvider.java @@ -19,23 +19,19 @@ */ package org.sonar.batch.bootstrap; -import org.sonar.home.log.Slf4jLog; -import org.sonar.home.cache.PersistentCacheBuilder; -import org.picocontainer.injectors.ProviderAdapter; - import java.nio.file.Paths; import java.util.Map; - +import org.picocontainer.injectors.ProviderAdapter; import org.sonar.home.cache.PersistentCache; +import org.sonar.home.cache.PersistentCacheBuilder; public class PersistentCacheProvider extends ProviderAdapter { private PersistentCache cache; public PersistentCache provide(UserProperties props) { if (cache == null) { - PersistentCacheBuilder builder = new PersistentCacheBuilder(); + PersistentCacheBuilder builder = new PersistentCacheBuilder(new Slf4jLogger()); - builder.setLog(new Slf4jLog(PersistentCache.class)); builder.forceUpdate(isForceUpdate(props.properties())); String home = props.property("sonar.userHome"); diff --git a/sonar-home/src/main/java/org/sonar/home/log/Slf4jLog.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Slf4jLogger.java index 03ff7029ff8..a480c736314 100644 --- a/sonar-home/src/main/java/org/sonar/home/log/Slf4jLog.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/Slf4jLogger.java @@ -17,46 +17,38 @@ * 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.home.log; +package org.sonar.batch.bootstrap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class Slf4jLog implements Log { +public class Slf4jLogger implements org.sonar.home.cache.Logger { - private final Logger logger; + private static final Logger LOG = LoggerFactory.getLogger(Slf4jLogger.class); - public Slf4jLog(Logger logger) { - this.logger = logger; - } - - public Slf4jLog(Class loggerClass) { - this.logger = LoggerFactory.getLogger(loggerClass); - } - - public boolean isDebugEnabled() { - return logger.isDebugEnabled(); + @Override + public void debug(String msg) { + LOG.debug(msg); } @Override - public void debug(String s) { - logger.debug(s); + public void info(String msg) { + LOG.info(msg); } @Override - public void info(String s) { - logger.info(s); + public void warn(String msg) { + LOG.warn(msg); } @Override - public void warn(String s) { - logger.warn(s); + public void error(String msg, Throwable t) { + LOG.error(msg, t); } @Override - public void error(String s, Throwable throwable) { - logger.error(s, throwable); + public void error(String msg) { + LOG.error(msg); } - } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java index c82124d64ab..044678ed0a0 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java @@ -19,16 +19,13 @@ */ package org.sonar.batch.bootstrapper; -import org.sonar.home.log.LogListener; - -import org.picocontainer.annotations.Nullable; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.sonar.batch.bootstrap.GlobalContainer; - import java.util.Collections; import java.util.List; import java.util.Map; +import org.picocontainer.annotations.Nullable; +import org.sonar.batch.bootstrap.GlobalContainer; /** * Entry point for sonar-runner 2.1. @@ -55,8 +52,8 @@ public final class Batch { if (builder.isEnableLoggingConfiguration()) { loggingConfig = new LoggingConfiguration(builder.environment).setProperties(bootstrapProperties); - if (builder.listener != null) { - loggingConfig.setListener(builder.listener); + if (builder.logOutput != null) { + loggingConfig.setLogOutput(builder.logOutput); } } } @@ -131,7 +128,7 @@ public final class Batch { private EnvironmentInformation environment; private List<Object> components = Lists.newArrayList(); private boolean enableLoggingConfiguration = true; - private LogListener listener; + private LogOutput logOutput; private Builder() { } @@ -146,8 +143,8 @@ public final class Batch { return this; } - public Builder setLogListener(@Nullable LogListener listener) { - this.listener = listener; + public Builder setLogOutput(@Nullable LogOutput logOutput) { + this.logOutput = logOutput; return this; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogCallbackAppender.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogCallbackAppender.java index eb5a66f266e..838e8c54a11 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogCallbackAppender.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogCallbackAppender.java @@ -19,41 +19,39 @@ */ package org.sonar.batch.bootstrapper; -import org.sonar.home.log.LogListener; - import ch.qos.logback.classic.Level; -import ch.qos.logback.core.UnsynchronizedAppenderBase; import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.UnsynchronizedAppenderBase; public class LogCallbackAppender extends UnsynchronizedAppenderBase<ILoggingEvent> { - protected LogListener target; + protected LogOutput target; - public LogCallbackAppender(LogListener target) { + public LogCallbackAppender(LogOutput target) { setTarget(target); } - public void setTarget(LogListener target) { + public void setTarget(LogOutput target) { this.target = target; } @Override protected void append(ILoggingEvent event) { - target.log(event.getMessage(), translate(event.getLevel())); + target.log(event.getFormattedMessage(), translate(event.getLevel())); } - private static LogListener.Level translate(Level level) { + private static LogOutput.Level translate(Level level) { switch (level.toInt()) { case Level.ERROR_INT: - return LogListener.Level.ERROR; + return LogOutput.Level.ERROR; case Level.WARN_INT: - return LogListener.Level.WARN; + return LogOutput.Level.WARN; case Level.INFO_INT: - return LogListener.Level.INFO; + return LogOutput.Level.INFO; case Level.DEBUG_INT: default: - return LogListener.Level.DEBUG; + return LogOutput.Level.DEBUG; case Level.TRACE_INT: - return LogListener.Level.TRACE; + return LogOutput.Level.TRACE; } } } diff --git a/sonar-home/src/main/java/org/sonar/home/log/LogListener.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogOutput.java index fa11374fdc4..c4030eaf3fb 100644 --- a/sonar-home/src/main/java/org/sonar/home/log/LogListener.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogOutput.java @@ -17,11 +17,16 @@ * 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.home.log; +package org.sonar.batch.bootstrapper; + +/** + * Allow to redirect batch logs to a custom output. By defaults logs are written to System.out + * @since 5.2 + */ +public interface LogOutput { + + void log(String formattedMessage, Level level); -public interface LogListener { - void log(String msg, Level level); - enum Level { ERROR, WARN, INFO, DEBUG, TRACE; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfiguration.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfiguration.java index e2ee829310d..e648dad4919 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfiguration.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfiguration.java @@ -19,15 +19,11 @@ */ package org.sonar.batch.bootstrapper; -import org.sonar.home.log.LogListener; - import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; -import org.apache.commons.lang.StringUtils; - -import javax.annotation.Nullable; - import java.util.Map; +import javax.annotation.Nullable; +import org.apache.commons.lang.StringUtils; /** * @since 2.14 @@ -47,8 +43,8 @@ public final class LoggingConfiguration { @VisibleForTesting static final String FORMAT_MAVEN = "[%level] [%d{HH:mm:ss.SSS}] %msg%n"; - Map<String, String> substitutionVariables = Maps.newHashMap(); - LogListener listener = null; + private Map<String, String> substitutionVariables = Maps.newHashMap(); + private LogOutput logOutput = null; public LoggingConfiguration() { this(null); @@ -69,8 +65,8 @@ public final class LoggingConfiguration { return this; } - public LoggingConfiguration setListener(@Nullable LogListener listener) { - this.listener = listener; + public LoggingConfiguration setLogOutput(@Nullable LogOutput listener) { + this.logOutput = listener; return this; } @@ -118,4 +114,12 @@ public final class LoggingConfiguration { String getSubstitutionVariable(String key) { return substitutionVariables.get(key); } + + Map<String, String> getSubstitutionVariables() { + return substitutionVariables; + } + + LogOutput getLogOutput() { + return logOutput; + } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfigurator.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfigurator.java index 9a74eda6da5..1cf808cde33 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfigurator.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfigurator.java @@ -19,16 +19,12 @@ */ package org.sonar.batch.bootstrapper; -import org.sonar.home.log.LogListener; - -import ch.qos.logback.core.Appender; import ch.qos.logback.classic.Level; -import org.apache.commons.lang.StringUtils; - -import java.io.File; - import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import java.io.File; +import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import org.sonar.core.config.Logback; @@ -37,9 +33,9 @@ public class LoggingConfigurator { } public static void apply(LoggingConfiguration conf, File logbackFile) { - Logback.configure(logbackFile, conf.substitutionVariables); + Logback.configure(logbackFile, conf.getSubstitutionVariables()); - if (conf.listener != null) { + if (conf.getLogOutput() != null) { setCustomRootAppender(conf); } } @@ -49,25 +45,25 @@ public class LoggingConfigurator { } public static void apply(LoggingConfiguration conf, String classloaderPath) { - Logback.configure(classloaderPath, conf.substitutionVariables); + Logback.configure(classloaderPath, conf.getSubstitutionVariables()); // if not set, keep default behavior (configured to stdout through the file in classpath) - if (conf.listener != null) { + if (conf.getLogOutput() != null) { setCustomRootAppender(conf); } } private static void setCustomRootAppender(LoggingConfiguration conf) { Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - String pattern = StringUtils.defaultIfBlank(conf.substitutionVariables.get(LoggingConfiguration.PROPERTY_FORMAT), LoggingConfiguration.FORMAT_DEFAULT); - String level = StringUtils.defaultIfBlank(conf.substitutionVariables.get(LoggingConfiguration.PROPERTY_ROOT_LOGGER_LEVEL), LoggingConfiguration.LEVEL_ROOT_DEFAULT); + String pattern = StringUtils.defaultIfBlank(conf.getSubstitutionVariables().get(LoggingConfiguration.PROPERTY_FORMAT), LoggingConfiguration.FORMAT_DEFAULT); + String level = StringUtils.defaultIfBlank(conf.getSubstitutionVariables().get(LoggingConfiguration.PROPERTY_ROOT_LOGGER_LEVEL), LoggingConfiguration.LEVEL_ROOT_DEFAULT); logger.detachAndStopAllAppenders(); - logger.addAppender(createAppender(pattern, conf.listener)); + logger.addAppender(createAppender(pattern, conf.getLogOutput())); logger.setLevel(Level.toLevel(level)); } - private static Appender<ILoggingEvent> createAppender(String pattern, LogListener target) { + private static Appender<ILoggingEvent> createAppender(String pattern, LogOutput target) { LogCallbackAppender appender = new LogCallbackAppender(target); appender.setName("custom_stream"); appender.start(); diff --git a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java index ab769822948..d1ca1ff324c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java +++ b/sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java @@ -19,10 +19,19 @@ */ package org.sonar.batch.mediumtest; -import org.sonar.home.log.LogListener; - import com.google.common.base.Function; import com.google.common.io.Files; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; import org.sonar.api.CoreProperties; import org.sonar.api.SonarPlugin; import org.sonar.api.batch.bootstrap.ProjectReactor; @@ -32,6 +41,7 @@ import org.sonar.api.measures.Metric; import org.sonar.batch.bootstrap.AnalysisProperties; import org.sonar.batch.bootstrapper.Batch; import org.sonar.batch.bootstrapper.EnvironmentInformation; +import org.sonar.batch.bootstrapper.LogOutput; import org.sonar.batch.issue.tracking.ServerLineHashesLoader; import org.sonar.batch.protocol.input.ActiveRule; import org.sonar.batch.protocol.input.BatchInput.ServerIssue; @@ -44,18 +54,6 @@ import org.sonar.batch.repository.ProjectRepositoriesLoader; import org.sonar.batch.repository.ServerIssuesLoader; import org.sonar.core.component.ComponentKeys; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - /** * Main utility class for writing batch medium tests. * @@ -80,14 +78,14 @@ public class BatchMediumTester { private final FakeServerIssuesLoader serverIssues = new FakeServerIssuesLoader(); private final FakeServerLineHashesLoader serverLineHashes = new FakeServerLineHashesLoader(); private final Map<String, String> bootstrapProperties = new HashMap<>(); - private LogListener logListener = null; + private LogOutput logOutput = null; public BatchMediumTester build() { return new BatchMediumTester(this); } - - public BatchMediumTesterBuilder setLogListener(LogListener listener) { - this.logListener = listener; + + public BatchMediumTesterBuilder setLogOutput(LogOutput logOutput) { + this.logOutput = logOutput; return this; } @@ -175,7 +173,7 @@ public class BatchMediumTester { builder.serverLineHashes, new DefaultDebtModel()) .setBootstrapProperties(builder.bootstrapProperties) - .setLogListener(builder.logListener) + .setLogOutput(builder.logOutput) .build(); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java index bb678103fe2..631d78634a0 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java @@ -19,6 +19,8 @@ */ package org.sonar.batch.bootstrap; +import java.io.File; +import java.io.IOException; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.ClassRule; @@ -29,9 +31,6 @@ import org.sonar.core.platform.PluginInfo; import org.sonar.home.cache.FileCache; import org.sonar.home.cache.FileCacheBuilder; -import java.io.File; -import java.io.IOException; - import static org.assertj.core.api.Assertions.assertThat; public class BatchPluginJarExploderTest { @@ -45,7 +44,7 @@ public class BatchPluginJarExploderTest { @Before public void setUp() throws IOException { userHome = temp.newFolder(); - FileCache fileCache = new FileCacheBuilder().setUserHome(userHome).build(); + FileCache fileCache = new FileCacheBuilder(new Slf4jLogger()).setUserHome(userHome).build(); underTest = new BatchPluginJarExploder(fileCache); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java index beab35ba672..75538ff5b73 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java @@ -19,29 +19,27 @@ */ package org.sonar.batch.bootstrap; -import org.junit.Before; -import org.sonar.home.cache.PersistentCacheBuilder; -import org.sonar.home.cache.PersistentCache; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.sonar.batch.bootstrapper.EnvironmentInformation; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; +import org.sonar.home.cache.PersistentCache; +import org.sonar.home.cache.PersistentCacheBuilder; import static javax.servlet.http.HttpServletResponse.SC_OK; import static org.apache.commons.io.IOUtils.write; @@ -68,48 +66,48 @@ public class ServerClientTest { mode = mock(DefaultAnalysisMode.class); when(mode.isPreview()).thenReturn(true); } - + @After public void stopServer() { if (server != null) { server.stop(); } } - + @Test public void dont_cache_post_request() throws Exception { server = new MockHttpServer(); server.start(); server.setMockResponseData("this is the content"); - + assertThat(newServerClient().request("/foo", "POST")).isEqualTo("this is the content"); - + // cache never accessed, so not even the .lock should be there assertThat(getNumFilesInCache()).isEqualTo(0); } - + @Test public void dont_cache_non_preview_mode() throws Exception { server = new MockHttpServer(); server.start(); server.setMockResponseData("this is the content"); - + when(mode.isPreview()).thenReturn(false); assertThat(newServerClient().request("/foo")).isEqualTo("this is the content"); - + // cache never accessed, so not even the .lock should be there assertThat(getNumFilesInCache()).isEqualTo(0); } - + @Test public void cache_preview_mode() throws Exception { server = new MockHttpServer(); server.start(); server.setMockResponseData("this is the content"); - + assertThat(newServerClient().request("/foo")).isEqualTo("this is the content"); - - //should have the .lock and one request cached + + // should have the .lock and one request cached assertThat(getNumFilesInCache()).isEqualTo(2); } @@ -118,7 +116,7 @@ public class ServerClientTest { BootstrapProperties settings = mock(BootstrapProperties.class); when(settings.property("sonar.host.url")).thenReturn("http://localhost:8080/sonar/"); - PersistentCache ps = new PersistentCacheBuilder().setSonarHome(cacheTmp.getRoot().toPath()).build(); + PersistentCache ps = new PersistentCacheBuilder(new Slf4jLogger()).setSonarHome(cacheTmp.getRoot().toPath()).build(); ServerClient client = new ServerClient(settings, new EnvironmentInformation("Junit", "4"), ps, mode); assertThat(client.getURL()).isEqualTo("http://localhost:8080/sonar"); @@ -204,10 +202,10 @@ public class ServerClientTest { private ServerClient newServerClient() { when(bootstrapProps.property("sonar.host.url")).thenReturn("http://localhost:" + server.getPort()); - PersistentCache ps = new PersistentCacheBuilder().setSonarHome(cacheTmp.getRoot().toPath()).build(); + PersistentCache ps = new PersistentCacheBuilder(new Slf4jLogger()).setSonarHome(cacheTmp.getRoot().toPath()).build(); return new ServerClient(bootstrapProps, new EnvironmentInformation("Junit", "4"), ps, mode); } - + private int getNumFilesInCache() { return new File(cacheTmp.getRoot(), "ws_cache").listFiles().length; } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/BatchTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/BatchTest.java index e13eed530c2..3f46d16ad92 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/BatchTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/BatchTest.java @@ -19,14 +19,12 @@ */ package org.sonar.batch.bootstrapper; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -import org.sonar.home.log.LogListener; - import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; public class BatchTest { @Test @@ -68,8 +66,8 @@ public class BatchTest { @Test public void shoudSetLogListener() { - LogListener listener = mock(LogListener.class); - Batch batch = Batch.builder().setLogListener(listener).build(); - assertThat(batch.getLoggingConfiguration().listener).isEqualTo(listener); + LogOutput logOutput = mock(LogOutput.class); + Batch batch = Batch.builder().setLogOutput(logOutput).build(); + assertThat(batch.getLoggingConfiguration().getLogOutput()).isEqualTo(logOutput); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LogCallbackAppenderTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LogCallbackAppenderTest.java index b01b214e345..d4026a09504 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LogCallbackAppenderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LogCallbackAppenderTest.java @@ -19,52 +19,49 @@ */ package org.sonar.batch.bootstrapper; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import static org.mockito.Mockito.reset; - import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; -import org.junit.Test; -import org.sonar.home.log.LogListener; import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; public class LogCallbackAppenderTest { - private LogListener listener; + private LogOutput listener; private LogCallbackAppender appender; private ILoggingEvent event; @Before public void setUp() { - listener = mock(LogListener.class); + listener = mock(LogOutput.class); appender = new LogCallbackAppender(listener); } - @Test public void testLevelTranslation() { - testMessage("test", Level.INFO, LogListener.Level.INFO); - testMessage("test", Level.DEBUG, LogListener.Level.DEBUG); - testMessage("test", Level.ERROR, LogListener.Level.ERROR); - testMessage("test", Level.TRACE, LogListener.Level.TRACE); - testMessage("test", Level.WARN, LogListener.Level.WARN); - + testMessage("test", Level.INFO, LogOutput.Level.INFO); + testMessage("test", Level.DEBUG, LogOutput.Level.DEBUG); + testMessage("test", Level.ERROR, LogOutput.Level.ERROR); + testMessage("test", Level.TRACE, LogOutput.Level.TRACE); + testMessage("test", Level.WARN, LogOutput.Level.WARN); + // this should never happen - testMessage("test", Level.OFF, LogListener.Level.DEBUG); + testMessage("test", Level.OFF, LogOutput.Level.DEBUG); } - - private void testMessage(String msg, Level level, LogListener.Level translatedLevel) { + + private void testMessage(String msg, Level level, LogOutput.Level translatedLevel) { reset(listener); event = mock(ILoggingEvent.class); - when(event.getMessage()).thenReturn(msg); + when(event.getFormattedMessage()).thenReturn(msg); when(event.getLevel()).thenReturn(level); - + appender.append(event); - verify(event).getMessage(); + verify(event).getFormattedMessage(); verify(event).getLevel(); verify(listener).log(msg, translatedLevel); verifyNoMoreInteractions(event, listener); @@ -72,7 +69,7 @@ public class LogCallbackAppenderTest { @Test public void testChangeTarget() { - listener = mock(LogListener.class); + listener = mock(LogOutput.class); appender.setTarget(listener); testLevelTranslation(); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfigurationTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfigurationTest.java index 9b773b220e9..0aae6df636c 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfigurationTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfigurationTest.java @@ -19,15 +19,12 @@ */ package org.sonar.batch.bootstrapper; -import org.sonar.home.log.LogListener; - import com.google.common.collect.Maps; -import org.junit.Test; - import java.util.Map; +import org.junit.Test; -import static org.mockito.Mockito.mock; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; public class LoggingConfigurationTest { @@ -51,8 +48,8 @@ public class LoggingConfigurationTest { @Test public void test_log_listener_setter() { - LogListener listener = mock(LogListener.class); - assertThat(new LoggingConfiguration(null).setListener(listener).listener).isEqualTo(listener); + LogOutput listener = mock(LogOutput.class); + assertThat(new LoggingConfiguration(null).setLogOutput(listener).getLogOutput()).isEqualTo(listener); } @Test diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfiguratorTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfiguratorTest.java index 5e139684e19..9e630914193 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfiguratorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfiguratorTest.java @@ -19,13 +19,6 @@ */ package org.sonar.batch.bootstrapper; -import org.apache.commons.io.IOUtils; -import org.junit.Rule; -import org.junit.rules.TemporaryFolder; -import org.sonar.home.log.LogListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; @@ -36,10 +29,15 @@ import java.io.OutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -import org.junit.Before; public class LoggingConfiguratorTest { private static final String DEFAULT_CLASSPATH_CONF = "/org/sonar/batch/bootstrapper/logback.xml"; @@ -57,17 +55,17 @@ public class LoggingConfiguratorTest { listener = new SimpleLogListener(); } - private class SimpleLogListener implements LogListener { + private class SimpleLogListener implements LogOutput { String msg; - Level level; + LogOutput.Level level; @Override - public void log(String msg, Level level) { + public void log(String msg, LogOutput.Level level) { this.msg = msg; this.level = level; } } - + @Test public void testWithFile() throws FileNotFoundException, IOException { InputStream is = this.getClass().getResourceAsStream(DEFAULT_CLASSPATH_CONF); @@ -76,33 +74,33 @@ public class LoggingConfiguratorTest { OutputStream os = new FileOutputStream(testFile); IOUtils.copy(is, os); os.close(); - - conf.setListener(listener); + + conf.setLogOutput(listener); LoggingConfigurator.apply(conf, testFile); Logger logger = LoggerFactory.getLogger(this.getClass()); logger.info(TEST_STR); assertThat(listener.msg).endsWith(TEST_STR); - assertThat(listener.level).isEqualTo(LogListener.Level.INFO); + assertThat(listener.level).isEqualTo(LogOutput.Level.INFO); } @Test public void testCustomAppender() throws UnsupportedEncodingException { - conf.setListener(listener); + conf.setLogOutput(listener); LoggingConfigurator.apply(conf); Logger logger = LoggerFactory.getLogger(this.getClass()); logger.info(TEST_STR); assertThat(listener.msg).endsWith(TEST_STR); - assertThat(listener.level).isEqualTo(LogListener.Level.INFO); + assertThat(listener.level).isEqualTo(LogOutput.Level.INFO); } @Test public void testNoStdout() throws UnsupportedEncodingException { System.setOut(new PrintStream(out, false, StandardCharsets.UTF_8.name())); - conf.setListener(listener); + conf.setLogOutput(listener); LoggingConfigurator.apply(conf); Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -115,7 +113,7 @@ public class LoggingConfiguratorTest { @Test public void testFormatNoEffect() throws UnsupportedEncodingException { - conf.setListener(listener); + conf.setLogOutput(listener); conf.setFormat("%t"); LoggingConfigurator.apply(conf); @@ -130,7 +128,7 @@ public class LoggingConfiguratorTest { public void testSqlClasspath() throws UnsupportedEncodingException { String classpath = "/org/sonar/batch/bootstrapper/logback.xml"; - conf.setListener(listener); + conf.setLogOutput(listener); conf.setShowSql(true); LoggingConfigurator.apply(conf, classpath); @@ -156,7 +154,7 @@ public class LoggingConfiguratorTest { public void testNoSqlClasspath() throws UnsupportedEncodingException { String classpath = "/org/sonar/batch/bootstrapper/logback.xml"; - conf.setListener(listener); + conf.setLogOutput(listener); conf.setShowSql(false); LoggingConfigurator.apply(conf, classpath); diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/log/LogListenerTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/log/LogListenerTest.java index c50f9e20adf..98d18d5a461 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/log/LogListenerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/log/LogListenerTest.java @@ -19,18 +19,7 @@ */ package org.sonar.batch.mediumtest.log; -import org.junit.BeforeClass; -import org.junit.AfterClass; -import org.sonar.home.log.LogListener; -import org.sonar.home.log.LogListener.Level; -import org.apache.commons.io.FileUtils; -import org.junit.Test; import com.google.common.collect.ImmutableMap; -import org.junit.After; -import org.junit.Before; -import org.sonar.batch.mediumtest.BatchMediumTester; -import org.sonar.xoo.XooPlugin; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @@ -39,11 +28,20 @@ import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; - -import static org.assertj.core.api.Assertions.assertThat; +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; +import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; +import org.sonar.batch.bootstrapper.LogOutput; +import org.sonar.batch.mediumtest.BatchMediumTester; +import org.sonar.xoo.XooPlugin; + +import static org.assertj.core.api.Assertions.assertThat; public class LogListenerTest { @Rule @@ -62,7 +60,7 @@ public class LogListenerTest { public BatchMediumTester tester = BatchMediumTester.builder() .registerPlugin("xoo", new XooPlugin()) .addDefaultQProfile("xoo", "Sonar Way") - .setLogListener(new SimpleLogListener()) + .setLogOutput(new SimpleLogListener()) .build(); private File baseDir; @@ -112,7 +110,7 @@ public class LogListenerTest { * Check that log message is not formatted, i.e. has no log level and timestamp. */ private void assertMsgClean(String msg) { - for (Level l : Level.values()) { + for (LogOutput.Level l : LogOutput.Level.values()) { assertThat(msg).doesNotContain(l.toString()); } @@ -168,7 +166,7 @@ public class LogListenerTest { } } - private class SimpleLogListener implements LogListener { + private class SimpleLogListener implements LogOutput { @Override public void log(String msg, Level level) { logOutput.add(new LogEvent(msg, level)); @@ -177,9 +175,9 @@ public class LogListenerTest { private static class LogEvent { String msg; - Level level; + LogOutput.Level level; - LogEvent(String msg, Level level) { + LogEvent(String msg, LogOutput.Level level) { this.msg = msg; this.level = level; } diff --git a/sonar-home/pom.xml b/sonar-home/pom.xml index 10b477a495c..b4877e29ce2 100644 --- a/sonar-home/pom.xml +++ b/sonar-home/pom.xml @@ -15,11 +15,6 @@ <dependencies> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <optional>true</optional> - </dependency> - <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <scope>provided</scope> @@ -36,11 +31,6 @@ <artifactId>commons-codec</artifactId> <scope>test</scope> </dependency> - <dependency> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-classic</artifactId> - <scope>test</scope> - </dependency> </dependencies> diff --git a/sonar-home/src/main/java/org/sonar/home/cache/FileCache.java b/sonar-home/src/main/java/org/sonar/home/cache/FileCache.java index 5998b97a2c5..3e83cd9d673 100644 --- a/sonar-home/src/main/java/org/sonar/home/cache/FileCache.java +++ b/sonar-home/src/main/java/org/sonar/home/cache/FileCache.java @@ -19,13 +19,10 @@ */ package org.sonar.home.cache; -import org.sonar.home.log.Log; - -import javax.annotation.CheckForNull; - import java.io.File; import java.io.IOException; import java.nio.file.Files; +import javax.annotation.CheckForNull; /** * This class is responsible for managing Sonar batch file cache. You can put file into cache and @@ -39,18 +36,18 @@ public class FileCache { private final File dir, tmpDir; private final FileHashes hashes; - private final Log log; + private final Logger logger; - FileCache(File dir, Log log, FileHashes fileHashes) { + FileCache(File dir, FileHashes fileHashes, Logger logger) { this.hashes = fileHashes; - this.log = log; - this.dir = createDir(dir, log, "user cache"); - log.info(String.format("User cache: %s", dir.getAbsolutePath())); - this.tmpDir = createDir(new File(dir, "_tmp"), log, "temp dir"); + this.logger = logger; + this.dir = createDir(dir, "user cache"); + logger.info(String.format("User cache: %s", dir.getAbsolutePath())); + this.tmpDir = createDir(new File(dir, "_tmp"), "temp dir"); } - public static FileCache create(File dir, Log log) { - return new FileCache(dir, log, new FileHashes()); + public static FileCache create(File dir, Logger logger) { + return new FileCache(dir, new FileHashes(), logger); } public File getDir() { @@ -67,7 +64,7 @@ public class FileCache { if (cachedFile.exists()) { return cachedFile; } - log.debug(String.format("No file found in the cache with name %s and hash %s", filename, hash)); + logger.debug(String.format("No file found in the cache with name %s and hash %s", filename, hash)); return null; } @@ -105,8 +102,8 @@ public class FileCache { boolean rename = sourceFile.renameTo(targetFile); // Check if the file was cached by another process during download if (!rename && !targetFile.exists()) { - log.warn(String.format("Unable to rename %s to %s", sourceFile.getAbsolutePath(), targetFile.getAbsolutePath())); - log.warn("A copy/delete will be tempted but with no guarantee of atomicity"); + logger.warn(String.format("Unable to rename %s to %s", sourceFile.getAbsolutePath(), targetFile.getAbsolutePath())); + logger.warn("A copy/delete will be tempted but with no guarantee of atomicity"); try { Files.move(sourceFile.toPath(), targetFile.toPath()); } catch (IOException e) { @@ -147,9 +144,9 @@ public class FileCache { throw new IllegalStateException("Failed to create directory in " + tmpDir); } - private File createDir(File dir, Log log, String debugTitle) { + private File createDir(File dir, String debugTitle) { if (!dir.isDirectory() || !dir.exists()) { - log.debug("Create : " + dir.getAbsolutePath()); + logger.debug("Create : " + dir.getAbsolutePath()); try { Files.createDirectories(dir.toPath()); } catch (IOException e) { diff --git a/sonar-home/src/main/java/org/sonar/home/cache/FileCacheBuilder.java b/sonar-home/src/main/java/org/sonar/home/cache/FileCacheBuilder.java index 6ebb828ca5a..040ea887b8e 100644 --- a/sonar-home/src/main/java/org/sonar/home/cache/FileCacheBuilder.java +++ b/sonar-home/src/main/java/org/sonar/home/cache/FileCacheBuilder.java @@ -19,25 +19,20 @@ */ package org.sonar.home.cache; -import org.sonar.home.log.Log; -import org.sonar.home.log.StandardLog; - -import javax.annotation.Nullable; - import java.io.File; +import javax.annotation.Nullable; public class FileCacheBuilder { private File userHome; - private Log log = new StandardLog(); + private Logger logger; - public FileCacheBuilder setUserHome(File d) { - this.userHome = d; - return this; + public FileCacheBuilder(Logger logger) { + this.logger = logger; } - public FileCacheBuilder setLog(Log log) { - this.log = log; + public FileCacheBuilder setUserHome(File d) { + this.userHome = d; return this; } @@ -56,6 +51,6 @@ public class FileCacheBuilder { userHome = new File(path); } File cacheDir = new File(userHome, "cache"); - return FileCache.create(cacheDir, log); + return FileCache.create(cacheDir, logger); } } diff --git a/sonar-home/src/main/java/org/sonar/home/log/Log.java b/sonar-home/src/main/java/org/sonar/home/cache/Logger.java index bb67428ae98..fb4e8ebc2e0 100644 --- a/sonar-home/src/main/java/org/sonar/home/log/Log.java +++ b/sonar-home/src/main/java/org/sonar/home/cache/Logger.java @@ -17,15 +17,18 @@ * 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.home.log; +package org.sonar.home.cache; -public interface Log { - void debug(String s); +public interface Logger { - void info(String s); + void debug(String msg); - void warn(String s); + void info(String msg); - void error(String s, Throwable throwable); + void warn(String msg); + + void error(String msg); + + void error(String msg, Throwable t); } diff --git a/sonar-home/src/main/java/org/sonar/home/cache/PersistentCache.java b/sonar-home/src/main/java/org/sonar/home/cache/PersistentCache.java index 6af55ef6271..95b93e6ed27 100644 --- a/sonar-home/src/main/java/org/sonar/home/cache/PersistentCache.java +++ b/sonar-home/src/main/java/org/sonar/home/cache/PersistentCache.java @@ -19,12 +19,6 @@ */ package org.sonar.home.cache; -import org.sonar.home.log.Log; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import java.io.IOException; import java.io.RandomAccessFile; import java.io.UnsupportedEncodingException; @@ -39,10 +33,16 @@ import java.nio.file.attribute.BasicFileAttributes; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.concurrent.Callable; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; -import static java.nio.file.StandardOpenOption.*; +import static java.nio.file.StandardOpenOption.CREATE; +import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; +import static java.nio.file.StandardOpenOption.WRITE; public class PersistentCache { + private static final Charset ENCODING = StandardCharsets.UTF_8; private static final String DIGEST_ALGO = "MD5"; private static final String LOCK_FNAME = ".lock"; @@ -51,23 +51,23 @@ public class PersistentCache { // eviction strategy is to expire entries after modification once a time duration has elapsed private final long defaultDurationToExpireMs; - private final Log log; private boolean forceUpdate; + private final Logger logger; - public PersistentCache(Path baseDir, long defaultDurationToExpireMs, Log log, boolean forceUpdate) { + public PersistentCache(Path baseDir, long defaultDurationToExpireMs, boolean forceUpdate, Logger logger) { this.baseDir = baseDir; this.defaultDurationToExpireMs = defaultDurationToExpireMs; - this.log = log; + this.logger = logger; reconfigure(forceUpdate); - log.debug("cache: " + baseDir + ", default expiration time (ms): " + defaultDurationToExpireMs); + logger.debug("cache: " + baseDir + ", default expiration time (ms): " + defaultDurationToExpireMs); } public void reconfigure(boolean forceUpdate) { this.forceUpdate = forceUpdate; if (forceUpdate) { - log.debug("cache: forcing update"); + logger.debug("cache: forcing update"); } try { @@ -115,13 +115,13 @@ public class PersistentCache { byte[] cached = getCache(key); if (cached != null) { - log.debug("cache hit for " + obj + " -> " + key); + logger.debug("cache hit for " + obj + " -> " + key); return cached; } - log.debug("cache miss for " + obj + " -> " + key); + logger.debug("cache miss for " + obj + " -> " + key); } else { - log.debug("cache force update for " + obj + " -> " + key); + logger.debug("cache force update for " + obj + " -> " + key); } if (valueLoader != null) { @@ -142,12 +142,12 @@ public class PersistentCache { * Deletes all cache entries */ public synchronized void clear() { - log.info("cache: clearing"); + logger.info("cache: clearing"); try { lock(); deleteCacheEntries(createClearFilter()); } catch (IOException e) { - log.error("Error clearing cache", e); + logger.error("Error clearing cache", e); } finally { unlock(); } @@ -157,12 +157,12 @@ public class PersistentCache { * Deletes cache entries that are no longer valid according to the default expiration time period. */ public synchronized void clean() { - log.info("cache: cleaning"); + logger.info("cache: cleaning"); try { lock(); deleteCacheEntries(createCleanFilter()); } catch (IOException e) { - log.error("Error cleaning cache", e); + logger.error("Error cleaning cache", e); } finally { unlock(); } @@ -183,21 +183,21 @@ public class PersistentCache { try { lock.release(); } catch (IOException e) { - log.error("Error releasing lock", e); + logger.error("Error releasing lock", e); } } if (lock_fc != null) { try { lock_fc.close(); } catch (IOException e) { - log.error("Error closing file channel", e); + logger.error("Error closing file channel", e); } } if (lock_raf != null) { try { lock_raf.close(); } catch (IOException e) { - log.error("Error closing file", e); + logger.error("Error closing file", e); } } @@ -222,7 +222,7 @@ public class PersistentCache { try { Files.delete(p); } catch (Exception e) { - log.error("Error deleting " + p, e); + logger.error("Error deleting " + p, e); } } } @@ -271,7 +271,7 @@ public class PersistentCache { } if (isCacheEntryExpired(cacheEntryPath, durationToExpireMs)) { - log.debug("cache: expiring entry"); + logger.debug("cache: expiring entry"); Files.delete(cacheEntryPath); return false; } diff --git a/sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java b/sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java index c58dc53bbd6..e115f1cab64 100644 --- a/sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java +++ b/sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java @@ -19,35 +19,29 @@ */ package org.sonar.home.cache; -import org.sonar.home.log.StandardLog; - -import org.sonar.home.log.Log; - -import javax.annotation.Nullable; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; public class PersistentCacheBuilder { private static final long DEFAULT_EXPIRE_DURATION = TimeUnit.MILLISECONDS.convert(1L, TimeUnit.DAYS); private static final String DIR_NAME = "ws_cache"; private boolean forceUpdate = false; - private Path cachePath = null; - private Log log = new StandardLog(); + private Path cachePath; + private final Logger logger; + + public PersistentCacheBuilder(Logger logger) { + this.logger = logger; + } public PersistentCache build() { if (cachePath == null) { setSonarHome(findHome()); } - return new PersistentCache(cachePath, DEFAULT_EXPIRE_DURATION, log, forceUpdate); - } - - public PersistentCacheBuilder setLog(Log log) { - this.log = log; - return this; + return new PersistentCache(cachePath, DEFAULT_EXPIRE_DURATION, forceUpdate, logger); } public PersistentCacheBuilder setSonarHome(@Nullable Path p) { diff --git a/sonar-home/src/main/java/org/sonar/home/log/StandardLog.java b/sonar-home/src/main/java/org/sonar/home/log/StandardLog.java deleted file mode 100644 index fa4402d15ca..00000000000 --- a/sonar-home/src/main/java/org/sonar/home/log/StandardLog.java +++ /dev/null @@ -1,38 +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.home.log; - -public class StandardLog implements Log { - @Override - public void debug(String s) { - } - - @Override - public void info(String s) { - } - - @Override - public void warn(String s) { - } - - @Override - public void error(String s, Throwable throwable) { - } -} diff --git a/sonar-home/src/main/java/org/sonar/home/log/package-info.java b/sonar-home/src/main/java/org/sonar/home/log/package-info.java deleted file mode 100644 index bbf1fe5f448..00000000000 --- a/sonar-home/src/main/java/org/sonar/home/log/package-info.java +++ /dev/null @@ -1,25 +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. - */ - -@ParametersAreNonnullByDefault -package org.sonar.home.log; - -import javax.annotation.ParametersAreNonnullByDefault; - diff --git a/sonar-home/src/test/java/org/sonar/home/cache/FileCacheBuilderTest.java b/sonar-home/src/test/java/org/sonar/home/cache/FileCacheBuilderTest.java index 59125570012..ec204cbf781 100644 --- a/sonar-home/src/test/java/org/sonar/home/cache/FileCacheBuilderTest.java +++ b/sonar-home/src/test/java/org/sonar/home/cache/FileCacheBuilderTest.java @@ -19,13 +19,13 @@ */ package org.sonar.home.cache; +import java.io.File; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import java.io.File; - import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; public class FileCacheBuilderTest { @Rule @@ -34,7 +34,7 @@ public class FileCacheBuilderTest { @Test public void setUserHome() throws Exception { File userHome = temp.newFolder(); - FileCache cache = new FileCacheBuilder().setUserHome(userHome).build(); + FileCache cache = new FileCacheBuilder(mock(Logger.class)).setUserHome(userHome).build(); assertThat(cache.getDir()).isDirectory().exists(); assertThat(cache.getDir().getName()).isEqualTo("cache"); @@ -43,7 +43,7 @@ public class FileCacheBuilderTest { @Test public void user_home_property_can_be_null() { - FileCache cache = new FileCacheBuilder().setUserHome((String) null).build(); + FileCache cache = new FileCacheBuilder(mock(Logger.class)).setUserHome((String) null).build(); // does not fail. It uses default path or env variable assertThat(cache.getDir()).isDirectory().exists(); @@ -52,7 +52,7 @@ public class FileCacheBuilderTest { @Test public void use_default_path_or_env_variable() { - FileCache cache = new FileCacheBuilder().build(); + FileCache cache = new FileCacheBuilder(mock(Logger.class)).build(); assertThat(cache.getDir()).isDirectory().exists(); assertThat(cache.getDir().getName()).isEqualTo("cache"); diff --git a/sonar-home/src/test/java/org/sonar/home/cache/FileCacheTest.java b/sonar-home/src/test/java/org/sonar/home/cache/FileCacheTest.java index 1410b63ea50..7d7a3d70449 100644 --- a/sonar-home/src/test/java/org/sonar/home/cache/FileCacheTest.java +++ b/sonar-home/src/test/java/org/sonar/home/cache/FileCacheTest.java @@ -19,15 +19,13 @@ */ package org.sonar.home.cache; +import java.io.File; +import java.io.IOException; import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.home.log.Slf4jLog; - -import java.io.File; -import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; @@ -41,17 +39,15 @@ public class FileCacheTest { @Rule public ExpectedException thrown = ExpectedException.none(); - private Slf4jLog log = new Slf4jLog(FileCacheTest.class); - @Test public void not_in_cache() throws IOException { - FileCache cache = FileCache.create(tempFolder.newFolder(), log); + FileCache cache = FileCache.create(tempFolder.newFolder(), mock(Logger.class)); assertThat(cache.get("sonar-foo-plugin-1.5.jar", "ABCDE")).isNull(); } @Test public void found_in_cache() throws IOException { - FileCache cache = FileCache.create(tempFolder.newFolder(), log); + FileCache cache = FileCache.create(tempFolder.newFolder(), mock(Logger.class)); // populate the cache. Assume that hash is correct. File cachedFile = new File(new File(cache.getDir(), "ABCDE"), "sonar-foo-plugin-1.5.jar"); @@ -63,7 +59,7 @@ public class FileCacheTest { @Test public void download_and_add_to_cache() throws IOException { FileHashes hashes = mock(FileHashes.class); - FileCache cache = new FileCache(tempFolder.newFolder(), log, hashes); + FileCache cache = new FileCache(tempFolder.newFolder(), hashes, mock(Logger.class)); when(hashes.of(any(File.class))).thenReturn("ABCDE"); FileCache.Downloader downloader = new FileCache.Downloader() { @@ -84,7 +80,7 @@ public class FileCacheTest { thrown.expectMessage("INVALID HASH"); FileHashes hashes = mock(FileHashes.class); - FileCache cache = new FileCache(tempFolder.newFolder(), log, hashes); + FileCache cache = new FileCache(tempFolder.newFolder(), hashes, mock(Logger.class)); when(hashes.of(any(File.class))).thenReturn("VWXYZ"); FileCache.Downloader downloader = new FileCache.Downloader() { @@ -99,7 +95,7 @@ public class FileCacheTest { public void concurrent_download() throws IOException { FileHashes hashes = mock(FileHashes.class); when(hashes.of(any(File.class))).thenReturn("ABCDE"); - final FileCache cache = new FileCache(tempFolder.newFolder(), log, hashes); + final FileCache cache = new FileCache(tempFolder.newFolder(), hashes, mock(Logger.class)); FileCache.Downloader downloader = new FileCache.Downloader() { public void download(String filename, File toFile) throws IOException { diff --git a/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheBuilderTest.java b/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheBuilderTest.java index 33418cd75ca..78efe696695 100644 --- a/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheBuilderTest.java +++ b/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheBuilderTest.java @@ -19,31 +19,30 @@ */ package org.sonar.home.cache; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assume.*; - import java.nio.file.Files; - -import static org.junit.Assert.assertTrue; - -import org.junit.Test; import org.junit.Rule; +import org.junit.Test; import org.junit.rules.TemporaryFolder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; +import static org.mockito.Mockito.mock; + public class PersistentCacheBuilderTest { @Rule public TemporaryFolder temp = new TemporaryFolder(); @Test public void user_home_property_can_be_null() { - PersistentCache cache = new PersistentCacheBuilder().setSonarHome(null).build(); + PersistentCache cache = new PersistentCacheBuilder(mock(Logger.class)).setSonarHome(null).build(); assertTrue(Files.isDirectory(cache.getBaseDirectory())); assertThat(cache.getBaseDirectory().getFileName().toString()).isEqualTo("ws_cache"); } @Test public void set_user_home() { - PersistentCache cache = new PersistentCacheBuilder().setSonarHome(temp.getRoot().toPath()).build(); + PersistentCache cache = new PersistentCacheBuilder(mock(Logger.class)).setSonarHome(temp.getRoot().toPath()).build(); assertThat(cache.getBaseDirectory().getParent().toString()).isEqualTo(temp.getRoot().toPath().toString()); assertTrue(Files.isDirectory(cache.getBaseDirectory())); @@ -52,10 +51,10 @@ public class PersistentCacheBuilderTest { @Test public void read_system_env() { assumeTrue(System.getenv("SONAR_USER_HOME") == null); - + System.setProperty("user.home", temp.getRoot().getAbsolutePath()); - PersistentCache cache = new PersistentCacheBuilder().build(); + PersistentCache cache = new PersistentCacheBuilder(mock(Logger.class)).build(); assertTrue(Files.isDirectory(cache.getBaseDirectory())); assertThat(cache.getBaseDirectory().getFileName().toString()).isEqualTo("ws_cache"); diff --git a/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheTest.java b/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheTest.java index e9abb0bc609..09335dffc3b 100644 --- a/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheTest.java +++ b/sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheTest.java @@ -19,21 +19,18 @@ */ package org.sonar.home.cache; +import java.io.File; +import java.util.concurrent.Callable; import org.apache.commons.io.FileUtils; - -import org.sonar.home.log.Slf4jLog; +import org.junit.Before; import org.junit.Rule; +import org.junit.Test; import org.junit.rules.TemporaryFolder; -import java.io.File; -import java.util.concurrent.Callable; - -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.mock; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Before; -import org.junit.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class PersistentCacheTest { private final static String URI = "key1"; @@ -43,11 +40,9 @@ public class PersistentCacheTest { @Rule public TemporaryFolder tmp = new TemporaryFolder(); - private Slf4jLog log = new Slf4jLog(FileCacheTest.class); - @Before public void setUp() { - cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, log, false); + cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, false, mock(Logger.class)); } @Test @@ -85,20 +80,20 @@ public class PersistentCacheTest { @Test public void testForceUpdate() throws Exception { - cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, log, true); + cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, true, mock(Logger.class)); assertCacheHit(false); assertCacheHit(false); assertCacheHit(false); // with forceUpdate, it should still have cached the last call - cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, log, false); + cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, false, mock(Logger.class)); assertCacheHit(true); } @Test public void testReconfigure() throws Exception { - cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, log, true); + cache = new PersistentCache(tmp.getRoot().toPath(), Long.MAX_VALUE, true, mock(Logger.class)); assertCacheHit(false); assertCacheHit(false); @@ -116,7 +111,7 @@ public class PersistentCacheTest { @Test public void testExpiration() throws Exception { // negative time to make sure it is expired on the second call - cache = new PersistentCache(tmp.getRoot().toPath(), -100, log, false); + cache = new PersistentCache(tmp.getRoot().toPath(), -100, false, mock(Logger.class)); assertCacheHit(false); assertCacheHit(false); } |