/classes/procedures/HttpProcedure.class.php
PHP | 324 lines | 177 code | 66 blank | 81 comment | 19 complexity | 9392bb6b30e7e067e395d4c93a905266 MD5 | raw file
- <?php
- /**
- * HTTP???????
- *
- * PHP version 5
- *
- * @package procedures
- * @author CharcoalPHP Development Team
- * @copyright 2008 - 2012 CharcoalPHP Development Team
- */
- class Charcoal_HttpProcedure extends Charcoal_CharcoalObject implements Charcoal_IProcedure
- {
- private $_task_manager;
- private $_use_session;
- private $_forward_target;
- private $_sequence;
- private $_modules;
- private $_events;
- private $_layout_manager;
- private $_debug_mode;
- private $_response_filters;
- private $_log_enabled;
- /*
- * ???????
- */
- public function __construct()
- {
- parent::__construct();
- }
- /*
- * ???????
- */
- public function isDebugMode()
- {
- return $this->_debug_mode && $this->_debug_mode->isTrue() ? TRUE : FALSE;
- }
- /*
- * ????????????
- */
- public function configure( Charcoal_Config $config )
- {
- $this->_task_manager = $config->getString( s('task_manager'), s('') );
- $this->_use_session = $config->getBoolean( s('use_session'), b(TRUE) );
- $this->_forward_target = $config->getString( s('forward_target'), s('') );
- $this->_sequence = $config->getString( s('sequence'), s('') );
- $this->_modules = $config->getArray( s('modules'), v(array()) );
- $this->_events = $config->getArray( s('events'), v(array()) );
- $this->_debug_mode = $config->getBoolean( s('debug_mode'), b(FALSE) );
- $this->_response_filters = $config->getArray( s('response_filters'), v(array()) );
- $this->_log_enabled = $config->getBoolean( s('log_enabled'), b(TRUE) );
- $layout_manager = $config->getString( s('layout_manager') );
- $this->setLayoutManager( s($layout_manager) );
- // events??????????????????????
- if ( $this->_events ){
- foreach( $this->_events as $event ){
- $pos = strpos( $event, "@" );
- if ( $pos !== FALSE ){
- $module_name = substr( $event, $pos );
- $this->_modules[] = $module_name;
- }
- }
- }
- log_info( "system,config", "task_manager?" . $this->_task_manager );
- log_info( "system,config", "use_session?" . $this->_use_session );
- log_info( "system,config", "forward_target?" . $this->_forward_target );
- log_info( "system,config", "sequence?" . $this->_sequence );
- log_info( "system,config", "modules?" . $this->_modules );
- log_info( "system,config", "events?" . $this->_events );
- log_info( "system,config", "layout_manager?" . $this->_layout_manager );
- log_info( "system,config", "debug_mode?" . $this->_debug_mode );
- log_info( "system,config", "response_filters:" . print_r($this->_response_filters,true) );
- }
- /*
- * ?????????????
- */
- public function getLayoutManager()
- {
- return $this->_layout_manager;
- }
- /*
- * ?????????????
- */
- public function setLayoutManager( Charcoal_String $layout_manager )
- {
- if ( !$layout_manager->isEmpty() ){
- $this->_layout_manager = Charcoal_Factory::CreateObject( s($layout_manager), s('layout_manager') );
- }
- }
- /*
- * ???????
- */
- public function hasForwardTarget()
- {
- return !$this->_forward_target->isEmpty();
- }
- /*
- * ??????
- */
- public function getForwardTarget()
- {
- return new ProcedurePath( $this->_forward_target );
- }
- /*
- * ???????????
- */
- public function execute( Charcoal_IRequest $request, Charcoal_IResponse $response, Charcoal_Session $session )
- {
- $proc_path = $this->getObjectPath();
- $proc_name = $proc_path->toString();
- log_info( "system,event", "??????[$proc_name]???????" );
- //=======================================
- // ??????
- //
- if ( $this->_log_enabled->isFalse() ){
- Charcoal_Logger::clear();
- }
- //=======================================
- // ???????????
- //
- // ???????????
- $task_manager_name = $this->_task_manager;
- $task_manager = Charcoal_Factory::createObject( s($task_manager_name), s('task_manager') );
- log_info( "system,event", "????????[$task_manager_name]????????" );
- //=======================================
- // ???????????
- //
- if ( $this->_modules ) {
- log_info( "system", '???????????????' );
- foreach( $this->_modules as $module_name ) {
- // ?????????
- $obj_path = new Charcoal_ObjectPath( s($module_name) );
- Charcoal_ModuleLoader::loadModule( $obj_path, $task_manager );
- }
-
- log_info( "system", '????????????????' );
- }
- //=======================================
- // modules???????????????????
- //
- log_info( "system", 'modules????????????????' );
- Charcoal_ModuleLoader::loadModule( $proc_path, $task_manager );
- log_info( "system", 'modules?????????????????' );
- //=======================================
- // ?????????????
- //
- if ( $this->_response_filters ) {
- log_info( "system", '??????????????????????????' );
- foreach( $this->_response_filters as $filter_name ) {
- // ?????????
- $filter = Charcoal_Factory::createObject( s($filter_name), s('response_filter') );
- // ??????
- $response->addResponseFilter( $filter );
- }
-
- log_info( "system", '???????????????????????????' );
- }
- //=======================================
- // ????????????
- //
- $use_session = Charcoal_Profile::getBoolean(s('USE_SESSION'))->isTrue();
- if ( $use_session && $this->_use_session->getValue() ){
- log_info( "system", '???????????????????' );
- $task_manager->restoreStatefulTasks( $session );
- log_info( "system", '?????????????????' );
- }
- //=======================================
- // ????????
- //
- $global_sequence = new Charcoal_Sequence();
- $local_sequence = new Charcoal_Sequence();
- $seq_name = us($this->_sequence);
- $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
- if ( $use_session ){
- // global???
- log_info( "system,sequence", 'global???????????????' );
- $data_id = 'sequence://global';
- if ( isset($_SESSION[ $data_id ]) ){
- $data = $_SESSION[ $data_id ];
- $data = unserialize( $data );
- if ( $data instanceof Charcoal_Sequence ){
- $global_sequence = $data;
- log_info( "debug,sequence", "global_sequence:" . print_r($global_sequence,true) );
- log_info( "system,sequence", 'global?????????????' );
- }
- }
- // ?????sequence????????
- log_info( "system,sequence", "[$seq_name]???????????????" );
- // ??
- $data_id = 'sequence://' . $seq_name;
- if ( isset($_SESSION[ $data_id ]) ){
- $data = $_SESSION[ $data_id ];
- $data = unserialize( $data );
- if ( $data instanceof Charcoal_Sequence ){
- $local_sequence = $data;
- log_info( "debug,sequence", "local_sequence:" . print_r($local_sequence,true) );
- log_info( "system,sequence", "local?????[$seq_name]????????" );
- }
- }
- }
- // ???
- $sequence = new Charcoal_SequenceHolder( $global_sequence, $local_sequence );
- //=======================================
- // ??????????
- //
- log_info( "system,event", '???????????????????' );
- $event_list = NULL;
- if ( $this->_events ) {
- foreach( $this->_events as $event_name ) {
- // ??????????
- $event = Charcoal_Factory::createObject( s($event_name), s('event') );
- // ??????????
- $event_list[] = $event;
- log_info( "system,event", "???????[$event_name]????????" );
- }
- }
- log_info( "system,event", '???????????????????' );
- //=======================================
- // ??????????
- //
- $task_manager->dispatchEvents( v($event_list) );
- //=======================================
- // ??????
- //
- log_info( "system", "????????????????????????" );
- $context = new Charcoal_EventContext();
- $context->setProcedure( $this );
- $context->setRequest( $request );
- $context->setSequence( $sequence );
- $context->setResponse( $response );
- $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_BadReturnValueTypeException( $exit_code, s('Integer') ) );
- }
- log_info( "system", "??????????????????????????????($exit_code)" );
- //=======================================
- // ????
- //
- if ( $use_session ){
- // global????????
- $data_id = 'sequence://global';
- $session->set( s($data_id), $global_sequence );
- log_info( "debug,sequence", "global_sequence:" . print_r($global_sequence,true) );
- log_info( "system,sequence", "global?????????????" );
- // local????????
- $data_id = 'sequence://' . $seq_name;
- $session->set( s($data_id), $local_sequence );
- log_info( "debug,sequence", "local_sequence:" . print_r($local_sequence,true) );
- log_info( "system,sequence", "local?????[$seq_name]????????" );
- }
- // ??????????
- if ( $use_session )
- {
- // ????????????
- $task_manager->saveStatefulTasks( $session );
- }
- log_info( "system", "??????[$proc_name]????????" );
- }
- }
- return __FILE__;