annotate Lib/IMPL/Web/Handler/RestController.pm @ 250:129e48bb5afb

DOM refactoring ObjectToDOM methods are virtual QueryToDOM uses inflators Fixed transform for the complex values in the ObjectToDOM QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author sergey
date Wed, 07 Nov 2012 04:17:53 +0400
parents a02b110da931
children 827cf96faa1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
1 package IMPL::Web::Handler::RestController;
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
2 use strict;
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
3
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
4 use IMPL::Const qw(:prop);
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
5 use IMPL::declare {
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
6 require => {
244
a02b110da931 refactoring
sergey
parents: 233
diff changeset
7 Locator => 'IMPL::Web::AutoLocator',
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
8 ResourceInterface => 'IMPL::Web::Application::ResourceInterface',
199
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
9 Exception => 'IMPL::Exception',
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
10 ArgumentExecption => '-IMPL::InvalidArgumentException',
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
11 NotFoundException => 'IMPL::Web::NotFoundException'
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
12 },
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
13 base => {
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
14 'IMPL::Object' => undef,
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 197
diff changeset
15 'IMPL::Object::Autofill' => '@_',
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 197
diff changeset
16 'IMPL::Object::Serializable' => undef
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
17 },
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
18 props => [
244
a02b110da931 refactoring
sergey
parents: 233
diff changeset
19 resourceFactory => PROP_RO,
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
20 trailingSlash => PROP_RO
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
21 ]
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
22 };
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
23
199
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
24 sub CTOR {
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
25 my ($this) = @_;
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
26
244
a02b110da931 refactoring
sergey
parents: 233
diff changeset
27 die ArgumentException->new(resourceFactory => "A web-resource is required")
a02b110da931 refactoring
sergey
parents: 233
diff changeset
28 unless $this->resourceFactory;
a02b110da931 refactoring
sergey
parents: 233
diff changeset
29 #unless eval { $this->resourceFacotry->isa(ResourceInterface) };
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
30
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
31 }
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
32
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
33 sub GetResourcePath {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
34 my ($this,$action) = @_;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
35
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
36 my $pathInfo = $action->pathInfo;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
37 my @segments;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
38
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
39 if (length $pathInfo) {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
40
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
41 @segments = split(/\//, $pathInfo, $this->trailingSlash ? -1 : 0);
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
42
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
43 # remove first segment if it is empty
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
44 shift @segments if @segments && length($segments[0]) == 0;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
45
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
46 if(@segments) {
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
47 my ($obj,$view) = (pop(@segments) =~ m/(.*?)(?:\.(\w+))?$/);
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
48 push @segments, $obj;
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
49 }
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
50
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
51 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
52
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
53 return @segments;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
54 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
55
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
56
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
57 sub Invoke {
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
58 my ($this,$action) = @_;
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
59
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
60 my $method = $action->requestMethod;
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
61
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
62 my @segments = $this->GetResourcePath($action);
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 197
diff changeset
63
244
a02b110da931 refactoring
sergey
parents: 233
diff changeset
64 my $res = $this->resourceFactory->new(
a02b110da931 refactoring
sergey
parents: 233
diff changeset
65 id => 'root',
a02b110da931 refactoring
sergey
parents: 233
diff changeset
66 location => Locator->new(base => $action->application->baseUrl)
a02b110da931 refactoring
sergey
parents: 233
diff changeset
67 );
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
68
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
69 while(@segments) {
199
e743a8481327 Added REST support for forms (with only get and post methods)
sergey
parents: 198
diff changeset
70 my $id = shift @segments;
202
5146e17a7b76 IMPL::Web::Application::RestResource fixes, documentation
sergey
parents: 199
diff changeset
71
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
72 $res = $res->FetchChildResource($id);
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
73 }
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
74
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
75 $res = $res->InvokeHttpVerb($method,$action);
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
76 }
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
77
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
78 1;
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
79
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
80 __END__
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
81
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
82 =pod
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
83
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
84 =head1 NAME
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
85
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
86 C<IMPL::Web::Handler::RestController> - Обрабатывает C<HTTP> запрос передавая
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
87 его соответствующему ресурсу.
213
sergey
parents: 212
diff changeset
88
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
89 =head1 SYNOPSIS
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
90
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
91 Используется в конфигурации приложения как элемент цепочки обработчиков.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
92 Как правило располагается на самом верхнем уровне.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
93
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
94 =begin code xml
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
95
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
96 <handlers type="ARRAY">
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
97 <item type="IMPL::Web::Handler::RestController">
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
98 <rootResource type="My::App::Web::RootResource"/>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
99 </item>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
100 <item type="IMPL::Web::Handler::JSONView" />
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
101 <item type="IMPL::Web::Handler::SecureCookie" />
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
102 <item type="IMPL::Web::Handler::ErrorHandler" />
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
103 </handlers>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
104
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
105 =end code xml
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
106
213
sergey
parents: 212
diff changeset
107
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
108 =head1 DESCRIPTION
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
109
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
110 Использует C<PATH_INFO> для определения нужного ресурса, затем предает
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
111 найденному ресурсу управление для обработки запроса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
112
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
113 Если ресурс не найден, то возникает исключение C<IMPL::Web::NotFoundException>.
213
sergey
parents: 212
diff changeset
114
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
115 Для определения нужного ресурса контроллер разбивает C<PATH_INFO> на фрагменты
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
116 и использует каждый фрагмент для получения дочернего ресурса начиная с корневого.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
117 Для чего используется метод
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
118 C<< IMPL::Web::Application::ResourceInterface->FetchChildResource($childId) >>.
213
sergey
parents: 212
diff changeset
119
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
120 =head1 MEMEBERS
213
sergey
parents: 212
diff changeset
121
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
122 =head2 C<[get]rootResource>
213
sergey
parents: 212
diff changeset
123
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
124 Корневой ресурс приложения, должен быть всегда и реализовывать интерфес ресурса
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
125 C<IMPL::Web::Application::ResourceInterface>.
213
sergey
parents: 212
diff changeset
126
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
127 =head2 C<[get]trailingSlash>
213
sergey
parents: 212
diff changeset
128
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
129 Если данная переменная имеет значение C<true>, то слеш в конце пути к ресурсу
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
130 будет интерпретироваться, как дочерний ресурс с пустым идентификатором.
197
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
131
6b1dda998839 Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
diff changeset
132 =cut