package org.oddjob.beanbus.destinations; import java.util.Collection; import javax.inject.Inject; import org.apache.log4j.Logger; import org.oddjob.arooa.deploy.annotations.ArooaHidden; import org.oddjob.beanbus.AbstractDestination; import org.oddjob.beanbus.BadBeanTransfer; import org.oddjob.beanbus.BusConductor; import org.oddjob.beanbus.BusEvent; import org.oddjob.beanbus.BusFilter; import org.oddjob.beanbus.TrackingBusListener; /** * @oddjob.description Something that will catch bad beans and pass them to * a handler. * * @author rob * * @param <T> */ public class BadBeanFilter<T> extends AbstractDestination<T> implements BusFilter<T, T> { private static final Logger logger = Logger.getLogger(BadBeanFilter.class); private Collection<? super BadBeanTransfer<T>> badBeanHandler; private Collection<? super T> to; private String name; private int badCount; private int count; private final TrackingBusListener trackingListener = new TrackingBusListener() { @Override public void busStarting(BusEvent event) { badCount = 0; count = 0; } }; @Override public boolean add(T bean) { if (to == null) { if (count == 0) { logger.info("No destination set. Beans will be ignored."); } return false; } try { to.add(bean); ++count; } catch (RuntimeException e) { Throwable t = e; do { if (t instanceof IllegalArgumentException) { if (badBeanHandler == null) { if (badCount == 0) { logger.info("No Bad Bean Handler. Bad Beans will be ignored."); } } else { badBeanHandler.add(new BadBeanTransfer<T>(bean, (IllegalArgumentException) t)); } ++badCount; ++count; } t = t.getCause(); } while (t != null); } return true; }; @ArooaHidden @Inject public void setBusConductor(BusConductor busConductor) { trackingListener.setBusConductor(busConductor); } @Override public void setTo(Collection<? super T> to) { this.to = to; } public Collection<? super T> getTo() { return to; } public Collection<? super BadBeanTransfer<T>> getBadBeanHandler() { return badBeanHandler; } public void setBadBeanHandler( Collection<? super BadBeanTransfer<T>> badBeanHandler) { this.badBeanHandler = badBeanHandler; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getBadCount() { return badCount; } @Override public String toString() { if (name == null) { return getClass().getSimpleName(); } else { return name; } } public int getCount() { return count; } }