package mireka.filter;
import java.io.IOException;
import mireka.MailData;
import mireka.address.ReversePath;
import mireka.smtp.RejectExceptionExt;
import org.subethamail.smtp.TooMuchDataException;
/**
* Adapts a {@link DataRecipientFilter} to the {@link Filter} interface
*/
public final class DataRecipientFilterAdapter implements Filter {
private final DataRecipientFilter filter;
private final MailTransaction mailTransaction;
private FilterChain chain;
public DataRecipientFilterAdapter(DataRecipientFilter filter,
MailTransaction mailTransaction) {
this.filter = filter;
this.mailTransaction = mailTransaction;
}
@Override
public void setChain(FilterChain chain) {
this.chain = chain;
}
@Override
public void begin() {
filter.begin();
chain.begin();
}
@Override
public void from(ReversePath from) throws RejectExceptionExt {
filter.from(from);
chain.from(from);
}
@Override
public FilterReply verifyRecipient(RecipientContext recipientContext)
throws RejectExceptionExt {
FilterReply result = filter.verifyRecipient(recipientContext);
switch (result) {
case ACCEPT:
return FilterReply.ACCEPT;
case NEUTRAL:
return chain.verifyRecipient(recipientContext);
default:
throw new RuntimeException();
}
}
@Override
public void recipient(RecipientContext recipientContext)
throws RejectExceptionExt {
filter.recipient(recipientContext);
chain.recipient(recipientContext);
}
@Override
public void data(MailData data) throws RejectExceptionExt,
TooMuchDataException, IOException {
filter.data(data);
for (RecipientContext recipientContext : mailTransaction
.getAcceptedRecipientContexts()) {
filter.dataRecipient(data, recipientContext);
}
chain.data(data);
}
@Override
public void done() {
filter.done();
}
}