Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/Validator/Compare.pm @ 263:0f59b2de72af
*fixed IMPL::DOM::Schema circular module references
*modified IMPL::Object::Singleton, added auto-activation
*code cleanups, docs
author | sergey |
---|---|
date | Wed, 09 Jan 2013 05:17:44 +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 |