Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application.pm @ 194:4d0e1962161c
Replaced tabs with spaces
IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
| author | cin |
|---|---|
| date | Tue, 10 Apr 2012 20:08:29 +0400 |
| parents | d1676be8afcc |
| children | 2ffe6f661605 |
comparison
equal
deleted
inserted
replaced
| 193:8e8401c0aea4 | 194:4d0e1962161c |
|---|---|
| 20 public property options => prop_all; | 20 public property options => prop_all; |
| 21 public property fetchRequestMethod => prop_all; | 21 public property fetchRequestMethod => prop_all; |
| 22 | 22 |
| 23 | 23 |
| 24 sub CTOR { | 24 sub CTOR { |
| 25 my ($this) = @_; | 25 my ($this) = @_; |
| 26 | 26 |
| 27 $this->actionFactory(typeof IMPL::Web::Application::Action) unless $this->actionFactory; | 27 $this->actionFactory(typeof IMPL::Web::Application::Action) unless $this->actionFactory; |
| 28 $this->responseCharset('utf-8') unless $this->responseCharset; | 28 $this->responseCharset('utf-8') unless $this->responseCharset; |
| 29 $this->fetchRequestMethod(\&defaultFetchRequest) unless $this->fetchRequestMethod; | 29 $this->fetchRequestMethod(\&defaultFetchRequest) unless $this->fetchRequestMethod; |
| 30 $this->handlerError(\&defaultHandlerError) unless $this->handlerError; | 30 $this->handlerError(\&defaultHandlerError) unless $this->handlerError; |
| 31 } | 31 } |
| 32 | 32 |
| 33 sub Run { | 33 sub Run { |
| 34 my ($this) = @_; | 34 my ($this) = @_; |
| 35 | 35 |
| 36 while (my $query = $this->FetchRequest()) { | 36 while (my $query = $this->FetchRequest()) { |
| 37 | 37 |
| 38 my $action = $this->actionFactory->new( | 38 my $action = $this->actionFactory->new( |
| 39 query => $query, | 39 query => $query, |
| 40 application => $this, | 40 application => $this, |
| 41 ); | 41 ); |
| 42 | 42 |
| 43 eval { | 43 eval { |
| 44 $action->response->charset($this->responseCharset); | 44 $action->response->charset($this->responseCharset); |
| 45 | 45 |
| 46 $action->ChainHandler($_) foreach $this->handlersQuery; | 46 $action->ChainHandler($_) foreach $this->handlersQuery; |
| 47 | 47 |
| 48 $action->Invoke(); | 48 $action->Invoke(); |
| 49 | 49 |
| 50 $action->response->Complete; | 50 $action->response->Complete; |
| 51 }; | 51 }; |
| 52 if ($@) { | 52 if ($@) { |
| 53 my $e = $@; | 53 my $e = $@; |
| 54 # we are expecting this method to be safe otherwise we can trust nothing in this wolrd | 54 # we are expecting this method to be safe otherwise we can trust nothing in this wolrd |
| 55 $this->handlerError()->($this,$action,$e); | 55 $this->handlerError()->($this,$action,$e); |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 } | 58 } |
| 59 | 59 |
| 60 sub FetchRequest { | 60 sub FetchRequest { |
| 61 my ($this) = @_; | 61 my ($this) = @_; |
| 62 | 62 |
| 63 if( ref $this->fetchRequestMethod eq 'CODE' ) { | 63 if( ref $this->fetchRequestMethod eq 'CODE' ) { |
| 64 return $this->fetchRequestMethod->($this); | 64 return $this->fetchRequestMethod->($this); |
| 65 } else { | 65 } else { |
| 66 die new IMPL::Exception("Unknown fetchRequestMethod type",ref $this->fetchRequestMethod); | 66 die new IMPL::Exception("Unknown fetchRequestMethod type",ref $this->fetchRequestMethod); |
| 67 } | 67 } |
| 68 } | 68 } |
| 69 | 69 |
| 70 { | 70 { |
| 71 my $hasFetched = 0; | 71 my $hasFetched = 0; |
| 72 | 72 |
| 73 sub defaultFetchRequest { | 73 sub defaultFetchRequest { |
| 74 my ($this) = @_; | 74 my ($this) = @_; |
| 75 return undef if $hasFetched; | 75 return undef if $hasFetched; |
| 76 $hasFetched = 1; | 76 $hasFetched = 1; |
| 77 my $query = CGIWrapper->new(); | 77 my $query = CGIWrapper->new(); |
| 78 $query->charset($this->responseCharset); | 78 $query->charset($this->responseCharset); |
| 79 return $query; | 79 return $query; |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 sub defaultHandlerError { | 83 sub defaultHandlerError { |
| 84 my ($this,$action,$e) = @_; | 84 my ($this,$action,$e) = @_; |
| 85 warn $e; | 85 warn $e; |
| 86 if ( eval { $action->ReinitResponse(); 1; } ) { | 86 if ( eval { $action->ReinitResponse(); 1; } ) { |
| 87 $action->response->contentType('text/plain'); | 87 $action->response->contentType('text/plain'); |
| 88 $action->response->charset($this->responseCharset); | 88 $action->response->charset($this->responseCharset); |
| 89 $action->response->status(500); | 89 $action->response->status(500); |
| 90 my $hout = $action->response->streamBody; | 90 my $hout = $action->response->streamBody; |
| 91 print $hout $e; | 91 print $hout $e; |
| 92 $action->response->Complete(); | 92 $action->response->Complete(); |
| 93 } | 93 } |
| 94 } | 94 } |
| 95 | 95 |
| 96 package CGIWrapper; | 96 package CGIWrapper; |
| 97 use parent qw(CGI); | 97 use parent qw(CGI); |
| 98 | 98 |
| 99 use Encode; | 99 use Encode; |
| 100 | 100 |
| 101 our $NO_DECODE = 0; | 101 our $NO_DECODE = 0; |
| 102 | 102 |
| 103 sub param { | 103 sub param { |
| 104 my $this = shift; | 104 my $this = shift; |
| 105 | 105 |
| 106 return $this->SUPER::param(@_) if $NO_DECODE; | 106 return $this->SUPER::param(@_) if $NO_DECODE; |
| 107 | 107 |
| 108 if (wantarray) { | 108 if (wantarray) { |
| 109 my @result = $this->SUPER::param(@_); | 109 my @result = $this->SUPER::param(@_); |
| 110 | 110 |
| 111 return map Encode::is_utf8($_) ? $_ : Encode::decode($this->charset,$_,Encode::LEAVE_SRC), @result; | 111 return map Encode::is_utf8($_) ? $_ : Encode::decode($this->charset,$_,Encode::LEAVE_SRC), @result; |
| 112 } else { | 112 } else { |
| 113 my $result = $this->SUPER::param(@_); | 113 my $result = $this->SUPER::param(@_); |
| 114 | 114 |
| 115 return Encode::is_utf8($result) ? $result : Encode::decode($this->charset,$result,Encode::LEAVE_SRC); | 115 return Encode::is_utf8($result) ? $result : Encode::decode($this->charset,$result,Encode::LEAVE_SRC); |
| 116 } | 116 } |
| 117 | 117 |
| 118 } | 118 } |
| 119 | 119 |
| 120 sub upload { | 120 sub upload { |
| 121 my $this = shift; | 121 my $this = shift; |
| 122 | 122 |
| 123 local $NO_DECODE = 1; | 123 local $NO_DECODE = 1; |
| 124 my $oldCharset = $this->charset(); | 124 my $oldCharset = $this->charset(); |
| 125 $this->charset('ISO-8859-1'); | 125 $this->charset('ISO-8859-1'); |
| 126 | 126 |
| 127 my $fh = $this->SUPER::upload(@_); | 127 my $fh = $this->SUPER::upload(@_); |
| 128 | 128 |
| 129 $this->charset($oldCharset); | 129 $this->charset($oldCharset); |
| 130 return $fh; | 130 return $fh; |
| 131 } | 131 } |
| 132 | 132 |
| 133 1; | 133 1; |
| 134 | 134 |
| 135 __END__ | 135 __END__ |
| 188 | 188 |
| 189 =begin code xml | 189 =begin code xml |
| 190 | 190 |
| 191 <?xml version="1.0" encoding="UTF-8"?> | 191 <?xml version="1.0" encoding="UTF-8"?> |
| 192 <Application id='app' type="Test::Web::Application::Instance"> | 192 <Application id='app' type="Test::Web::Application::Instance"> |
| 193 | 193 |
| 194 <!-- Begin custom properties --> | 194 <!-- Begin custom properties --> |
| 195 <name>Sample application</name> | 195 <name>Sample application</name> |
| 196 <dataSource type='IMPL::Config::Activator' id='ds'> | 196 <dataSource type='IMPL::Config::Activator' id='ds'> |
| 197 <factory>IMPL::Object</factory> | 197 <factory>IMPL::Object</factory> |
| 198 <parameters type='HASH'> | 198 <parameters type='HASH'> |
| 199 <db>data</db> | 199 <db>data</db> |
| 200 <user>nobody</user> | 200 <user>nobody</user> |
| 201 </parameters> | 201 </parameters> |
| 202 </dataSource> | 202 </dataSource> |
| 203 <securityMod type='IMPL::Config::Activator'> | 203 <securityMod type='IMPL::Config::Activator'> |
| 204 <factory>IMPL::Object</factory> | 204 <factory>IMPL::Object</factory> |
| 205 <parameters type='HASH'> | 205 <parameters type='HASH'> |
| 206 <ds refid='ds'/> | 206 <ds refid='ds'/> |
| 207 </parameters> | 207 </parameters> |
| 208 </securityMod> | 208 </securityMod> |
| 209 <!-- End custom properties --> | 209 <!-- End custom properties --> |
| 210 | 210 |
| 211 <!-- direct access to the activators --> | 211 <!-- direct access to the activators --> |
| 212 <options type="HASH"> | 212 <options type="HASH"> |
| 213 <dataSource refid='ds'/> | 213 <dataSource refid='ds'/> |
| 214 </options> | 214 </options> |
| 215 | 215 |
| 216 <!-- Set default output encoding, can be changed due query handling --> | 216 <!-- Set default output encoding, can be changed due query handling --> |
| 217 <responseCharset>utf-8</responseCharset> | 217 <responseCharset>utf-8</responseCharset> |
| 218 | 218 |
| 219 <!-- Actions creation configuration --> | 219 <!-- Actions creation configuration --> |
| 220 <actionFactory type="IMPL::Object::Factory"> | 220 <actionFactory type="IMPL::Object::Factory"> |
| 221 | 221 |
| 222 <!-- Construct actions --> | 222 <!-- Construct actions --> |
| 223 <factory>IMPL::Web::Application::Action</factory> | 223 <factory>IMPL::Web::Application::Action</factory> |
| 224 <parameters type='HASH'> | 224 <parameters type='HASH'> |
| 225 | 225 |
| 226 <!-- with special responseFactory --> | 226 <!-- with special responseFactory --> |
| 227 <responseFactory type='IMPL::Object::Factory'> | 227 <responseFactory type='IMPL::Object::Factory'> |
| 228 | 228 |
| 229 <!-- Where resopnses have a special streamOut --> | 229 <!-- Where resopnses have a special streamOut --> |
| 230 <factory>IMPL::Web::Application::Response</factory> | 230 <factory>IMPL::Web::Application::Response</factory> |
| 231 <parameters type='HASH'> | 231 <parameters type='HASH'> |
| 232 | 232 |
| 233 <!-- in memory dummy output instead of STDOUT --> | 233 <!-- in memory dummy output instead of STDOUT --> |
| 234 <streamOut>memory</streamOut> | 234 <streamOut>memory</streamOut> |
| 235 | 235 |
| 236 </parameters> | 236 </parameters> |
| 237 </responseFactory> | 237 </responseFactory> |
| 238 </parameters> | 238 </parameters> |
| 239 </actionFactory> | 239 </actionFactory> |
| 240 | 240 |
| 241 <!-- Query processing chain --> | 241 <!-- Query processing chain --> |
| 242 <handlersQuery type="IMPL::Object::List"> | 242 <handlersQuery type="IMPL::Object::List"> |
| 243 <item type="IMPL::Web::QueryHandler::PageFormat"> | 243 <item type="IMPL::Web::QueryHandler::PageFormat"> |
| 244 <templatesCharset>cp1251</templatesCharset> | 244 <templatesCharset>cp1251</templatesCharset> |
| 245 </item> | 245 </item> |
| 246 </handlersQuery> | 246 </handlersQuery> |
| 247 </Application> | 247 </Application> |
| 248 | 248 |
| 249 =end code xml | 249 =end code xml |
| 250 | 250 |
| 251 =head1 MEMBERS | 251 =head1 MEMBERS |
