annotate Lib/IMPL/Web/Application.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 546957c50a36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
1 package IMPL::Web::Application;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
2 use strict;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
3 use warnings;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
4
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
5 use CGI;
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
6 use Carp qw(carp);
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
7 use IMPL::Const qw(:prop);
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
8
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
9 use IMPL::declare {
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
10 require => {
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
11 Locator => 'IMPL::Web::AutoLocator',
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
12 TAction => 'IMPL::Web::Application::Action',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
13 HttpResponse => 'IMPL::Web::HttpResponse',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
14 TFactory => '-IMPL::Object::Factory',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
15 Exception => 'IMPL::Exception',
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
16 InvalidOperationException => '-IMPL::InvalidOperationException',
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
17 Loader => 'IMPL::Code::Loader'
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
18 },
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
19 base => [
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
20 'IMPL::Config' => '@_',
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
21 'IMPL::Object::Singleton' => '@_'
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
22 ],
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
23 props => [
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
24 baseUrl => PROP_RW,
233
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
25 actionFactory => PROP_RW,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
26 handlers => PROP_RW | PROP_LIST,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
27 security => PROP_RW,
3cebcf6fdb9b refactoring, cleaning code
sergey
parents: 230
diff changeset
28 options => PROP_RW,
242
fe9d62d9054d requestCharset support
sergey
parents: 233
diff changeset
29 requestCharset => PROP_RW,
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
30 output => PROP_RW,
a02b110da931 refactoring
sergey
parents: 242
diff changeset
31 location => PROP_RO
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
32 ]
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
33 };
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
34
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
35 sub CTOR {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
36 my ($this) = @_;
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
37
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
38 die IMPL::InvalidArgumentException->new( "handlers",
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
39 "At least one handler should be supplied" )
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
40 unless $this->handlers->Count;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
41
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
42 $this->baseUrl('/') unless $this->baseUrl;
a02b110da931 refactoring
sergey
parents: 242
diff changeset
43
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
44 $this->actionFactory(TAction) unless $this->actionFactory;
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
45 $this->location(Locator->new(base => $this->baseUrl));
62
c64bd1bf727d Web application
wizard
parents: 60
diff changeset
46 }
c64bd1bf727d Web application
wizard
parents: 60
diff changeset
47
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
48 sub Run {
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
49 my ($this) = @_;
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 my $handler;
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 $handler = _ChainHandler( $_, $handler ) foreach $this->handlers;
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 while ( my $query = $this->FetchRequest() ) {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
56
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
57 my $action = $this->actionFactory->new(
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
58 query => $query,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
59 application => $this,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
60 );
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
61
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
62 eval {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
63 my $result = $handler->($action);
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
64
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
65 die InvalidOperationException->new(
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
66 "Invalid handlers result. A reference to IMPL::Web::HttpResponse is expexted."
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
67 ) unless eval { $result->isa(HttpResponse) };
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
68
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
69 $result->PrintResponse( $this->output );
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
70 };
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
71 if ($@) {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
72 my $e = $@;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
73
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
74 HttpResponse->InternalError(
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
75 type => 'text/plain',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
76 charset => 'utf-8',
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
77 body => $e
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
78 )->PrintResponse( $this->output );
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
79
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
80 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
81 }
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
82 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
83
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
84 sub _ChainHandler {
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
85 my ( $handler, $next ) = @_;
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
86
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
87 if ( ref $handler eq 'CODE' ) {
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
88 return sub {
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
89 my ($action) = @_;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
90 return $handler->( $action, $next );
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
91 };
229
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 elsif ( eval { $handler->can('Invoke') } ) {
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
94 return sub {
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
95 my ($action) = @_;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
96 return $handler->Invoke( $action, $next );
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
97 };
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
98 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
99 elsif ( eval { $handler->isa(TFactory) } ) {
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
100 return sub {
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
101 my ($action) = @_;
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
102 my $inst = $handler->new();
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
103 return $inst->Invoke( $action, $next );
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 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
106 elsif ( $handler
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
107 and not ref $handler
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
108 and $handler =~ m/^(-)?(\w+(?:::\w+)*)$/ )
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
109 {
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
110 my $class = $2;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
111 if ( not $1 ) {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
112 Loader->safe->Require($class);
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
113 die IMPL::InvalidArgumentException->(
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
114 "An invalid handler supplied", $handler
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
115 ) unless $class->can('Invoke');
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
116 }
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
117
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
118 return sub {
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
119 my ($action) = @_;
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
120 my $inst = $class->new();
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
121 return $inst->Invoke( $action, $next );
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
122 };
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
123 }
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
124 else {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
125 die new IMPL::InvalidArgumentException( "An invalid handler supplied",
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
126 $handler );
198
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
127 }
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
128 }
2ffe6f661605 Implemented IMPL::Web::Handler::RestController
cin
parents: 194
diff changeset
129
97
964587c5183c Added SecureCall to Web QueryHandlers stack
wizard
parents: 73
diff changeset
130 sub FetchRequest {
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
131
a02b110da931 refactoring
sergey
parents: 242
diff changeset
132 return;
138
c5bc900eefd3 IMPL::Web::Application: Fixed file uploading
wizard
parents: 130
diff changeset
133 }
c5bc900eefd3 IMPL::Web::Application: Fixed file uploading
wizard
parents: 130
diff changeset
134
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
135 1;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
136
52
15d720913562 security in work
wizard@linux-odin.local
parents: 49
diff changeset
137 __END__
15d720913562 security in work
wizard@linux-odin.local
parents: 49
diff changeset
138
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
139 =pod
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
140
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
141 =head1 NAME
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
142
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
143 C<IMPL::Web::Application> Базовай класс для создания экземпляров приложения
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
144
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
145 =head1 SYNOPSIS
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
146
67
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
147 =begin code
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
148
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
149 use IMPL::require {
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
150 App => 'IMPL::Web::Application'
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
151 };
67
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
152
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
153 my $instance = App->spawn(); # will use ./IMPL/Web/Application.xml as configuration
67
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
154
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
155 $instance->Run;
67
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
156
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
157 =end code
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
158
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
159 =head1 DESCRIPTION
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
160
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
161 Создает экземпляр объекта, который получает и обрабатывает C<HTTP> запрос.
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
162 Приложение можно загрузить из C<xml> файла в котором описано состояние свойств,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
163 для этого используется механизм C<IMPL::Serialization>.
67
9f5795a10939 Documentation, minor fixes
wizard
parents: 65
diff changeset
164
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
165 Приложение представлет собой модульную конструкцию, которая состоит из цепочки
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
166 обработчиков. Цепочка обработчиков вызывается снизу вверх, при этом каждый
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
167 обработчик самостоятельно рекурсивно вызывает следующий (более высокого уровня).
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
168
244
a02b110da931 refactoring
sergey
parents: 242
diff changeset
169 См. также C<IMPL::Web::CGIApplication>
a02b110da931 refactoring
sergey
parents: 242
diff changeset
170
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 47
diff changeset
171 =cut