Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application.pm Thu Feb 14 19:14:02 2013 +0400 +++ b/Lib/IMPL/Web/Application.pm Mon Feb 18 02:55:59 2013 +0400 @@ -13,12 +13,13 @@ HttpResponse => 'IMPL::Web::HttpResponse', TFactory => '-IMPL::Object::Factory', Exception => 'IMPL::Exception', + ArgException => '-IMPL::InvalidArgumentException', InvalidOperationException => '-IMPL::InvalidOperationException', Loader => 'IMPL::Code::Loader' }, base => [ 'IMPL::Config' => '@_', - 'IMPL::Object::Singleton' => '@_' + 'IMPL::Object::Singleton' => undef ], props => [ baseUrl => PROP_RW, @@ -28,7 +29,8 @@ options => PROP_RW, requestCharset => PROP_RW, output => PROP_RW, - location => PROP_RO + location => PROP_RO, + _handler => PROP_RW ] }; @@ -45,40 +47,41 @@ $this->location(Locator->new(base => $this->baseUrl)); } -sub Run { - my ($this) = @_; - - my $handler; - - $handler = _ChainHandler( $_, $handler ) foreach $this->handlers; - - while ( my $query = $this->FetchRequest() ) { - - my $action = $this->actionFactory->new( - query => $query, - application => $this, - ); - - eval { - my $result = $handler->($action); +sub ProcessRequest { + my ($this,$q) = @_; + + die ArgException->new(q => 'A query is required') + unless $q; + + my $handler = $this->_handler; + unless ($handler) { + $handler = _ChainHandler( $_, $handler ) foreach $this->handlers; + $this->_handler($handler); + } + + my $action = $this->actionFactory->new( + query => $q, + application => $this, + ); - die InvalidOperationException->new( -"Invalid handlers result. A reference to IMPL::Web::HttpResponse is expexted." - ) unless eval { $result->isa(HttpResponse) }; + eval { + my $result = $handler->($action); - $result->PrintResponse( $this->output ); - }; - if ($@) { - my $e = $@; + die InvalidOperationException->new("Invalid handlers result. A reference to IMPL::Web::HttpResponse is expexted.") + unless eval { $result->isa(HttpResponse) }; - HttpResponse->InternalError( - type => 'text/plain', - charset => 'utf-8', - body => $e - )->PrintResponse( $this->output ); + $result->PrintResponse( $this->output ); + }; + if ($@) { + my $e = $@; - } - } + HttpResponse->InternalError( + type => 'text/plain', + charset => 'utf-8', + body => $e + )->PrintResponse( $this->output ); + + } } sub _ChainHandler { @@ -127,11 +130,6 @@ } } -sub FetchRequest { - - return; -} - 1; __END__ @@ -140,32 +138,6 @@ =head1 NAME -C<IMPL::Web::Application> Базовай класс для создания экземпляров приложения - -=head1 SYNOPSIS - -=begin code - -use IMPL::require { - App => 'IMPL::Web::Application' -}; - -my $instance = App->spawn(); # will use ./IMPL/Web/Application.xml as configuration - -$instance->Run; - -=end code - -=head1 DESCRIPTION - -Создает экземпляр объекта, который получает и обрабатывает C<HTTP> запрос. -Приложение можно загрузить из C<xml> файла в котором описано состояние свойств, -для этого используется механизм C<IMPL::Serialization>. - -Приложение представлет собой модульную конструкцию, которая состоит из цепочки -обработчиков. Цепочка обработчиков вызывается снизу вверх, при этом каждый -обработчик самостоятельно рекурсивно вызывает следующий (более высокого уровня). - -См. также C<IMPL::Web::CGIApplication> +C<IMPL::Web::Application> Базовай класс для веб-приложения =cut