import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
-
-import javax.annotation.Nullable;
-
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
-class ListInterceptor implements LogInterceptor {
+public class ListInterceptor implements LogInterceptor {
- private final List<String> logs = new ArrayList<>();
- private final ListMultimap<LoggerLevel, String> logsByLevel = ArrayListMultimap.create();
+ private final List<LogAndArguments> logs = new ArrayList<>();
+ private final ListMultimap<LoggerLevel, LogAndArguments> logsByLevel = ArrayListMultimap.create();
@Override
public void log(LoggerLevel level, String msg) {
- logs.add(msg);
- logsByLevel.put(level, msg);
+ LogAndArguments l = new LogAndArguments(msg, msg);
+ add(level, l);
}
@Override
public void log(LoggerLevel level, String msg, @Nullable Object arg) {
String s = ConsoleFormatter.format(msg, arg);
- logs.add(s);
- logsByLevel.put(level, s);
+ LogAndArguments l = new LogAndArguments(s, msg, arg);
+ add(level, l);
}
@Override
public void log(LoggerLevel level, String msg, @Nullable Object arg1, @Nullable Object arg2) {
String s = ConsoleFormatter.format(msg, arg1, arg2);
- logs.add(s);
- logsByLevel.put(level, s);
+ LogAndArguments l = new LogAndArguments(s, msg, arg1, arg2);
+ add(level, l);
}
@Override
public void log(LoggerLevel level, String msg, Object... args) {
String s = ConsoleFormatter.format(msg, args);
- logs.add(s);
- logsByLevel.put(level, s);
+ LogAndArguments l = new LogAndArguments(s, msg, args);
+ add(level, l);
}
@Override
public void log(LoggerLevel level, String msg, Throwable thrown) {
- logs.add(msg);
- logsByLevel.put(level, msg);
+ LogAndArguments l = new LogAndArguments(msg, msg, thrown);
+ add(level, l);
+ }
+
+ private void add(LoggerLevel level, LogAndArguments l) {
+ logs.add(l);
+ logsByLevel.put(level, l);
}
public List<String> logs() {
- return logs;
+ return logs.stream().map(LogAndArguments::getFormattedMsg).collect(Collectors.toList());
+ }
+
+ public Optional<String> findFirst(Predicate<String> logPredicate) {
+ return logs.stream().map(LogAndArguments::getFormattedMsg).filter(logPredicate).findFirst();
}
public List<String> logs(LoggerLevel level) {
+ return logsByLevel.get(level).stream().map(LogAndArguments::getFormattedMsg).collect(Collectors.toList());
+ }
+
+ public List<LogAndArguments> getLogs() {
+ return logs;
+ }
+
+ public List<LogAndArguments> getLogs(LoggerLevel level) {
return logsByLevel.get(level);
}
logs.clear();
logsByLevel.clear();
}
+
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.api.utils.log;
+
+import java.util.Optional;
+import javax.annotation.Nullable;
+
+public final class LogAndArguments {
+ private final String rawMsg;
+ private final Object[] args;
+ private final String msg;
+
+ LogAndArguments(String msg, String rawMsg) {
+ this.rawMsg = rawMsg;
+ this.msg = msg;
+ this.args = null;
+ }
+
+ LogAndArguments(String msg, String rawMsg, @Nullable Object arg1) {
+ this.rawMsg = rawMsg;
+ this.args = new Object[] {arg1};
+ this.msg = msg;
+ }
+
+ LogAndArguments(String msg, String rawMsg, @Nullable Object arg1, @Nullable Object arg2) {
+ this.rawMsg = rawMsg;
+ this.msg = msg;
+ this.args = new Object[] {arg1, arg2};
+ }
+
+ LogAndArguments(String msg, String rawMsg, Object... args) {
+ this.rawMsg = rawMsg;
+ this.msg = msg;
+ this.args = args;
+ }
+
+ public String getRawMsg() {
+ return rawMsg;
+ }
+
+ public Optional<Object[]> getArgs() {
+ return Optional.ofNullable(args);
+ }
+
+ public String getFormattedMsg() {
+ return msg;
+ }
+}
package org.sonar.api.utils.log;
import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
import org.junit.rules.ExternalResource;
/**
return ((ListInterceptor) LogInterceptors.get()).logs();
}
+ public Optional<String> findFirstLog(Predicate<String> msgPredicate) {
+ return ((ListInterceptor) LogInterceptors.get()).findFirst(msgPredicate);
+ }
+
/**
* Logs in chronological order (item at index 0 is the oldest one) for
* a given level
return ((ListInterceptor) LogInterceptors.get()).logs(level);
}
+ /**
+ * Logs with arguments in chronological order (item at index 0 is the oldest one)
+ */
+ public List<LogAndArguments> getLogs() {
+ return ((ListInterceptor) LogInterceptors.get()).getLogs();
+ }
+
+ /**
+ * Logs with arguments in chronological order (item at index 0 is the oldest one) for
+ * a given level
+ */
+ public List<LogAndArguments> getLogs(LoggerLevel level) {
+ return ((ListInterceptor) LogInterceptors.get()).getLogs(level);
+ }
+
public LogTester clear() {
((ListInterceptor) LogInterceptors.get()).clear();
return this;