changeset 255:827cf96faa1c

refactoring (incomplete)
author sergey
date Fri, 07 Dec 2012 16:58:19 +0400
parents fb52014f6931
children 32aceba4ee6d
files Lib/IMPL/Web/Application/Resource.pm Lib/IMPL/Web/Handler/RestController.pm
diffstat 2 files changed, 24 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Resource.pm	Thu Dec 06 19:58:42 2012 +0400
+++ b/Lib/IMPL/Web/Application/Resource.pm	Fri Dec 07 16:58:19 2012 +0400
@@ -16,11 +16,12 @@
         'IMPL::Web::Application::ResourceInterface' => undef
       ],
       props => [
-        parent   => PROP_GET | PROP_OWNERSET,
-        model    => PROP_GET | PROP_OWNERSET,
-        id       => PROP_GET | PROP_OWNERSET,
-        contract => PROP_GET | PROP_OWNERSET,
-        location => PROP_GET | PROP_OWNERSET
+        parent   => PROP_RO,
+        model    => PROP_RO,
+        id       => PROP_RO,
+        name     => PROP_RO,
+        contract => PROP_RO,
+        location => PROP_RO,
       ]
 };
 
@@ -30,16 +31,19 @@
     die ArgumentException->new( id => 'A resource identifier is required' )
       unless $args{id};
     die ArgumentException->new( contract => 'A contract is required' )
-      unless $args{id};
+      unless $args{contract};
+    die ArgumentException->new( name => 'A name is required' )
+      if $args{parent} && not(length $args{name});
 
     $this->parent( $args{parent} );
     $this->model( $args{model} );
     $this->id( $args{id} );
     $this->contract( $args{contract} );
+    $this->name($args{name});
 
     # если расположение явно не указано, то оно вычисляется автоматически,
     # либо остается не заданным
-    $this->location( $args{location} || eval { $this->parent->location->Child( $this->id ) } );
+    $this->location( $args{location} || eval { $this->parent->location->Child( $this->name ) } );
 }
 
 sub InvokeHttpVerb {
@@ -168,6 +172,13 @@
 Обязательное свойство ресурса, идентифицирует его в родительском контейнере,
 для корневого ресурса может иметь произвольное значение.
 
+=head2 C<[get]name>
+
+Имя ресурса в адресной строке. При разборе адреса идентификаторы ресурсов могут
+не всегда совпадать с именами, например C<http://audio/sonar.mp3> может иметь
+идентификатор C<sonar>, а его имя будет C<sonar.mp3>. Однако за частую имя
+совпадает с идентификатором.
+
 =head2 C<[get]parent>
 
 Ссылка на родительский ресурс, для корневого ресурса не определена.
--- a/Lib/IMPL/Web/Handler/RestController.pm	Thu Dec 06 19:58:42 2012 +0400
+++ b/Lib/IMPL/Web/Handler/RestController.pm	Fri Dec 07 16:58:19 2012 +0400
@@ -44,8 +44,9 @@
         shift @segments if @segments && length($segments[0]) == 0;
         
         if(@segments) {
-            my ($obj,$view) = (pop(@segments) =~ m/(.*?)(?:\.(\w+))?$/);
-            push @segments, $obj;
+        	my $segment = pop(@segments);
+            my ($obj,$view) = ($segment =~ m/(.*?)(?:\.(\w+))?$/);
+            push @segments, { id => $obj, name => $segment, ext => $view };
         }
     
     }
@@ -63,13 +64,14 @@
 	
 	my $res = $this->resourceFactory->new(
 	   id => 'root',
+	   name => '',
 	   location => Locator->new(base => $action->application->baseUrl)
 	);
 	
 	while(@segments) {
-		my $id = shift @segments;
+		my $info = shift @segments;
 		
-		$res = $res->FetchChildResource($id);
+		$res = $res->FetchChildResource($info->{id});
 	}
 	
 	$res = $res->InvokeHttpVerb($method,$action);