Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/ValidationError.pm @ 393:69a1f1508696
minor security refactoring
author | cin |
---|---|
date | Fri, 14 Feb 2014 16:41:12 +0400 |
parents | 5aff94ba842f |
children |
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 |
389 | 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 }; | |
49 | 26 use IMPL::Resources::Format qw(FormatMessage); |
27 | |
28 sub CTOR { | |
29 my ($this,%args) = @_; | |
30 | |
236 | 31 $this->{$node} = $args{node}; |
389 | 32 $this->{$schemaNode} = $args{schemaNode} if $args{schemaNode}; |
33 $this->{$schemaType} = $args{schemaType} if $args{schemaType}; | |
34 | |
236 | 35 if ($args{parent}) { |
36 $this->{$parent} = $args{parent}; | |
37 } elsif ($args{node}) { | |
38 $this->{$parent} = $args{node}->parentNode; | |
125 | 39 } else { |
236 | 40 die new IMPL::InvalidArgumentException("A 'parent' or a 'node' parameter is required"); |
125 | 41 } |
383 | 42 |
389 | 43 if ($args{message}) { |
44 $this->{$message} = is($args{message},Label) ? $args{message}->Format(\%args) : FormatMessage($args{message}, \%args) ; | |
383 | 45 } |
389 | 46 |
49 | 47 } |
48 | |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
49 sub toString { |
194 | 50 (my $this) = @_; |
236 | 51 return $this->message; |
104
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
52 } |
196bf443b5e1
DOM::Schema RC0 inflators support, validation and some other things,
wizard
parents:
102
diff
changeset
|
53 |
49 | 54 1; |
125 | 55 |
56 __END__ | |
57 | |
58 =pod | |
59 | |
60 =head1 NAME | |
61 | |
180 | 62 C<IMPL::DOM::Schema::ValidationError> - Описывает ошибку в документе. |
125 | 63 |
64 =head1 DESCRIPTION | |
65 | |
180 | 66 При проверке документа на ошибки формирования возвращается массив с объектами |
67 C<IMPL::DOM::Schema::ValidationError>, каждая из которых описывает одну ошибку | |
68 в документе. | |
125 | 69 |
180 | 70 С помощью данного объекта осущетсвляется привязка элемента схемы, элемента документа |
71 и сообщения о причине возникновения ошибки. | |
125 | 72 |
236 | 73 Часть ошибок, таких как проверка содержимого на регулярные выражения, привязаны |
74 непосредственно к элементу. Но есть ошибки которые привязываются к родительскому | |
75 контейнеру, например отсутсвие обязательного элемента. В таком случае ошибка | |
76 содержит свойство C<parent> и по свойству C<source> можно определить элемент | |
77 (например его имя), к которому относится ошибка. | |
78 | |
125 | 79 =head1 MEMBERS |
80 | |
81 =over | |
230 | 82 |
265 | 83 =item C<[get] node> |
125 | 84 |
180 | 85 Узел в документе который привел к ошибке. Как правило это либо простые узлы, либо |
86 узлы, которые не могут присутствоать в данном месте по схеме. | |
125 | 87 |
180 | 88 Данное свойство может быть C<undef>. |
125 | 89 |
265 | 90 =item C<[get] parent> |
125 | 91 |
265 | 92 Родительский узел в котором произошла ошибка. Используется в случаях, когда C<node> |
180 | 93 не указан, например, если по схеме должен существовать дочерний узел с определенным |
94 именем, а в реальном документе его нет. | |
125 | 95 |
180 | 96 Также это свойство может использоваться при формировании сообщения. |
125 | 97 |
265 | 98 =item C<[get] schema> |
125 | 99 |
180 | 100 Схема для C<Node> или узла который должен присутсвовать если C<Node> не задан. |
125 | 101 |
265 | 102 =item C<[get] source> |
125 | 103 |
180 | 104 Схема, проверка которой привела к возникновению ошибки. Поскольку схемы могут |
105 использовать ссылки, то данное свойство нужно для получения схемы узла, а не | |
106 схемы его типа. | |
125 | 107 |
180 | 108 Тоесть проверка схемы узла C<IMPL::DOM::Schema::Node> приводит к проверке схемы |
109 типа, например, C<IMPL::DOM::Schema::ComplexType>, а свойство C<Source> будет | |
110 указывать именно на C<IMPL::DOM::Schema::Node>. | |
125 | 111 |
265 | 112 =item C<[get] message> |
125 | 113 |
180 | 114 Возвращает форматированное сообщение об ошибке. |
125 | 115 |
116 =item C<toString()> | |
117 | |
180 | 118 Преобразует ошибку к строке, возвращает значение свойства C<Message> |
125 | 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 | |
180 | 133 # Получаем все ошибки относящиеся к данному узлу |
265 | 134 my @nodeErrors = grep { ($_->node || $_->parent) == $node } @errors; |
125 | 135 |
136 =end code | |
137 | |
138 =cut |