1: | <?php |
2: | |
3: | /** |
4: | * Abstract class representing Definition cache managers that implements |
5: | * useful common methods and is a factory. |
6: | * @todo Create a separate maintenance file advanced users can use to |
7: | * cache their custom HTMLDefinition, which can be loaded |
8: | * via a configuration directive |
9: | * @todo Implement memcached |
10: | */ |
11: | abstract class HTMLPurifier_DefinitionCache |
12: | { |
13: | /** |
14: | * @type string |
15: | */ |
16: | public $type; |
17: | |
18: | /** |
19: | * @param string $type Type of definition objects this instance of the |
20: | * cache will handle. |
21: | */ |
22: | public function __construct($type) |
23: | { |
24: | $this->type = $type; |
25: | } |
26: | |
27: | /** |
28: | * Generates a unique identifier for a particular configuration |
29: | * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config |
30: | * @return string |
31: | */ |
32: | public function generateKey($config) |
33: | { |
34: | return $config->version . ',' . // possibly replace with function calls |
35: | $config->getBatchSerial($this->type) . ',' . |
36: | $config->get($this->type . '.DefinitionRev'); |
37: | } |
38: | |
39: | /** |
40: | * Tests whether or not a key is old with respect to the configuration's |
41: | * version and revision number. |
42: | * @param string $key Key to test |
43: | * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against |
44: | * @return bool |
45: | */ |
46: | public function isOld($key, $config) |
47: | { |
48: | if (substr_count($key, ',') < 2) { |
49: | return true; |
50: | } |
51: | list($version, $hash, $revision) = explode(',', $key, 3); |
52: | $compare = version_compare($version, $config->version); |
53: | // version mismatch, is always old |
54: | if ($compare != 0) { |
55: | return true; |
56: | } |
57: | // versions match, ids match, check revision number |
58: | if ($hash == $config->getBatchSerial($this->type) && |
59: | $revision < $config->get($this->type . '.DefinitionRev')) { |
60: | return true; |
61: | } |
62: | return false; |
63: | } |
64: | |
65: | /** |
66: | * Checks if a definition's type jives with the cache's type |
67: | * @note Throws an error on failure |
68: | * @param HTMLPurifier_Definition $def Definition object to check |
69: | * @return bool true if good, false if not |
70: | */ |
71: | public function checkDefType($def) |
72: | { |
73: | if ($def->type !== $this->type) { |
74: | trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); |
75: | return false; |
76: | } |
77: | return true; |
78: | } |
79: | |
80: | /** |
81: | * Adds a definition object to the cache |
82: | * @param HTMLPurifier_Definition $def |
83: | * @param HTMLPurifier_Config $config |
84: | */ |
85: | abstract public function add($def, $config); |
86: | |
87: | /** |
88: | * Unconditionally saves a definition object to the cache |
89: | * @param HTMLPurifier_Definition $def |
90: | * @param HTMLPurifier_Config $config |
91: | */ |
92: | abstract public function set($def, $config); |
93: | |
94: | /** |
95: | * Replace an object in the cache |
96: | * @param HTMLPurifier_Definition $def |
97: | * @param HTMLPurifier_Config $config |
98: | */ |
99: | abstract public function replace($def, $config); |
100: | |
101: | /** |
102: | * Retrieves a definition object from the cache |
103: | * @param HTMLPurifier_Config $config |
104: | */ |
105: | abstract public function get($config); |
106: | |
107: | /** |
108: | * Removes a definition object to the cache |
109: | * @param HTMLPurifier_Config $config |
110: | */ |
111: | abstract public function remove($config); |
112: | |
113: | /** |
114: | * Clears all objects from cache |
115: | * @param HTMLPurifier_Config $config |
116: | */ |
117: | abstract public function flush($config); |
118: | |
119: | /** |
120: | * Clears all expired (older version or revision) objects from cache |
121: | * @note Be careful implementing this method as flush. Flush must |
122: | * not interfere with other Definition types, and cleanup() |
123: | * should not be repeatedly called by userland code. |
124: | * @param HTMLPurifier_Config $config |
125: | */ |
126: | abstract public function cleanup($config); |
127: | } |
128: | |
129: | // vim: et sw=4 sts=4 |
130: |