Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/ControllerUnit.pm @ 134:44977efed303
Significant performance optimizations
Fixed recursion problems due converting objects to JSON
Added cache support for the templates
Added discovery feature for the web methods
| author | wizard |
|---|---|
| date | Mon, 21 Jun 2010 02:39:53 +0400 |
| parents | a07a66fd8d5c |
| children | c5bc900eefd3 |
comparison
equal
deleted
inserted
replaced
| 133:a07a66fd8d5c | 134:44977efed303 |
|---|---|
| 35 $this->action($action); | 35 $this->action($action); |
| 36 $this->application($action->application); | 36 $this->application($action->application); |
| 37 $this->query($action->query); | 37 $this->query($action->query); |
| 38 | 38 |
| 39 $this->$_($args->{$_}) foreach qw(formData formSchema formErrors); | 39 $this->$_($args->{$_}) foreach qw(formData formSchema formErrors); |
| 40 } | |
| 41 | |
| 42 sub unitNamespace() { | |
| 43 "" | |
| 44 } | |
| 45 | |
| 46 sub transactions { | |
| 47 my ($self,%methods) = @_; | |
| 48 | |
| 49 while (my ($method,$info) = each %methods) { | |
| 50 if ($info and ref $info ne 'HASH') { | |
| 51 warn "Bad transaction $method description"; | |
| 52 $info = {}; | |
| 53 } | |
| 54 | |
| 55 $info->{wrapper} = 'TransactionWrapper'; | |
| 56 $self->class_data(CONTROLLER_METHODS)->{$method} = $info; | |
| 57 } | |
| 40 } | 58 } |
| 41 | 59 |
| 42 sub forms { | 60 sub forms { |
| 43 my ($self,%forms) = @_; | 61 my ($self,%forms) = @_; |
| 44 | 62 |
| 163 | 181 |
| 164 return IMPL::DOM::Schema->LoadSchema(File::Spec->catfile($vol,$dir,$name)); | 182 return IMPL::DOM::Schema->LoadSchema(File::Spec->catfile($vol,$dir,$name)); |
| 165 } | 183 } |
| 166 } | 184 } |
| 167 | 185 |
| 168 sub webMethod($$;$$) { | 186 sub discover { |
| 169 my ($name,$args,$body,$options) = @_; | 187 my ($this) = @_; |
| 170 | 188 |
| 171 my %info = %$options; | 189 my $methods = $this->class_data(CONTROLLER_METHODS); |
| 172 $info{parameters} = $args; | 190 |
| 173 $info{name} = $name; | 191 my $namespace = $this->unitNamespace; |
| 174 $info{module} = scalar caller; | 192 (my $module = typeof $this) =~ s/^$namespace//; |
| 175 | 193 |
| 176 | 194 my %smd = ( |
| 177 } | 195 module => [grep $_, split /::/, $module ], |
| 178 | 196 ); |
| 179 public webMethod discover => sub { | 197 |
| 180 | 198 while (my ($method,$info) = each %$methods) { |
| 181 }, { schema => 'some schema', returns => 'HASH' } ; | 199 my %methodInfo = ( |
| 200 name => $method | |
| 201 ); | |
| 202 $methodInfo{parameters} = $info->{parameters} if $info->{parameters}; | |
| 203 push @{$smd{methods}},\%methodInfo; | |
| 204 } | |
| 205 return \%smd; | |
| 206 } | |
| 207 | |
| 208 __PACKAGE__->transactions( | |
| 209 discover => undef | |
| 210 ); | |
| 182 | 211 |
| 183 1; | 212 1; |
| 184 | 213 |
| 185 __END__ | 214 __END__ |
| 186 | 215 |
| 314 =item C<FormWrapper($method,$action,$methodInfo)> | 343 =item C<FormWrapper($method,$action,$methodInfo)> |
| 315 | 344 |
| 316 Обертка для конструирования форм, может быть переопределен для конструирования контекста по | 345 Обертка для конструирования форм, может быть переопределен для конструирования контекста по |
| 317 своим правилам. | 346 своим правилам. |
| 318 | 347 |
| 348 =item C<discover()> | |
| 349 | |
| 350 Метод, опубликованный для вызова контроллером, возвращает описание методов в формате C<Simple Module Definition>. | |
| 351 | |
| 352 =begin code | |
| 353 | |
| 354 # SMD structure | |
| 355 { | |
| 356 module => ['Foo','Bar'], | |
| 357 methods => [ | |
| 358 { | |
| 359 name => 'search', | |
| 360 parameters => ['text','limit'] #optional | |
| 361 } | |
| 362 ] | |
| 363 } | |
| 364 | |
| 365 =end code | |
| 366 | |
| 319 =back | 367 =back |
| 320 | 368 |
| 321 =head1 EXAMPLE | 369 =head1 EXAMPLE |
| 322 | 370 |
| 323 =begin code | 371 =begin code |
| 326 use strict; | 374 use strict; |
| 327 use base qw(IMPL::Web::Application::ControllerUnit); | 375 use base qw(IMPL::Web::Application::ControllerUnit); |
| 328 | 376 |
| 329 __PACKAGE__->PassThroughArgs; | 377 __PACKAGE__->PassThroughArgs; |
| 330 | 378 |
| 331 __PACKAGE__->transactions(qw( | 379 sub unitDataClass { 'My::Books' } |
| 332 find | 380 |
| 333 info | 381 __PACKAGE__->transactions( |
| 334 )); | 382 find => { |
| 383 parameters => [qw(author)] | |
| 384 }, | |
| 385 info => { | |
| 386 parameters => [qw(id)] | |
| 387 } | |
| 388 ); | |
| 335 __PACKAGE__->forms( | 389 __PACKAGE__->forms( |
| 336 create => 'books.create.xml' | 390 create => 'books.create.xml' |
| 337 ); | 391 ); |
| 338 | 392 |
| 339 sub find { | 393 sub find { |
| 340 my ($this) = @_; | 394 my ($this,$author) = @_; |
| 341 | 395 |
| 342 return $this->application->dataSource->resultset('Books')->find({author => $this->query->param('author')}); | 396 return $this->ds->find({author => $author}); |
| 343 } | 397 } |
| 344 | 398 |
| 345 sub info { | 399 sub info { |
| 346 my ($this) = @_; | 400 my ($this,$id) = @_; |
| 347 | 401 |
| 348 return $this->application->dataSource->resultset('Books')->find({id => $this->query->param('id')}); | 402 return $this->ds->find({id => $id}); |
| 349 } | 403 } |
| 350 | 404 |
| 351 sub create { | 405 sub create { |
| 352 my ($this) = @_; | 406 my ($this) = @_; |
| 353 | 407 |
| 354 my %book = map { | 408 my %book = map { |
| 355 $_ => $this->formData->selectSingleNode($_)->nodeValue | 409 $_->nodeName, $_->nodeValue |
| 356 } qw(author_id title year ISBN); | 410 } $this->formData->selectNodes([qw(author_id title year ISBN)]); |
| 357 | 411 |
| 358 return $this->application->datasource->resultset('Books')->create(\%book); | 412 return $this->ds->create(\%book); |
| 359 } | 413 } |
| 360 | 414 |
| 361 =end code | 415 =end code |
| 362 | 416 |
| 363 =cut | 417 =cut |
