| 407 | 1 package IMPL::DOM::Schema::ValidationError; | 
|  | 2 use strict; | 
|  | 3 use warnings; | 
|  | 4 | 
|  | 5 use overload | 
|  | 6     '""' => \&toString, | 
|  | 7     'fallback' => 1; | 
|  | 8 | 
|  | 9 use IMPL::lang qw(is); | 
|  | 10 use IMPL::Const qw(:prop); | 
|  | 11 use IMPL::declare { | 
|  | 12 	require => { | 
|  | 13 		Label => '-IMPL::DOM::Schema::Label' | 
|  | 14 	}, | 
|  | 15 	base => [ | 
|  | 16 		'IMPL::Object' => undef | 
|  | 17 	], | 
|  | 18 	props => [ | 
|  | 19 		node => PROP_RO | PROP_DIRECT, | 
|  | 20 		schemaNode => PROP_RO | PROP_DIRECT, | 
|  | 21 		schemaType => PROP_RO | PROP_DIRECT, | 
|  | 22 		parent => PROP_RO | PROP_DIRECT, | 
|  | 23 		message => PROP_RO | PROP_DIRECT | 
|  | 24 	] | 
|  | 25 }; | 
|  | 26 use IMPL::Resources::Format qw(FormatMessage); | 
|  | 27 | 
|  | 28 sub CTOR { | 
|  | 29     my ($this,%args) = @_; | 
|  | 30 | 
|  | 31     $this->{$node} = $args{node}; | 
|  | 32     $this->{$schemaNode} = $args{schemaNode} if $args{schemaNode}; | 
|  | 33     $this->{$schemaType} = $args{schemaType} if $args{schemaType}; | 
|  | 34 | 
|  | 35     if ($args{parent}) { | 
|  | 36         $this->{$parent} = $args{parent}; | 
|  | 37     } elsif ($args{node}) { | 
|  | 38         $this->{$parent} = $args{node}->parentNode; | 
|  | 39     } else { | 
|  | 40         die new IMPL::InvalidArgumentException("A 'parent' or a 'node' parameter is required"); | 
|  | 41     } | 
|  | 42 | 
|  | 43     if ($args{message}) { | 
|  | 44     	$this->{$message} = is($args{message},Label) ? $args{message}->Format(\%args) : FormatMessage($args{message}, \%args) ; | 
|  | 45     } | 
|  | 46 | 
|  | 47 } | 
|  | 48 | 
|  | 49 sub toString { | 
|  | 50     (my $this) = @_; | 
|  | 51     return $this->message; | 
|  | 52 } | 
|  | 53 | 
|  | 54 1; | 
|  | 55 | 
|  | 56 __END__ | 
|  | 57 | 
|  | 58 =pod | 
|  | 59 | 
|  | 60 =head1 NAME | 
|  | 61 | 
|  | 62 C<IMPL::DOM::Schema::ValidationError> - Описывает ошибку в документе. | 
|  | 63 | 
|  | 64 =head1 DESCRIPTION | 
|  | 65 | 
|  | 66 При проверке документа на ошибки формирования возвращается массив с объектами | 
|  | 67 C<IMPL::DOM::Schema::ValidationError>, каждая из которых описывает одну ошибку | 
|  | 68 в документе. | 
|  | 69 | 
|  | 70 С помощью данного объекта осущетсвляется привязка элемента схемы, элемента документа | 
|  | 71 и сообщения о причине возникновения ошибки. | 
|  | 72 | 
|  | 73 Часть ошибок, таких как проверка содержимого на регулярные выражения, привязаны | 
|  | 74 непосредственно к элементу. Но есть ошибки которые привязываются к родительскому | 
|  | 75 контейнеру, например отсутсвие обязательного элемента. В таком случае ошибка | 
|  | 76 содержит свойство C<parent> и по свойству C<source> можно определить элемент | 
|  | 77 (например его имя), к которому относится ошибка. | 
|  | 78 | 
|  | 79 =head1 MEMBERS | 
|  | 80 | 
|  | 81 =over | 
|  | 82 | 
|  | 83 =item C<[get] node> | 
|  | 84 | 
|  | 85 Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо | 
|  | 86 узлы, которые не могут присутствоать в данном месте по схеме. | 
|  | 87 | 
|  | 88 Данное свойство может быть C<undef>. | 
|  | 89 | 
|  | 90 =item C<[get] parent> | 
|  | 91 | 
|  | 92 Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node> | 
|  | 93 не указан, например, если по схеме должен существовать дочерний узел с определенным | 
|  | 94 именем, а в реальном документе его нет. | 
|  | 95 | 
|  | 96 Также это свойство может использоваться при формировании сообщения. | 
|  | 97 | 
|  | 98 =item C<[get] schema> | 
|  | 99 | 
|  | 100 Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан. | 
|  | 101 | 
|  | 102 =item C<[get] source> | 
|  | 103 | 
|  | 104 Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут | 
|  | 105 использовать ссылки, то данное свойство нужно для получения схемы узла, а не | 
|  | 106 схемы его типа. | 
|  | 107 | 
|  | 108 Тоесть проверка схемы узла C<IMPL::DOM::Schema::Node> приводит к проверке схемы | 
|  | 109 типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет | 
|  | 110 указывать именно на C<IMPL::DOM::Schema::Node>. | 
|  | 111 | 
|  | 112 =item C<[get] message> | 
|  | 113 | 
|  | 114 Возвращает форматированное сообщение об ошибке. | 
|  | 115 | 
|  | 116 =item C<toString()> | 
|  | 117 | 
|  | 118 Преобразует ошибку к строке, возвращает значение свойства C<Message> | 
|  | 119 | 
|  | 120 =back | 
|  | 121 | 
|  | 122 =head1 REMARKS | 
|  | 123 | 
|  | 124 =begin code | 
|  | 125 | 
|  | 126 my $doc = IMPL::DOM::XMLReader->LoadDocument('data.xml'); | 
|  | 127 my $schema = IMPL::DOM::Schema->LoadSchema('schema.xml'); | 
|  | 128 | 
|  | 129 my @errors = $schema->Validate($doc); | 
|  | 130 | 
|  | 131 my $node = $doc->selectSingleNode('user','name'); | 
|  | 132 | 
|  | 133 # Получаем все ошибки относящиеся к данному узлу | 
|  | 134 my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; | 
|  | 135 | 
|  | 136 =end code | 
|  | 137 | 
|  | 138 =cut |