root/websites/planet.php.gr.jp/trunk/lib/Ethna/class/Ethna_SkeltonGenerator.php @ 12921

Revision 12921, 20.0 kB (checked in by ha1t, 7 years ago)

first import

Line 
1<?php
2// vim: foldmethod=marker
3/**
4 *    Ethna_SkeltonGenerator.php
5 *
6 *    @author        Masaki Fujimoto <fujimoto@php.net>
7 *    @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8 *    @package    Ethna
9 *    @version    $Id: Ethna_SkeltonGenerator.php 49 2006-06-20 09:44:20Z ha1t $
10 */
11
12// {{{ Ethna_SkeltonGenerator
13/**
14 *    ������������饹
15 *
16 *    @author        Masaki Fujimoto <fujimoto@php.net>
17 *    @access        public
18 *    @package    Ethna
19 */
20class Ethna_SkeltonGenerator
21{
22    /**
23     *    �ץ�����ȥ������������� *
24     *    @access    public
25     *    @param    string    $basedir    �ץ�����ȥ١����ǥ��쥯�ȥ� *    @param    string    $id            �ץ������D
26     *    @return    bool    true:���se:���
27     */
28    function generateProjectSkelton($basedir, $id)
29    {
30        $dir_list = array(
31            array("app", 0755),
32            array("app/action", 0755),
33            array("app/action_cli", 0755),
34            array("app/action_xmlrpc", 0755),
35            array("app/filter", 0755),
36            array("app/view", 0755),
37            array("bin", 0755),
38            array("etc", 0755),
39            array("lib", 0755),
40            array("locale", 0755),
41            array("locale/ja", 0755),
42            array("locale/ja/LC_MESSAGES", 0755),
43            array("log", 0777),
44            array("schema", 0755),
45            array("skel", 0755),
46            array("template", 0755),
47            array("template/ja", 0755),
48            array("tmp", 0777),
49            array("www", 0755),
50            array("www/css", 0755),
51            array("www/js", 0755),
52        );
53
54        $r = Ethna_Controller::checkAppId($id);
55        if (Ethna::isError($r)) {
56            return $r;
57        }
58
59        $basedir = sprintf("%s/%s", $basedir, strtolower($id));
60
61        // �ǥ��쥯�ȥ��
62        if (is_dir($basedir) == false) {
63            // confirm
64            printf("creating directory ($basedir) [y/n]: ");
65            flush();
66            $fp = fopen("php://stdin", "r");
67            $r = trim(fgets($fp, 128));
68            fclose($fp);
69            if (strtolower($r) != 'y') {
70                return Ethna::raiseError('aborted by user');
71            }
72
73            if (mkdir($basedir, 0775) == false) {
74                return Ethna::raiseError('directory creation failed');
75            }
76        }
77        foreach ($dir_list as $dir) {
78            $mode = $dir[1];
79            $dir = $dir[0];
80            $target = "$basedir/$dir";
81            if (is_dir($target)) {
82                printf("%s already exists -> skipping...\n", $target);
83                continue;
84            }
85            if (mkdir($target, $mode) == false) {
86                return Ethna::raiseError('directory creation failed');
87            } else {
88                printf("proejct sub directory created [%s]\n", $target);
89            }
90            if (chmod($target, $mode) == false) {
91                return Ethna::raiseError('chmod failed');
92            }
93        }
94
95        // ��������������
96        $macro['application_id'] = strtoupper($id);
97        $macro['project_id'] = ucfirst($id);
98        $macro['project_prefix'] = strtolower($id);
99        $macro['basedir'] = realpath($basedir);
100
101        $macro['action_class'] = '{$action_class}';
102        $macro['action_form'] = '{$action_form}';
103        $macro['action_name'] = '{$action_name}';
104        $macro['action_path'] = '{$action_path}';
105        $macro['forward_name'] = '{$forward_name}';
106        $macro['view_name'] = '{$view_name}';
107        $macro['view_path'] = '{$view_path}';
108
109        // the longest if? :)
110        if ($this->_generateFile("www.index.php", "$basedir/www/index.php", $macro) == false ||
111            $this->_generateFile("www.info.php", "$basedir/www/info.php", $macro) == false ||
112            $this->_generateFile("www.unittest.php", "$basedir/www/unittest.php", $macro) == false ||
113            $this->_generateFile("www.xmlrpc.php", "$basedir/www/xmlrpc.php", $macro) == false ||
114            $this->_generateFile("www.css.ethna.css", "$basedir/www/css/ethna.css", $macro) == false ||
115            $this->_generateFile("dot.ethna", "$basedir/.ethna", $macro) == false ||
116            $this->_generateFile("app.controller.php", sprintf("$basedir/app/%s_Controller.php", $macro['project_id']), $macro) == false ||
117            $this->_generateFile("app.error.php", sprintf("$basedir/app/%s_Error.php", $macro['project_id']), $macro) == false ||
118            $this->_generateFile("app.action.default.php", "$basedir/app/action/Index.php", $macro) == false ||
119            $this->_generateFile("app.filter.default.php", sprintf("$basedir/app/filter/%s_Filter_ExecutionTime.php", $macro['project_id']), $macro) == false ||
120            $this->_generateFile("app.view.default.php", "$basedir/app/view/Index.php", $macro) == false ||
121            $this->_generateFile("app.unittest.php", sprintf("$basedir/app/%s_UnitTestManager.php", $macro['project_id']), $macro) == false ||
122            $this->_generateFile("etc.ini.php", sprintf("$basedir/etc/%s-ini.php", $macro['project_prefix']), $macro) == false ||
123            $this->_generateFile("skel.action.php", sprintf("$basedir/skel/skel.action.php"), $macro) == false ||
124            $this->_generateFile("skel.action_cli.php", sprintf("$basedir/skel/skel.action_cli.php"), $macro) == false ||
125            $this->_generateFile("skel.action_test.php", sprintf("$basedir/skel/skel.action_test.php"), $macro) == false ||
126            $this->_generateFile("skel.app_object.php", sprintf("$basedir/skel/skel.app_object.php"), $macro) == false ||
127            $this->_generateFile("skel.cli.php", sprintf("$basedir/skel/skel.cli.php"), $macro) == false ||
128            $this->_generateFile("skel.view.php", sprintf("$basedir/skel/skel.view.php"), $macro) == false ||
129            $this->_generateFile("skel.template.tpl", sprintf("$basedir/skel/skel.template.tpl"), $macro) == false ||
130            $this->_generateFile("skel.view_test.php", sprintf("$basedir/skel/skel.view_test.php"), $macro) == false ||
131            $this->_generateFile("template.index.tpl", sprintf("$basedir/template/ja/index.tpl"), $macro) == false) {
132            return Ethna::raiseError('generating files failed');
133        }
134
135        return true;
136    }
137
138    /**
139     *    ���������Υ������������� *
140     *    @access    public
141     *    @param    string    $action_name    ��������̾
142     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ�    *  @param  int     $gateway        �����ȥ�����
143     *    @return    bool    true:���se:���
144     */
145    function generateActionSkelton($action_name, $app_dir, $gateway = GATEWAY_WWW)
146    {
147        // discover controller
148        $controller_class = $this->_discoverController($app_dir);
149        if (Ethna::isError($controller_class)) {
150            return $controller_class;
151        }
152
153        $c =& new $controller_class;
154        $c->setGateway(GATEWAY_CLI);
155
156        $action_dir = $c->getActiondir($gateway);
157        $action_class = $c->getDefaultActionClass($action_name, $gateway);
158        $action_form = $c->getDefaultFormClass($action_name, $gateway);
159        $action_path = $c->getDefaultActionPath($action_name);
160
161        $macro = array();
162        $macro['project_id'] = $c->getAppId();
163        $macro['action_name'] = $action_name;
164        $macro['action_class'] = $action_class;
165        $macro['action_form'] = $action_form;
166        $macro['action_path'] = $action_path;
167
168        $user_macro = $this->_getUserMacro();
169        $macro = array_merge($macro, $user_macro);
170
171        $this->_mkdir(dirname("$action_dir$action_path"), 0755);
172
173        switch ($gateway) {
174        case GATEWAY_WWW:
175            $skelton = "skel.action.php";
176            break;
177        case GATEWAY_CLI:
178            $skelton = "skel.action_cli.php";
179            break;
180        case GATEWAY_XMLRPC:
181            $skelton = "skel.action_xmlrpc.php";
182            break;
183        }
184
185        if (file_exists("$action_dir$action_path")) {
186            printf("file [%s] already exists -> skip\n", "$action_dir$action_path");
187        } else if ($this->_generateFile($skelton, "$action_dir$action_path", $macro) == false) {
188            printf("[warning] file creation failed [%s]\n", "$action_dir$action_path");
189        } else {
190            printf("action script(s) successfully created [%s]\n", "$action_dir$action_path");
191        }
192    }
193
194    /**
195     *    �ӥ塼�Υ������������� *
196     *    @access    public
197     *    @param    string    $forward_name    ��������̾
198     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
199     */
200    function generateViewSkelton($forward_name, $app_dir)
201    {
202        // discover controller
203        $controller_class = $this->_discoverController($app_dir);
204        if (Ethna::isError($controller_class)) {
205            return $controller_class;
206        }
207
208        $c =& new $controller_class;
209        $c->setGateway(GATEWAY_CLI);
210
211        $view_dir = $c->getViewdir();
212        $view_class = $c->getDefaultViewClass($forward_name, false);
213        $view_path = $c->getDefaultViewPath($forward_name, false);
214
215        $macro = array();
216        $macro['project_id'] = $c->getAppId();
217        $macro['forward_name'] = $forward_name;
218        $macro['view_class'] = $view_class;
219        $macro['view_path'] = $view_path;
220
221        $user_macro = $this->_getUserMacro();
222        $macro = array_merge($macro, $user_macro);
223
224        $this->_mkdir(dirname("$view_dir/$view_path"), 0755);
225
226        if (file_exists("$view_dir$view_path")) {
227            printf("file [%s] already exists -> skip\n", "$view_dir$view_path");
228        } else if ($this->_generateFile("skel.view.php", "$view_dir$view_path", $macro) == false) {
229            printf("[warning] file creation failed [%s]\n", "$view_dir$view_path");
230        } else {
231            printf("view script(s) successfully created [%s]\n", "$view_dir$view_path");
232        }
233    }
234
235    /**
236     *    CLI���������Υ������������� *
237     *    @access    public
238     *    @param    string    $forward_name    ��������̾
239     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
240     */
241    function generateCliSkelton($action_name, $app_dir)
242    {
243        // discover controller
244        $controller_class = $this->_discoverController($app_dir);
245        if (Ethna::isError($controller_class)) {
246            return $controller_class;
247        }
248
249        $c =& new $controller_class;
250        $c->setGateway(GATEWAY_CLI);
251
252        $action_dir = $c->getActiondir($gateway);
253        $app_dir = $c->getDirectory('app');
254        $bin_dir = $c->getDirectory('bin');
255        $cli_file = sprintf("%s/%s.%s", $bin_dir, $action_name, $c->getExt('php'));
256
257        $macro = array();
258        $macro['project_id'] = $c->getAppId();
259        $macro['action_name'] = $action_name;
260        $macro['dir_app'] = $app_dir;
261        $macro['dir_bin'] = $bin_dir;
262
263        $user_macro = $this->_getUserMacro();
264        $macro = array_merge($macro, $user_macro);
265
266        if (file_exists($cli_file)) {
267            printf("file [%s] already exists -> skip\n", $cli_file);
268        } else if ($this->_generateFile("skel.cli.php", $cli_file, $macro) == false) {
269            printf("[warning] file creation failed [%s]\n", $cli_file);
270        } else {
271            printf("action script(s) successfully created [%s]\n", $cli_file);
272        }
273    }
274
275    /**
276     *    �ƥ�졼�ȤΥ������������� *
277     *    @access    public
278     *    @param    string    $forward_name    ��������̾
279     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
280     */
281    function generateTemplateSkelton($forward_name, $app_dir)
282    {
283        // discover controller
284        $controller_class = $this->_discoverController($app_dir);
285        if (Ethna::isError($controller_class)) {
286            return $controller_class;
287        }
288
289        $c =& new $controller_class;
290        $c->setGateway(GATEWAY_CLI);
291
292        $tpl_dir = $c->getTemplatedir();
293        if ($tpl_dir{strlen($tpl_dir)-1} != '/') {
294            $tpl_dir .= '/';
295        }
296        $tpl_path = $c->getDefaultForwardPath($forward_name);
297
298        $macro = array();
299        // add '_' for tpl and no user macro for tpl
300        $macro['_project_id'] = $c->getAppId();
301
302        $this->_mkdir(dirname("$tpl_dir/$tpl_path"), 0755);
303
304        if (file_exists("$tpl_dir$tpl_path")) {
305            printf("file [%s] already exists -> skip\n", "$tpl_dir$tpl_path");
306        } else if ($this->_generateFile("skel.template.tpl", "$tpl_dir$tpl_path", $macro) == false) {
307            printf("[warning] file creation failed [%s]\n", "$tpl_dir$tpl_path");
308        } else {
309            printf("template file(s) successfully created [%s]\n", "$tpl_dir$tpl_path");
310        }
311    }
312
313    /**
314     *    ���ץꥱ���������֥������ȤΥ������������� *
315     *    @access    public
316     *    @param    string    $table_name     �ơ��֥�
317     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
318     */
319    function generateAppObjectSkelton($table_name, $app_dir)
320    {
321        // discover controller
322        $controller_class = $this->_discoverController($app_dir);
323        if (Ethna::isError($controller_class)) {
324            return $controller_class;
325        }
326
327        $c =& new $controller_class;
328        $c->setGateway(GATEWAY_CLI);
329
330        $table_id = preg_replace('/_(.)/e', "strtoupper('\$1')", ucfirst($table_name));
331
332        $app_dir = $c->getDirectory('app');
333        $app_path = ucfirst($c->getAppId()) . '_' . $table_id .'.php';
334
335        $macro = array();
336        $macro['project_id'] = $c->getAppId();
337        $macro['app_path'] = $app_path;
338        $macro['app_object'] = ucfirst($c->getAppId()) . '_' . $table_id;
339
340        $user_macro = $this->_getUserMacro();
341        $macro = array_merge($macro, $user_macro);
342
343        $path = "$app_dir/$app_path";
344        $this->_mkdir(dirname($path), 0755);
345        if (file_exists($path)) {
346            printf("file [%s] already exists -> skip\n", $path);
347        } else if ($this->_generateFile("skel.app_object.php", $path, $macro) == false) {
348            printf("[warning] file creation failed [%s]\n", $path);
349        } else {
350            printf("app-object script(s) successfully created [%s]\n", $path);
351        }
352    }
353
354    /**
355     *    ���ץꥱ�������ޥ͡������������������� *
356     *    @access    public
357     *    @param    string    $manager_name    ���ץꥱ�������ޥ͡���̾
358     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
359     */
360    function generateAppManagerSkelton($manager_name, $app_dir)
361    {
362        // discover controller
363        $controller_class = $this->_discoverController($app_dir);
364        if (Ethna::isError($controller_class)) {
365            return $controller_class;
366        }
367
368        $c =& new $controller_class;
369        $c->setGateway(GATEWAY_CLI);
370
371        $manager_id = preg_replace('/_(.)/e', "strtoupper('\$1')", ucfirst($manager_name));
372
373        $app_dir = $c->getDirectory('app');
374        $app_path = ucfirst($c->getAppId()) . '_' . $manager_id .'Manager.php';
375
376        $macro = array();
377        $macro['project_id'] = $c->getAppId();
378        $macro['app_path'] = $app_path;
379        $macro['app_manager'] = ucfirst($c->getAppId()) . '_' . $manager_id;
380
381        $user_macro = $this->_getUserMacro();
382        $macro = array_merge($macro, $user_macro);
383
384        $path = "$app_dir/$app_path";
385        $this->_mkdir(dirname($path), 0755);
386        if (file_exists($path)) {
387            printf("file [%s] already exists -> skip\n", $path);
388        } else if ($this->_generateFile("skel.app_manager.php", $path, $macro) == false) {
389            printf("[warning] file creation failed [%s]\n", $path);
390        } else {
391            printf("app-manager script(s) successfully created [%s]\n", $path);
392        }
393    }
394
395    /**
396     *    ����������ƥ��ȤΥ������������� *
397     *    @access    public
398     *    @param    string    $action_name    ��������̾
399     *  @param  string  $app_dir        �ץ�����ȥǥ��쥯�ȥ� *    @return    bool    true:���se:���
400     */
401    function generateActionTestSkelton($action_name, $app_dir)
402    {
403        // discover controller
404        $controller_class = $this->_discoverController($app_dir);
405        if (Ethna::isError($controller_class)) {
406            return $controller_class;
407        }
408
409        $c =& new $controller_class;
410        $c->setGateway(GATEWAY_CLI);
411
412        $action_dir = $c->getActiondir();
413        $action_class = $c->getDefaultActionClass($action_name, false);
414        $action_form = $c->getDefaultFormClass($action_name, false);
415        $action_path = $c->getDefaultActionPath($action_name . "Test", false);
416
417        $macro = array();
418        $macro['project_id'] = $c->getAppId();
419        $macro['action_name'] = $action_name;
420        $macro['action_class'] = $action_class;
421        $macro['action_form'] = $action_form;
422        $macro['action_path'] = $action_path;
423
424        $user_macro = $this->_getUserMacro();
425        $macro = array_merge($macro, $user_macro);
426
427        $this->_mkdir(dirname("$action_dir$action_path"), 0755);
428
429        if (file_exists("$action_dir$action_path")) {
430            printf("file [%s] aleady exists -> skip\n", "$action_dir$action_path");
431        } else if ($this->_generateFile("skel.action_test.php", "$action_dir$action_path", $macro) == false) {
432            printf("[warning] file creation failed [%s]\n", "$action_dir$action_path");
433        } else {
434            printf("action test(s) successfully created [%s]\n", "$action_dir$action_path");
435        }
436    }
437
438    /**
439     *    �ӥ塼��ƥ��ȤΥ������������� *
440     *    @access    public
441     *    @param    string    $forward_name    ��������̾
442     *    @return    bool    true:���se:���
443     */
444    function generateViewTestSkelton($forward_name, $app_dir)
445    {
446        // discover controller
447        $controller_class = $this->_discoverController($app_dir);
448        if (Ethna::isError($controller_class)) {
449            return $controller_class;
450        }
451
452        $c =& new $controller_class;
453        $c->setGateway(GATEWAY_CLI);
454
455        $view_dir = $c->getViewdir();
456        $view_class = $c->getDefaultViewClass($forward_name, false);
457        $view_path = $c->getDefaultViewPath($forward_name . "Test", false);
458
459        $macro = array();
460        $macro['project_id'] = $c->getAppId();
461        $macro['forward_name'] = $forward_name;
462        $macro['view_class'] = $view_class;
463        $macro['view_path'] = $view_path;
464
465        $user_macro = $this->_getUserMacro();
466        $macro = array_merge($macro, $user_macro);
467
468        $this->_mkdir(dirname("$view_dir/$view_path"), 0755);
469
470        if (file_exists("$view_dir$view_path")) {
471            printf("file [%s] aleady exists -> skip\n", "$view_dir$view_path");
472        } else if ($this->_generateFile("skel.view_test.php", "$view_dir$view_path", $macro) == false) {
473            printf("[warning] file creation failed [%s]\n", "$view_dir$view_path");
474        } else {
475            printf("view test(s) successfully created [%s]\n", "$view_dir$view_path");
476        }
477    }
478
479    /**
480     *    mkdir -p
481     *
482     *    @access    private
483     *    @param    string    $dir    ���������쥯�ȥ� *    @param    int        $mode    �ѡ��ߥå���
484     *    @return    bool    true:���se:���
485     */
486    function _mkdir($dir, $mode)
487    {
488        if (@is_dir($dir)) {
489            return true;
490        }
491
492        $parent = dirname($dir);
493        if ($dir == $parent) {
494            return true;
495        }
496        if (is_dir($parent) == false) {
497            $this->_mkdir($parent, $mode);
498        }
499
500        return mkdir($dir, $mode);
501    }
502
503    /**
504     *    ��������������ޥ���Ŭ����ƥե����������� *
505     *    ethna�饤�֥��Υǥ��쥯�ȥ깽¤������������ʤ����Ȥ���
506     *    �ȤʤäƤ������
507     *
508     *    @access    private
509     *    @param    string    $skel        ������������� *    @param    string    $entity        ���ե�����
510     *    @param    array    $macro        ����ޥ��� *    @return    bool    true:��ェλ false:���顼
511     */
512    function _generateFile($skel, $entity, $macro)
513    {
514        $base = null;
515
516        if (file_exists($entity)) {
517            printf("file [%s] already exists -> skip\n", $entity);
518            return true;
519        }
520        $c =& Ethna_Controller::getInstance();
521        if (is_object($c)) {
522            $base = $c->getBasedir();
523            if (file_exists("$base/skel/$skel") == false) {
524                $base = null;
525            }
526        }
527        if (is_null($base)) {
528            $base = dirname(dirname(__FILE__));
529        }
530
531        $rfp = fopen("$base/skel/$skel", "r");
532        if ($rfp == null) {
533            return false;
534        }
535        $wfp = fopen($entity, "w");
536        if ($wfp == null) {
537            fclose($rfp);
538            return false;
539        }
540
541        for (;;) {
542            $s = fread($rfp, 4096);
543            if (strlen($s) == 0) {
544                break;
545            }
546
547            foreach ($macro as $k => $v) {
548                $s = preg_replace("/{\\\$$k}/", $v, $s);
549            }
550            fwrite($wfp, $s);
551        }
552
553        fclose($wfp);
554        fclose($rfp);
555
556        $st = stat("$base/skel/$skel");
557        if (chmod($entity, $st[2]) == false) {
558            return false;
559        }
560
561        printf("file generated [%s -> %s]\n", $skel, $entity);
562
563        return true;
564    }
565
566    /**
567     *    �桼�����Υޥ���������/.ethna)
568     *
569     *    @access    private
570     */
571    function _getUserMacro()
572    {
573        $home = $_SERVER['HOME'];
574        if (is_file("$home/.ethna") == false) {
575            return array();
576        }
577
578        $user_macro = parse_ini_file("$home/.ethna");
579        return $user_macro;
580    }
581
582    /**
583     *  ��������������饹�򸡺��    *
584     *  @access private
585     */
586    function _discoverController($app_dir)
587    {
588        $ini_file = null;
589        while (is_dir($app_dir) && $app_dir != "/") {
590            if (is_file("$app_dir/.ethna")) {
591                $ini_file = "$app_dir/.ethna";
592                break;
593            }
594            $app_dir = dirname($app_dir);
595        }
596
597        if ($ini_file === null) {
598            return Ethna::raiseError('no .ethna file found');
599        }
600       
601        $macro = parse_ini_file($ini_file);
602        if (isset($macro['controller_file']) == false || isset($macro['controller_class']) == false) {
603            return Ethna::raiseError('invalid .ethna file');
604        }
605        $file = $macro['controller_file'];
606        $class = $macro['controller_class'];
607
608        $controller_file = "$app_dir/$file";
609        if (is_file($controller_file) == false) {
610            return Ethna::raiseError("no such file $controller_file");
611        }
612
613        include_once($controller_file);
614        if (class_exists($class) == false) {
615            return Ethna::raiseError("no such class $class");
616        }
617
618        return $class;
619    }
620}
621// }}}
622?>
Note: See TracBrowser for help on using the browser.