Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/ValidationError.pm @ 384:4edd36025051
DOM schema refactoring
author | cin |
---|---|
date | Mon, 10 Feb 2014 17:41:34 +0400 |
parents | 2f16f13b000c |
children | 5aff94ba842f |
rev | line source |
---|---|
49 | 1 package IMPL::DOM::Schema::ValidationError; |
2 use strict; | |
3 use warnings; | |
4 | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
5 use overload |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
6 '""' => \&toString, |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
7 'fallback' => 1; |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
8 |
165 | 9 use parent qw(IMPL::Object); |
49 | 10 use IMPL::Class::Property; |
11 use IMPL::Resources::Format qw(FormatMessage); | |
12 | |
13 BEGIN { | |
236 | 14 public _direct property node => prop_get; # target document node (if exists) |
15 public _direct property schema => prop_get; # a schema for the target node (if exists) | |
16 public _direct property source => prop_get; # a schema which triggered this error (can be equal to the Schema) | |
17 public _direct property parent => prop_get; | |
18 public _direct property message => prop_get; # displayable message | |
49 | 19 } |
20 | |
21 sub CTOR { | |
22 my ($this,%args) = @_; | |
23 | |
236 | 24 $this->{$node} = $args{node}; |
25 $this->{$schema} = $args{schema} if $args{schema}; | |
26 $this->{$source} = $args{source} if $args{source}; | |
27 if ($args{parent}) { | |
28 $this->{$parent} = $args{parent}; | |
29 } elsif ($args{node}) { | |
30 $this->{$parent} = $args{node}->parentNode; | |
125 | 31 } else { |
236 | 32 die new IMPL::InvalidArgumentException("A 'parent' or a 'node' parameter is required"); |
125 | 33 } |
383 | 34 |
35 if(my $msg = $args{message}) { | |
36 if (my($msgId) = ( $msg =~ /^ID:([\w\.]+)$/ ) ) { | |
37 $this->{$message} = ($args{schema} || $args{source})->document->stringMap->GetString($msgId, \%args); | |
38 } else { | |
39 $this->{$message} = FormatMessage(delete $args{message}, \%args) if $args{message}; | |
40 } | |
41 } | |
49 | 42 } |
43 | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
44 sub toString { |
194 | 45 (my $this) = @_; |
236 | 46 return $this->message; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
47 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
48 |
49 | 49 1; |
125 | 50 |
51 __END__ | |
52 | |
53 =pod | |
54 | |
55 =head1 NAME | |
56 | |
180 | 57 C<IMPL::DOM::Schema::ValidationError> - Описывает ошибку в документе. |
125 | 58 |
59 =head1 DESCRIPTION | |
60 | |
180 | 61 При проверке документа на ошибки формирования возвращается массив с объектами |
62 C<IMPL::DOM::Schema::ValidationError>, каждая из которых описывает одну ошибку | |
63 в документе. | |
125 | 64 |
180 | 65 С помощью данного объекта осущетсвляется привязка элемента схемы, элемента документа |
66 и сообщения о причине возникновения ошибки. | |
125 | 67 |
236 | 68 Часть ошибок, таких как проверка содержимого на регулярные выражения, привязаны |
69 непосредственно к элементу. Но есть ошибки которые привязываются к родительскому | |
70 контейнеру, например отсутсвие обязательного элемента. В таком случае ошибка | |
71 содержит свойство C<parent> и по свойству C<source> можно определить элемент | |
72 (например его имя), к которому относится ошибка. | |
73 | |
125 | 74 =head1 MEMBERS |
75 | |
76 =over | |
230 | 77 |
265 | 78 =item C<[get] node> |
125 | 79 |
180 | 80 Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо |
81 узлы, которые не могут присутствоать в данном месте по схеме. | |
125 | 82 |
180 | 83 Данное свойство может быть C<undef>. |
125 | 84 |
265 | 85 =item C<[get] parent> |
125 | 86 |
265 | 87 Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node> |
180 | 88 не указан, например, если по схеме должен существовать дочерний узел с определенным |
89 именем, а в реальном документе его нет. | |
125 | 90 |
180 | 91 Также это свойство может использоваться при формировании сообщения. |
125 | 92 |
265 | 93 =item C<[get] schema> |
125 | 94 |
180 | 95 Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан. |
125 | 96 |
265 | 97 =item C<[get] source> |
125 | 98 |
180 | 99 Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут |
100 использовать ссылки, то данное свойство нужно для получения схемы узла, а не | |
101 схемы его типа. | |
125 | 102 |
180 | 103 Тоесть проверка схемы узла C<IMPL::DOM::Schema::Node> приводит к проверке схемы |
104 типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет | |
105 указывать именно на C<IMPL::DOM::Schema::Node>. | |
125 | 106 |
265 | 107 =item C<[get] message> |
125 | 108 |
180 | 109 Возвращает форматированное сообщение об ошибке. |
125 | 110 |
111 =item C<toString()> | |
112 | |
180 | 113 Преобразует ошибку к строке, возвращает значение свойства C<Message> |
125 | 114 |
115 =back | |
116 | |
117 =head1 REMARKS | |
118 | |
119 =begin code | |
120 | |
121 my $doc = IMPL::DOM::XMLReader->LoadDocument('data.xml'); | |
122 my $schema = IMPL::DOM::Schema->LoadSchema('schema.xml'); | |
123 | |
124 my @errors = $schema->Validate($doc); | |
125 | |
126 my $node = $doc->selectSingleNode('user','name'); | |
127 | |
180 | 128 # Получаем все ошибки относящиеся к данному узлу |
265 | 129 my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; |
125 | 130 |
131 =end code | |
132 | |
133 =cut |