comparison Lib/IMPL/Web/Application.pm @ 285:546957c50a36

*IMPL::Web::Handler::TTView Reworked template selection mechanism *IMPL::Web::Application: refactoring -Removed obsolete IMPL::Text modules
author cin
date Mon, 18 Feb 2013 02:55:59 +0400
parents a02b110da931
children 63709a4e6da0
comparison
equal deleted inserted replaced
284:f2a6bc5f3184 285:546957c50a36
11 Locator => 'IMPL::Web::AutoLocator', 11 Locator => 'IMPL::Web::AutoLocator',
12 TAction => 'IMPL::Web::Application::Action', 12 TAction => 'IMPL::Web::Application::Action',
13 HttpResponse => 'IMPL::Web::HttpResponse', 13 HttpResponse => 'IMPL::Web::HttpResponse',
14 TFactory => '-IMPL::Object::Factory', 14 TFactory => '-IMPL::Object::Factory',
15 Exception => 'IMPL::Exception', 15 Exception => 'IMPL::Exception',
16 ArgException => '-IMPL::InvalidArgumentException',
16 InvalidOperationException => '-IMPL::InvalidOperationException', 17 InvalidOperationException => '-IMPL::InvalidOperationException',
17 Loader => 'IMPL::Code::Loader' 18 Loader => 'IMPL::Code::Loader'
18 }, 19 },
19 base => [ 20 base => [
20 'IMPL::Config' => '@_', 21 'IMPL::Config' => '@_',
21 'IMPL::Object::Singleton' => '@_' 22 'IMPL::Object::Singleton' => undef
22 ], 23 ],
23 props => [ 24 props => [
24 baseUrl => PROP_RW, 25 baseUrl => PROP_RW,
25 actionFactory => PROP_RW, 26 actionFactory => PROP_RW,
26 handlers => PROP_RW | PROP_LIST, 27 handlers => PROP_RW | PROP_LIST,
27 security => PROP_RW, 28 security => PROP_RW,
28 options => PROP_RW, 29 options => PROP_RW,
29 requestCharset => PROP_RW, 30 requestCharset => PROP_RW,
30 output => PROP_RW, 31 output => PROP_RW,
31 location => PROP_RO 32 location => PROP_RO,
33 _handler => PROP_RW
32 ] 34 ]
33 }; 35 };
34 36
35 sub CTOR { 37 sub CTOR {
36 my ($this) = @_; 38 my ($this) = @_;
43 45
44 $this->actionFactory(TAction) unless $this->actionFactory; 46 $this->actionFactory(TAction) unless $this->actionFactory;
45 $this->location(Locator->new(base => $this->baseUrl)); 47 $this->location(Locator->new(base => $this->baseUrl));
46 } 48 }
47 49
48 sub Run { 50 sub ProcessRequest {
49 my ($this) = @_; 51 my ($this,$q) = @_;
52
53 die ArgException->new(q => 'A query is required')
54 unless $q;
55
56 my $handler = $this->_handler;
57 unless ($handler) {
58 $handler = _ChainHandler( $_, $handler ) foreach $this->handlers;
59 $this->_handler($handler);
60 }
61
62 my $action = $this->actionFactory->new(
63 query => $q,
64 application => $this,
65 );
50 66
51 my $handler; 67 eval {
68 my $result = $handler->($action);
52 69
53 $handler = _ChainHandler( $_, $handler ) foreach $this->handlers; 70 die InvalidOperationException->new("Invalid handlers result. A reference to IMPL::Web::HttpResponse is expexted.")
71 unless eval { $result->isa(HttpResponse) };
54 72
55 while ( my $query = $this->FetchRequest() ) { 73 $result->PrintResponse( $this->output );
74 };
75 if ($@) {
76 my $e = $@;
56 77
57 my $action = $this->actionFactory->new( 78 HttpResponse->InternalError(
58 query => $query, 79 type => 'text/plain',
59 application => $this, 80 charset => 'utf-8',
60 ); 81 body => $e
82 )->PrintResponse( $this->output );
61 83
62 eval { 84 }
63 my $result = $handler->($action);
64
65 die InvalidOperationException->new(
66 "Invalid handlers result. A reference to IMPL::Web::HttpResponse is expexted."
67 ) unless eval { $result->isa(HttpResponse) };
68
69 $result->PrintResponse( $this->output );
70 };
71 if ($@) {
72 my $e = $@;
73
74 HttpResponse->InternalError(
75 type => 'text/plain',
76 charset => 'utf-8',
77 body => $e
78 )->PrintResponse( $this->output );
79
80 }
81 }
82 } 85 }
83 86
84 sub _ChainHandler { 87 sub _ChainHandler {
85 my ( $handler, $next ) = @_; 88 my ( $handler, $next ) = @_;
86 89
125 die new IMPL::InvalidArgumentException( "An invalid handler supplied", 128 die new IMPL::InvalidArgumentException( "An invalid handler supplied",
126 $handler ); 129 $handler );
127 } 130 }
128 } 131 }
129 132
130 sub FetchRequest {
131
132 return;
133 }
134
135 1; 133 1;
136 134
137 __END__ 135 __END__
138 136
139 =pod 137 =pod
140 138
141 =head1 NAME 139 =head1 NAME
142 140
143 C<IMPL::Web::Application> Базовай класс для создания экземпляров приложения 141 C<IMPL::Web::Application> Базовай класс для веб-приложения
144
145 =head1 SYNOPSIS
146
147 =begin code
148
149 use IMPL::require {
150 App => 'IMPL::Web::Application'
151 };
152
153 my $instance = App->spawn(); # will use ./IMPL/Web/Application.xml as configuration
154
155 $instance->Run;
156
157 =end code
158
159 =head1 DESCRIPTION
160
161 Создает экземпляр объекта, который получает и обрабатывает C<HTTP> запрос.
162 Приложение можно загрузить из C<xml> файла в котором описано состояние свойств,
163 для этого используется механизм C<IMPL::Serialization>.
164
165 Приложение представлет собой модульную конструкцию, которая состоит из цепочки
166 обработчиков. Цепочка обработчиков вызывается снизу вверх, при этом каждый
167 обработчик самостоятельно рекурсивно вызывает следующий (более высокого уровня).
168
169 См. также C<IMPL::Web::CGIApplication>
170 142
171 =cut 143 =cut