Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Navigator/Builder.pm @ 250:129e48bb5afb
DOM refactoring
ObjectToDOM methods are virtual
QueryToDOM uses inflators
Fixed transform for the complex values in the ObjectToDOM
QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author | sergey |
---|---|
date | Wed, 07 Nov 2012 04:17:53 +0400 |
parents | 2746a8e5a6c4 |
children | 4ddb27ff4a0b |
comparison
equal
deleted
inserted
replaced
249:0057f48f7945 | 250:129e48bb5afb |
---|---|
39 my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType || 'IMPL::DOM::Node' : 'IMPL::DOM::Node'; | 39 my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType || 'IMPL::DOM::Node' : 'IMPL::DOM::Node'; |
40 | 40 |
41 my $schemaSource = $this->{$_schemaNavi}->SourceSchemaNode; | 41 my $schemaSource = $this->{$_schemaNavi}->SourceSchemaNode; |
42 | 42 |
43 my @errors = $this->inflateProperties($schemaNode,\%props); | 43 my @errors = $this->inflateProperties($schemaNode,\%props); |
44 | |
44 $props{schema} = $schemaNode; | 45 $props{schema} = $schemaNode; |
45 $props{schemaSource} = $schemaSource; | 46 $props{schemaSource} = $schemaSource; |
46 | 47 |
47 my $node; | 48 my $node; |
48 if (! $this->{$Document}) { | 49 if (! $this->{$Document}) { |
49 $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); | 50 $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); |
50 $this->_initNavigator($node); | 51 $this->_initNavigator($node); |
51 } else { | 52 } else { |
52 die new IMPL::InvalidOperationException('Can create a second top level element') unless $this->Current; | 53 die new IMPL::InvalidOperationException('Can\'t create a second top level element') unless $this->Current; |
53 $node = $this->{$Document}->Create($nodeName,$class,\%props); | 54 $node = $this->{$Document}->Create($nodeName,$class,\%props); |
54 $this->Current->appendChild($node); | 55 $this->Current->appendChild($node); |
55 $this->internalNavigateNodeSet($node); | 56 $this->internalNavigateNodeSet($node); |
56 } | 57 } |
57 | 58 |
91 } | 92 } |
92 return @errors; | 93 return @errors; |
93 } | 94 } |
94 | 95 |
95 sub inflateValue { | 96 sub inflateValue { |
96 my ($this,$value,$node) = @_; | 97 my ($this,$value,$node,$strict) = @_; |
97 | 98 |
99 $strict ||= 0; | |
98 $node ||= $this->Current; | 100 $node ||= $this->Current; |
99 | 101 |
100 my $nodeSchema = $this->{$_schemaNavi}->Current; | 102 my $nodeSchema = $this->{$_schemaNavi}->Current; |
101 | 103 |
102 my $result = eval { $nodeSchema->inflateValue($value) }; | 104 my $result = eval { $nodeSchema->inflateValue($value) }; |
106 node => $node, | 108 node => $node, |
107 error => $e, | 109 error => $e, |
108 message => $nodeSchema->messageInflateError, | 110 message => $nodeSchema->messageInflateError, |
109 source => $this->{$_schemaNavi}->SourceSchemaNode | 111 source => $this->{$_schemaNavi}->SourceSchemaNode |
110 )); | 112 )); |
111 return $value; | 113 return $strict ? undef : $value ; |
112 } else { | 114 } else { |
113 return $result; | 115 return $result; |
114 } | 116 } |
115 } | 117 } |
116 | 118 |
138 #compatibility | 140 #compatibility |
139 sub buildErrors { | 141 sub buildErrors { |
140 goto &BuildErrors; | 142 goto &BuildErrors; |
141 } | 143 } |
142 | 144 |
145 sub document { | |
146 goto &Document; | |
147 } | |
148 | |
143 1; | 149 1; |
144 | 150 |
145 __END__ | 151 __END__ |
146 | 152 |
147 =pod | 153 =pod |
166 =head1 DESCRIPTION | 172 =head1 DESCRIPTION |
167 | 173 |
168 Построитель DOM документов по указанной схеме. Обычно используется в связке | 174 Построитель DOM документов по указанной схеме. Обычно используется в связке |
169 с объектами для чтения такими как C<IMPL::DOM::XMLReader>. | 175 с объектами для чтения такими как C<IMPL::DOM::XMLReader>. |
170 | 176 |
171 =head1 METHODS | 177 =head1 MEMBERS |
172 | 178 |
173 =over | 179 =head2 C< CTOR($classDocument,$schema, %opts) > |
174 | |
175 =item C< CTOR($classDocument,$schema) > | |
176 | 180 |
177 Создает новый объект, принимает на вход класс документа (или фабрику, например | 181 Создает новый объект, принимает на вход класс документа (или фабрику, например |
178 L<IMPL::Object::Factory>) и схему. В процессе процедуры построения документа | 182 L<IMPL::Object::Factory>) и схему. В процессе процедуры построения документа |
179 будет создан объект документа. | 183 будет создан объект документа. |
180 | 184 |
181 =item C< NavigateCreate($nodeName,\%props) > | 185 Необязательные именованные параметры |
186 | |
187 =over | |
188 | |
189 =item C<ignoreUndefined> | |
190 | |
191 C<NavigateCreate> не будет вызывать исключение, если запрашиваемый узел не | |
192 найден в схеме, но будет возвращать C<undef>. | |
193 | |
194 =back | |
195 | |
196 =head2 C< NavigateCreate($nodeName,%props) > | |
182 | 197 |
183 Создает новый узел с указанным именем и переходит в него. В случае если в схеме | 198 Создает новый узел с указанным именем и переходит в него. В случае если в схеме |
184 подходящий узел не найден, то вызывается исключение. | 199 подходящий узел не найден, то вызывается исключение или будет возвращено |
200 C<undef> см. C<ignoreUndefined>. | |
185 | 201 |
186 При этом по имени узла ищется его схема, после чего определяется класс для | 202 При этом по имени узла ищется его схема, после чего определяется класс для |
187 создания экземпляра и созданный узел доавляется в документ. При создании | 203 создания экземпляра узла и созданный узел доавляется в документ. При создании |
188 нового узла используется метод документа C<< IMPL::DOM::Document->Create >> | 204 нового узла используется метод документа C<< IMPL::DOM::Document->Create >> |
189 | 205 |
190 Свойства узла передаются при создании через параметр C<%props>, но имя создаваемого | 206 Свойства узла передаются при создании через параметр C<%props>, но имя |
191 узла НЕ может быть переопределено свойством C<nodeName>, оно будет проигнорировано. | 207 создаваемого узла НЕ может быть переопределено свойством C<nodeName>, оно будет |
192 | 208 проигнорировано. |
193 =item C< Document > | 209 |
210 Свойства узла будут преобразованы при помощи заданных в схеме заполнителей | |
211 C<inflator>. | |
212 | |
213 =head2 C<[get]document > | |
194 | 214 |
195 Свойство, которое содержит документ по окончании процедуры построения. | 215 Свойство, которое содержит документ по окончании процедуры построения. |
196 | 216 |
197 =back | 217 =head2 C<[get]buildErrors> |
218 | |
219 Ошибки, возникшие в процессе построения документа. | |
220 | |
221 =head2 C<[get]ignoreUndefined> | |
222 | |
223 Опция, заданная при создании построителя, отвечающая за обработку узлов | |
224 не найденных в схеме. | |
198 | 225 |
199 =cut | 226 =cut |