| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | <?php/** * Abstract class representing Definition cache managers that implements * useful common methods and is a factory. * @todo Create a separate maintenance file advanced users can use to *       cache their custom HTMLDefinition, which can be loaded *       via a configuration directive * @todo Implement memcached */abstract class HTMLPurifier_DefinitionCache{    /**     * @type string     */    public $type;    /**     * @param string $type Type of definition objects this instance of the     *      cache will handle.     */    public function __construct($type)    {        $this->type = $type;    }    /**     * Generates a unique identifier for a particular configuration     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config     * @return string     */    public function generateKey($config)    {        return $config->version . ',' . // possibly replace with function calls               $config->getBatchSerial($this->type) . ',' .               $config->get($this->type . '.DefinitionRev');    }    /**     * Tests whether or not a key is old with respect to the configuration's     * version and revision number.     * @param string $key Key to test     * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against     * @return bool     */    public function isOld($key, $config)    {        if (substr_count($key, ',') < 2) {            return true;        }        list($version, $hash, $revision) = explode(',', $key, 3);        $compare = version_compare($version, $config->version);        // version mismatch, is always old        if ($compare != 0) {            return true;        }        // versions match, ids match, check revision number        if ($hash == $config->getBatchSerial($this->type) &&            $revision < $config->get($this->type . '.DefinitionRev')) {            return true;        }        return false;    }    /**     * Checks if a definition's type jives with the cache's type     * @note Throws an error on failure     * @param HTMLPurifier_Definition $def Definition object to check     * @return bool true if good, false if not     */    public function checkDefType($def)    {        if ($def->type !== $this->type) {            trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");            return false;        }        return true;    }    /**     * Adds a definition object to the cache     * @param HTMLPurifier_Definition $def     * @param HTMLPurifier_Config $config     */    abstract public function add($def, $config);    /**     * Unconditionally saves a definition object to the cache     * @param HTMLPurifier_Definition $def     * @param HTMLPurifier_Config $config     */    abstract public function set($def, $config);    /**     * Replace an object in the cache     * @param HTMLPurifier_Definition $def     * @param HTMLPurifier_Config $config     */    abstract public function replace($def, $config);    /**     * Retrieves a definition object from the cache     * @param HTMLPurifier_Config $config     */    abstract public function get($config);    /**     * Removes a definition object to the cache     * @param HTMLPurifier_Config $config     */    abstract public function remove($config);    /**     * Clears all objects from cache     * @param HTMLPurifier_Config $config     */    abstract public function flush($config);    /**     * Clears all expired (older version or revision) objects from cache     * @note Be careful implementing this method as flush. Flush must     *       not interfere with other Definition types, and cleanup()     *       should not be repeatedly called by userland code.     * @param HTMLPurifier_Config $config     */    abstract public function cleanup($config);}// vim: et sw=4 sts=4
 |