Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/ValidationError.pm @ 329:50ff1595bd62
fixed bug when transforming list properties
author | sergey |
---|---|
date | Mon, 03 Jun 2013 18:03:54 +0400 |
parents | 4ddb27ff4a0b |
children | 2f16f13b000c |
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 } |
236 | 34 $this->{$message} = FormatMessage(delete $args{message}, \%args) if $args{message}; |
49 | 35 } |
36 | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
37 sub toString { |
194 | 38 (my $this) = @_; |
236 | 39 return $this->message; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
40 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
41 |
49 | 42 1; |
125 | 43 |
44 __END__ | |
45 | |
46 =pod | |
47 | |
48 =head1 NAME | |
49 | |
180 | 50 C<IMPL::DOM::Schema::ValidationError> - Описывает ошибку в документе. |
125 | 51 |
52 =head1 DESCRIPTION | |
53 | |
180 | 54 При проверке документа на ошибки формирования возвращается массив с объектами |
55 C<IMPL::DOM::Schema::ValidationError>, каждая из которых описывает одну ошибку | |
56 в документе. | |
125 | 57 |
180 | 58 С помощью данного объекта осущетсвляется привязка элемента схемы, элемента документа |
59 и сообщения о причине возникновения ошибки. | |
125 | 60 |
236 | 61 Часть ошибок, таких как проверка содержимого на регулярные выражения, привязаны |
62 непосредственно к элементу. Но есть ошибки которые привязываются к родительскому | |
63 контейнеру, например отсутсвие обязательного элемента. В таком случае ошибка | |
64 содержит свойство C<parent> и по свойству C<source> можно определить элемент | |
65 (например его имя), к которому относится ошибка. | |
66 | |
125 | 67 =head1 MEMBERS |
68 | |
69 =over | |
230 | 70 |
265 | 71 =item C<[get] node> |
125 | 72 |
180 | 73 Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо |
74 узлы, которые не могут присутствоать в данном месте по схеме. | |
125 | 75 |
180 | 76 Данное свойство может быть C<undef>. |
125 | 77 |
265 | 78 =item C<[get] parent> |
125 | 79 |
265 | 80 Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node> |
180 | 81 не указан, например, если по схеме должен существовать дочерний узел с определенным |
82 именем, а в реальном документе его нет. | |
125 | 83 |
180 | 84 Также это свойство может использоваться при формировании сообщения. |
125 | 85 |
265 | 86 =item C<[get] schema> |
125 | 87 |
180 | 88 Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан. |
125 | 89 |
265 | 90 =item C<[get] source> |
125 | 91 |
180 | 92 Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут |
93 использовать ссылки, то данное свойство нужно для получения схемы узла, а не | |
94 схемы его типа. | |
125 | 95 |
180 | 96 Тоесть проверка схемы узла C<IMPL::DOM::Schema::Node> приводит к проверке схемы |
97 типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет | |
98 указывать именно на C<IMPL::DOM::Schema::Node>. | |
125 | 99 |
265 | 100 =item C<[get] message> |
125 | 101 |
180 | 102 Возвращает форматированное сообщение об ошибке. |
125 | 103 |
104 =item C<toString()> | |
105 | |
180 | 106 Преобразует ошибку к строке, возвращает значение свойства C<Message> |
125 | 107 |
108 =back | |
109 | |
110 =head1 REMARKS | |
111 | |
112 =begin code | |
113 | |
114 my $doc = IMPL::DOM::XMLReader->LoadDocument('data.xml'); | |
115 my $schema = IMPL::DOM::Schema->LoadSchema('schema.xml'); | |
116 | |
117 my @errors = $schema->Validate($doc); | |
118 | |
119 my $node = $doc->selectSingleNode('user','name'); | |
120 | |
180 | 121 # Получаем все ошибки относящиеся к данному узлу |
265 | 122 my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; |
125 | 123 |
124 =end code | |
125 | |
126 =cut |