<?php
/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *	   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @package log4php
 */

/**
 * Users should extend this class to implement customized logging
 * event filtering. Note that {@link LoggerCategory} and {@link LoggerAppender}, 
 * the parent class of all standard
 * appenders, have built-in filtering rules. It is suggested that you
 * first use and understand the built-in rules before rushing to write
 * your own custom filters.
 * 
 * <p>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.
 * 
 * <p>The {@link decide()} method must return one
 * of the integer constants {@link LoggerFilter::DENY}, 
 * {@link LoggerFilter::NEUTRAL} or {@link LoggerFilter::ACCEPT}.
 * 
 * <p>If the value {@link LoggerFilter::DENY} is returned, then the log event is
 * dropped immediately without consulting with the remaining
 * filters. 
 * 
 * <p>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.
 * 
 * <p>If the value {@link LoggerFilter::ACCEPT} is returned, then the log
 * event is logged without consulting the remaining filters. 
 * 
 * <p>The philosophy of log4php filters is largely inspired from the
 * Linux ipchains. 
 * 
 * @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.
	 * <p>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;
	}

}
