1: <?php
2: /**
3: * This class handles the db schema.
4: *
5: * PHP version 5
6: *
7: * @category Kolab
8: * @package Kolab_Server
9: * @author Gunnar Wrobel <wrobel@pardus.de>
10: * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
11: * @link http://pear.horde.org/index.php?package=Kolab_Server
12: */
13:
14: /**
15: * This class handles the db schema.
16: *
17: * Copyright 2008-2012 Horde LLC (http://www.horde.org/)
18: *
19: * See the enclosed file COPYING for license information (LGPL). If you
20: * did not receive this file, see http://www.horde.org/licenses/lgpl21.
21: *
22: * @category Kolab
23: * @package Kolab_Server
24: * @author Gunnar Wrobel <wrobel@pardus.de>
25: * @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
26: * @link http://pear.horde.org/index.php?package=Kolab_Server
27: */
28: class Horde_Kolab_Server_Schema_Base
29: implements Horde_Kolab_Server_Schema_Interface
30: {
31: /**
32: * A link to the composite server handler.
33: *
34: * @var Horde_Kolab_Server_Composite
35: */
36: private $_composite;
37:
38: /**
39: * Set the composite server reference for this object.
40: *
41: * @param Horde_Kolab_Server_Composite $composite A link to the composite
42: * server handler.
43: *
44: * @return NULL
45: */
46: public function setComposite(
47: Horde_Kolab_Server_Composite $composite
48: ) {
49: $this->_composite = $composite;
50: }
51:
52: /**
53: * Return the schema for the given objectClass.
54: *
55: * @param string $objectclass Fetch the schema for this objectClass.
56: *
57: * @return array The schema for the given objectClass.
58: *
59: * @throws Horde_Kolab_Server_Exception If retrieval of the schema failed.
60: */
61: public function getObjectclassSchema($objectclass)
62: {
63: if (!empty($this->_config['schema_support'])) {
64: $schema = $this->_getSchema();
65: $info = $schema->get('objectclass', $objectclass);
66: $this->_handleError($info, Horde_Kolab_Server_Exception::SYSTEM);
67: return $info;
68: }
69: return parent::getObjectclassSchema($objectclass);
70: }
71:
72: /**
73: * Return the schema for the given attribute.
74: *
75: * @param string $attribute Fetch the schema for this attribute.
76: *
77: * @return array The schema for the given attribute.
78: *
79: * @throws Horde_Kolab_Server_Exception If retrieval of the schema failed.
80: */
81: public function getAttributeSchema($attribute)
82: {
83: if (!empty($this->_config['schema_support'])) {
84: $schema = $this->_getSchema();
85: $info = $schema->get('attribute', $attribute);
86: $this->_handleError($info, Horde_Kolab_Server_Exception::SYSTEM);
87: return $info;
88: }
89: return parent::getAttributeSchema($attribute);
90: }
91:
92: /**
93: * Return the attributes supported by the given object class.
94: *
95: * @param string $class Determine the attributes for this class.
96: *
97: * @return array The supported attributes.
98: *
99: * @throws Horde_Kolab_Server_Exception If the schema analysis fails.
100: */
101: public function getExternalAttributes($class)
102: {
103: $childclass = get_class($class);
104: $classes = array();
105: $level = 0;
106: while ($childclass != 'Horde_Kolab_Server_Object_Top'
107: && $level < self::MAX_HIERARCHY) {
108: $classes[] = $childclass;
109: $childclass = get_parent_class($childclass);
110: $level++;
111: }
112:
113: /** Finally add the basic object class */
114: $classes[] = $childclass;
115:
116: //@todo: Throw exception here
117: if ($level == self::MAX_HIERARCHY) {
118: if (isset($this->logger)) {
119: $logger->err(sprintf('The maximal level of the object hierarchy has been exceeded for class \"%s\"!',
120: $class));
121: }
122: }
123:
124: /**
125: * Collect attributes from bottom to top.
126: */
127: $classes = array_reverse($classes);
128:
129: $attributes = array();
130:
131: foreach ($classes as $childclass) {
132: $vars = get_class_vars($childclass);
133: if (isset($vars['attributes'])) {
134: /**
135: * If the user wishes to adhere to the schema
136: * information from the server we will skip the
137: * attributes defined within the object class here.
138: */
139: if (!empty($this->params['schema_override'])) {
140: continue;
141: }
142: $attributes = array_merge($vars['attributes'], $attributes);
143: }
144: }
145:
146: /* $attrs = array(); */
147:
148: /* foreach ($object_classes as $object_class) { */
149: /* $info = $this->getObjectclassSchema($object_class); */
150: /* if (isset($info['may'])) { */
151: /* $defined = array_merge($defined, $info['may']); */
152: /* } */
153: /* if (isset($info['must'])) { */
154: /* $defined = array_merge($defined, $info['must']); */
155: /* $required = array_merge($required, $info['must']); */
156: /* } */
157: /* foreach ($defined as $attribute) { */
158: /* try { */
159: /* $attrs[$attribute] = $this->getAttributeSchema($attribute); */
160: /* } catch (Horde_Kolab_Server_Exception $e) { */
161: /* /\** */
162: /* * If the server considers the attribute to be */
163: /* * invalid we mark it. */
164: /* *\/ */
165: /* $attrs[$attribute] = array('invalid' => true); */
166: /* } */
167: /* } */
168: /* foreach ($required as $attribute) { */
169: /* $attrs[$attribute]['required'] = true; */
170: /* } */
171: /* foreach ($locked as $attribute) { */
172: /* $attrs[$attribute]['locked'] = true; */
173: /* } */
174: /* foreach ($defaults as $attribute => $default) { */
175: /* $attrs[$attribute]['default'] = $default; */
176: /* } */
177: /* $attrs[Horde_Kolab_Server_Object::ATTRIBUTE_OC]['default'] = $object_classes; */
178: /* } */
179: /* foreach ($derived as $key => $attributes) { */
180: /* $supported = true; */
181: /* if (isset($attributes['base'])) { */
182: /* foreach ($attributes['base'] as $attribute) { */
183: /* /\** */
184: /* * Usually derived attribute are determined on basis */
185: /* * of one or more attributes. If any of these is not */
186: /* * supported the derived attribute should not be */
187: /* * included into the set of supported attributes. */
188: /* *\/ */
189: /* if (!isset($attrs[$attribute])) { */
190: /* unset($derived[$attribute]); */
191: /* $supported = false; */
192: /* break; */
193: /* } */
194: /* } */
195: /* } */
196: /* if ($supported) { */
197: /* $attrs[$key] = $attributes; */
198: /* } */
199: /* } */
200: /* $check_collapsed = $collapsed; */
201: /* foreach ($check_collapsed as $key => $attributes) { */
202: /* if (isset($attributes['base'])) { */
203: /* foreach ($attributes['base'] as $attribute) { */
204: /* /\** */
205: /* * Usually collapsed attribute are determined on basis */
206: /* * of one or more attributes. If any of these is not */
207: /* * supported the collapsed attribute should not be */
208: /* * included into the set of supported attributes. */
209: /* *\/ */
210: /* if (!isset($attrs[$attribute])) { */
211: /* unset($collapsed[$attribute]); */
212: /* } */
213: /* } */
214: /* } */
215: /* } */
216: /* $this->attributes[$class] = array($attrs, */
217: /* array( */
218: /* 'derived' => array_keys($derived), */
219: /* 'collapsed' => $collapsed, */
220: /* 'locked' => $locked, */
221: /* 'required' => $required)); */
222: return $attributes;
223: }
224:
225: /**
226: * Stores the attribute definitions in the cache.
227: *
228: * @return Horde_Kolab_Server The concrete Horde_Kolab_Server reference.
229: */
230: public function shutdown()
231: {
232: if (isset($this->attributes)) {
233: if (isset($this->cache)) {
234: foreach ($this->attributes as $key => $value) {
235: $this->cache->set('attributes_' . $key, @serialize($value));
236: }
237: }
238: }
239: }
240:
241:
242: }