annotate Lib/IMPL/Web/AutoLocator.pm @ 245:7c517134c42f

Added Unsupported media type Web exception corrected resourceLocation setting in the resource Implemented localizable resources for text messages fixed TT view scopings, INIT block in controls now sets globals correctly.
author sergey
date Mon, 29 Oct 2012 03:15:22 +0400
parents a02b110da931
children 32aceba4ee6d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
1 package IMPL::Web::AutoLocator;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
2 use strict;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
3
244
a02b110da931 refactoring
sergey
parents: 232
diff changeset
4 use overload '""' => 'toString';
a02b110da931 refactoring
sergey
parents: 232
diff changeset
5
232
5c82eec23bb6 Fixed degradations due refactoring
sergey
parents: 229
diff changeset
6 use IMPL::Const qw(:prop);
244
a02b110da931 refactoring
sergey
parents: 232
diff changeset
7 use IMPL::lang qw(:hash);
a02b110da931 refactoring
sergey
parents: 232
diff changeset
8 use IMPL::clone qw(clone);
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
9 use URI;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
10 use URI::Escape;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
11 use IMPL::declare {
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
12 require => {
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
13 Exception => 'IMPL::Exception',
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
14 ArgumentException => '-IMPL::InvalidArgumentException'
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
15 },
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
16 base => [
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
17 'IMPL::Object' => undef,
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
18 'IMPL::Object::Autofill' => '@_',
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
19 'IMPL::Object::Serializable' => '@_'
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
20 ],
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
21 props => [
232
5c82eec23bb6 Fixed degradations due refactoring
sergey
parents: 229
diff changeset
22 base => PROP_RO,
5c82eec23bb6 Fixed degradations due refactoring
sergey
parents: 229
diff changeset
23 view => PROP_RW,
5c82eec23bb6 Fixed degradations due refactoring
sergey
parents: 229
diff changeset
24 query => PROP_RW,
5c82eec23bb6 Fixed degradations due refactoring
sergey
parents: 229
diff changeset
25 hash => PROP_RW
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
26 ]
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
27 };
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
28
244
a02b110da931 refactoring
sergey
parents: 232
diff changeset
29 sub Clone {
a02b110da931 refactoring
sergey
parents: 232
diff changeset
30 my $this = shift;
a02b110da931 refactoring
sergey
parents: 232
diff changeset
31
a02b110da931 refactoring
sergey
parents: 232
diff changeset
32 return clone($this);
a02b110da931 refactoring
sergey
parents: 232
diff changeset
33 }
a02b110da931 refactoring
sergey
parents: 232
diff changeset
34
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
35 sub Child {
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
36 my $this = shift;
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
37 my $child = shift or die ArgumentException->new("a child resource identifier is required");
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
38 die ArgumentException->new("a child resource can't be a reference") if ref $child;
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
39
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
40 # safe
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
41 $child = uri_escape($child);
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
42
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
43 my %args;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
44
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
45 $args{base} = $this->base =~ /\/$/ ? $this->base . $child : $this->base . '/' . $child;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
46 $args{view} = $this->view if $this->view;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
47 $args{hash} = $this->hash if $this->hash;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
48
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
49 if (@_) {
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
50 my $query = shift;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
51
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
52 $args{query} = ref $query eq 'HASH' ? hashMerge($this->query,$query) : $query;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
53 }
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
54
212
292226770180 bugfixes
sergey
parents: 211
diff changeset
55 return $this->new(%args);
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
56 }
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
57
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
58 sub SetView {
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
59 my ($this,$newView) = @_;
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
60
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
61 $this->view($newView);
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
62
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
63 return $this;
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
64 }
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
65
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
66 sub url {
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
67 my ($this) = @_;
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
68
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
69 my $url = URI->new($this->view ? $this->base . "." . $this->view : $this->base);
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
70 $url->query_form($this->query);
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
71 $url->fragment($this->hash);
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
72
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
73 return $url;
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
74 }
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
75
244
a02b110da931 refactoring
sergey
parents: 232
diff changeset
76 sub toString {
a02b110da931 refactoring
sergey
parents: 232
diff changeset
77 shift->url->as_string();
a02b110da931 refactoring
sergey
parents: 232
diff changeset
78 }
a02b110da931 refactoring
sergey
parents: 232
diff changeset
79
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
80 sub AUTOLOAD {
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
81 our $AUTOLOAD;
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
82
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
83 (my $method) = ($AUTOLOAD =~ m/(\w+)$/);
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
84
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
85 return if $method eq 'DESTROY';
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
86
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
87 my $this = shift;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
88 return $this->Child($method,@_);
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
89 }
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
90
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
91
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
92
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
93 1;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
94
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
95 __END__
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
96
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
97 =head1 NAME
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
98
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
99 C<IMPL::Web::AutoLocator> - Обертка вокруг адреса ресурса.
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
100
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
101 =head1 SYNOPSIS
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
102
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
103 =begin code
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
104
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
105 use IMPL::require {
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
106 Locator => 'IMPL::Web::AutoLocator'
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
107 };
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
108
212
292226770180 bugfixes
sergey
parents: 211
diff changeset
109 my $bugTracker = Locator->new(base => "http://myhost.org/bugzilla")->SetView("cgi");
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
110
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
111 my $bug = $bugTracker->show_bug({id = 1});
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
112
212
292226770180 bugfixes
sergey
parents: 211
diff changeset
113 my $wikiPages = Locator->new(base => "http://myhost.org/wiki/bin/view");
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
114
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
115 my $page = $wiki->Main->HowTo;
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
116
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
117 my $images = Locator->new(base => "http://static.myhost.org/images", view => "png");
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
118
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
119 my $editIco = $images->icons->small->edit;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
120
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
121 =end code
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
122
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
123 =head1 DESCRIPTION
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents:
diff changeset
124
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
125 Для удобстав навигации по ресурсам, полностью отражает классическую структуру
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
126 иерархически организованных ресурсов. позволяет гибко работать с параметрами
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
127 запроса и хешем. Для постоты чтения реализует метод C<AUTOLOAD> для доступа
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
128 к дочерним ресурсам.
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
129
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
130 =head1 MEMBERS
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
131
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
132 =head2 C<CTOR(%args)>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
133
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
134 Создает новый объект расположение. Позволяет задать путь, расширение, параметры
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
135 запроса и фрагмент ресурса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
136
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
137 =over
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
138
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
139 =item * C<base>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
140
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
141 Строка с базовым адресом для дочерних ресурсов.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
142
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
143 =item * C<view>
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
144
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
145 Задает суфикс, обозначающий представление ресурса, аналогично расширению у
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
146 файлов. Данный суффикс может использоваться контроллером для выбора
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
147 представления ресурса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
148
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
149 =item * C<query>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
150
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
151 Ссылка на хеш с параметрами запроса
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
152
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
153 =item * C<hash>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
154
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
155 Часть C<uri> обозначающая фрагмент документа (все, что идет после символа C<#>).
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
156
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
157 =back
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
158
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
159 =head2 C<Child($child[,$query])>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
160
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
161 Получает расположение дочернего ресурса. При этом cоздается новый объект адреса ресурса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
162
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
163 =head2 C<SetView($view)>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
164
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
165 Позволяет указать представление (расширение) у текущего адреса ресурса. Изменяет
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
166 представление и возвращает измененный адрес ресурса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
167
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
168 =head2 C<[get]base>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
169
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
170 Базовый адрес, относительно которого будут получены дочерние ресурсы.
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
171
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
172 =head2 C<[get,set]view>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
173
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
174 Представление для ресурсов, аналогично расширению у файлов.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
175
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
176 =head2 C<[get,set]query>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
177
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
178 Ссылка на хеш с параметрами для C<GET> запроса.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
179
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
180 =head2 C<[get,set]hash>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
181
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
182 Часть адреса ресурса, отвечающая за фрагмент.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
183
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
184 =head2 C<[get]url>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
185
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
186 Объект C<URI> для текущего адреса.
211
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
187
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
188 =head2 C<AUTLOAD>
2b9b55cfb79b Completed IMPL::Web::AutoLocator, added tests
cin
parents: 210
diff changeset
189
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 212
diff changeset
190 Перенаправляет вызовы методов в метод C<Child> передавая первым параметром имя метода.
212
292226770180 bugfixes
sergey
parents: 211
diff changeset
191
292226770180 bugfixes
sergey
parents: 211
diff changeset
192 =cut
292226770180 bugfixes
sergey
parents: 211
diff changeset
193