Mercurial > pub > Impl
diff Lib/IMPL/Web/Application/Resource.pm @ 230:6d8092d8ce1b
*reworked IMPL::Security
*reworked IMPL::Web::Security
*refactoring
author | sergey |
---|---|
date | Mon, 08 Oct 2012 03:37:37 +0400 |
parents | 47f77e6409f7 |
children | a02b110da931 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Resource.pm Sat Sep 29 02:34:47 2012 +0400 +++ b/Lib/IMPL/Web/Application/Resource.pm Mon Oct 08 03:37:37 2012 +0400 @@ -1,7 +1,7 @@ package IMPL::Web::Application::Resource; use strict; -use IMPL::lang qw(:constants); +use IMPL::Const qw(:prop); use IMPL::declare { require => { Exception => 'IMPL::Exception', @@ -36,24 +36,22 @@ $this->id( $args{id} ); $this->contract( $args{contract} ); - # если расположение явно не указано, что обычно делается для корневого - # ресурса, то оно вычисляется автоматически, либо остается не заданным - $this->location( $args{location} - || eval { $this->parent->location->Child( $this->id ) } ); - ) - + # если расположение явно не указано, то оно вычисляется автоматически, + # либо остается не заданным + $this->location( $args{location} || eval { $this->parent->location->Child( $this->id ) } ); } sub InvokeHttpVerb { my ( $this, $verb, $action ) = @_; - my $verb = $this->contract->verbs->{ lc($verb) }; - + my $operation = $this->contract->verbs->{ lc($verb) }; + die NotAllowedException->new( - allow => join( ',' map( uc, keys %{ $this->contract->verbs } ) ) ) - unless $verb; + allow => join( ',', map( uc, keys %{ $this->contract->verbs } ) ) + ) + unless $operation; - return $verb->Invoke( $this, $action ); + return $operation->Invoke( $this, $action ); } # это реализация по умолчанию, базируется информации о ресурсах, содержащийся @@ -61,12 +59,12 @@ sub FetchChildResource { my ( $this, $childId ) = @_; - my $info = $this->contract->FindChildResourceInfo($childId); + my ($info,$childIdParts) = $this->contract->FindChildResourceInfo($childId); - die NotFoundException->new() unless $info; + die NotFoundException->new($this->location->url,$childId) unless $info; - my $binding = $this->{binding}; - my $contract = $this->{contract} + my $binding = $info->{binding}; + my $contract = $info->{contract} or die OperationException->new("Can't fetch a contract for the resource", $childId); my %args = ( @@ -74,7 +72,7 @@ id => $childId ); - $args{model} = _InvokeDelegate($binding,$this); + $args{model} = _InvokeDelegate($binding,$this,@$childIdParts); return $contract->CreateResource(%args); } @@ -82,7 +80,7 @@ sub _InvokeDelegate { my $delegate = shift; - return $delegete->(@_) if ref $delegate eq 'CODE'; + return $delegate->(@_) if ref $delegate eq 'CODE'; return $delegate->Invoke(@_) if eval { $delegate->can('Invoke')}; } @@ -145,4 +143,33 @@ собственный класс ресурса, например унаследованный от C<IMPL::Web::Application::CustomResource>. +=head1 MEMBERS + +=head2 C<[get]contract> + +Обязательное свойство для ресурса, ссылается, на контракт, соотсетствующий +данному ресурсу, используется для выполнения C<HTTP> методов и получения +дочерних ресурсов. + +=head2 C<[get]id> + +Обязательное свойство ресурса, идентифицирует его в родительском контейнере, +для корневого ресурса может иметь произвольное значение. + +=head2 C<[get]parent> + +Ссылка на родительский ресурс, для корневого ресурса не определена. + +=head2 C<[get]model> + +Ссылка на объект предметной области, представляемый данным ресурсом. Данное +свойство не является обязательным и может быть не задано. + +=head2 C<[get]location> + +Объект типа C<IMPL::Web::AutoLocator> или аналогичный описывающий адрес текущего +ресурса, может быть как явно передан при создании ресурса, так и вычислен +автоматически (только для ресурсов имеющих родителя). Следует заметить, что +адрес ресурса не содержит параметров запроса, а только путь. + =cut