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)); } }