PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/classes/procedures/HttpProcedure.class.php

https://bitbucket.org/stk2k/charcoalphp2.1
PHP | 324 lines | 177 code | 66 blank | 81 comment | 19 complexity | 9392bb6b30e7e067e395d4c93a905266 MD5 | raw file
  1. <?php
  2. /**
  3. * HTTP???????
  4. *
  5. * PHP version 5
  6. *
  7. * @package procedures
  8. * @author CharcoalPHP Development Team
  9. * @copyright 2008 - 2012 CharcoalPHP Development Team
  10. */
  11. class Charcoal_HttpProcedure extends Charcoal_CharcoalObject implements Charcoal_IProcedure
  12. {
  13. private $_task_manager;
  14. private $_use_session;
  15. private $_forward_target;
  16. private $_sequence;
  17. private $_modules;
  18. private $_events;
  19. private $_layout_manager;
  20. private $_debug_mode;
  21. private $_response_filters;
  22. private $_log_enabled;
  23. /*
  24. * ???????
  25. */
  26. public function __construct()
  27. {
  28. parent::__construct();
  29. }
  30. /*
  31. * ???????
  32. */
  33. public function isDebugMode()
  34. {
  35. return $this->_debug_mode && $this->_debug_mode->isTrue() ? TRUE : FALSE;
  36. }
  37. /*
  38. * ????????????
  39. */
  40. public function configure( Charcoal_Config $config )
  41. {
  42. $this->_task_manager = $config->getString( s('task_manager'), s('') );
  43. $this->_use_session = $config->getBoolean( s('use_session'), b(TRUE) );
  44. $this->_forward_target = $config->getString( s('forward_target'), s('') );
  45. $this->_sequence = $config->getString( s('sequence'), s('') );
  46. $this->_modules = $config->getArray( s('modules'), v(array()) );
  47. $this->_events = $config->getArray( s('events'), v(array()) );
  48. $this->_debug_mode = $config->getBoolean( s('debug_mode'), b(FALSE) );
  49. $this->_response_filters = $config->getArray( s('response_filters'), v(array()) );
  50. $this->_log_enabled = $config->getBoolean( s('log_enabled'), b(TRUE) );
  51. $layout_manager = $config->getString( s('layout_manager') );
  52. $this->setLayoutManager( s($layout_manager) );
  53. // events??????????????????????
  54. if ( $this->_events ){
  55. foreach( $this->_events as $event ){
  56. $pos = strpos( $event, "@" );
  57. if ( $pos !== FALSE ){
  58. $module_name = substr( $event, $pos );
  59. $this->_modules[] = $module_name;
  60. }
  61. }
  62. }
  63. log_info( "system,config", "task_manager?" . $this->_task_manager );
  64. log_info( "system,config", "use_session?" . $this->_use_session );
  65. log_info( "system,config", "forward_target?" . $this->_forward_target );
  66. log_info( "system,config", "sequence?" . $this->_sequence );
  67. log_info( "system,config", "modules?" . $this->_modules );
  68. log_info( "system,config", "events?" . $this->_events );
  69. log_info( "system,config", "layout_manager?" . $this->_layout_manager );
  70. log_info( "system,config", "debug_mode?" . $this->_debug_mode );
  71. log_info( "system,config", "response_filters:" . print_r($this->_response_filters,true) );
  72. }
  73. /*
  74. * ?????????????
  75. */
  76. public function getLayoutManager()
  77. {
  78. return $this->_layout_manager;
  79. }
  80. /*
  81. * ?????????????
  82. */
  83. public function setLayoutManager( Charcoal_String $layout_manager )
  84. {
  85. if ( !$layout_manager->isEmpty() ){
  86. $this->_layout_manager = Charcoal_Factory::CreateObject( s($layout_manager), s('layout_manager') );
  87. }
  88. }
  89. /*
  90. * ???????
  91. */
  92. public function hasForwardTarget()
  93. {
  94. return !$this->_forward_target->isEmpty();
  95. }
  96. /*
  97. * ??????
  98. */
  99. public function getForwardTarget()
  100. {
  101. return new ProcedurePath( $this->_forward_target );
  102. }
  103. /*
  104. * ???????????
  105. */
  106. public function execute( Charcoal_IRequest $request, Charcoal_IResponse $response, Charcoal_Session $session )
  107. {
  108. $proc_path = $this->getObjectPath();
  109. $proc_name = $proc_path->toString();
  110. log_info( "system,event", "??????[$proc_name]???????" );
  111. //=======================================
  112. // ??????
  113. //
  114. if ( $this->_log_enabled->isFalse() ){
  115. Charcoal_Logger::clear();
  116. }
  117. //=======================================
  118. // ???????????
  119. //
  120. // ???????????
  121. $task_manager_name = $this->_task_manager;
  122. $task_manager = Charcoal_Factory::createObject( s($task_manager_name), s('task_manager') );
  123. log_info( "system,event", "????????[$task_manager_name]????????" );
  124. //=======================================
  125. // ???????????
  126. //
  127. if ( $this->_modules ) {
  128. log_info( "system", '???????????????' );
  129. foreach( $this->_modules as $module_name ) {
  130. // ?????????
  131. $obj_path = new Charcoal_ObjectPath( s($module_name) );
  132. Charcoal_ModuleLoader::loadModule( $obj_path, $task_manager );
  133. }
  134. log_info( "system", '????????????????' );
  135. }
  136. //=======================================
  137. // modules???????????????????
  138. //
  139. log_info( "system", 'modules????????????????' );
  140. Charcoal_ModuleLoader::loadModule( $proc_path, $task_manager );
  141. log_info( "system", 'modules?????????????????' );
  142. //=======================================
  143. // ?????????????
  144. //
  145. if ( $this->_response_filters ) {
  146. log_info( "system", '??????????????????????????' );
  147. foreach( $this->_response_filters as $filter_name ) {
  148. // ?????????
  149. $filter = Charcoal_Factory::createObject( s($filter_name), s('response_filter') );
  150. // ??????
  151. $response->addResponseFilter( $filter );
  152. }
  153. log_info( "system", '???????????????????????????' );
  154. }
  155. //=======================================
  156. // ????????????
  157. //
  158. $use_session = Charcoal_Profile::getBoolean(s('USE_SESSION'))->isTrue();
  159. if ( $use_session && $this->_use_session->getValue() ){
  160. log_info( "system", '???????????????????' );
  161. $task_manager->restoreStatefulTasks( $session );
  162. log_info( "system", '?????????????????' );
  163. }
  164. //=======================================
  165. // ????????
  166. //
  167. $global_sequence = new Charcoal_Sequence();
  168. $local_sequence = new Charcoal_Sequence();
  169. $seq_name = us($this->_sequence);
  170. $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
  171. if ( $use_session ){
  172. // global???
  173. log_info( "system,sequence", 'global???????????????' );
  174. $data_id = 'sequence://global';
  175. if ( isset($_SESSION[ $data_id ]) ){
  176. $data = $_SESSION[ $data_id ];
  177. $data = unserialize( $data );
  178. if ( $data instanceof Charcoal_Sequence ){
  179. $global_sequence = $data;
  180. log_info( "debug,sequence", "global_sequence:" . print_r($global_sequence,true) );
  181. log_info( "system,sequence", 'global?????????????' );
  182. }
  183. }
  184. // ?????sequence????????
  185. log_info( "system,sequence", "[$seq_name]???????????????" );
  186. // ??
  187. $data_id = 'sequence://' . $seq_name;
  188. if ( isset($_SESSION[ $data_id ]) ){
  189. $data = $_SESSION[ $data_id ];
  190. $data = unserialize( $data );
  191. if ( $data instanceof Charcoal_Sequence ){
  192. $local_sequence = $data;
  193. log_info( "debug,sequence", "local_sequence:" . print_r($local_sequence,true) );
  194. log_info( "system,sequence", "local?????[$seq_name]????????" );
  195. }
  196. }
  197. }
  198. // ???
  199. $sequence = new Charcoal_SequenceHolder( $global_sequence, $local_sequence );
  200. //=======================================
  201. // ??????????
  202. //
  203. log_info( "system,event", '???????????????????' );
  204. $event_list = NULL;
  205. if ( $this->_events ) {
  206. foreach( $this->_events as $event_name ) {
  207. // ??????????
  208. $event = Charcoal_Factory::createObject( s($event_name), s('event') );
  209. // ??????????
  210. $event_list[] = $event;
  211. log_info( "system,event", "???????[$event_name]????????" );
  212. }
  213. }
  214. log_info( "system,event", '???????????????????' );
  215. //=======================================
  216. // ??????????
  217. //
  218. $task_manager->dispatchEvents( v($event_list) );
  219. //=======================================
  220. // ??????
  221. //
  222. log_info( "system", "????????????????????????" );
  223. $context = new Charcoal_EventContext();
  224. $context->setProcedure( $this );
  225. $context->setRequest( $request );
  226. $context->setSequence( $sequence );
  227. $context->setResponse( $response );
  228. $exit_code = $task_manager->processEvents( $context );
  229. if ( !is_int($exit_code) && !($exit_code instanceof Charcoal_Integer) ){
  230. log_info( "system", "????????????????(" . gettype($exit_code) . ")???????????????????????????????????" );
  231. _throw( new Charcoal_BadReturnValueTypeException( $exit_code, s('Integer') ) );
  232. }
  233. log_info( "system", "??????????????????????????????($exit_code)" );
  234. //=======================================
  235. // ????
  236. //
  237. if ( $use_session ){
  238. // global????????
  239. $data_id = 'sequence://global';
  240. $session->set( s($data_id), $global_sequence );
  241. log_info( "debug,sequence", "global_sequence:" . print_r($global_sequence,true) );
  242. log_info( "system,sequence", "global?????????????" );
  243. // local????????
  244. $data_id = 'sequence://' . $seq_name;
  245. $session->set( s($data_id), $local_sequence );
  246. log_info( "debug,sequence", "local_sequence:" . print_r($local_sequence,true) );
  247. log_info( "system,sequence", "local?????[$seq_name]????????" );
  248. }
  249. // ??????????
  250. if ( $use_session )
  251. {
  252. // ????????????
  253. $task_manager->saveStatefulTasks( $session );
  254. }
  255. log_info( "system", "??????[$proc_name]????????" );
  256. }
  257. }
  258. return __FILE__;