Mercurial > pub > Impl
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">