Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/Resource.pm @ 335:e8be9062ecf2
improved resource classes, contracts are deprecated
author | cin |
---|---|
date | Thu, 13 Jun 2013 20:13:24 +0400 |
parents | 71221d79e6b4 |
children | ec58c47edb52 |
comparison
equal
deleted
inserted
replaced
334:71221d79e6b4 | 335:e8be9062ecf2 |
---|---|
11 Exception => 'IMPL::Exception', | 11 Exception => 'IMPL::Exception', |
12 ArgumentException => '-IMPL::InvalidArgumentException', | 12 ArgumentException => '-IMPL::InvalidArgumentException', |
13 OperationException => '-IMPL::InvalidOperationException', | 13 OperationException => '-IMPL::InvalidOperationException', |
14 NotAllowedException => 'IMPL::Web::NotAllowedException', | 14 NotAllowedException => 'IMPL::Web::NotAllowedException', |
15 NotFoundException => 'IMPL::Web::NotFoundException', | 15 NotFoundException => 'IMPL::Web::NotFoundException', |
16 Loader => 'IMPL::Code::Loader' | 16 Loader => 'IMPL::Code::Loader', |
17 CustomResource => '-IMPL::Web::Application::CustomResource' | |
17 }, | 18 }, |
18 base => [ | 19 base => [ |
19 'IMPL::Object' => undef, | 20 'IMPL::Object' => undef, |
20 'IMPL::Web::Application::ResourceInterface' => undef | 21 'IMPL::Web::Application::ResourceInterface' => undef |
21 ], | 22 ], |
24 application => PROP_RO, | 25 application => PROP_RO, |
25 parent => PROP_RO, | 26 parent => PROP_RO, |
26 model => PROP_RO, | 27 model => PROP_RO, |
27 id => PROP_RO, | 28 id => PROP_RO, |
28 location => PROP_RO, | 29 location => PROP_RO, |
29 resources => PROP_RO, | |
30 verbs => PROP_RO, | |
31 namedResources => PROP_RO, | |
32 regexResources => PROP_RO | |
33 ] | 30 ] |
34 }; | 31 }; |
35 | 32 |
36 sub CTOR { | 33 sub CTOR { |
37 my ( $this, %args ) = @_; | 34 my ( $this, %args ) = @_; |
46 $this->request( $args{request} ); | 43 $this->request( $args{request} ); |
47 $this->parent( $args{parent} ); | 44 $this->parent( $args{parent} ); |
48 $this->model( $args{model} ); | 45 $this->model( $args{model} ); |
49 $this->id( $args{id} ); | 46 $this->id( $args{id} ); |
50 $this->application( $args{request}->application ); | 47 $this->application( $args{request}->application ); |
51 $this->verbs( $args{verbs} || {} ); | 48 |
52 $this->resources($args{resources} || []); | |
53 | |
54 $this->PrepareResourcesCache(); | |
55 | |
56 # если расположение явно не указано, то оно вычисляется автоматически, | 49 # если расположение явно не указано, то оно вычисляется автоматически, |
57 # либо остается не заданным | 50 # либо остается не заданным |
58 $this->location( $args{location} | 51 $this->location( $args{location} |
59 || eval { $this->parent->location->Child( $this->id ) } ); | 52 || eval { $this->parent->location->Child( $this->id ) } ); |
60 } | 53 } |
61 | 54 |
62 sub PrepareResourcesCache { | |
63 my ($this,$resources) = @_; | |
64 my %nameMap; | |
65 my @rxMap; | |
66 | |
67 foreach my $res (@{$this->resources}) { | |
68 #skip resources without contract | |
69 next unless $res->{contract}; | |
70 | |
71 if ( my $name = $res->{name} ) { | |
72 $nameMap{$name} = $res; | |
73 } | |
74 if ( $res->{match} ) { | |
75 push @rxMap,$res; | |
76 } | |
77 } | |
78 | |
79 $this->regexResources(\@rxMap); | |
80 $this->namedResources(\%nameMap); | |
81 } | |
82 | |
83 sub InvokeHttpVerb { | 55 sub InvokeHttpVerb { |
84 my ( $this, $verb ) = @_; | 56 my ( $this, $verb ) = @_; |
85 | 57 |
86 my $operation = $this->verbs->{ lc($verb) }; | 58 my $operation = $this->verbs->{ lc($verb) }; |
87 | 59 |
88 die NotAllowedException->new( | 60 die NotAllowedException->new( |
89 allow => join( ',', map( uc, keys %{ $this->verbs } ) ) ) | 61 allow => join( ',', $this->GetAllowedMethods ) ) |
90 unless $operation; | 62 unless $operation; |
91 | 63 |
92 $this->AccessCheck($verb); | 64 $this->AccessCheck($verb); |
93 my $request = $this->request; | 65 my $request = $this->request; |
94 | 66 |
108 } | 80 } |
109 | 81 |
110 return _InvokeDelegate( $operation, $this, $request ); | 82 return _InvokeDelegate( $operation, $this, $request ); |
111 } | 83 } |
112 | 84 |
85 sub GetAllowedMethods { | |
86 | |
87 } | |
88 | |
89 sub FindChildResourceInfo { | |
90 | |
91 } | |
92 | |
113 sub AccessCheck { | 93 sub AccessCheck { |
114 | 94 |
115 } | 95 } |
116 | 96 |
117 sub PrepareEnvironment { | 97 sub PrepareEnvironment { |
125 } | 105 } |
126 | 106 |
127 map $_->SetupEnvironment($env), reverse @stack; | 107 map $_->SetupEnvironment($env), reverse @stack; |
128 | 108 |
129 return $env; | 109 return $env; |
130 } | |
131 | |
132 sub FindChildResourceInfo { | |
133 my ( $this, $name ) = @_; | |
134 | |
135 if ( my $info = $this->namedResources->{$name} ) { | |
136 return $info, [$name]; | |
137 } | |
138 else { | |
139 foreach my $info ( @{$this->regexResources} ) { | |
140 my $rx = $info->{match}; | |
141 if(my @childId = $name =~ m/$rx/) { | |
142 return $info, \@childId; | |
143 } | |
144 } | |
145 } | |
146 | |
147 return; | |
148 } | 110 } |
149 | 111 |
150 # это реализация по умолчанию, базируется информации о ресурсах, содержащийся | 112 # это реализация по умолчанию, базируется информации о ресурсах, содержащийся |
151 # в контракте. | 113 # в контракте. |
152 sub FetchChildResource { | 114 sub FetchChildResource { |
184 $args{request} = $this->request; | 146 $args{request} = $this->request; |
185 | 147 |
186 my $factory; | 148 my $factory; |
187 | 149 |
188 if (ref($contract) eq 'HASH') { | 150 if (ref($contract) eq 'HASH') { |
189 $factory = delete $contract->{class} || __PACKAGE__; | 151 $factory = delete $contract->{class} || CustomResource; |
190 hashApply(\%args,$contract); | 152 hashApply(\%args,$contract); |
191 | 153 |
192 Loader->default->Require($factory) | 154 Loader->default->Require($factory) |
193 unless ref($factory); | 155 unless ref($factory); |
194 } else { | 156 } else { |