annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
1 use strict;
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
2 package IMPL::Web::Application::ControllerUnit;
c13a215508ca Refactoring,
wizard
parents:
diff changeset
3 use base qw(IMPL::Object);
c13a215508ca Refactoring,
wizard
parents:
diff changeset
4
c13a215508ca Refactoring,
wizard
parents:
diff changeset
5 use IMPL::Class::Property;
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
6 use IMPL::DOM::Transform::PostToDOM;
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
7 use IMPL::DOM::Schema;
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
8 use Class::Inspector;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
9 use File::Spec;
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
10 use Sub::Name;
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
11
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
12 use constant {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
13 CONTROLLER_METHODS => 'controller_methods',
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
14 STATE_CORRECT => 'correct',
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
15 STATE_NEW => 'new',
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
16 STATE_INVALID => 'invalid'
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
17 };
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
18
c13a215508ca Refactoring,
wizard
parents:
diff changeset
19 BEGIN {
c13a215508ca Refactoring,
wizard
parents:
diff changeset
20 public property action => prop_get | owner_set;
c13a215508ca Refactoring,
wizard
parents:
diff changeset
21 public property application => prop_get | owner_set;
c13a215508ca Refactoring,
wizard
parents:
diff changeset
22 public property query => prop_get | owner_set;
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
23 public property formData => prop_get | owner_set;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
24 public property formSchema => prop_get | owner_set;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
25 public property formErrors => prop_get | owner_set;
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
26 }
c13a215508ca Refactoring,
wizard
parents:
diff changeset
27
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
28 my %publicProps = map {$_->Name , 1} __PACKAGE__->get_meta(typeof IMPL::Class::PropertyInfo);
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
29
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
30 __PACKAGE__->class_data(CONTROLLER_METHODS,{});
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
31
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
32 sub CTOR {
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
33 my ($this,$action,$args) = @_;
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
34
c13a215508ca Refactoring,
wizard
parents:
diff changeset
35 $this->action($action);
c13a215508ca Refactoring,
wizard
parents:
diff changeset
36 $this->application($action->application);
c13a215508ca Refactoring,
wizard
parents:
diff changeset
37 $this->query($action->query);
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
38
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
39 $this->$_($args->{$_}) foreach qw(formData formSchema formErrors);
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
40 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
41
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
42 sub unitNamespace() {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
43 ""
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
44 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
45
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
46 sub transactions {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
47 my ($self,%methods) = @_;
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
48
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
49 while (my ($method,$info) = each %methods) {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
50 if ($info and ref $info ne 'HASH') {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
51 warn "Bad transaction $method description";
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
52 $info = {};
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
53 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
54
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
55 $info->{wrapper} = 'TransactionWrapper';
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
56 $self->class_data(CONTROLLER_METHODS)->{$method} = $info;
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
57 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
58 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
59
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
60 sub forms {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
61 my ($self,%forms) = @_;
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
62
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
63 while ( my ($method,$info) = each %forms ) {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
64 die new IMPL::Exception("A method doesn't exists in the controller",$self,$method) unless $self->can($method);
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
65 if ( not ref $info ) {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
66 $self->class_data(CONTROLLER_METHODS)->{$method} = {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
67 wrapper => 'FormWrapper',
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
68 schema => $info
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
69 };
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
70 } elsif (ref $info eq 'HASH') {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
71 die new IMPL::Exception("A schema must be specified",$self,$method) unless $info->{schema};
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
72
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
73 $self->class_data(CONTROLLER_METHODS)->{$method} = {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
74 wrapper => 'FormWrapper',
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
75 schema => $info->{schema}
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
76 };
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
77 } else {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
78 die new IMPL::Exception("Unsupported method information",$self,$method);
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
79 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
80 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
81 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
82
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
83 sub InvokeAction {
c13a215508ca Refactoring,
wizard
parents:
diff changeset
84 my ($self,$method,$action) = @_;
c13a215508ca Refactoring,
wizard
parents:
diff changeset
85
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
86 if (my $methodInfo = $self->class_data(CONTROLLER_METHODS)->{$method}) {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
87 if (my $wrapper = $methodInfo->{wrapper}) {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
88 return $self->$wrapper($method,$action,$methodInfo);
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
89 } else {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
90 return $self->TransactionWrapper($method,$action,$methodInfo);
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
91 }
110
c13a215508ca Refactoring,
wizard
parents:
diff changeset
92 } else {
c13a215508ca Refactoring,
wizard
parents:
diff changeset
93 die new IMPL::InvalidOperationException("Invalid method call",$self,$method);
c13a215508ca Refactoring,
wizard
parents:
diff changeset
94 }
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
95 }
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
96
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
97 sub MakeParams {
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
98 my ($this,$methodInfo) = @_;
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
99
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
100 my $params;
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
101 if ($params = $methodInfo->{parameters} and ref $params eq 'ARRAY') {
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
102 return map $this->ResolveParam($_), @$params;
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
103 }
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
104 return();
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
105 }
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
106
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
107 sub ResolveParam {
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
108 my ($this,$param) = @_;
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
109
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
110 if ( $param =~ /^::(\w+)$/ and $publicProps{$1}) {
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
111 return $this->$1();
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
112 } else {
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
113 return $this->query->param($param);
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
114 }
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
115 }
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
116
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
117 sub TransactionWrapper {
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
118 my ($self,$method,$action,$methodInfo) = @_;
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
119
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
120 my $unit = $self->new($action);
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
121 return $unit->$method($unit->MakeParams($methodInfo));
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
122 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
123
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
124 sub FormWrapper {
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
125 my ($self,$method,$action,$methodInfo) = @_;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
126
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
127 my $schema = $self->loadSchema($methodInfo->{schema});
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
128
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
129 my $process = $action->query->param('process') || 0;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
130 my $form = $methodInfo->{form}
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
131 || $action->query->param('form')
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
132 || $schema->selectSingleNode('ComplexNode')->name
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
133 or die new IMPL::Exception('No situable form name could be determined',$self,$method);
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
134
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
135 my %result;
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
136
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
137 my $transform = IMPL::DOM::Transform::PostToDOM->new(
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
138 undef,
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
139 $schema,
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
140 $form
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
141 );
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
142
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
143 $result{formSchema} = $schema;
126
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
144 $result{formData} = $transform->Transform($action->query);
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
145
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
146
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
147 if ($process) {
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
148 $result{formErrors} = $transform->Errors->as_list;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
149 if ($transform->Errors->Count) {
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
150 $result{state} = STATE_INVALID;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
151 } else {
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
152 $result{state} = STATE_CORRECT;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
153 my $unit = $self->new($action,\%result);
127
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
154
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
155 eval {
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
156 $result{result} = $unit->$method($unit->MakeParams($methodInfo));
127
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
157 };
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
158 if (my $err = $@) {
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
159 $result{state} = STATE_INVALID;
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
160 if (eval { $err->isa(typeof IMPL::WrongDataException) } ) {
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
161 $result{formErrors} = $err->Args;
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
162 } else {
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
163 die $err;
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
164 }
0dce0470a3d8 In the IMPL::Web::ControllerUnit added the ability to notify a form about a wrong data from a transaction
wizard
parents: 126
diff changeset
165 }
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
166 }
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
167 } else {
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
168 $result{state} = STATE_NEW;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
169 }
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
170
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
171 return \%result;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
172 }
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
173
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
174 sub loadSchema {
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
175 my ($self,$name) = @_;
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
176
126
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
177 if (-f $name) {
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
178 return IMPL::DOM::Schema->LoadSchema($name);
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
179 } else {
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
180 my ($vol,$dir,$file) = File::Spec->splitpath( Class::Inspector->resolved_filename(ref $self || $self) );
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
181
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
182 return IMPL::DOM::Schema->LoadSchema(File::Spec->catfile($vol,$dir,$name));
c8dfbbdd8005 Several bug fixes
wizard
parents: 113
diff changeset
183 }
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
184 }
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
185
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
186 sub discover {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
187 my ($this) = @_;
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
188
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
189 my $methods = $this->class_data(CONTROLLER_METHODS);
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
190
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
191 my $namespace = $this->unitNamespace;
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
192 (my $module = typeof $this) =~ s/^$namespace//;
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
193
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
194 my %smd = (
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
195 module => [grep $_, split /::/, $module ],
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
196 );
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
197
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
198 while (my ($method,$info) = each %$methods) {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
199 my %methodInfo = (
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
200 name => $method
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
201 );
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
202 $methodInfo{parameters} = $info->{parameters} if $info->{parameters};
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
203 push @{$smd{methods}},\%methodInfo;
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
204 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
205 return \%smd;
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
206 }
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
207
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
208 __PACKAGE__->transactions(
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
209 discover => undef
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
210 );
133
a07a66fd8d5c Added IMPL::Class::MethodInfo
wizard
parents: 132
diff changeset
211
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
212 1;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
213
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
214 __END__
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
215
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
216 =pod
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
217
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
218 =head1 NAME
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
219
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
220 C<IMPL::Web::Application::ControllerUnit> - базовый класс для обработчика транзакций в модели контроллера.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
221
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
222 =head1 DESCRIPTION
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
223
113
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
224 Классы, наследуемые от данного класса называется пакетом транзакций. Часть методов в таком классе
7b14e0122b79 Updated PostToDOM transformation
wizard
parents: 112
diff changeset
225 объявляются как транзакции при помощи методов C<transaction>, C<form>.
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
226
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
227 Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
228 Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
229 транзакции.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
230
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
231 Транзакции на данный момент делятся на простые и формы. Различные типы транзакций выполняются при помощи
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
232 различных оберток (C<TransactionWrapper> и C<FormWrapper>). Каждая обертка отвечает за конструирование
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
233 экземпляра объекта и вызов метода для выполнения транзакции, а также за возврат результата выполнения.
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
234
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
235 =head2 Простые транзакции
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
236
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
237 Простые транзакции получаю только запрос, без предварительной обработки, и возвращенный результат напрямую
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
238 передается пользователю.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
239
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
240 =head2 Формы
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
241
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
242 При использовании форм запрос предварительно обрабатывается, для получения DOM документа с данными формы.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
243 Для постороенния DOM документа используется схема. При этом становятся доступны дополнительные свойства
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
244 C<formData>, C<formSchema>, C<formErrors>.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
245
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
246 Результат выполнения транзакции не возвращается наверх напрямую, а включается в структуру, которая
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
247 выглядит следующим образом
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
248
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
249 =begin code
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
250
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
251 {
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
252 state => '{ new | correct | invalid }',
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
253 result => $transactionResult,
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
254 formData => $formDOM,
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
255 formSchema => $formSchema,
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
256 formErrors => @errors
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
257 }
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
258
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
259 =end code
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
260
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
261 =over
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
262
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
263 =item C<state>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
264
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
265 Состояние верификации формы.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
266
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
267 =over
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
268
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
269 =item C<new>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
270
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
271 Первоначальное содержимое формы, оно может быть некорректным, но это нормально.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
272 В данном состоянии транзакция обычно не выполняется.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
273
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
274 =item C<correct>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
275
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
276 Данные формы корректны, транзакция выполнена, и ее результат доступен через поле C<result>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
277
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
278 =item C<invalid>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
279
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
280 Содержимое формы не прошло верификацию, ошибки доступны через поле C<formErrors>. Транзакция
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
281 не выполнялась.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
282
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
283 =back
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
284
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
285 =item C<result>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
286
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
287 Результат выполнения транзакции, если конечно таковая выполнялась.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
288
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
289 =item C<formData>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
290
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
291 ДОМ документ с данными формами. Документ существует всегда, не зависимо от его корректности,
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
292 может быть использован для построения формы, уже заполненную параметрами.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
293
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
294 =item C<formSchema>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
295
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
296 Схема данных формы, может использоваться для построения динамических форм.
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
297
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
298 =item C<formErrors>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
299
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
300 Ссылка на массив с ошибками при проверки формы.
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
301
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
302 =back
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
303
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
304 =head1 MEMBERS
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
305
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
306 =over
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
307
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
308 =item C<[get] application>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
309
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
310 Объект приложения, которое обрабатывает запрос.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
311
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
312 =item C<[get] query>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
313
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
314 Текущий запрос.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
315
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
316 =item C<[get] response>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
317
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
318 Текущий ответ.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
319
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
320 =item C<[get] formData>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
321
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
322 C<IMPL::DOM::Document> документ с данныим, если данный запрос является формой.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
323
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
324 =item C<[get] formSchema>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
325
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
326 C<IMPL::DOM::Schema> документ со схемой формы данного запроса.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
327
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
328 =item C<[get] formErrors>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
329
128
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
330 Ошибки верификации данных, если таковые были. Обычно при наличии ошибок в форме, транзакция
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
331 не выполняется, а эти ошибки передаются в ответ.
08753833173d Fixed a error handling issue in JSON output: errors are correctly transfered
wizard
parents: 127
diff changeset
332
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
333 =item C<InvokeAction($method,$action)>
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
334
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
335 Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по
112
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
336 своим правилам.
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
337
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
338 =item C<TransactionWrapper($method,$action,$methodInfo)>
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
339
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
340 Обертка для конструирования простых транзакций, может быть переопределен для конструирования контекста по
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
341 своим правилам.
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
342
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
343 =item C<FormWrapper($method,$action,$methodInfo)>
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
344
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
345 Обертка для конструирования форм, может быть переопределен для конструирования контекста по
0ed8e2541b1c Form processing mechanism
wizard
parents: 111
diff changeset
346 своим правилам.
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
347
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
348 =item C<discover()>
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
349
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
350 Метод, опубликованный для вызова контроллером, возвращает описание методов в формате C<Simple Module Definition>.
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
351
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
352 =begin code
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
353
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
354 # SMD structure
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
355 {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
356 module => ['Foo','Bar'],
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
357 methods => [
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
358 {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
359 name => 'search',
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
360 parameters => ['text','limit'] #optional
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
361 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
362 ]
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
363 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
364
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
365 =end code
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
366
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
367 =back
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
368
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
369 =head1 EXAMPLE
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
370
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
371 =begin code
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
372
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
373 package MyBooksUnit;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
374 use strict;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
375 use base qw(IMPL::Web::Application::ControllerUnit);
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
376
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
377 __PACKAGE__->PassThroughArgs;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
378
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
379 sub unitDataClass { 'My::Books' }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
380
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
381 __PACKAGE__->transactions(
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
382 find => {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
383 parameters => [qw(author)]
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
384 },
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
385 info => {
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
386 parameters => [qw(id)]
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
387 }
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
388 );
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
389 __PACKAGE__->forms(
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
390 create => 'books.create.xml'
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
391 );
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
392
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
393 sub find {
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
394 my ($this,$author) = @_;
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
395
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
396 return $this->ds->find({author => $author});
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
397 }
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
398
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
399 sub info {
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
400 my ($this,$id) = @_;
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
401
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
402 return $this->ds->find({id => $id});
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
403 }
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
404
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
405 sub create {
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
406 my ($this) = @_;
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
407
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
408 my %book = map {
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
409 $_->nodeName, $_->nodeValue
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
410 } $this->formData->selectNodes([qw(author_id title year ISBN)]);
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
411
134
44977efed303 Significant performance optimizations
wizard
parents: 133
diff changeset
412 return $this->ds->create(\%book);
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
413 }
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
414
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
415 =end code
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
416
6c25ea91c985 ControllerUnit concept
wizard
parents: 110
diff changeset
417 =cut