Mercurial > pub > Impl
annotate Lib/IMPL/DOM/Schema/NodeList.pm @ 28:6d33f75c6e1f
ORM in works
| author | Sergey |
|---|---|
| date | Mon, 19 Oct 2009 04:13:54 +0400 |
| parents | 7f00786f8210 |
| children | 16ada169ca75 |
| rev | line source |
|---|---|
| 8 | 1 package IMPL::DOM::Schema::NodeList; |
| 2 use strict; | |
| 3 use warnings; | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
4 use base qw(IMPL::DOM::Node); |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
5 |
| 8 | 6 use IMPL::Class::Property; |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
7 require IMPL::DOM::Schema::ValidationError; |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
8 |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
9 our %CTOR = ( |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
10 'IMPL::DOM::Node' => sub { nodeName => 'NodeList' } |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
11 ); |
| 8 | 12 |
| 13 BEGIN { | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
14 public property messageUnexpected => prop_all; |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
15 public property messageNodesRequired => prop_all; |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
16 } |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
17 |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
18 sub CTOR { |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
19 my ($this,%args) = @_; |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
20 |
| 24 | 21 $this->messageUnexpected($args{messageUnexpected} || 'A %Node.nodeName% isn\'t allowed in %Node.parentNode.path%'); |
| 22 $this->messageNodesRequired($args{messageNodesRequired} || 'A %Schema.name% is required in the node %Node.path%'); | |
| 8 | 23 } |
| 24 | |
| 25 sub Validate { | |
| 26 my ($this,$node) = @_; | |
| 27 | |
| 28 my @nodes = map { | |
| 24 | 29 {nodeName => $_->name, anyNode => $_->isa('IMPL::DOM::Schema::AnyNode') , Schema => $_, Max => $_->maxOccur eq 'unbounded' ? undef : $_->maxOccur, Min => $_->minOccur, Seen => 0 } |
| 8 | 30 } @{$this->childNodes}; |
| 31 | |
| 32 my $info = shift @nodes; | |
| 33 | |
| 34 foreach my $child ( @{$node->childNodes} ) { | |
| 35 #skip schema elements | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
36 while ($info and not $info->{anyNode} and $info->{nodeName} ne $child->nodeName) { |
| 8 | 37 # if possible of course :) |
| 24 | 38 return new IMPL::DOM::Schema::ValidationError ( |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
39 Message => $this->messageUnexpected, |
| 8 | 40 Node => $child, |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
41 Schema => $info->{Schema}, |
| 8 | 42 Source => $this |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
43 ) if $info->{Min} > $info->{Seen}; |
| 8 | 44 |
| 45 $info = shift @nodes; | |
| 46 } | |
| 47 | |
| 48 # return error if no more children allowed | |
| 24 | 49 return new IMPL::DOM::Schema::ValidationError ( |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
50 Message => $this->messageUnexpected, |
| 8 | 51 Node => $child, |
| 52 Source => $this | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
53 ) unless $info; |
| 8 | 54 |
| 24 | 55 # it's ok, we found schema element for child |
| 56 # but it may be any node or switching node wich would not satisfy current child | |
| 57 | |
| 58 # validate | |
| 59 while (my @errors = $info->{Schema}->Validate($child)) { | |
| 60 if( $info->{anyNode} and $info->{Seen} >= $info->{Min} ) { | |
| 61 # in case of any or switch node, skip it if possible | |
| 62 next if $info = shift @nodes; | |
| 63 } | |
| 64 return @errors; | |
| 65 } | |
| 66 | |
| 8 | 67 $info->{Seen}++; |
| 68 | |
| 69 # check count limits | |
| 24 | 70 return new IMPL::DOM::Schema::ValidationError ( |
| 8 | 71 Error => 1, |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
72 Message => $this->messageUnexpected, |
| 8 | 73 Node => $child, |
| 74 Source => $this, | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
75 ) if $info->{Max} and $info->{Seen} > $info->{Max}; |
| 8 | 76 } |
| 77 | |
| 78 # no more children left (but may be should :) | |
| 79 while ($info) { | |
| 24 | 80 return new IMPL::DOM::Schema::ValidationError ( |
| 8 | 81 Error => 1, |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
82 Message => $this->messageNodesRequired, |
|
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
83 Node => $node, |
| 24 | 84 Source => $this, |
| 85 Schema => $info->{Schema} | |
|
19
1ca530e5c9c5
DOM схема, требует переработки в части схемы для описания схем. Автоверификация не проходит
Sergey
parents:
8
diff
changeset
|
86 ) if $info->{Seen} < $info->{Min}; |
| 8 | 87 |
| 88 $info = shift @nodes; | |
| 89 } | |
| 24 | 90 return; |
| 8 | 91 } |
| 92 | |
| 93 1; | |
| 94 | |
| 95 __END__ | |
| 96 | |
| 97 =pod | |
| 98 | |
| 99 =head1 DESCRIPTION | |
| 100 | |
| 101 . . | |
| 102 C<IMPL::DOM::Schema::ComplexNode> C<IMPL::DOM::Schema::SimpleNode>. | |
| 103 | |
| 104 =cut |
