package dk.thoerup.circuitbreaker.statistics; import java.util.Date; import java.util.LinkedList; import dk.thoerup.circuitbreaker.Event; public class LoggingStatistics extends AccountingStatistics { private LinkedList log = new LinkedList(); final int maxSize = 50; public static class LogEntry { public long time; public Event event; public int count = 1; public LogEntry(Event evnt) { this.event = evnt; this.time = System.currentTimeMillis(); } public void newRetrip() {// count++; time = System.currentTimeMillis(); } @Override public String toString() { String str = new Date(time).toString() + (" : ") + event; if (event == Event.BreakerRetripped) { str += ( ", " + count + " re-trips" ); } return str ; } } @Override public void addStatistics(Event event) { super.addStatistics(event); switch(event) { case BreakerReset: addEntry(Event.BreakerReset); break; case BreakerRetripped: addEntry(Event.BreakerRetripped); break; case BreakerTripped: addEntry(Event.BreakerTripped); break; /*case InvocationBlocked: break; case InvocationFailure: break; case Invocation: break; case BreakerAttemptReset: break; */ default: break; } } private void addEntry(Event event) { synchronized(this) { if (event != Event.BreakerRetripped ) { log.addFirst( new LogEntry(event) ); //trip and reset are added unconditionally } else { if (log.size() == 0 || log.getFirst().event != Event.BreakerRetripped) { log.addFirst( new LogEntry(event) ); } else { log.getFirst().newRetrip(); } } if(log.size() > maxSize) { log.removeLast(); } } } public void clearLog() { synchronized(this) { log.clear(); } } public LinkedList getLog() { synchronized(this) { return new LinkedList(log); //return a copy so caller can to whatever he wants, when he wants } } }