Mercurial > pub > Impl
diff Lib/IMPL/DOM/Schema/NodeSet.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 7f00786f8210 |
children | df6b4f054957 |
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Schema/NodeSet.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/IMPL/DOM/Schema/NodeSet.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,91 +1,91 @@ -package IMPL::DOM::Schema::NodeSet; -use strict; -use warnings; - -use base qw(IMPL::DOM::Node); -use IMPL::Class::Property; - -our %CTOR = ( - 'IMPL::DOM::Node' => sub { nodeName => 'NodeSet' } -); - -BEGIN { - public property messageUnexpected => prop_all; - public property messageMax => prop_all; - public property messageMin => prop_all; -} - -sub CTOR { - my ($this,%args) = @_; - - $this->messageMax( $args{messageMax} || 'Too many %Node.nodeName% nodes'); - $this->messageMin( $args{messageMin} || '%Schema.name% nodes expected'); - $this->messageUnexpected( $args{messageUnexpected} || 'A %Node.nodeName% isn\'t allowed in %Node.parentNode.path%'); -} - -sub Validate { - my ($this,$node) = @_; - - my @errors; - - my %nodes; - my $anyNode; - foreach (@{$this->childNodes}) { - if ($_->isa('IMPL::DOM::Schema::AnyNode')) { - $anyNode = {Schema => $_, Min => $_->minOccur, Max => $_->maxOccur eq 'unbounded' ? undef : $_->maxOccur , Seen => 0 }; - } else { - $nodes{$_->name} = {Schema => $_, Min => $_->minOccur, Max => $_->maxOccur eq 'unbounded' ? undef : $_->maxOccur , Seen => 0 }; - } - } - - foreach my $child ( @{$node->childNodes} ) { - if (my $info = $nodes{$child->nodeName} || $anyNode) { - $info->{Seen}++; - push @errors,new IMPL::DOM::Schema::ValidationError ( - Source => $this, - Node => $child, - Schema => $info->{Schema}, - Message => $this->messageMax - ) if ($info->{Max} and $info->{Seen} > $info->{Max}); - - if (my @localErrors = $info->{Schema}->Validate($child)) { - push @errors,@localErrors; - } - } else { - push @errors, new IMPL::DOM::Schema::ValidationError ( - Source => $this, - Node => $child, - Schema => $info->{Schema}, - Message => $this->messageUnexpected - ) - } - } - - foreach my $info (values %nodes) { - push @errors, new IMPL::DOM::Schema::ValidationError ( - Source => $this, - Schema => $info->{Schema}, - Node => $node, - Message => $this->messageMin - ) if $info->{Min} > $info->{Seen}; - } - - return @errors; -} - -1; - -__END__ - -=pod - -=head1 DESCRIPTION - -Содержимое для сложного узла. Порядок не важен. Дочерними элементами могут быть -только C<IMPL::DOM::Schema::ComplexNode> и C<IMPL::DOM::Schema::SimpleNode>. - -При проверке данного правила, проверяются имеющиеся элементы на соответсие схемы -и количества встречаемости, после чего проверяются количественные ограничения -для несуществующих элементов. - -=cut +package IMPL::DOM::Schema::NodeSet; +use strict; +use warnings; + +use base qw(IMPL::DOM::Node); +use IMPL::Class::Property; + +our %CTOR = ( + 'IMPL::DOM::Node' => sub { nodeName => 'NodeSet' } +); + +BEGIN { + public property messageUnexpected => prop_all; + public property messageMax => prop_all; + public property messageMin => prop_all; +} + +sub CTOR { + my ($this,%args) = @_; + + $this->messageMax( $args{messageMax} || 'Too many %Node.nodeName% nodes'); + $this->messageMin( $args{messageMin} || '%Schema.name% nodes expected'); + $this->messageUnexpected( $args{messageUnexpected} || 'A %Node.nodeName% isn\'t allowed in %Node.parentNode.path%'); +} + +sub Validate { + my ($this,$node) = @_; + + my @errors; + + my %nodes; + my $anyNode; + foreach (@{$this->childNodes}) { + if ($_->isa('IMPL::DOM::Schema::AnyNode')) { + $anyNode = {Schema => $_, Min => $_->minOccur, Max => $_->maxOccur eq 'unbounded' ? undef : $_->maxOccur , Seen => 0 }; + } else { + $nodes{$_->name} = {Schema => $_, Min => $_->minOccur, Max => $_->maxOccur eq 'unbounded' ? undef : $_->maxOccur , Seen => 0 }; + } + } + + foreach my $child ( @{$node->childNodes} ) { + if (my $info = $nodes{$child->nodeName} || $anyNode) { + $info->{Seen}++; + push @errors,new IMPL::DOM::Schema::ValidationError ( + Source => $this, + Node => $child, + Schema => $info->{Schema}, + Message => $this->messageMax + ) if ($info->{Max} and $info->{Seen} > $info->{Max}); + + if (my @localErrors = $info->{Schema}->Validate($child)) { + push @errors,@localErrors; + } + } else { + push @errors, new IMPL::DOM::Schema::ValidationError ( + Source => $this, + Node => $child, + Schema => $info->{Schema}, + Message => $this->messageUnexpected + ) + } + } + + foreach my $info (values %nodes) { + push @errors, new IMPL::DOM::Schema::ValidationError ( + Source => $this, + Schema => $info->{Schema}, + Node => $node, + Message => $this->messageMin + ) if $info->{Min} > $info->{Seen}; + } + + return @errors; +} + +1; + +__END__ + +=pod + +=head1 DESCRIPTION + +Содержимое для сложного узла. Порядок не важен. Дочерними элементами могут быть +только C<IMPL::DOM::Schema::ComplexNode> и C<IMPL::DOM::Schema::SimpleNode>. + +При проверке данного правила, проверяются имеющиеся элементы на соответсие схемы +и количества встречаемости, после чего проверяются количественные ограничения +для несуществующих элементов. + +=cut