annotate Lib/IMPL/Web/Handler/ErrorHandler.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 3cebcf6fdb9b
children 32aceba4ee6d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
1 package IMPL::Web::Handler::ErrorHandler;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
2 use strict;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
3
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
4 use IMPL::Const qw(:prop);
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
5 use IMPL::Exception();
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
6 use IMPL::declare {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
7 require => {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
8 WebException => 'IMPL::Web::Exception',
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
9 ArgumentException => '-IMPL::InvalidArgumentException',
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
10 IOException => '-IMPL::IOException',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
11 HttpResponse => 'IMPL::Web::HttpResponse'
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
12 },
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
13 base => {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
14 'IMPL::Object' => undef,
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
15 'IMPL::Object::Autofill' => '@_',
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
16 'IMPL::Object::Serializable' => undef
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
17 },
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
18 props => [
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
19 errors => PROP_RW,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
20 loader => PROP_RW,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
21 fallback => PROP_RW,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
22 contentType => PROP_RW
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
23 ]
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
24 };
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
25
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
26 sub CTOR {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
27 my ($this) = @_;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
28
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
29 die ArgumentException->new("loader") unless $this->loader;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
30 die ArgumentException->new("fallback") unless $this->fallback;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
31
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
32 $this->errors({}) unless $this->errors;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
33
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
34 }
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
35
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
36 sub Invoke {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
37 my ($this,$action,$next) = @_;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
38
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
39 undef $@;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
40 my $result;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
41 eval {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
42 $result = $next ? $next->($action) : undef;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
43 };
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
44
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
45 if (my $err = $@) {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
46
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
47 my $vars = {
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
48 error => $err
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
49 };
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
50
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
51 my $status = "500 Internal Server Error";
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
52
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
53 if (eval { $err->isa(WebException) }) {
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
54 $status = $err->status;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
55 }
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
56
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
57 my ($code) = ($status =~ m/^(\d+)/);
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
58
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
59 my $doc = $this->loader->document(
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
60 $this->errors->{$code} || $this->fallback,
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
61 $vars
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
62 );
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
63
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
64 my $text = $doc->Render($vars);
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
65
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
66 $result = HttpResponse->new(
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
67 status => $status,
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
68 type => $this->contentType,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
69 charset => 'utf-8',
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
70 headers => eval{ $err->headers } || {},
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
71 body => $text
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
72 );
206
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
73 }
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
74
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
75 return $result;
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
76 }
c8fe3f84feba +IMPL::Web::Handlers::ViewSelector
sergey
parents:
diff changeset
77
213
sergey
parents: 208
diff changeset
78 1;
sergey
parents: 208
diff changeset
79
sergey
parents: 208
diff changeset
80 __END__
sergey
parents: 208
diff changeset
81
sergey
parents: 208
diff changeset
82 =pod
sergey
parents: 208
diff changeset
83
sergey
parents: 208
diff changeset
84 =head1 NAME
sergey
parents: 208
diff changeset
85
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
86 C<IMPL::Web::Handler::ErrorHandler> - обертка для обработки исключений.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
87
213
sergey
parents: 208
diff changeset
88 =head1 SYNOPSIS
sergey
parents: 208
diff changeset
89
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
90 Используется в цеопчке обработчиков приложения.
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 =begin code xml
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 <handlers type="ARRAY">
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
95 <item type="IMPL::Web::Handler::ErrorHandler">
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
96 <contentType>text/html</contentType>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
97 <loader refid="tt-loader"/>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
98 <errors type="HASH">
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
99 <error extname="500">errors/500</error>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
100 <error extname="404">errors/404</error>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
101 <error extname="403">errors/403</error>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
102 </errors>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
103 <fallback>errors/500</fallback>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
104 </item>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
105 </handlers>
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
106
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
107 =end code xml
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
108
213
sergey
parents: 208
diff changeset
109 =head1 DESCRIPTION
sergey
parents: 208
diff changeset
110
229
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
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
114 В результате обработчик либо прозрачно передает результат вышестоящего
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
115 обработчика нижестоящему, либо создает C<IMPL::Web::HttpResponse> с
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
213
sergey
parents: 208
diff changeset
118 =cut