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