view lib/IMPL/DOM/Schema/ValidationError.pm @ 410:9335cf010b23 ref20150831

refactoring
author cin
date Mon, 14 Sep 2015 01:11:53 +0300
parents c6e90e02dd17
children
line wrap: on
line source

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