Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/Validator/Compare.pm @ 250:129e48bb5afb
DOM refactoring
ObjectToDOM methods are virtual
QueryToDOM uses inflators
Fixed transform for the complex values in the ObjectToDOM
QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author | sergey |
---|---|
date | Wed, 07 Nov 2012 04:17:53 +0400 |
parents | b8c724f6de36 |
children | 89179bb8c388 |
rev | line source |
---|---|
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
1 package IMPL::DOM::Schema::Validator::Compare; |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
2 use strict; |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
3 |
165 | 4 use parent qw(IMPL::DOM::Schema::Validator); |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
5 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
6 use IMPL::Resources::Format qw(FormatMessage); |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
7 use IMPL::Class::Property; |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
8 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
9 BEGIN { |
194 | 10 public property targetProperty => prop_all; |
11 public property op => prop_all; | |
12 public property nodePath => prop_all; | |
13 public property optional => prop_all; | |
14 private property _pathTranslated => prop_all; | |
15 private property _targetNode => prop_all; | |
16 public property message => prop_all; | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
17 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
18 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
19 our %CTOR = ( |
194 | 20 'IMPL::DOM::Schema::Validator' => sub { |
21 my %args = @_; | |
22 $args{nodeName} ||= 'Compare'; | |
23 delete @args{qw(targetProperty op nodePath optional message)}; | |
24 %args; | |
25 } | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
26 ); |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
27 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
28 our %Ops = ( |
194 | 29 '=' => \&_equals, |
30 'eq' => \&_equalsString, | |
31 '!=' => \&_notEquals, | |
32 'ne' => \&_notEqualsString, | |
33 '=~' => \&_matchRx, | |
34 '!~' => \&_notMatchRx, | |
35 '<' => \&_less, | |
36 '>' => \&_greater, | |
37 'lt' => \&_lessString, | |
38 'gt' => \&_greaterString | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
39 ); |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
40 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
41 my $rxOps = map qr/$_/, join( '|', keys %Ops ); |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
42 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
43 sub CTOR { |
194 | 44 my ($this,%args) = @_; |
45 | |
46 $this->targetProperty($args{targetProperty} || 'nodeValue'); | |
47 $this->op( $Ops{ $args{op} || '=' } ) or die new IMPL::InvalidArgumentException("Invalid parameter value",'op',$args{op},$this->path); | |
48 $this->nodePath($args{nodePath}) or die new IMPL::InvalidArgumentException("The argument is required", 'nodePath', $this->path); | |
238 | 49 $this->message($args{message} || 'The value of %node.path% %source.op% %value% (%source.nodePath%)' ); |
194 | 50 $this->optional($args{optional}) if $args{optional}; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
51 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
52 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
53 sub TranslatePath { |
194 | 54 my ($this,$path) = @_; |
55 | |
56 $path ||= ''; | |
57 | |
58 my @selectQuery; | |
59 | |
60 my $i = 0; | |
61 | |
62 foreach my $chunk (split /\//,$path) { | |
63 $chunk = 'document:*' if $i == 0 and not length $chunk; | |
64 next if not length $chunk; | |
65 | |
66 my $query; | |
67 my ($axis,$filter) = ( $chunk =~ /^(?:(\w+):)?(.*)$/); | |
68 | |
69 if ($filter =~ /^\w+|\*$/ ) { | |
70 $query = $filter eq '*' ? undef : $filter; | |
71 } elsif ( $filter =~ /^(\w+|\*)\s*((?:\[\s*\w+\s*(?:=|!=|=~|!~|eq|ne|lt|gt|)\s*["'](?:[\\'"]|\\[\\"'])*["']\])+)$/) { | |
72 my ($nodeName,$filterArgs) = ($1,$2); | |
73 | |
74 my @parsedFilters = map { | |
75 my ($prop,$op,$value) = ($_ =~ /\s*(\w+)\s*(=|!=|=~|!~)\s*(["'](?:[\\'"]|\\[\\"'])*["'])/); | |
76 $value =~ s/\\[\\'"]/$1/g; | |
77 { | |
78 prop => $prop, | |
79 op => $Ops{$op}, | |
80 value => $value | |
81 } | |
82 } grep ( $_, split ( /[\]\[]+/,$filterArgs ) ); | |
83 | |
84 $query = sub { | |
85 my ($node) = shift; | |
86 | |
87 $node->nodeName eq $nodeName or return 0 if $nodeName ne '*'; | |
88 $_->{op}->( | |
89 _resovleProperty($node,$_->{prop}), | |
90 FormatMessage($_->{value},{ | |
91 Schema => $this->parentNode, | |
92 Node => $this->_targetNode | |
93 },\&_resovleProperty) | |
94 ) or return 0 foreach @parsedFilters; | |
95 | |
96 }; | |
97 } else { | |
98 die new IMPL::Exception("Invalid query syntax",$path,$chunk); | |
99 } | |
100 | |
101 push @selectQuery, $axis ? { $axis => $query } : $query; | |
102 | |
103 $i++; | |
104 } | |
105 | |
106 return \@selectQuery; | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
107 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
108 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
109 sub Validate { |
194 | 110 my ($this,$node,$ctx) = @_; |
111 | |
112 my @result; | |
113 | |
114 $this->_targetNode($node); | |
115 | |
116 my $query = $this->_pathTranslated() || $this->_pathTranslated($this->TranslatePath($this->nodePath)); | |
117 | |
118 my ($foreignNode) = $node->selectNodes(@$query); | |
119 | |
120 my $Source = $ctx && $ctx->{Source} || $this->parentNode; | |
121 | |
122 if ($foreignNode) { | |
123 my $value = $this->nodeValue; | |
124 | |
125 if ($value) { | |
126 $value = FormatMessage($value, { Schema => $this->parentNode, Node => $this->_targetNode, ForeignNode => $foreignNode },\&_resovleProperty); | |
127 } else { | |
128 $value = $foreignNode->nodeValue; | |
129 } | |
130 | |
131 push @result, new IMPL::DOM::Schema::ValidationError( | |
236 | 132 node => $node, |
133 foreignNode => $foreignNode, | |
134 value => $value, | |
135 source => $Source, | |
136 schema => $this->parentNode, | |
137 message => $this->message | |
194 | 138 ) unless $this->op->(_resovleProperty($node,$this->targetProperty),$value); |
139 } elsif (not $this->optional) { | |
140 push @result, new IMPL::DOM::Schema::ValidationError( | |
236 | 141 node => $node, |
142 value => '', | |
143 source => $Source, | |
144 schema => $this->parentNode, | |
145 message => $this->message | |
194 | 146 ); |
147 } | |
148 | |
149 $this->_targetNode(undef); | |
150 | |
151 return @result; | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
152 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
153 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
154 sub _resovleProperty { |
194 | 155 my ($node,$prop) = @_; |
156 | |
157 return $node->can($prop) ? $node->$prop() : $node->nodeProperty($prop); | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
158 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
159 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
160 sub _matchRx { |
194 | 161 $_[0] =~ $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
162 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
163 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
164 sub _notMatchRx { |
194 | 165 $_[0] !~ $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
166 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
167 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
168 sub _equals { |
194 | 169 $_[0] == $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
170 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
171 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
172 sub _notEquals { |
194 | 173 $_[0] != $_[0]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
174 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
175 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
176 sub _equalsString { |
194 | 177 $_[0] eq $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
178 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
179 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
180 sub _notEqualsString { |
194 | 181 $_[0] ne $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
182 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
183 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
184 sub _less { |
194 | 185 $_[0] < $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
186 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
187 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
188 sub _greater { |
194 | 189 $_[0] > $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
190 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
191 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
192 sub _lessString { |
194 | 193 $_[0] lt $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
194 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
195 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
196 sub _greaterString { |
194 | 197 $_[0] gt $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
198 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
199 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
200 sub _lessEq { |
194 | 201 $_[0] <= $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
202 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
203 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
204 sub _greaterEq { |
194 | 205 $_[0] >= $_[1]; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
206 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
207 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
208 1; |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
209 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
210 __END__ |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
211 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
212 =pod |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
213 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
214 =head1 NAME |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
215 |
180 | 216 C<IMPL::DOM::Schema::Validator::Compare> - ограничение на содержимое текущего узла, |
217 сравнивая его со значением другого узла. | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
218 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
219 =head1 SYNOPSIS |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
220 |
180 | 221 Пример типа описания поля с проверочным полем |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
222 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
223 =begin code xml |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
224 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
225 <schema> |
194 | 226 <SimpleType type="retype_field"> |
227 <Property name="linkedNode" message="Для узла %Node.nodeName% необходимо задать свойство %Source.name%"/> | |
228 <Compare op="eq" nodePath="sibling:*[nodeName eq '%Node.linkedNode%']"/> | |
229 </SimpleType> | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
230 </schema> |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
231 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
232 =begin code xml |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
233 |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
234 =head1 DESCRIPTION |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
235 |
180 | 236 Позволяет сравнивать значение текущего узла со значением другого узла. |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
diff
changeset
|
237 |
180 | 238 =cut |