Mercurial > pub > Impl
diff lib/IMPL/DOM/Schema/ValidationError.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/DOM/Schema/ValidationError.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,138 @@ +package IMPL::DOM::Schema::ValidationError; +use strict; +use warnings; + +use overload + '""' => \&toString, + 'fallback' => 1; + +use IMPL::lang qw(is); +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + Label => '-IMPL::DOM::Schema::Label' + }, + base => [ + 'IMPL::Object' => undef + ], + props => [ + node => PROP_RO | PROP_DIRECT, + schemaNode => PROP_RO | PROP_DIRECT, + schemaType => PROP_RO | PROP_DIRECT, + parent => PROP_RO | PROP_DIRECT, + message => PROP_RO | PROP_DIRECT + ] +}; +use IMPL::Resources::Format qw(FormatMessage); + +sub CTOR { + my ($this,%args) = @_; + + $this->{$node} = $args{node}; + $this->{$schemaNode} = $args{schemaNode} if $args{schemaNode}; + $this->{$schemaType} = $args{schemaType} if $args{schemaType}; + + if ($args{parent}) { + $this->{$parent} = $args{parent}; + } elsif ($args{node}) { + $this->{$parent} = $args{node}->parentNode; + } else { + die new IMPL::InvalidArgumentException("A 'parent' or a 'node' parameter is required"); + } + + if ($args{message}) { + $this->{$message} = is($args{message},Label) ? $args{message}->Format(\%args) : FormatMessage($args{message}, \%args) ; + } + +} + +sub toString { + (my $this) = @_; + return $this->message; +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::DOM::Schema::ValidationError> - Описывает ошибку в документе. + +=head1 DESCRIPTION + +При проверке документа на ошибки формирования возвращается массив с объектами +C<IMPL::DOM::Schema::ValidationError>, каждая из которых описывает одну ошибку +в документе. + +С помощью данного объекта осущетсвляется привязка элемента схемы, элемента документа +и сообщения о причине возникновения ошибки. + +Часть ошибок, таких как проверка содержимого на регулярные выражения, привязаны +непосредственно к элементу. Но есть ошибки которые привязываются к родительскому +контейнеру, например отсутсвие обязательного элемента. В таком случае ошибка +содержит свойство C<parent> и по свойству C<source> можно определить элемент +(например его имя), к которому относится ошибка. + +=head1 MEMBERS + +=over + +=item C<[get] node> + +Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо +узлы, которые не могут присутствоать в данном месте по схеме. + +Данное свойство может быть C<undef>. + +=item C<[get] parent> + +Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node> +не указан, например, если по схеме должен существовать дочерний узел с определенным +именем, а в реальном документе его нет. + +Также это свойство может использоваться при формировании сообщения. + +=item C<[get] schema> + +Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан. + +=item C<[get] source> + +Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут +использовать ссылки, то данное свойство нужно для получения схемы узла, а не +схемы его типа. + +Тоесть проверка схемы узла C<IMPL::DOM::Schema::Node> приводит к проверке схемы +типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет +указывать именно на C<IMPL::DOM::Schema::Node>. + +=item C<[get] message> + +Возвращает форматированное сообщение об ошибке. + +=item C<toString()> + +Преобразует ошибку к строке, возвращает значение свойства C<Message> + +=back + +=head1 REMARKS + +=begin code + +my $doc = IMPL::DOM::XMLReader->LoadDocument('data.xml'); +my $schema = IMPL::DOM::Schema->LoadSchema('schema.xml'); + +my @errors = $schema->Validate($doc); + +my $node = $doc->selectSingleNode('user','name'); + +# Получаем все ошибки относящиеся к данному узлу +my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; + +=end code + +=cut