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