aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/FileCacheProvider.java3
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/PersistentCacheProvider.java10
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/Slf4jLogger.java (renamed from sonar-home/src/main/java/org/sonar/home/log/Slf4jLog.java)36
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrapper/Batch.java17
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogCallbackAppender.java24
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LogOutput.java (renamed from sonar-home/src/main/java/org/sonar/home/log/LogListener.java)13
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfiguration.java24
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrapper/LoggingConfigurator.java26
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/mediumtest/BatchMediumTester.java36
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginJarExploderTest.java7
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrap/ServerClientTest.java50
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrapper/BatchTest.java14
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LogCallbackAppenderTest.java47
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfigurationTest.java11
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/bootstrapper/LoggingConfiguratorTest.java42
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/mediumtest/log/LogListenerTest.java34
-rw-r--r--sonar-home/pom.xml10
-rw-r--r--sonar-home/src/main/java/org/sonar/home/cache/FileCache.java31
-rw-r--r--sonar-home/src/main/java/org/sonar/home/cache/FileCacheBuilder.java19
-rw-r--r--sonar-home/src/main/java/org/sonar/home/cache/Logger.java (renamed from sonar-home/src/main/java/org/sonar/home/log/Log.java)15
-rw-r--r--sonar-home/src/main/java/org/sonar/home/cache/PersistentCache.java48
-rw-r--r--sonar-home/src/main/java/org/sonar/home/cache/PersistentCacheBuilder.java22
-rw-r--r--sonar-home/src/main/java/org/sonar/home/log/StandardLog.java38
-rw-r--r--sonar-home/src/main/java/org/sonar/home/log/package-info.java25
-rw-r--r--sonar-home/src/test/java/org/sonar/home/cache/FileCacheBuilderTest.java10
-rw-r--r--sonar-home/src/test/java/org/sonar/home/cache/FileCacheTest.java18
-rw-r--r--sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheBuilderTest.java21
-rw-r--r--sonar-home/src/test/java/org/sonar/home/cache/PersistentCacheTest.java29
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);
}