OSDN Git Service

- changed to supress header related error.
[ethna/ethna.git] / Idea_Extended_ViewClass / test / Ethna_MockProject.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna_MockProject.php
5  *
6  *  @author     Yoshinari Takaoka <takaoka@beatcraft.com>
7  *  @version    $Id$
8  */
9
10 define('ETHNA_TEST_DIR', ETHNA_BASE . '/test');
11 define('ETHNA_TEST_PROJECT', 'mockproject');
12 define('ETHNA_TEST_SKELDIR', ETHNA_TEST_DIR . '/skel/');
13
14 /**
15  *  ethna command, and project Emulator Class. 
16  *  
17  *  @access public
18  */
19 class Ethna_MockProject
20 {
21     var $basedir;
22     var $skel_dir;
23     var $project_name;
24     var $proj_basedir;
25     var $is_created;
26
27     /*
28      *  コンストラクタ
29      * 
30      *  @param $basedir プロジェクトベースディレクトリ  
31      *  @param $project_name プロジェクト名
32      *  @param $skel_dir スケルトンディレクトリ
33      *  @access public
34      */
35     function Ethna_MockProject($basedir = ETHNA_TEST_DIR,
36                                $project_name = ETHNA_TEST_PROJECT,
37                                $skel_dir = ETHNA_TEST_SKELDIR)
38     {
39         $this->basedir = $basedir;
40         $this->skel_dir = $skel_dir;
41         $this->project_name = $project_name;
42         $this->proj_basedir = "${basedir}/${project_name}";
43         $this->is_created = false;
44     }
45
46     /*
47      *  プロジェクトを作成します。
48      *  ethna add-project コマンドをエミュレートします。
49      * 
50      *  @access public
51      *  @return 成功したらtrue, 失敗したらEthna_Error 
52      */
53     function create()
54     {
55         $this->is_created = true;
56
57         if (!is_dir($this->proj_basedir)) {
58             do {
59                 sleep(0.1);
60                 $r = Ethna_Util::mkdir($this->proj_basedir, 0775);
61             } while ($r == false || is_dir($this->proj_basedir) == false);
62         }
63
64         //  fire ethna add-project command
65         $id = 'add-project';
66         $options = array(
67                        '-b',
68                        $this->basedir,
69                        '-s',
70                        $this->skel_dir, 
71                        $this->project_name,
72                    );
73         $r = $this->runCmd($id, $options); 
74         if (Ethna::isError($r)) {
75             return $r;
76         }
77
78         return true;
79     } 
80
81     /*
82      *  作成したプロジェクトに対してコマンドを
83      *  実行することで、ethna コマンドをエミュレートします。
84      *  (プロジェクトがない場合は作成されます)
85      * 
86      *  @access public
87      *  @param string $id  コマンドID (e.x add-action)
88      *  @param array  $options コマンドラインオプション
89      *                e.x ethna add-action -b /tmp test の場合
90      *                    array('-b', '/tmp', 'test') を指定
91      *  @return 成功したらtrue, 失敗したらEthna_Error 
92      */
93     function runCmd($id, $options = array())
94     {
95         if (($r = $this->create_ifnot_exists()) !== true) {
96             return $r;
97         }
98
99         //   supplement basedir option.
100         $in_basedir_opt = false;
101         foreach ($options as $opt) {
102             if ($opt == '-b' || $opt == '--basedir') {
103                 $in_basedir_opt = true;
104             }
105         }
106         if (!$in_basedir_opt) { 
107             $base_opt = array('-b', $this->proj_basedir);
108             $options = array_merge($base_opt, $options);
109         }
110
111         $eh =& new Ethna_Handle();
112         $handler =& $eh->getHandler($id);
113         if (Ethna::isError($handler)) {
114             return $r;
115         }
116
117         ob_start(); //  supress output.
118         $handler->setArgList($options);
119         $r = $handler->perform();
120         ob_end_clean();
121
122         if (Ethna::isError($r)) {
123             return $r;
124         }
125
126         //  set plain ActionForm
127         $ctl =& $this->getController();
128         $backend =& $ctl->getBackend();
129         $af =& new Ethna_ActionForm($ctl);
130         $backend->setActionForm($af);
131
132         return true;
133     }
134
135     /**
136      *  アプリケーションのエントリポイントをエミュレートします。
137      *
138      *  @access public
139      *  @param  mixed   $action_name    指定のアクション名(省略可)
140      *  @param  array   $submit_value   ブラウザからSubmitする値 
141      *  @return string  ブラウザへの出力
142      */
143     function runMain($action_name = 'index', $submit_value = array())
144     {
145         if (($r = $this->create_ifnot_exists()) !== true) {
146             return $r;
147         }
148
149         $_SERVER['REQUEST_METHOD'] = 'POST';
150         $_POST["action_${action_name}"] = true;
151         $_POST = array_merge($_POST, $submit_value);
152
153         $c =& $this->getController();
154         $c->setGateway(GATEWAY_WWW);
155         ob_start();
156         @$c->trigger($action_name, "");  // suppress header related error.
157         $c->end();
158         $result = ob_get_contents();
159         ob_end_clean();
160
161         return $result;
162     }
163
164     /*
165      *  作成したプロジェクトのコントローラクラス
166      *  のインスタンスを取得します。
167      *  (プロジェクトがない場合は作成されます)
168      * 
169      *  @access public
170      *  @return Ethna_Controller コントローラクラスのインスタンス
171      *          失敗したらEthna_Error 
172      */
173     function &getController()
174     {
175         if (($r = $this->create_ifnot_exists()) !== true) {
176             return $r;
177         }
178         return Ethna_Handle::getAppController($this->proj_basedir);
179     }
180
181     /*
182      *  作成したプロジェクトのベースディレクトリを取得します。
183      *
184      *  @access public 
185      *  @return string  プロジェクトのベースディレクトリ
186      */
187     function getBaseDir()
188     {
189         return $this->proj_basedir;
190     }
191
192     /*
193      *  プロジェクトを削除します。
194      *
195      *  @access public 
196      */
197     function delete()
198     {
199         Ethna_Util::purgeDir($this->proj_basedir);
200     }
201
202     /*
203      *  プロジェクトが既に作成されているかをチェックし,
204      *  存在しない場合は作成します。
205      *
206      *  @access private
207      *  @return boolean  既に作成している場合はtrue.
208      *                   プロジェクトの作成に失敗したらEthna_Error 
209      */
210     function create_ifnot_exists()
211     {
212         if ($this->is_created === false) {
213             $r = $this->create();
214             if (Ethna::isError($r)) {
215                 return $r;
216             }
217         }
218         return true;
219     }
220 }
221
222 ?>