root/trunk/midgard/tools/midrepository/paths.php

Revision 7101, 12.2 kB (checked in by bergius, 5 years ago)

Initial commit of the MidRepository? workflow extension
Issue number:
Obtained from:
Submitted by:
Reviewed by:

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1 <?
2 /*
3    midgard-paths 1.0beta
4    This provides path functionality as described in the documentation at http://midgard.dataflow.ch
5    Author: David Schmitter, schmitt@dataflow.ch
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License 2 as published by
8    the Free Software Foundation;
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307  USA
18 */
19
20 if (isset($midgard))
21      $sitegroup = $midgard->sitegroup;
22
23 function mgd_get_sitegroup_by_name($name) {
24   if ($name == 'SG0') {
25     $sg = mgd_get_sitegroup();
26     $sg->id=0;
27     return $sg;
28   }
29   $sitegroups = mgd_list_sitegroups();
30   while ($sitegroups && $sitegroups->fetch()) {
31     if ($sitegroups->name == $name) {
32       return mgd_get_sitegroup($sitegroups->id);
33     }
34   }
35   return FALSE;
36 }
37
38 function mgd_really_get_page_by_name($sg, $name) {
39   $pages = mgd_list_pages(0);
40   while ($pages && $pages->fetch()) {
41     if ($pages->sitegroup == $sg && $pages->name == $name) {
42       return mgd_get_page($pages->id);
43     }   
44   }
45   return FALSE
46 }
47
48 function mgd_get_event_by_guid($id, $guid) {
49   $event = mgd_get_object_by_guid($guid);
50   if (!$event || get_class($event) != 'MidgardEvent') {
51     return FALSE;
52   }       
53   if ($event->up != $id) {
54     return FALSE;
55   }
56   return $event;
57 }
58
59 function mgd_get_event_member_by_guid($id, $guid) {
60   $eventmember = mgd_get_object_by_guid($guid);
61   if (!$eventmember || get_class($event) != 'MidgardEventMember') {
62     return FALSE;
63   }
64   if ($eventmember->eid != $id) {
65     return FALSE;
66   }
67   return $eventmember;
68 }
69
70 function label($host) {
71   if (!$host || get_class($host) != 'MidgardHost') {
72     return FALSE;
73   } else {
74      return $host->name . ':' . $host->port . '|' . str_replace('/', '|', substr($host->prefix, 1));
75   }
76 }
77
78
79 function mgd_get_member_by_guid($id, $guid) {
80   $member = mgd_get_object_by_guid($guid);
81   if (!$member || get_class($member) != 'MidgardMember') {
82     return FALSE;
83   }
84   if ($member->uid != $id) {
85     return FALSE;
86   }
87   return $member;
88 }
89
90 function mgd_get_host_by_label($label) {
91   preg_match('/([^:]+):(\d+)\|(.*)/', $label, $stuff);
92   list($bla, $name, $port, $prefix) = $stuff;
93   $prefix = str_replace('|', '/', $prefix);
94   $prefix = '/' . $prefix;
95   $hosts = mgd_list_hosts();
96   while ($hosts && $hosts->fetch()) {
97     if ($hosts->name == $name && $hosts->port == $port && ($hosts->prefix == $prefix || '/' . $hosts->prefix == $prefix)) {
98       return mgd_get_host($hosts->id);
99     }
100   }
101   return FALSE;
102 }
103
104 function mgd_get_style_by_id_and_name($id, $name) {
105   $styles = mgd_list_styles($id);
106   while ($styles && $styles->fetch()) {
107     if ($styles->name == $name) {
108       return mgd_get_style($styles->id);
109     }
110   }
111   return FALSE;
112 }
113
114 function mgd_really_get_group_by_name($sg, $name) {
115   $groups = mgd_list_groups(0);
116   while ($groups && $groups->fetch()) {
117     if ($groups->sitegroup == $sg && $groups->name== $name) {
118       return mgd_get_group($groups->id);
119     }
120   }
121   return FALSE;
122 }
123
124
125 function mgd_really_get_person_by_name($sg, $name) {
126   $persons = mgd_list_persons();
127   while ($persons && $persons->fetch()) {
128     if ($persons->sitegroup == $sg && $persons->username == $name) {
129       return mgd_get_person($persons->id);
130     }
131   }
132   return FALSE;
133 }
134
135 function mgd_really_get_style_by_name($sg, $name) {
136   $styles = mgd_list_styles(0);
137   while ($styles && $styles->fetch()) {
138     if ($styles->sitegroup == $sg && $styles->name == $name) {
139       return mgd_get_style($styles->id);
140     }
141   }
142   return FALSE;
143 }
144
145
146 function mgd_really_get_topic_by_name($sg, $name) {
147   $topics = mgd_list_topics(0);
148   while ($topics && $topics->fetch()) {
149     if ($topics->sitegroup == $sg && $topics->name == $name) {
150       return mgd_get_topic($topics->id);
151     }   
152   }
153   return FALSE;
154 }
155     
156 $CLASSES = array (
157 'ar' => 'article',
158 'at' => 'attachment',
159 'el' => 'element',
160 'ev' => 'event',
161 'em' => 'eventmember',
162 'gr' => 'group',
163 'ho' => 'host',
164 'me' => 'member',
165 'pa' => 'page',
166 'pe' => 'pageelement',
167 'pr' => 'person',
168 'sd' => 'snippetdir',
169 'sg' => 'sitegroup',
170 'sn' => 'snippet',
171 'st' => 'style',
172 'to' => 'topic');
173       
174 class Node {
175   var $namefield;
176   var $links;
177   function Node($namefield, $links) {
178     $this->namefield = $namefield;
179     $this->links = $links;
180   }
181 }
182
183 class Link {
184   var $downfunc;
185   var $primkey;
186   var $uptable;
187   var $upkey;
188   var $upfunc
189   var $uptablekey;
190   function Link($downfunc, $primkey, $uptable, $upkey, $upfunc='mgd_get_$uptable', $uptablekey = NULL) {
191     $this->downfunc = $downfunc;
192     $this->primkey = $primkey;
193     $this->uptable = $uptable;
194     $this->upkey = $upkey;
195     eval ("\$upfunc = \"$upfunc\";");
196     $this->upfunc  = $upfunc;
197     $this->uptablekey = $uptablekey;
198   }
199 }
200
201 function newstdlink($table, $uptable) {
202   $stdlink = new Link("mgd_get_${table}_by_name", 'id', $uptable, 'up');
203   return $stdlink;
204 }
205
206 $LINKS = array('article' => new Node('$obj->name', array(new Link('mgd_get_reply_by_name', 'id', 'article','up'),
207                                  new Link('mgd_get_article_by_name', 'id', 'topic', 'topic'))),
208            'attachment' => new Node('$obj->name', array(new Link('$obj->getattachment'NULL, 'ANY', 'pid', 'mgd_get_$uptablekey', '$obj->ptable'))),
209            'element' => new Node('$obj->name', array(new Link('mgd_get_element_by_name', 'id', 'style', 'style'))),
210            'event' => new Node('$obj->guid()', array(new Link('mgd_get_event_by_guid''id', 'event', 'up'),
211                                  new Link('mgd_get_event_by_guid', '0', 'sitegroup', 'sitegroup'))),
212            'eventmember' => new Node('$obj->guid()', array(new Link('mgd_get_event_member_by_guid''id', 'event', 'eid'))),
213            'group' => new Node('$obj->name', array(new Link('mgd_get_group_by_name', 'id', 'group', 'owner'),
214                                new Link('mgd_really_get_group_by_name', '$cursg', 'sitegroup', 'sitegroup'))),
215            'host' => new Node('label($obj)', array(new Link('mgd_get_host_by_label', NULL, 'sitegroup', 'sitegroup'))),
216            'member' => new Node('$obj->guid()', array(new Link('mgd_get_member_by_guid', 'id', 'person', 'uid'))),
217            'page' => new Node('$obj->name', array(newstdlink('page', 'page'),
218                               new Link('mgd_really_get_page_by_name', '$cursg', 'sitegroup', 'sitegroup'))),
219            'pageelement' => new Node('$obj->name', array(new Link('mgd_get_page_element_by_name', 'id', 'page', 'page'))),
220            'person' => new Node('$obj->username', array(new Link('mgd_really_get_person_by_name', '$cursg', 'sitegroup', 'sitegroup'))),
221            'snippet' => new Node('$obj->name', array(newstdlink('snippet', 'snippetdir'))),
222            'snippetdir' => new Node('$obj->name', array(new Link(NULL, NULL, 'snippetdir', 'up'), // snippetdir_by_path must be handled specially
223                                 new Link('mgd_get_snippetdir_by_path', NULL, 'sitegroup', 'sitegroup'))),
224            'sitegroup' => new Node('$obj->name', array(new Link('mgd_get_sitegroup_by_name', NULL, NULL, NULL))),
225            'style' => new Node('$obj->name', array(new Link('mgd_get_style_by_id_and_name', 'id', 'style', 'up'),
226                                new Link('mgd_really_get_style_by_name', '$cursg', 'sitegroup', 'sitegroup'))),
227            'topic' => new Node('$obj->name', array(newstdlink('topic', 'topic'),
228                                new Link('mgd_really_get_topic_by_name', '$cursg', 'sitegroup', 'sitegroup')))
229            );
230
231 /* Returns the object pointed to by $path
232    $path: the path (string)
233 */
234 function mgd_get_object_by_path ($path) {
235   global $CLASSES, $LINKS, $sitegroup;
236   if (function_exists('mgd_set_lang'))
237     $multilang = 1;
238   else
239     $multilang = 0;
240   $class = NULL;
241   $snippetpath = '';
242   $cursg = $sitegroup;   
243   $lang = 0;
244   $search = array ('\\', '\'');//for eval
245   $replace = array ('\\\\', '\\\'');//for eval
246   $path .= '/';//can't figure out how to construct the r.e. without trailing slash
247   preg_match_all('/(([a-z]+?):)(.*?)(?<!\\\)\//', $path, $atoms);
248   $c = count($atoms[3]);
249   if (!$atoms[2][0] || ($atoms[2][0] != 'sg' && $atoms[2][0] != 'sitegroup')) {
250     $sgObj = mgd_get_sitegroup($sitegroup);
251     array_unshift($atoms[2], 'sg');
252     array_unshift($atoms[3], $sgObj->name);
253   }
254   $langid = 0;
255   if ($multilang && $atoms[2][$c - 1] == 'lang') {
256     $lang = mgd_get_language_by_code($atoms[3][$c - 1]);
257     $langid = ($lang)?$lang->id:0;
258     $c--;
259   }
260   $i = 0;
261   if ($multilang)
262     mgd_set_lang(0);
263   for ($i = 0; $i < $c; $i++) {
264     $atoms[3][$i] = str_replace('\/', '/', $atoms[3][$i]);
265     if ($multilang && $i == $c - 1) {
266       mgd_set_lang($langid);
267     }
268     $parentclass = $class;
269     if ($atoms[2][$i]) {
270       $class = $atoms[2][$i];
271       if (isset($CLASSES[$class])) {
272         $class = $CLASSES[$class];
273       } else {
274         if (!array_search($class, $CLASSES)) {
275           return FALSE;
276         }
277       }
278     }
279     if (!isset($class)) {
280        return FALSE;
281     }
282      $newobj = NULL;
283     if ($class == 'snippetdir') {
284       $snippetpath .= '/' . $atoms[3][$i];
285       if (isset($atoms[2][$i+1]) && ($atoms[2][$i+1] == 'sd' || $atoms[2][$i+1] == 'snippetdir')) {
286         continue;
287       } else {
288     $atoms[3][$i] = $snippetpath;
289     $parentclass = 'sitegroup';
290       }
291     }
292     $graph = $LINKS[$class];
293     array_reverse($graph->links);
294     foreach ($graph->links as $link) {
295       if ($link->uptable == $parentclass || ($link->uptable == 'ANY' && $link->uptable != $class)) {
296     if (strlen($atoms[3][$i]) == 32 and strspn($atoms[3][$i], '0123456789abcdef') == 32) {
297       $eval_str = "\$newobj = mgd_get_object_by_guid(\"$guid\");";
298     } else {
299       $eval_str = "\$newobj = $link->downfunc (";
300       if ($link->primkey != NULL) {
301         $primkey = "$link->primkey";
302         if ($primkey != '0') {
303           if ($primkey{0} != '$') {
304         $primkey = '$obj->' . $primkey;
305           }
306           eval ("\$primkey = \"$primkey\";");
307         }
308         $eval_str .= $primkey . ',';
309       }
310       $eval_str .= '\'' . str_replace($search, $replace, $atoms[3][$i]) .'\');';
311     }
312     eval ($eval_str);
313     break;
314       }
315     }
316     $snippetpath = '';
317     $obj = $newobj;
318     if (!$obj) {
319       return mgd_errno();
320     }
321     if (get_class($obj) == 'MidgardSitegroup') {
322       $cursg = $obj->id;
323     }
324     if (get_class($obj) != 'MidgardSitegroup' && $obj->sitegroup != $cursg && $obj->sitegroup != 0) {
325       return MGD_ERR_NOT_EXISTS;
326     }
327   }
328   return $obj;
329 }
330
331
332 /* Returns the path of the object
333    $obj: Specifies the object. Can be MidgardObject or guid
334 */
335 function mgd_get_path($obj) {
336   global $CLASSES, $LINKS, $sitegroup;
337   if (function_exists('mgd_set_lang'))
338     $multilang = 1;
339   else
340     $multilang = 0;
341   $path="";
342   if (is_string($obj)) {
343     $obj = mgd_get_object_by_guid($obj);
344   }
345   if (!$obj) {
346     return MGD_ERR_NOT_EXISTS;
347   }
348   $origobj = $obj;
349   $lastobj = NULL;
350   if ($multilang)
351     mgd_set_lang(0);
352   while ($obj && !($obj === $lastobj)) {
353     $ClassName = get_class($obj);
354     if (!$ClassName) {
355       return MGD_ERR_NOT_EXISTS;
356     }
357     if (substr($ClassName, 0, 7) != 'Midgard') {
358       return MGD_ERR_NOT_EXISTS;
359     }
360     $class = strtolower(substr($ClassName, 7));
361     $graph = $LINKS[$class];
362     if (!$graph) {
363       return MGD_ERR_NOT_EXISTS;   
364     }
365     $name = "$graph->namefield";
366     eval ("\$name = $name;");
367     $name = str_replace('/','\/',$name);
368     if ($name == '') {
369       $name = $obj->guid();
370     }
371     $path = '/' . $class . ':' . $name . $path;   
372     $lastobj = $obj;
373     foreach ($graph->links as $link) {
374       if (!$link->upkey)
375         continue;
376       $upkey = '$obj->' . "$link->upkey";
377       eval ("\$upkey = \"$upkey\";");
378       if ($upkey == NULL || ($upkey == 0 && !($link->uptable == 'sitegroup' || ($class == 'attachment' && $obj->ptable == 'sitegroup')))) {
379         continue;
380       }
381       $upfunc = "$link->upfunc";
382       if ($upfunc == 'mgd_get_sitegroup' && $upkey == 0) {
383         $path = '/sitegroup:SG0' . $path;
384     $obj = 0;
385       } else {
386     eval ("\$upfunc = \"$upfunc\";");   
387     $eval_str = "\$obj = $upfunc(";
388     $eval_str .= $upkey;
389     $eval_str .= ');';
390     eval ($eval_str);
391     break;
392       }
393     }
394   }
395   if ($multilang) {
396     $lang = mgd_get_language(@$origobj->lang);
397     $langcode = $lang?$lang->code:"nolang";
398     $path = $path . '/lang:' . $langcode;
399   }
400   return $path;
401 }
402
403 ?>
404
Note: See TracBrowser for help on using the browser.