diff --git a/library/log4php/LoggerFilter.php b/library/log4php/LoggerFilter.php new file mode 100644 --- /dev/null +++ b/library/log4php/LoggerFilter.php @@ -0,0 +1,126 @@ +This abstract class assumes and also imposes that filters be + * organized in a linear chain. The {@link #decide + * decide(LoggerLoggingEvent)} method of each filter is called sequentially, + * in the order of their addition to the chain. + * + *

The {@link decide()} method must return one + * of the integer constants {@link LoggerFilter::DENY}, + * {@link LoggerFilter::NEUTRAL} or {@link LoggerFilter::ACCEPT}. + * + *

If the value {@link LoggerFilter::DENY} is returned, then the log event is + * dropped immediately without consulting with the remaining + * filters. + * + *

If the value {@link LoggerFilter::NEUTRAL} is returned, then the next filter + * in the chain is consulted. If there are no more filters in the + * chain, then the log event is logged. Thus, in the presence of no + * filters, the default behaviour is to log all logging events. + * + *

If the value {@link LoggerFilter::ACCEPT} is returned, then the log + * event is logged without consulting the remaining filters. + * + *

The philosophy of log4php filters is largely inspired from the + * Linux ipchains. + * + * @version $Revision: 1213283 $ + * @package log4php + */ +abstract class LoggerFilter extends LoggerConfigurable { + + /** + * The log event must be logged immediately without consulting with + * the remaining filters, if any, in the chain. + */ + const ACCEPT = 1; + + /** + * This filter is neutral with respect to the log event. The + * remaining filters, if any, should be consulted for a final decision. + */ + const NEUTRAL = 0; + + /** + * The log event must be dropped immediately without consulting + * with the remaining filters, if any, in the chain. + */ + const DENY = -1; + + /** + * @var LoggerFilter Points to the next {@link LoggerFilter} in the filter chain. + */ + protected $next; + + /** + * Usually filters options become active when set. We provide a + * default do-nothing implementation for convenience. + */ + public function activateOptions() { + } + + /** + * Decide what to do. + *

If the decision is {@link LoggerFilter::DENY}, then the event will be + * dropped. If the decision is {@link LoggerFilter::NEUTRAL}, then the next + * filter, if any, will be invoked. If the decision is {@link LoggerFilter::ACCEPT} then + * the event will be logged without consulting with other filters in + * the chain. + * + * @param LoggerLoggingEvent $event The {@link LoggerLoggingEvent} to decide upon. + * @return integer {@link LoggerFilter::NEUTRAL} or {@link LoggerFilter::DENY}|{@link LoggerFilter::ACCEPT} + */ + public function decide(LoggerLoggingEvent $event) { + return self::NEUTRAL; + } + + /** + * Adds a new filter to the filter chain this filter is a part of. + * If this filter has already and follow up filter, the param filter + * is passed on until it is the last filter in chain. + * + * @param $filter - the filter to add to this chain + */ + public function addNext($filter) { + if ($this->next !== null) { + $this->next->addNext($filter); + } else { + $this->next = $filter; + } + } + + /** + * Returns the next filter in this chain + * @return the next filter + */ + public function getNext() { + return $this->next; + } + +}