Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Schema/Validator/Compare.pm @ 389:5aff94ba842f
DOM Schema refactoring complete
author | cin |
---|---|
date | Wed, 12 Feb 2014 13:36:24 +0400 |
parents | 89179bb8c388 |
children |
comparison
equal
deleted
inserted
replaced
388:648dfaf642e0 | 389:5aff94ba842f |
---|---|
1 package IMPL::DOM::Schema::Validator::Compare; | 1 package IMPL::DOM::Schema::Validator::Compare; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use parent qw(IMPL::DOM::Schema::Validator); | 4 use IMPL::Const qw(:prop); |
5 | 5 use IMPL::declare { |
6 require => { | |
7 Label => 'IMPL::DOM::Schema::Label', | |
8 ValidationError => 'IMPL::DOM::Schema::ValidationError' | |
9 }, | |
10 base => [ | |
11 'IMPL::DOM::Schema::Validator' => sub { | |
12 my %args = @_; | |
13 $args{nodeName} ||= 'Compare'; | |
14 delete @args{qw(targetProperty op nodePath optional message)}; | |
15 %args; | |
16 } | |
17 ], | |
18 props => [ | |
19 targetProperty => PROP_RW, | |
20 op => PROP_RW, | |
21 nodePath => PROP_RW, | |
22 optional => PROP_RW, | |
23 _pathTranslated => PROP_RW, | |
24 _targetNode => PROP_RW, | |
25 _schemaNode => PROP_RW, | |
26 message => PROP_RW | |
27 ] | |
28 }; | |
6 use IMPL::Resources::Format qw(FormatMessage); | 29 use IMPL::Resources::Format qw(FormatMessage); |
7 use IMPL::Class::Property; | |
8 | |
9 BEGIN { | |
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 private property _sourceSchema => prop_all; | |
17 public property message => prop_all; | |
18 } | |
19 | |
20 our %CTOR = ( | |
21 'IMPL::DOM::Schema::Validator' => sub { | |
22 my %args = @_; | |
23 $args{nodeName} ||= 'Compare'; | |
24 delete @args{qw(targetProperty op nodePath optional message)}; | |
25 %args; | |
26 } | |
27 ); | |
28 | 30 |
29 our %Ops = ( | 31 our %Ops = ( |
30 '=' => \&_equals, | 32 '=' => \&_equals, |
31 'eq' => \&_equalsString, | 33 'eq' => \&_equalsString, |
32 '!=' => \&_notEquals, | 34 '!=' => \&_notEquals, |
45 my ($this,%args) = @_; | 47 my ($this,%args) = @_; |
46 | 48 |
47 $this->targetProperty($args{targetProperty} || 'nodeValue'); | 49 $this->targetProperty($args{targetProperty} || 'nodeValue'); |
48 $this->op( $Ops{ $args{op} || '=' } ) or die new IMPL::InvalidArgumentException("Invalid parameter value",'op',$args{op},$this->path); | 50 $this->op( $Ops{ $args{op} || '=' } ) or die new IMPL::InvalidArgumentException("Invalid parameter value",'op',$args{op},$this->path); |
49 $this->nodePath($args{nodePath}) or die new IMPL::InvalidArgumentException("The argument is required", 'nodePath', $this->path); | 51 $this->nodePath($args{nodePath}) or die new IMPL::InvalidArgumentException("The argument is required", 'nodePath', $this->path); |
50 $this->message($args{message} || 'The value of %node.path% %source.op% %value% (%source.nodePath%)' ); | 52 $this->message($args{message} || 'The value of %node.path% %schemaNode.op% %value% (%schemaNode.nodePath%)' ); |
51 $this->optional($args{optional}) if $args{optional}; | 53 $this->optional($args{optional}) if $args{optional}; |
52 } | 54 } |
53 | 55 |
54 sub TranslatePath { | 56 sub TranslatePath { |
55 my ($this,$path) = @_; | 57 my ($this,$path) = @_; |
92 _resovleProperty($node,$_->{prop}), | 94 _resovleProperty($node,$_->{prop}), |
93 FormatMessage($_->{value},{ | 95 FormatMessage($_->{value},{ |
94 Schema => $this->parentNode, | 96 Schema => $this->parentNode, |
95 Node => $this->_targetNode, | 97 Node => $this->_targetNode, |
96 schema => $this->parentNode, | 98 schema => $this->parentNode, |
99 schemaType => $this->parentNode, | |
97 node => $this->_targetNode, | 100 node => $this->_targetNode, |
98 source => $this->_sourceSchema | 101 source => $this->_schemaNode, |
102 schemaNode => $this->_schemaNode | |
99 },\&_resovleProperty) | 103 },\&_resovleProperty) |
100 ) or return 0 foreach @parsedFilters; | 104 ) or return 0 foreach @parsedFilters; |
101 return 1; | 105 return 1; |
102 }; | 106 }; |
103 } else { | 107 } else { |
115 sub Validate { | 119 sub Validate { |
116 my ($this,$node,$ctx) = @_; | 120 my ($this,$node,$ctx) = @_; |
117 | 121 |
118 my @result; | 122 my @result; |
119 | 123 |
120 my $Source = $ctx && $ctx->{Source} || $this->parentNode; | 124 my $schemaNode = $ctx->{schemaNode}; |
121 | 125 my $schemaType = $ctx->{schemaType}; |
122 $this->_sourceSchema($Source); | 126 |
127 $this->_schemaNode($schemaNode); | |
123 | 128 |
124 $this->_targetNode($node); | 129 $this->_targetNode($node); |
125 | 130 |
126 my $query = $this->_pathTranslated() || $this->_pathTranslated($this->TranslatePath($this->nodePath)); | 131 my $query = $this->_pathTranslated() || $this->_pathTranslated($this->TranslatePath($this->nodePath)); |
127 | 132 |
136 $value = FormatMessage($value, { Schema => $this->parentNode, Node => $this->_targetNode, ForeignNode => $foreignNode },\&_resovleProperty); | 141 $value = FormatMessage($value, { Schema => $this->parentNode, Node => $this->_targetNode, ForeignNode => $foreignNode },\&_resovleProperty); |
137 } else { | 142 } else { |
138 $value = $foreignNode->nodeValue; | 143 $value = $foreignNode->nodeValue; |
139 } | 144 } |
140 | 145 |
141 push @result, new IMPL::DOM::Schema::ValidationError( | 146 push @result, ValidationError->new( |
142 node => $node, | 147 node => $node, |
143 foreignNode => $foreignNode, | 148 foreignNode => $foreignNode, |
144 value => $value, | 149 value => $value, |
145 source => $Source, | 150 schemaNode => $schemaNode, |
146 schema => $this->parentNode, | 151 schemaType => $schemaType, |
147 message => $this->message | 152 message => $this->_MakeLabel($this->message) |
148 ) unless $this->op->(_resovleProperty($node,$this->targetProperty),$value); | 153 ) unless $this->op->(_resovleProperty($node,$this->targetProperty),$value); |
149 } elsif (not $this->optional) { | 154 } elsif (not $this->optional) { |
150 push @result, new IMPL::DOM::Schema::ValidationError( | 155 push @result, ValidationError->new( |
151 node => $node, | 156 node => $node, |
152 value => '', | 157 value => '', |
153 source => $Source, | 158 schemaNode => $schemaNode, |
154 schema => $this->parentNode, | 159 schemaType => $schemaType, |
155 message => $this->message | 160 message => $this->_MakeLabel( $this->message ) |
156 ); | 161 ); |
157 } | 162 } |
158 | 163 |
159 $this->_targetNode(undef); | 164 $this->_targetNode(undef); |
160 $this->_sourceSchema(undef); | 165 $this->_schemaNode(undef); |
161 | 166 |
162 return @result; | 167 return @result; |
163 } | 168 } |
164 | 169 |
165 sub _resovleProperty { | 170 sub _resovleProperty { |
214 | 219 |
215 sub _greaterEq { | 220 sub _greaterEq { |
216 $_[0] >= $_[1]; | 221 $_[0] >= $_[1]; |
217 } | 222 } |
218 | 223 |
224 sub _MakeLabel { | |
225 my ($this,$label) = @_; | |
226 | |
227 if ($label =~ /^ID:(\w+)$/) { | |
228 return Label->new($this->document->stringMap, $1); | |
229 } else { | |
230 return $label; | |
231 } | |
232 } | |
233 | |
219 1; | 234 1; |
220 | 235 |
221 __END__ | 236 __END__ |
222 | 237 |
223 =pod | 238 =pod |
233 | 248 |
234 =begin code xml | 249 =begin code xml |
235 | 250 |
236 <schema> | 251 <schema> |
237 <SimpleType type="retype_field"> | 252 <SimpleType type="retype_field"> |
238 <Property name="linkedNode" message="Для узла %Node.nodeName% необходимо задать свойство %Source.name%"/> | 253 <Property name="linkedNode" message="Для узла %node.nodeName% необходимо задать свойство %schemaNode.name%"/> |
239 <Compare op="eq" nodePath="sibling:*[nodeName eq '%Node.linkedNode%']"/> | 254 <Compare op="eq" nodePath="sibling:*[nodeName eq '%node.linkedNode%']"/> |
240 </SimpleType> | 255 </SimpleType> |
241 </schema> | 256 </schema> |
242 | 257 |
243 =begin code xml | 258 =begin code xml |
244 | 259 |