001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.util; 005 006 import java.lang.reflect.Method; 007 import java.util.Collections; 008 import java.util.Iterator; 009 import java.util.LinkedList; 010 import java.util.List; 011 012 /** 013 * @author Pavel Vlasov 014 * @version $Revision: 1.1 $ 015 */ 016 public class AccumulatingVisitorExceptionSink implements VisitorExceptionSink { 017 private List exceptions=new LinkedList(); 018 019 public class Entry { 020 private Object visitor; 021 private Exception exception; 022 private Object visitee; 023 private Method method; 024 025 Entry(Object visitor, Method method, Object visitee, Exception exception) { 026 this.visitor = visitor; 027 this.exception = exception; 028 this.visitee = visitee; 029 this.method = method; 030 } 031 032 public Exception getException() { 033 return exception; 034 } 035 036 public Method getMethod() { 037 return method; 038 } 039 040 public Object getVisitee() { 041 return visitee; 042 } 043 044 public Object getVisitor() { 045 return visitor; 046 } 047 } 048 049 public void consume(DispatchingVisitor dispatcher, Object visitor, Method method, Object visitee, Exception e) { 050 exceptions.add(new Entry(visitor, method, visitee, e)); 051 } 052 053 public synchronized List getExceptions() { 054 return Collections.unmodifiableList(exceptions); 055 } 056 057 public synchronized void reset() { 058 exceptions.clear(); 059 } 060 061 /** 062 * Invokes printStackTrace() for all accumulated exceptions 063 */ 064 public synchronized void dump() { 065 Iterator it=exceptions.iterator(); 066 while (it.hasNext()) { 067 Entry entry=(Entry) it.next(); 068 System.err.println("Visitor: "+entry.getVisitor()); 069 System.err.println("Method: "+entry.getMethod()); 070 System.err.println("Visitee: "+entry.getVisitee()); 071 entry.getException().printStackTrace(); 072 } 073 } 074 }