1: <?php
2:
3: 4: 5:
6: class HTMLPurifier_DefinitionCacheFactory
7: {
8:
9: protected $caches = array('Serializer' => array());
10: protected $implementations = array();
11: protected $decorators = array();
12:
13: 14: 15:
16: public function setup() {
17: $this->addDecorator('Cleanup');
18: }
19:
20: 21: 22:
23: public static function instance($prototype = null) {
24: static $instance;
25: if ($prototype !== null) {
26: $instance = $prototype;
27: } elseif ($instance === null || $prototype === true) {
28: $instance = new HTMLPurifier_DefinitionCacheFactory();
29: $instance->setup();
30: }
31: return $instance;
32: }
33:
34: 35: 36: 37: 38:
39: public function register($short, $long) {
40: $this->implementations[$short] = $long;
41: }
42:
43: 44: 45: 46: 47:
48: public function create($type, $config) {
49: $method = $config->get('Cache.DefinitionImpl');
50: if ($method === null) {
51: return new HTMLPurifier_DefinitionCache_Null($type);
52: }
53: if (!empty($this->caches[$method][$type])) {
54: return $this->caches[$method][$type];
55: }
56: if (
57: isset($this->implementations[$method]) &&
58: class_exists($class = $this->implementations[$method], false)
59: ) {
60: $cache = new $class($type);
61: } else {
62: if ($method != 'Serializer') {
63: trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING);
64: }
65: $cache = new HTMLPurifier_DefinitionCache_Serializer($type);
66: }
67: foreach ($this->decorators as $decorator) {
68: $new_cache = $decorator->decorate($cache);
69:
70: unset($cache);
71: $cache = $new_cache;
72: }
73: $this->caches[$method][$type] = $cache;
74: return $this->caches[$method][$type];
75: }
76:
77: 78: 79: 80:
81: public function addDecorator($decorator) {
82: if (is_string($decorator)) {
83: $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator";
84: $decorator = new $class;
85: }
86: $this->decorators[$decorator->name] = $decorator;
87: }
88:
89: }
90:
91:
92: