package org.subethamail.core.filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.mail.MessagingException;
import lombok.extern.java.Log;
import org.subethamail.common.SubEthaMessage;
import org.subethamail.core.plugin.i.ArchiveRenderFilterContext;
import org.subethamail.core.plugin.i.Filter;
import org.subethamail.core.plugin.i.FilterContext;
import org.subethamail.core.plugin.i.FilterRegistry;
import org.subethamail.core.plugin.i.HoldException;
import org.subethamail.core.plugin.i.IgnoreException;
import org.subethamail.core.plugin.i.SendFilterContext;
import org.subethamail.entity.EnabledFilter;
import org.subethamail.entity.Mail;
import org.subethamail.entity.MailingList;
/**
* @author Jeff Schnitzer
* @author Scott Hernandez
*/
@ApplicationScoped
@Log
public class FilterRunnerBean implements FilterRunner, FilterRegistry
{
/** */
@Inject @Any Instance<Filter> filters;
/* */
@Override
public Iterable<Filter> getFilters()
{
return this.filters;
}
/* */
@Override
public void onInject(SubEthaMessage msg, MailingList list) throws IgnoreException, HoldException, MessagingException
{
log.log(Level.FINE,"Running onInject filters for list ''{0}'' on message: {1}", new Object[]{list.getName(), msg.getSubject()});
HoldException holdException = null;
for (EnabledFilter enabled: list.getEnabledFilters().values())
{
Filter filter = this.getFilterFor(enabled);
if (filter != null)
{
FilterContext ctx = new FilterContextImpl(enabled, filter, msg);
try
{
log.log(Level.FINE,"Running filter {0}");
filter.onInject(msg, ctx);
}
catch (HoldException ex)
{
// We only track the first one
if (holdException == null)
holdException = ex;
}
}
}
if (holdException != null)
throw holdException;
}
/* */
public void onSend(SubEthaMessage msg, Mail mail) throws IgnoreException, MessagingException
{
MailingList list = mail.getList();
log.log(Level.FINE,"Running onSend filters for list ''{0}'' on message: {1}", new Object[]{list.getName(), msg.getSubject()});
for (EnabledFilter enabled: list.getEnabledFilters().values())
{
Filter filter = this.getFilterFor(enabled);
if (filter != null)
{
SendFilterContext ctx = new SendFilterContextImpl(enabled, filter, msg, mail);
log.log(Level.FINE,"Running filter {0}", filter);
filter.onSend(msg, ctx);
}
}
}
/* */
public void onArchiveRender(SubEthaMessage msg, Mail mail) throws MessagingException
{
MailingList list = mail.getList();
log.log(Level.FINE,"Running onArchiveRender filters for list ''{0}'' on message: {1}", new Object[]{list.getName(), msg.getSubject()});
for (EnabledFilter enabled: list.getEnabledFilters().values())
{
try
{
Filter filter = this.getFilterFor(enabled);
if (filter != null)
{
ArchiveRenderFilterContext ctx = new ArchiveRenderFilterContextImpl(enabled, filter, msg, mail);
log.log(Level.FINE,"Running filter {0}", filter);
filter.onArchiveRender(msg, ctx);
}
}
catch (Exception e)
{
log.log(Level.SEVERE,"Error in filter OnArchiveRender", e);
}
}
}
/**
* @return null if couldn't get it for some reason (logs error too)
*/
private Filter getFilterFor(EnabledFilter enabled)
{
try
{
return this.getFilter(enabled.getClassName());
}
catch (Exception ex)
{
LogRecord logRecord=new LogRecord(Level.SEVERE, "Problem with filter ''{0}'' on list ''{1}''");
logRecord.setParameters(new Object[]{enabled.getClassName(), enabled.getList().getEmail()});
logRecord.setThrown(ex);
log.log(logRecord);
return null;
}
}
/* */
@Override
@SuppressWarnings("unchecked")
public Filter getFilter(String filterClassName)
{
Class<Filter> filterClass;
try
{
filterClass = (Class<Filter>)Class.forName(filterClassName);
}
catch (ClassNotFoundException e) { throw new RuntimeException(e); }
return this.filters.select(filterClass).get();
}
}