Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/Action.pm @ 194:4d0e1962161c
Replaced tabs with spaces
IMPL::Web::View - fixed document model, new features (control classes, document constructor parameters)
author | cin |
---|---|
date | Tue, 10 Apr 2012 20:08:29 +0400 |
parents | d1676be8afcc |
children | c8fe3f84feba |
comparison
equal
deleted
inserted
replaced
193:8e8401c0aea4 | 194:4d0e1962161c |
---|---|
6 __PACKAGE__->PassThroughArgs; | 6 __PACKAGE__->PassThroughArgs; |
7 | 7 |
8 use IMPL::Class::Property; | 8 use IMPL::Class::Property; |
9 | 9 |
10 BEGIN { | 10 BEGIN { |
11 public property application => prop_get | owner_set; | 11 public property application => prop_get | owner_set; |
12 public property query => prop_get | owner_set; | 12 public property query => prop_get | owner_set; |
13 public property response => prop_get | owner_set; | 13 public property response => prop_get | owner_set; |
14 public property responseFactory => prop_get | owner_set; | 14 public property responseFactory => prop_get | owner_set; |
15 public property context => prop_get | owner_set; | 15 public property context => prop_get | owner_set; |
16 private property _entryPoint => prop_all; | 16 private property _entryPoint => prop_all; |
17 } | 17 } |
18 | 18 |
19 sub CTOR { | 19 sub CTOR { |
20 my ($this) = @_; | 20 my ($this) = @_; |
21 | 21 |
22 $this->responseFactory('IMPL::Web::Application::Response') unless $this->responseFactory; | 22 $this->responseFactory('IMPL::Web::Application::Response') unless $this->responseFactory; |
23 $this->response( $this->responseFactory->new(query => $this->query) ); | 23 $this->response( $this->responseFactory->new(query => $this->query) ); |
24 $this->context({}); | 24 $this->context({}); |
25 } | 25 } |
26 | 26 |
27 sub Invoke { | 27 sub Invoke { |
28 my ($this) = @_; | 28 my ($this) = @_; |
29 | 29 |
30 if ($this->_entryPoint) { | 30 if ($this->_entryPoint) { |
31 $this->_entryPoint->(); | 31 $this->_entryPoint->(); |
32 } else { | 32 } else { |
33 die new IMPL::InvalidOperationException("At least one handler is required"); | 33 die new IMPL::InvalidOperationException("At least one handler is required"); |
34 } | 34 } |
35 } | 35 } |
36 | 36 |
37 sub ReinitResponse { | 37 sub ReinitResponse { |
38 my ($this) = @_; | 38 my ($this) = @_; |
39 | 39 |
40 die new IMPL::InvalidOperationException("Response already sent") if $this->response->isHeaderPrinted; | 40 die new IMPL::InvalidOperationException("Response already sent") if $this->response->isHeaderPrinted; |
41 | 41 |
42 $this->response->Discard; | 42 $this->response->Discard; |
43 $this->response($this->responseFactory->new(query => $this->query)); | 43 $this->response($this->responseFactory->new(query => $this->query)); |
44 } | 44 } |
45 | 45 |
46 sub ChainHandler { | 46 sub ChainHandler { |
47 my ($this,$handler) = @_; | 47 my ($this,$handler) = @_; |
48 | 48 |
49 my $delegateNext = $this->_entryPoint(); | 49 my $delegateNext = $this->_entryPoint(); |
50 | 50 |
51 if (ref $handler eq 'CODE') { | 51 if (ref $handler eq 'CODE') { |
52 $this->_entryPoint( sub { | 52 $this->_entryPoint( sub { |
53 $handler->($this,$delegateNext); | 53 $handler->($this,$delegateNext); |
54 } ); | 54 } ); |
55 } elsif (ref $handler and UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { | 55 } elsif (ref $handler and UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { |
56 $this->_entryPoint( sub { | 56 $this->_entryPoint( sub { |
57 $handler->Invoke($this,$delegateNext); | 57 $handler->Invoke($this,$delegateNext); |
58 } ); | 58 } ); |
59 } elsif ($handler and not ref $handler) { | 59 } elsif ($handler and not ref $handler) { |
60 | 60 |
61 if (my $method = $this->can($handler) ) { | 61 if (my $method = $this->can($handler) ) { |
62 $this->_entryPoint( sub { | 62 $this->_entryPoint( sub { |
63 $method->($this,$delegateNext); | 63 $method->($this,$delegateNext); |
64 } ); | 64 } ); |
65 } else { | 65 } else { |
66 { | 66 { |
67 no strict 'refs'; | 67 no strict 'refs'; |
68 eval "require $handler; 1;" or die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler,"Failed to load module") unless keys %{"${handler}::"}; | 68 eval "require $handler; 1;" or die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler,"Failed to load module") unless keys %{"${handler}::"}; |
69 } | 69 } |
70 | 70 |
71 if (UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { | 71 if (UNIVERSAL::isa($handler,'IMPL::Web::QueryHandler')) { |
72 $this->_entryPoint( sub { | 72 $this->_entryPoint( sub { |
73 $handler->Invoke($this,$delegateNext); | 73 $handler->Invoke($this,$delegateNext); |
74 } ); | 74 } ); |
75 } else { | 75 } else { |
76 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); | 76 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); |
77 } | 77 } |
78 } | 78 } |
79 } else { | 79 } else { |
80 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); | 80 die new IMPL::InvalidArgumentException("An invalid handler supplied",$handler); |
81 } | 81 } |
82 | 82 |
83 } | 83 } |
84 | 84 |
85 sub cookie { | 85 sub cookie { |
86 my ($this,$name,$rx) = @_; | 86 my ($this,$name,$rx) = @_; |
87 | 87 |
88 $this->_launder(scalar( $this->query->cookie($name) ), $rx ); | 88 $this->_launder(scalar( $this->query->cookie($name) ), $rx ); |
89 } | 89 } |
90 | 90 |
91 sub param { | 91 sub param { |
92 my ($this,$name,$rx) = @_; | 92 my ($this,$name,$rx) = @_; |
93 | 93 |
94 $this->_launder(scalar( $this->query->param($name) ), $rx ); | 94 $this->_launder(scalar( $this->query->param($name) ), $rx ); |
95 } | 95 } |
96 | 96 |
97 sub _launder { | 97 sub _launder { |
98 my ($this,$value,$rx) = @_; | 98 my ($this,$value,$rx) = @_; |
99 | 99 |
100 if ( $value ) { | 100 if ( $value ) { |
101 if ($rx) { | 101 if ($rx) { |
102 if ( my @result = ($value =~ m/$rx/) ) { | 102 if ( my @result = ($value =~ m/$rx/) ) { |
103 return @result > 1 ? \@result : $result[0]; | 103 return @result > 1 ? \@result : $result[0]; |
104 } else { | 104 } else { |
105 return undef; | 105 return undef; |
106 } | 106 } |
107 } else { | 107 } else { |
108 return $value; | 108 return $value; |
109 } | 109 } |
110 } else { | 110 } else { |
111 return undef; | 111 return undef; |
112 } | 112 } |
113 } | 113 } |
114 | 114 |
115 1; | 115 1; |
116 | 116 |
117 __END__ | 117 __END__ |
145 =begin code | 145 =begin code |
146 | 146 |
147 # the application creates a new Action object | 147 # the application creates a new Action object |
148 | 148 |
149 my $action = $application->actionFactory->new( | 149 my $action = $application->actionFactory->new( |
150 action => $application, # the application passes self | 150 action => $application, # the application passes self |
151 query => $query # current CGI query | 151 query => $query # current CGI query |
152 ); | 152 ); |
153 | 153 |
154 # forms query handlers stack | 154 # forms query handlers stack |
155 | 155 |
156 $action->ChainHandler($_) foreach qw ( | 156 $action->ChainHandler($_) foreach qw ( |
157 IMPL::Web::QueryHandler::SecCallToMethod | 157 IMPL::Web::QueryHandler::SecCallToMethod |
158 IMPL::Web::QueryHandler::AuthenticateCookie | 158 IMPL::Web::QueryHandler::AuthenticateCookie |
159 IMPL::Web::QueryHandler::PageFormat | 159 IMPL::Web::QueryHandler::PageFormat |
160 ); | 160 ); |
161 | 161 |
162 # and finally invokes the action | 162 # and finally invokes the action |
163 | 163 |
164 $action->Invoke() { | 164 $action->Invoke() { |
165 | 165 |
166 # some internals | 166 # some internals |
167 | 167 |
168 IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) { | 168 IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) { |
169 | 169 |
170 #some internals | 170 #some internals |
171 | 171 |
172 my $result = $nextHandlerIsAuthHandler() { | 172 my $result = $nextHandlerIsAuthHandler() { |
173 | 173 |
174 # some internals | 174 # some internals |
175 | 175 |
176 IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) { | 176 IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) { |
177 | 177 |
178 # some internals | 178 # some internals |
179 # do auth and generate security $context | 179 # do auth and generate security $context |
180 | 180 |
181 # impersonate $context and call the next handler | 181 # impersonate $context and call the next handler |
182 return $context->Impersonate($nextHandlerIsSecCall) { | 182 return $context->Impersonate($nextHandlerIsSecCall) { |
183 | 183 |
184 # some internals | 184 # some internals |
185 | 185 |
186 IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) { | 186 IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) { |
187 | 187 |
188 # next handler isn't present as it is the last hanler | 188 # next handler isn't present as it is the last hanler |
189 | 189 |
190 # some internals | 190 # some internals |
191 # calculate the $method and the $target from CGI request | 191 # calculate the $method and the $target from CGI request |
192 | 192 |
193 IMPL::Security->AccessCheck($target,$method); | 193 IMPL::Security->AccessCheck($target,$method); |
194 return $target->$method(); | 194 return $target->$method(); |
195 | 195 |
196 } | 196 } |
197 | 197 |
198 } | 198 } |
199 | 199 |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
203 # some intenals | 203 # some intenals |
204 # formatted output to $action->response->streamBody | 204 # formatted output to $action->response->streamBody |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 =end code | 208 =end code |
209 | 209 |
210 или как альтернатива может быть еще | 210 или как альтернатива может быть еще |