Coverage for Doctrine_Configurable

Back to coverage report

1 <?php
2 /*
3  *  $Id: Configurable.php 2753 2007-10-07 20:58:08Z zYne $
4  *
5  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16  *
17  * This software consists of voluntary contributions made by many individuals
18  * and is licensed under the LGPL. For more information, see
19  * <http://www.phpdoctrine.com>.
20  */
21 /**
22  * Doctrine_Configurable
23  * the base for Doctrine_Table, Doctrine_Manager and Doctrine_Connection
24  *
25  *
26  * @package     Doctrine
27  * @subpackage  Configurable
28  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
29  * @link        www.phpdoctrine.com
30  * @since       1.0
31  * @version     $Revision: 2753 $
32  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
33  */
34 abstract class Doctrine_Configurable extends Doctrine_Locator_Injectable
35 {
36     /**
37      * @var array $attributes               an array of containing all attributes
38      */
39     protected $attributes = array();
40     /**
41      * @var Doctrine_Configurable $parent   the parent of this component
42      */
43     protected $parent;
44     /**
45      * @var array $_impl                    an array containing concrete implementations for class templates
46      *                                      keys as template names and values as names of the concrete
47      *                                      implementation classes
48      */
49     protected $_impl = array();
50     /**
51      * setAttribute
52      * sets a given attribute
53      *
54      * <code>
55      * $manager->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL);
56      *
57      * // or
58      *
59      * $manager->setAttribute('portability', Doctrine::PORTABILITY_ALL);
60      * </code>
61      *
62      * @param mixed $attribute              either a Doctrine::ATTR_* integer constant or a string
63      *                                      corresponding to a constant
64      * @param mixed $value                  the value of the attribute
65      * @see Doctrine::ATTR_* constants
66      * @throws Doctrine_Exception           if the value is invalid
67      * @return void
68      */
69     public function setAttribute($attribute,$value)
70     {
71         if (is_string($attribute)) {
72             $upper = strtoupper($attribute);
73
74             $const = 'Doctrine::ATTR_' . $attribute;
75             if (defined($const)) {
76                 $this->_state = constant($const);
77             } else {
78                 throw new Doctrine_Exception('Unknown attribute ' . $attribute);
79             }
80         }
81         switch ($attribute) {
82             case Doctrine::ATTR_FETCHMODE:
83                 throw new Doctrine_Exception('Deprecated attribute. See http://doctrine.pengus.net/doctrine/manual/new/?chapter=configuration');
84             case Doctrine::ATTR_LISTENER:
85                 $this->setEventListener($value);
86                 break;
87             case Doctrine::ATTR_COLL_KEY:
88                 if ( ! ($this instanceof Doctrine_Table)) {
89                     throw new Doctrine_Exception("This attribute can only be set at table level.");
90                 }
91                 if ($value !== null && ! $this->hasColumn($value)) {
92                     throw new Doctrine_Exception("Couldn't set collection key attribute. No such column '$value'");
93                 }
94                 break;
95             case Doctrine::ATTR_CACHE:
96                 if ($value !== null) {
97                     if ( ! ($value instanceof Doctrine_Cache_Interface)) {
98                         throw new Doctrine_Exception('Cache driver should implement Doctrine_Cache_Interface');
99                     }
100                 }
101                 break;
102             case Doctrine::ATTR_VALIDATE:
103             case Doctrine::ATTR_QUERY_LIMIT:
104             case Doctrine::ATTR_QUOTE_IDENTIFIER:
105             case Doctrine::ATTR_PORTABILITY:
106             case Doctrine::ATTR_DEFAULT_TABLE_TYPE:
107             case Doctrine::ATTR_EMULATE_DATABASE:
108             case Doctrine::ATTR_USE_NATIVE_ENUM:
109             case Doctrine::ATTR_DEFAULT_SEQUENCE:
110             case Doctrine::ATTR_EXPORT:
111             case Doctrine::ATTR_DECIMAL_PLACES:
112             case Doctrine::ATTR_LOAD_REFERENCES:
113             case Doctrine::ATTR_RECORD_LISTENER:
114             case Doctrine::ATTR_THROW_EXCEPTIONS:
115
116                 break;
117             case Doctrine::ATTR_SEQCOL_NAME:
118                 if ( ! is_string($value)) {
119                     throw new Doctrine_Exception('Sequence column name attribute only accepts string values');
120                 }
121                 break;
122             case Doctrine::ATTR_FIELD_CASE:
123                 if ($value != 0 && $value != CASE_LOWER && $value != CASE_UPPER)
124                     throw new Doctrine_Exception('Field case attribute should be either 0, CASE_LOWER or CASE_UPPER constant.');
125                 break;
126             case Doctrine::ATTR_SEQNAME_FORMAT:
127             case Doctrine::ATTR_IDXNAME_FORMAT:
128                 if ($this instanceof Doctrine_Table) {
129                     throw new Doctrine_Exception('Sequence / index name format attributes cannot be set'
130                                                . 'at table level (only at connection or global level).');
131                 }
132                 break;
133             default:
134                 throw new Doctrine_Exception("Unknown attribute.");
135         }
136
137         $this->attributes[$attribute] = $value;
138
139     }
140     /**
141      * setImpl
142      * binds given class to given template name
143      *
144      * this method is the base of Doctrine dependency injection
145      *
146      * @param string $template      name of the class template
147      * @param string $class         name of the class to be bound
148      * @return Doctrine_Configurable    this object
149      */
150     public function setImpl($template, $class)
151     {
152         $this->_impl[$template] = $class;
153
154         return $this;
155     }
156     /**
157      * getImpl
158      * returns the implementation for given class
159      *
160      * @return string   name of the concrete implementation
161      */
162     public function getImpl($template)
163     {
164         if ( ! isset($this->_impl[$template])) {
165             if (isset($this->parent)) {
166                 return $this->parent->getImpl($template);
167             }
168             return null;
169         }
170         return $this->_impl[$template];
171     }
172     /**
173      * getCacheDriver
174      *
175      * @return Doctrine_Cache_Interface
176      */
177     public function getCacheDriver()
178     {
179         if ( ! isset($this->attributes[Doctrine::ATTR_CACHE])) {
180             throw new Doctrine_Exception('Cache driver not initialized.');
181         }
182
183         return $this->attributes[Doctrine::ATTR_CACHE];
184     }
185     /**
186      * @param Doctrine_EventListener $listener
187      * @return void
188      */
189     public function setEventListener($listener)
190     {
191         return $this->setListener($listener);
192     }
193     /**
194      * addRecordListener
195      *
196      * @param Doctrine_EventListener_Interface|Doctrine_Overloadable $listener
197      * @return mixed        this object
198      */
199     public function addRecordListener($listener, $name = null)
200     {
201         if ( ! isset($this->attributes[Doctrine::ATTR_RECORD_LISTENER]) ||
202              ! ($this->attributes[Doctrine::ATTR_RECORD_LISTENER] instanceof Doctrine_Record_Listener_Chain)) {
203
204             $this->attributes[Doctrine::ATTR_RECORD_LISTENER] = new Doctrine_Record_Listener_Chain();
205         }
206         $this->attributes[Doctrine::ATTR_RECORD_LISTENER]->add($listener, $name);
207
208         return $this;
209     }
210     /**
211      * getListener
212      *
213      * @return Doctrine_EventListener_Interface|Doctrine_Overloadable
214      */
215     public function getRecordListener()
216     {
217         if ( ! isset($this->attributes[Doctrine::ATTR_RECORD_LISTENER])) {
218             if (isset($this->parent)) {
219                 return $this->parent->getRecordListener();
220             }
221             return null;
222         }
223         return $this->attributes[Doctrine::ATTR_RECORD_LISTENER];
224     }
225     /**
226      * setListener
227      *
228      * @param Doctrine_EventListener_Interface|Doctrine_Overloadable $listener
229      * @return Doctrine_Configurable        this object
230      */
231     public function setRecordListener($listener)
232     {
233         if ( ! ($listener instanceof Doctrine_Record_Listener_Interface)
234             && ! ($listener instanceof Doctrine_Overloadable)
235         ) {
236             throw new Doctrine_Exception("Couldn't set eventlistener. Record listeners should implement either Doctrine_Record_Listener_Interface or Doctrine_Overloadable");
237         }
238         $this->attributes[Doctrine::ATTR_RECORD_LISTENER] = $listener;
239
240         return $this;
241     }
242     /**
243      * addListener
244      *
245      * @param Doctrine_EventListener_Interface|Doctrine_Overloadable $listener
246      * @return mixed        this object
247      */
248     public function addListener($listener, $name = null)
249     {
250         if ( ! isset($this->attributes[Doctrine::ATTR_LISTENER]) ||
251              ! ($this->attributes[Doctrine::ATTR_LISTENER] instanceof Doctrine_EventListener_Chain)) {
252
253             $this->attributes[Doctrine::ATTR_LISTENER] = new Doctrine_EventListener_Chain();
254         }
255         $this->attributes[Doctrine::ATTR_LISTENER]->add($listener, $name);
256
257         return $this;
258     }
259     /**
260      * getListener
261      *
262      * @return Doctrine_EventListener_Interface|Doctrine_Overloadable
263      */
264     public function getListener()
265     {
266         if ( ! isset($this->attributes[Doctrine::ATTR_LISTENER])) {
267             if (isset($this->parent)) {
268                 return $this->parent->getListener();
269             }
270             return null;
271         }
272         return $this->attributes[Doctrine::ATTR_LISTENER];
273     }
274     /**
275      * setListener
276      *
277      * @param Doctrine_EventListener_Interface|Doctrine_Overloadable $listener
278      * @return Doctrine_Configurable        this object
279      */
280     public function setListener($listener)
281     {
282         if ( ! ($listener instanceof Doctrine_EventListener_Interface)
283             && ! ($listener instanceof Doctrine_Overloadable)
284         ) {
285             throw new Doctrine_EventListener_Exception("Couldn't set eventlistener. EventListeners should implement either Doctrine_EventListener_Interface or Doctrine_Overloadable");
286         }
287         $this->attributes[Doctrine::ATTR_LISTENER] = $listener;
288
289         return $this;
290     }
291     /**
292      * returns the value of an attribute
293      *
294      * @param integer $attribute
295      * @return mixed
296      */
297     public function getAttribute($attribute)
298     {
299         $attribute = (int) $attribute;
300
301         if ($attribute < 0) {
302             throw new Doctrine_Exception('Unknown attribute.');
303         }
304
305         if ( ! isset($this->attributes[$attribute])) {
306             if (isset($this->parent)) {
307                 return $this->parent->getAttribute($attribute);
308             }
309             return null;
310         }
311         return $this->attributes[$attribute];
312     }
313     /**
314      * getAttributes
315      * returns all attributes as an array
316      *
317      * @return array
318      */
319     public function getAttributes()
320     {
321         return $this->attributes;
322     }
323     /**
324      * sets a parent for this configurable component
325      * the parent must be configurable component itself
326      *
327      * @param Doctrine_Configurable $component
328      * @return void
329      */
330     public function setParent(Doctrine_Configurable $component)
331     {
332         $this->parent = $component;
333     }
334     /**
335      * getParent
336      * returns the parent of this component
337      *
338      * @return Doctrine_Configurable
339      */
340     public function getParent()
341     {
342         return $this->parent;
343     }
344 }