package jetbrains.mps.testbench.util;
/*Generated by MPS */
import org.apache.log4j.AppenderSkeleton;
import java.util.List;
import java.util.ArrayList;
import com.intellij.openapi.util.Pair;
import org.apache.log4j.Level;
import org.apache.log4j.varia.LevelRangeFilter;
import org.apache.log4j.spi.LoggingEvent;
import java.util.Arrays;
/**
* fyodor, Aug 18, 2010
*/
public class CachingAppender extends AppenderSkeleton implements Output {
private int myEvents;
private List<String> myMessages = new ArrayList<String>();
private List<Pair<Integer, String>> myExpectedEvents = new ArrayList<Pair<Integer, String>>();
private List<Pair<Integer, String>> myReceivedExpectedEvents = new ArrayList<Pair<Integer, String>>();
public CachingAppender(Level watchLevel) {
final LevelRangeFilter newFilter = new LevelRangeFilter();
newFilter.setLevelMin(watchLevel);
this.addFilter(newFilter);
}
@Override
protected void append(LoggingEvent loggingEvent) {
if (!(isExpected(loggingEvent))) {
myEvents++;
myMessages.add(loggingEvent.getRenderedMessage());
String[] stackTrace = loggingEvent.getThrowableStrRep();
if (stackTrace != null) {
myMessages.add("++ =============StackTrace================");
myMessages.addAll(Arrays.asList(stackTrace));
myMessages.add("-- =============StackTrace================");
}
}
}
private boolean isExpected(LoggingEvent event) {
for (Pair<Integer, String> pr : myExpectedEvents) {
if (event.getLevel().isGreaterOrEqual(Level.toLevel(pr.first))) {
if (pr.second == null || pr.second.equals(event.getRenderedMessage())) {
myReceivedExpectedEvents.add(pr);
return true;
}
}
}
return false;
}
@Override
public boolean isNotEmpty() {
return myEvents > 0;
}
@Override
public String getDescription() {
return myEvents + " events";
}
@Override
public String getText() {
StringBuilder sb = new StringBuilder();
String sep = "";
for (String s : myMessages) {
sb.append(sep);
sep = "\n";
sb.append(s);
}
sb.append("\n");
return sb.toString();
}
@Override
public void close() {
}
@Override
public boolean requiresLayout() {
return false;
}
public void sealEvents() {
List<Pair<Integer, String>> list = new ArrayList<Pair<Integer, String>>(myExpectedEvents);
list.removeAll(myReceivedExpectedEvents);
for (Pair<Integer, String> pr : list) {
myEvents++;
myMessages.add("MISSING: " + pr.second);
}
}
public void expectEvent(int level, String text) {
myExpectedEvents.add(new Pair<Integer, String>(level, text));
}
}