changeset 67:9f5795a10939

Documentation, minor fixes
author wizard
date Fri, 19 Mar 2010 20:06:12 +0300 (2010-03-19)
parents f47f93534005
children 739f1288ca84
files Lib/IMPL/Object/Factory.pm Lib/IMPL/Web/Application.pm Lib/IMPL/Web/Application/Action.pm Lib/IMPL/Web/Application/Response.pm _test/Resources/app.xml
diffstat 5 files changed, 334 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/IMPL/Object/Factory.pm	Thu Mar 18 17:58:33 2010 +0300
+++ b/Lib/IMPL/Object/Factory.pm	Fri Mar 19 20:06:12 2010 +0300
@@ -70,14 +70,6 @@
 
 =begin code
 
-sub ProcessItems {
-	my ($factory,$items);
-	
-	return map $factory->new($_), @$items;
-}
-
-my @users = ProcessItems('MyApp::User',$db->selectUsers);
-
 my $factory = new IMPL::Object::Factory(
 	'MyApp::User',
 	{
@@ -85,13 +77,35 @@
 	}
 );
 
+my $class = 'MyApp::User';
+
+my $user;
+
+$user = $class->new(name => 'nobody'); # will create object MyApp::User
+                                       # and pass parameters (name=>'nobody')
+											
+$user = $factory->new(name => 'root'); # will create object MyApp::User
+                                       # and pass paremeters (isAdmin => 1, name => 'root')
+
 =end code
 
-my @admins = ProcessItems($factory,$db->selectAdmins);
+��� ��������������� ����� � XML.
+
+=begin code xml
 
+<factory type="IMPL::Object::Factory">
+	<factory>MyApp::User</factory>,
+	<parameters type="HASH">
+		<isAdmin>1</isAdmin>
+	</parameters>
+</factory>
+
+=end code xml
 
 =head1 DESCRIPTION
 
+C<[Serializable]>
+
 �����, ����������� ������� �������.
 
 ������� ������� ��� ����� ������, ������� ����� ����� C< new > ����� �������� �������� � �������� ������
@@ -108,16 +122,56 @@
 
 =over
 
-=item C< factory >
+=item C< CTOR($factory,$parameters) >
+
+������� ����� ���������
+
+=over
+
+=item C<$factory>
+
+���� ��� ������, ���� ������ �������.
+
+=item C<$parameters>
+
+������ �� ��������� ��� �������� ��������, ����� ���� ������� �� ���, ������ � �.�.
+
+���� �������� ������� �� ���, �� ��� �������� �������� ������ �������� ���� ���
+����� ��������� � ������ � ������� ����������� ������ C<new>.
+
+���� �������� ������� �� ������, �� ��� �������� �������� ������ �������� ���� ������
+����� ������� � ����� � ������� ����������� ������ C<new>.
+
+���� �������� ����� ������ �������� ��� ��������, �� ����� ������� ���������� ������
+C<new> ��� ����.
+
+=back
+
+=item C< [get] factory >
 
 ��������, ���������� ������� ��� �������� ����� �������� ������� ��������. ���� ����� ��� ��������
 ��� ������.
 
-=item C< parameters >
+=item C< [get] parameters >
 
 ��������, �������� ������ �� ��������� ��� �������� ��������, ��� �������� ������� ��� ��������� �����
 ���������� � ������ � �������� ��������� C< new > ������� �� �������� C< factory >, �� ���� �����
-��������� ��������� ��������������� ������� �������. 
+��������� ��������� ��������������� ������� �������.
+
+=item C<new(@params)>
+
+������� ����� ������, ��������� ������� C<factory> ��� ������� � ��������� ���� ���������
+�� �������� C<parameters> � ������ C<@params>. ���� �������� ���������� ������, ��� ��� ����������.
+
+=begin code
+
+sub new {
+	my ($this,@params) = @_;
+	
+	return $this->factory->new(_as_list($this->parameters), @params);
+}
+
+=end code
 
 =back
 
--- a/Lib/IMPL/Web/Application.pm	Thu Mar 18 17:58:33 2010 +0300
+++ b/Lib/IMPL/Web/Application.pm	Fri Mar 19 20:06:12 2010 +0300
@@ -14,7 +14,7 @@
 
 BEGIN {
     public property handlerError => prop_all;
-    public property factoryAction => prop_all;
+    public property actionFactory => prop_all;
     public property handlersQuery => prop_all | prop_list;
     public property responseCharset => prop_all;
     public property options => prop_all;
@@ -30,7 +30,7 @@
 sub CTOR {
 	my ($this) = @_;
 	
-	$this->factoryAction('IMPL::Web::Application::Action') unless $this->factoryAction;
+	$this->actionFactory('IMPL::Web::Application::Action') unless $this->actionFactory;
 	$this->responseCharset('utf-8') unless $this->responseCharset;
 }
 
@@ -39,7 +39,7 @@
     
     while (my $query = $this->FetchRequest()) {
         
-        my $action = $this->factoryAction->new(
+        my $action = $this->actionFactory->new(
         	query => $query,
         	application => $this, 
         );
@@ -72,8 +72,15 @@
 
 =head1 SYNOPSIS
 
+=begin code
+
 require MyApp;
-MyApp->spawn('app.config')->Run();
+
+my $instance = spawn MyApp('app.config');
+
+$instance->Run();
+
+=end code
 
 =head1 DESCRIPTION
 
@@ -82,13 +89,94 @@
 
 ������� ��������� ������� ������� �� ��������� ������
 
-1. ��������� cgi �������
-2. ����� ������ ��� ������������� ������� ��������
-3. ������������� ��������� ���������� 
-4. ���������� �������
-5. �������������� ���������� ������ � ���� ������
+=over
+
+=item 1
+
+��������� cgi �������
+
+=item 2
 
+�������� ������� C<IMPL::Web::Application::Action>
 
+=item 3
 
+������������ ������� ������� ��� ������ C<< IMPL::Web::Application::Action->ChainHandler >>
+
+=item 4
+
+���������� ������� C<< IMPL::Web::Application::Action->Invoke >>
 
 =cut
+
+����� ���������� ������������ ���������� �������� ��������, ������� �� ������� ���������
+� ���������. ��� ����������� � ������� ������ C< IMPL::Configuration >. ��� ���������
+����������� ����� ������������ �������� C<options>, � ������� ������ ���� ������� ���
+�� �������� �� ����������, ��. ������ ���� C<CONFIGURATION>. 
+
+=head2 CONFIGURATION
+
+���� �������� ������ ������������ ����������
+
+=begin code xml
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Application id='app' type="Test::Web::Application::Instance">
+	
+	<!-- Begin custom properties -->
+	<name>Sample application</name>
+	<dataSource type='IMPL::Config::Activator' id='ds'>
+		<factory>IMPL::Object</factory>
+		<parameters type='HASH'>
+			<db>data</db>
+			<user>nobody</user>
+		</parameters>
+	</dataSource>
+	<securityMod type='IMPL::Config::Activator'>
+		<factory>IMPL::Object</factory>
+		<parameters type='HASH'>
+			<ds refid='ds'/>
+		</parameters>
+	</securityMod>	
+	<!-- End custom properties -->
+	
+	<!-- direct access to the activators -->
+	<options type="HASH">
+		<dataSource refid='ds'/>
+	</options>
+	
+	<!-- Set default output encoding, can be changed due query handling -->
+	<responseCharset>utf-8</responseCharset>
+	
+	<!-- Actions creation configuration -->
+	<actionFactory type="IMPL::Object::Factory">
+		
+		<!-- Construct actions -->		
+		<factory>IMPL::Web::Application::Action</factory>
+		<parameters type='HASH'>
+			
+			<!-- with special responseFactory -->
+			<responseFactory type='IMPL::Object::Factory'>
+			
+				<!-- Where resopnses have a special streamOut -->
+				<factory>IMPL::Web::Application::Response</factory>
+				<parameters type='HASH'>
+				
+					<!-- in memory dummy output instead of STDOUT -->
+					<streamOut>memory</streamOut>
+					
+				</parameters>
+			</responseFactory>
+		</parameters>
+	</actionFactory>
+	
+	<!-- Query processing chain -->
+	<handlersQuery type="IMPL::Object::List">
+		<item type="IMPL::Web::QueryHandler::PageFormat">
+			<templatesCharset>cp1251</templatesCharset>
+		</item>
+	</handlersQuery>
+</Application>
+
+=end code xml
+
--- a/Lib/IMPL/Web/Application/Action.pm	Thu Mar 18 17:58:33 2010 +0300
+++ b/Lib/IMPL/Web/Application/Action.pm	Fri Mar 19 20:06:12 2010 +0300
@@ -87,49 +87,159 @@
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Web::Application::Action> - ������� ������ C<CGI> �������.
+
 =head1 DESCRIPTION
 
-���������� ������� ���������� �������.
+C<[Infrastructure]>
 
-������ ����������� ���������������� ������� ������� ������������, ��� ���� �����������
-���� �������� ���������.
+���������� ������� ���������� �������. ������ ����������� ���������������� �������
+������� ������������, ��� ���� ����������� ���� �������� ���������.
+����������� ����������� � �������, �������� �� ����������.
 
 �������� ������� ����� ���� �����, � ������� ����������
 
-SecCallToMethod($target,$method)
-AuthenticateMethod
-TDocumentOut($file)
+=begin code
+
+IMPL::Web::QueryHandler::SecCallToMethod
+IMPL::Web::QueryHandler::AuthenticateCookie
+IMPL::Web::QueryHandler::PageFormat
+
+=end code
 
 ��� �������� � ��������� ������������������
 
-Action->Invoke() {
-	TDocumentOut->Invoke($Action,$nextHandler) {
-		my $result = $nextHandler() {
-			$AuthenticateMethod($Action,$nextHandler) {
-				my $context = $Action->application->security->Authenticate($Action->query,$Action->response);
-				return $context->Impersonate($nextHandler) {
-					$objSecCallToMethod->Invoke($Action,undef) {
+=begin code
+
+# the application creates a new Action object 
+
+my $action = $application->actionFactory->new(
+	action => $application, # the application passes self
+	query => $query # current CGI query
+);
+
+# forms query handlers stack
+
+$action->ChainHandler($_) foreach qw (
+	IMPL::Web::QueryHandler::SecCallToMethod
+	IMPL::Web::QueryHandler::AuthenticateCookie
+	IMPL::Web::QueryHandler::PageFormat
+);
+
+# and finally invokes the action
+
+$action->Invoke() {
+	
+	# some internals
+	
+	IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) {
+		
+		#some internals
+		
+		my $result = $nextHandlerIsAuthHandler() {
+			
+			# some internals
+
+			IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) {
+				
+				# some internals
+				# do auth and generate security $context 
+				
+				# impersonate $context and call the next handler				
+				return $context->Impersonate($nextHandlerIsSecCall) {
+					
+					# some internals 
+					
+					IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) {
+						
+						# next handler isn't present as it is the last hanler
+						
+						# some internals
+						# calculate the $method and the $target from CGI request
+												
 						IMPL::Security->AccessCheck($target,$method);
 						return $target->$method();
+						
 					}
+					
 				}
+				
 			}
 		}
-		$this->format($result,$Action->response->streamBody);
+		
+		# some intenals
+		# formatted output to $action->response->streamBody		
 	}		
 }
 
+=end code
+
 ��� ��� ������������ ����� ���� ���
 
-$objSecCallToMethod($target,$method)
-$AuthenticateMethod
-$TransfromToSimpleData
-$JSONOut
+=begin code
+
+IMPL::Web::QueryHandler::SecCallToMethod
+IMPL::Web::QueryHandler::AuthenticateCookie
+IMPL::Web::QueryHandler::Filter->new( target => IMPL::Transform::ObjectToJSON->new() , method => 'Transform')
+IMLP::Web::QueryHandler::JSONFormat
+
+
+=end code
 
 � ������ ������� ����� ���������� ����� ������, �� ��� ��������� ����� �������������
 � ������� ��������� � ���������� JSON ���������������. ����� ������� ������ ������
 �� ��������� ����� � �������� �������, ��� ������ ��������� �������������� �������.
 
+=head1 MEMBERS
+
+=head2 PROPERTIES
+
+=over
+
+=item C< [get] application>
+
+��������� ���������� ���������� ������� ������
+
+=item C< [get] query >
+
+��������� C<CGI> �������
+
+=item C< [get] response >
+
+����� �� C<CGI> ������� C<IMPL::Web::Application::Response>
+
+=item C< [get] responseFactory >
+
+������� ������� �� ������, ������������ ��� �������� ������ ������
+���� ��� ��������������� �������� ������� C<IMPL::Web::Application::Action>,
+���� ��� ������ ������ C<ReinitResponse> � �������� �������.
+
+�� ��������� ����� �������� C<IMPL::Web::Application::Response>
+
+=back
+
+=head2 METHODS
+
+=over
+
+=item C< ReinitResponse() >
+
+������ ������� ������ C<response> � �������� ������ ���� ������.
+
+������ �������� ������ ���������� ��� ��������� ������, �����
+��� �������������� ����� ��������� ��������. ������� ��������,
+��� ��� �������� �� ��������, ���� ����� �������� ��� ���������
+��������� �������. ����� ��������� ���������� C<IMPL::InvalidOperationException>.
+
+=item C< ChainHandler($handler) >
+
+��������� ����� ���������� � �������. ���������� ������� ���������� � �����,
+������ ��������� ����������� ����� �������� ������. 
+
+=back
+
 =head1 HANDLERS
 
 =head2 subroutines
@@ -151,9 +261,9 @@
 
 =back 
 
-=head2 C< IMPL::Web::Application::QueryHandler >
+=head2 C< IMPL::Web::QueryHandler >
 
-����� ������ ������������� �� C< IMPL::Web::Application::QueryHandler > ����� ����
+����� ������ ������������� �� C< IMPL::Web::QueryHandler > ����� ����
 ����������� � �������� ����������� �������
 
 =cut
\ No newline at end of file
--- a/Lib/IMPL/Web/Application/Response.pm	Thu Mar 18 17:58:33 2010 +0300
+++ b/Lib/IMPL/Web/Application/Response.pm	Fri Mar 19 20:06:12 2010 +0300
@@ -14,6 +14,7 @@
 #todo: add binary method to set a binary encoding, set it automatic when type isn't a text 
 
 BEGIN {
+	# �������������� ���� ����������� � ������� ����������
 	public property query => prop_get | owner_set; # cgi query
 	public property status => prop_all, { validator => \&_checkHeaderPrinted };
 	public property contentType => prop_all, { validator => \&_checkHeaderPrinted }; # String
@@ -32,11 +33,19 @@
 
 __PACKAGE__->PassThroughArgs;
 
+our %CTOR = (
+	'IMPL::Object::Autofill' => sub {
+		my %args = @_;
+		
+		$args{query} = CGI->new($args{query} || {});
+		
+		%args;
+	}
+);
+
 sub CTOR {
 	my ($this,%args) = @_;
 	
-	$this->query(CGI->new($this->query() | {})) unless $this->query;
-	
 	if (lc $this->streamOut eq 'memory') {
 		my $dummy = '';
 		open my $hout, '>:encoding(utf8)', \$dummy or die new IMPL::Exception("Failed to create memory stream",$!);
@@ -165,15 +174,23 @@
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Web::Application::Response> - ����� ��� ������� ��������������� �������.
+
 =head1 DESCRIPTION
 
-����� ������� �� CGI ������, ��������� ������������ �������� �������� ��������� � ���� �������.
+C<[Infrastructure]>
+
+��������� ������������ �������� �������� ��������� � ���� ������.
+
+��������� �������� C<IMPL::Web::Application::Action> � �������� ��������� �������.
+
+����� �������������� ������������� C<IMPL::Web::QueryHandler> � �������� ���������� �������.
 
 ������ ��������� ��������������� ����� � ���� ������, ��� ��������� �������� ��� ��������
-����� � ��������� ������.
-
-�������� C< isHeaderPrinted > ����� ������������ ��� ����������� ���� �� ���������� �����-������
-������ �������. 
+����� � ��������� ������. �������� C< isHeaderPrinted >  ������������ ��� ����������� �����
+��������� ������ �������. 
 
 =head1 PROPERTIES
 
@@ -184,27 +201,27 @@
 
 =over
 
-=item C< query >
+=item C< [get] query >
 
 CGI ������, ������� ������������ ��� ������ ������, ��������� � ��. ���������� ������.
 
-=item C< status >
+=item C< [get,set] status >
 
 ��� ������ HTTP. ��������, '200 OK'. �� ��������� �� ����������, ��� �������� ������� ���� ��������� '200 ��'.
 
-=item C< contentType >
+=item C< [get,set] contentType >
 
 ��� MIME. �� ��������� �� ����������, ��������������� 'text/html'.
 
-=item C< charset >
+=item C< [get,set] charset >
 
 ���������, ������� �������� query->charset.
 
-=item C< expires >
+=item C< [get,set] expires >
 
 ���������� ����� ����� ��������, �������� '+10m'. �� ��������� �� ������ � �� ����������.
 
-=item C< cookies >
+=item C< [get,set] cookies >
 
 ��� ������ � cookies, �������� C< { cart => ['foo','bar'], display => 'list' } >.
 
@@ -216,7 +233,7 @@
 
 =over
 
-=item C< buffered >
+=item C< [get,set] buffered >
 
 C< True > - �� ���� ������ ������� � ������ � ����� ���������� ��� ������ ������ C< Complete >,
 ��������� ����� ����� ��������� ����� ������ ������ C< Complete >. 
@@ -226,15 +243,15 @@
 
 ��� �������� ����� ������ �� ������� ��������� � ������ ��� ������ � ���� ������.
 
-=item C< streamOut >
+=item C< [get] streamOut >
 
 ����������� ����� CGI ����������.
 
-=item C< streamBody >
+=item C< [get] streamBody >
 
 ����� ��� ������ � ���� ������.
 
-=item C< isHeadPrinted >
+=item C< [get] isHeadPrinted >
 
 ������� ����, ��� ��������� ��� ��� ��������� �������.
 
@@ -255,4 +272,9 @@
 
 =back
 
+=head1 REMARKS
+
+������ ������ �������� ���������������, �.�. ��� ��� �������� ����� ������ �����
+����������� ��������� ������������.
+
 =cut
\ No newline at end of file
--- a/_test/Resources/app.xml	Thu Mar 18 17:58:33 2010 +0300
+++ b/_test/Resources/app.xml	Fri Mar 19 20:06:12 2010 +0300
@@ -27,7 +27,7 @@
 	<responseCharset>utf-8</responseCharset>
 	
 	<!-- Actions creation configuration -->
-	<factoryAction type="IMPL::Object::Factory">
+	<actionFactory type="IMPL::Object::Factory">
 		<factory>IMPL::Web::Application::Action</factory>
 		<parameters type='HASH'>
 			<responseFactory type='IMPL::Object::Factory'>
@@ -37,7 +37,7 @@
 				</parameters>
 			</responseFactory>
 		</parameters>
-	</factoryAction>
+	</actionFactory>
 	
 	<!-- Query processing  -->
 	<handlersQuery type="IMPL::Object::List">