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