package dk.thoerup.circuitbreaker; import java.util.Date; import java.util.LinkedList; import dk.thoerup.circuitbreaker.notification.Notifier; public class LoggingCircuitBreaker extends AccountingCircuitBreaker { private LinkedList log = new LinkedList(); final int maxSize = 50; public class LogEntry { public long time; public Notifier.Event event; public int count = 0; public LogEntry(Notifier.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 == Notifier.Event.BreakerRetripped) { str += ( ", " + count + " re-trips" ); } return str ; } } public LoggingCircuitBreaker(String name, int threshold, long timeoutMS) { super(name, threshold, timeoutMS); } @Override public void tripBreaker() { super.tripBreaker(); addEntry(Notifier.Event.BreakerTripped); } @Override public void retripBreaker() { super.retripBreaker(); addEntry(Notifier.Event.BreakerRetripped); } @Override public void reset() { super.reset(); addEntry(Notifier.Event.BreakerReset); } private void addEntry(Notifier.Event event) { synchronized(this) { //needs more work //if (log.size() == 0 || log.getFirst().event != Notifier.Event.BreakerRetripped) { log.addFirst( new LogEntry(event) ); if(log.size() > maxSize) { log.removeLast(); } /* } else { log.getFirst().newRetrip(); }*/ } } 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 } } }