public function execute($request, $response, $session = NULL)
 {
     //        Charcoal_ParamTrait::validateImplements( 1, 'Charcoal_IRequest', $request );
     //        Charcoal_ParamTrait::validateImplements( 2, 'Charcoal_IResponse', $response );
     //        Charcoal_ParamTrait::validateIsA( 3, 'Charcoal_Session', $session, TRUE );
     $proc_path = $this->getObjectPath();
     $proc_name = $proc_path->toString();
     log_info("system,event", "プロシージャ[{$proc_name}]を実行します。");
     //=======================================
     // タスクマネージャの作成
     //
     // タスクマネージャを作成
     $task_manager_name = $this->_task_manager;
     $task_manager = $this->getSandbox()->createObject($task_manager_name, 'task_manager');
     log_info("system,event", "タスクマネージャ[{$task_manager_name}]を作成しました。");
     //=======================================
     // 追加モジュールのロード
     //
     if ($this->_modules) {
         log_info("system", '追加モジュールを読み込みます。');
         foreach ($this->_modules as $module_name) {
             if (strlen($module_name) === 0) {
                 continue;
             }
             // モジュールのロード
             Charcoal_ModuleLoader::loadModule($this->getSandbox(), $module_name, $task_manager);
         }
         log_info("system", '追加モジュールを読み込みました。');
     }
     //=======================================
     // module以下にクラスファイルがあればロードする
     //
     Charcoal_ModuleLoader::loadModule($this->getSandbox(), $proc_path, $task_manager);
     //=======================================
     // create system event(request event)
     //
     //        log_info( "system,debug,event", 'creating reqyest event.', 'event' );
     // create request event
     $event = $this->getSandbox()->createEvent('request', array($request));
     $task_manager->pushEvent($event);
     //        log_info( "system,debug,event", 'pushed reqyest event to the event queue.', 'event' );
     //=======================================
     // ユーザイベントの作成
     //
     log_info("system,event", 'ユーザイベントの作成処理を開始します。');
     $event_list = NULL;
     if ($this->_events) {
         foreach ($this->_events as $event_name) {
             if (strlen($event_name) === 0) {
                 continue;
             }
             $event = $this->getSandbox()->createEvent($event_name);
             $event_list[] = $event;
         }
     }
     log_info("system,event", 'ユーザイベントの作成処理を終了します。');
     // add events
     if ($event_list && is_array($event_list)) {
         foreach ($event_list as $event) {
             $task_manager->pushEvent($event);
         }
     }
     //=======================================
     // イベント処理
     //
     log_info("system", "タスクマネージャによるイベント処理を開始します。");
     $context = new Charcoal_EventContext($this->getSandbox());
     $context->setProcedure($this);
     $context->setRequest($request);
     $context->setResponse($response);
     $context->setTaskManager($task_manager);
     $exit_code = $task_manager->processEvents($context);
     if (!is_int($exit_code) && !$exit_code instanceof Charcoal_Integer) {
         log_info("system", "異常な終了コードを検知しました。(" . gettype($exit_code) . ")。タスクマネージャは終了コードとして整数値のみ返却することができます。");
         _throw(new Charcoal_BadExitCodeException($exit_code));
     }
     log_info("system", "タスクマネージャによるイベント処理が完了しました。終了コード({$exit_code})");
     //=======================================
     // 終了処理
     //
     log_info("system", "プロシージャ[{$proc_name}]を実行しました。");
 }
 public function execute($request, $response, $session = NULL)
 {
     $timer_handle = Charcoal_Benchmark::start();
     //        Charcoal_ParamTrait::validateImplements( 1, 'Charcoal_IRequest', $request );
     //        Charcoal_ParamTrait::validateImplements( 2, 'Charcoal_IResponse', $response );
     //        Charcoal_ParamTrait::validateIsA( 3, 'Charcoal_Session', $session, TRUE );
     $proc_path = $this->getObjectPath();
     $proc_name = $proc_path->toString();
     //        log_info( "system", "procedure",  "プロシージャ[$proc_name]を実行します。" );
     //=======================================
     // タスクマネージャの作成
     //
     // タスクマネージャを作成
     $task_manager_name = $this->task_manager;
     $task_manager = $this->getSandbox()->createObject($task_manager_name, 'task_manager');
     //        log_info( "system", "procedure", "タスクマネージャ[$task_manager_name]を作成しました。" );
     //=======================================
     // modules以下にクラスファイルがあればロードする
     //
     //        log_info( "system", "procedure", 'loading module at procedure path:' . $proc_path );
     Charcoal_ModuleLoader::loadModule($this->getSandbox(), $proc_path, $task_manager);
     //        log_info( "system", "procedure", 'loaded module at procedure path:' . $proc_path );
     //=======================================
     // 追加モジュールのロード
     //
     if ($this->modules) {
         //            log_info( "system", "procedure", 'loading additional modules: ' . $this->modules . " of procedure: " . $proc_path );
         foreach ($this->modules as $module_name) {
             if (strlen($module_name) === 0) {
                 continue;
             }
             // load module
             Charcoal_ModuleLoader::loadModule($this->getSandbox(), $module_name, $task_manager);
         }
         //            log_info( "system", "procedure", 'loaded additional modules.' );
     }
     //=======================================
     // ステートフルタスクの復帰
     //
     $use_session = b($this->getSandbox()->getProfile()->getBoolean('USE_SESSION'));
     if ($use_session->isTrue()) {
         //            log_info( "system", "procedure", 'ステートフルタスクの復元を開始します。' );
         $task_manager->restoreStatefulTasks($session);
         //            log_info( "system", "procedure", 'ステートフルタスクを復元しました。' );
     }
     //=======================================
     // シーケンスの復帰
     //
     $sequence = NULL;
     $globalsequence = NULL;
     $localsequence = NULL;
     if ($use_session->isTrue()) {
         $seq_name = us($this->sequence);
         $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
         // restore global sequence
         //            log_info( "system,sequence", "sequence", "starting restoring global sequence." );
         $data_id = 'sequence://global';
         $global_seq = NULL;
         if (isset($_SESSION[$data_id])) {
             $data = $_SESSION[$data_id];
             $data = unserialize($data);
             if ($data instanceof Charcoal_Sequence) {
                 $global_seq = $data;
                 //                    log_info( "debug,sequence", "sequence", "restored global sequence:" . print_r($globalsequence,true) );
             }
         }
         // restore local sequence
         //            log_info( "system,sequence", "sequence", "starting restoring local sequence." );
         // 復元
         $data_id = 'sequence://' . $seq_name;
         $local_seq = NULL;
         if (isset($_SESSION[$data_id])) {
             $data = $_SESSION[$data_id];
             $data = unserialize($data);
             if ($data instanceof Charcoal_Sequence) {
                 $local_seq = $data;
                 //                    log_info( "debug,sequence",  "restored local sequence:" . print_r($localsequence,true) );
             }
         }
         // merge global and local sequence
         $global_seq = $global_seq ? $global_seq : new Charcoal_Sequence();
         $local_seq = $local_seq ? $local_seq : new Charcoal_Sequence();
         $sequence = new Charcoal_SequenceHolder($global_seq, $local_seq);
     }
     //=======================================
     // create system event(request event)
     //
     //        log_info( "system,debug,event", 'creating reqyest event.', 'event' );
     // create request event
     $event = $this->getSandbox()->createEvent('request', array($request));
     $task_manager->pushEvent($event);
     //        log_info( "system,debug,event", 'pushed reqyest event to the event queue.', 'event' );
     //=======================================
     // ユーザイベントの作成
     //
     //        log_info( "system", "procedure", 'ユーザイベントの作成処理を開始します。' );
     $event_list = array();
     if ($this->events) {
         foreach ($this->events as $event_name) {
             if (strlen($event_name) === 0) {
                 continue;
             }
             $event = $this->getSandbox()->createEvent($event_name);
             $task_manager->pushEvent($event);
         }
     }
     //=======================================
     // イベント処理
     //
     //        log_info( "system", "procedure", "タスクマネージャによるイベント処理を開始します。" );
     $context = new Charcoal_EventContext($this->getSandbox());
     $context->setProcedure($this);
     $context->setRequest($request);
     $context->setSequence($sequence);
     $context->setResponse($response);
     $context->setTaskManager($task_manager);
     $exit_code = $task_manager->processEvents($context);
     if (!is_int($exit_code) && !$exit_code instanceof Charcoal_Integer) {
         //            log_info( "system", "procedure", "異常な終了コードを検知しました。(" . gettype($exit_code) . ")。タスクマネージャは終了コードとして整数値のみ返却することができます。" );
         _throw(new Charcoal_BadExitCodeException($exit_code));
     }
     //        log_info( "system", "procedure", "タスクマネージャによるイベント処理が完了しました。終了コード($exit_code)" );
     //=======================================
     // 終了処理
     //
     if ($use_session->isTrue()) {
         $seq_name = us($this->sequence);
         $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
         // globalシーケンスの保存
         $data_id = 'sequence://global';
         $session->set(s($data_id), $global_seq);
         //            log_info( "debug,sequence",  "globalsequence:" . print_r($globalsequence,true) );
         //            log_info( "system,sequence", "globalシーケンスを保存しました。" );
         // localシーケンスの保存
         $data_id = 'sequence://' . $seq_name;
         $session->set(s($data_id), $local_seq);
         //            log_info( "debug,sequence",  "localsequence:" . print_r($localsequence,true) );
         //            log_info( "system,sequence", "localシーケンス[$seq_name]を保存しました。" );
     }
     // セッション情報の保存
     if ($use_session->isTrue()) {
         // ステートフルタスクの保存
         $task_manager->saveStatefulTasks($session);
     }
     $score = Charcoal_Benchmark::stop($timer_handle);
     log_debug('system, debug', "procedure execute method end: [{$score}] msec");
     //        log_info( "system", "procedure", "プロシージャ[$proc_name]を実行しました。" );
 }