Mercurial > pub > Impl
diff Lib/IMPL/DOM/Navigator/Builder.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | f25d021780b3 |
children | 259cd3df6e53 |
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Navigator/Builder.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/IMPL/DOM/Navigator/Builder.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,97 +1,97 @@ -package IMPL::DOM::Navigator::Builder; -use strict; -use warnings; - -use base qw(IMPL::Object); -use IMPL::Class::Property; -use IMPL::Class::Property::Direct; -require IMPL::DOM::Navigator::SchemaNavigator; - -BEGIN { - private _direct property _schemaNavi => prop_all; - private _direct property _nodesPath => prop_all; - private _direct property _nodeCurrent => prop_all; - private _direct property _docClass => prop_all - public _direct property Document => prop_get | owner_set; -} - -sub CTOR { - my ($this,$docClass,$schema) = @_; - - $this->{$_docClass} = $docClass; - $this->{$_schemaNavi} = $schema ? IMPL::DOM::Navigator::SchemaNavigator->new($schema) : undef; -} - -sub NavigateCreate { - my ($this,$nodeName,%props) = @_; - - if (my $schemaNode = $this->{$_schemaNavi}->NavigateName($nodeName)) { - my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType : 'IMPL::DOM::Node'; - - my $node; - if (! $this->{$Document}) { - $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); - } else { - die new IMPL::InvalidOperationException('Can\t create a second top level element') unless $this->{$_nodeCurrent}; - $node = $this->{$Document}->Create($nodeName,$class,\%props); - push @{$this->{$_nodesPath}}, $this->{$_nodeCurrent}; - $this->{$_nodeCurrent}->appendChild($node); - } - - $this->{$_nodeCurrent} = $node; - - return $node; - } else { - die new IMPL::InvalidOperationException("The specified node is undefined", $nodeName); - } -} - -sub Back { - my ($this) = @_; - - $this->{$_schemaNavi}->SchemaBack(); - $this->{$_nodeCurrent} = pop @{$this->{$_nodesPath}}; -} - -1; - -__END__ -=pod - -=head1 SYNOPSIS - -my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema); -my $reader = new IMPL::DOM::XMLReader(Navigator => $builder); - -$reader->ParseFile("document.xml"); - -my @errors = $schema->Validate($builder->Document); - -=head1 DESCRIPTION - -Построитель DOM документов по указанной схеме. Обычно используется в связке -с объектами для чтения такими как C<IMPL::DOM::XMLReader>. - -=head1 METHODS - -=over - -=item C<CTOR($domDocument,$schema)> - -Создает новый объект, принимает на вход пустой (но не обязательно) документ и -схему. - -=item C<< $obj->NavigateCreate($nodeName) >> - -Создает новый узел с указанным именем и переходит в него. В случае если в схеме -подходящий узел не найден, то вызывается исключение. - -При этом по имени узла ищется его схема, после чего определяется класс для -создания экземпляра и созданный узел доавляется в документ. - -Также имя создаваемого узла НЕ может быть переопределено свойством nodeName, оно -будет проигнорировано. - -=back - -=cut \ No newline at end of file +package IMPL::DOM::Navigator::Builder; +use strict; +use warnings; + +use base qw(IMPL::Object); +use IMPL::Class::Property; +use IMPL::Class::Property::Direct; +require IMPL::DOM::Navigator::SchemaNavigator; + +BEGIN { + private _direct property _schemaNavi => prop_all; + private _direct property _nodesPath => prop_all; + private _direct property _nodeCurrent => prop_all; + private _direct property _docClass => prop_all + public _direct property Document => prop_get | owner_set; +} + +sub CTOR { + my ($this,$docClass,$schema) = @_; + + $this->{$_docClass} = $docClass; + $this->{$_schemaNavi} = $schema ? IMPL::DOM::Navigator::SchemaNavigator->new($schema) : undef; +} + +sub NavigateCreate { + my ($this,$nodeName,%props) = @_; + + if (my $schemaNode = $this->{$_schemaNavi}->NavigateName($nodeName)) { + my $class = $schemaNode->can('nativeType') ? $schemaNode->nativeType : 'IMPL::DOM::Node'; + + my $node; + if (! $this->{$Document}) { + $node = $this->{$Document} = $this->{$_docClass}->new(nodeName => $nodeName,%props); + } else { + die new IMPL::InvalidOperationException('Can\t create a second top level element') unless $this->{$_nodeCurrent}; + $node = $this->{$Document}->Create($nodeName,$class,\%props); + push @{$this->{$_nodesPath}}, $this->{$_nodeCurrent}; + $this->{$_nodeCurrent}->appendChild($node); + } + + $this->{$_nodeCurrent} = $node; + + return $node; + } else { + die new IMPL::InvalidOperationException("The specified node is undefined", $nodeName); + } +} + +sub Back { + my ($this) = @_; + + $this->{$_schemaNavi}->SchemaBack(); + $this->{$_nodeCurrent} = pop @{$this->{$_nodesPath}}; +} + +1; + +__END__ +=pod + +=head1 SYNOPSIS + +my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema); +my $reader = new IMPL::DOM::XMLReader(Navigator => $builder); + +$reader->ParseFile("document.xml"); + +my @errors = $schema->Validate($builder->Document); + +=head1 DESCRIPTION + +Построитель DOM документов по указанной схеме. Обычно используется в связке +с объектами для чтения такими как C<IMPL::DOM::XMLReader>. + +=head1 METHODS + +=over + +=item C<CTOR($domDocument,$schema)> + +Создает новый объект, принимает на вход пустой (но не обязательно) документ и +схему. + +=item C<< $obj->NavigateCreate($nodeName) >> + +Создает новый узел с указанным именем и переходит в него. В случае если в схеме +подходящий узел не найден, то вызывается исключение. + +При этом по имени узла ищется его схема, после чего определяется класс для +создания экземпляра и созданный узел доавляется в документ. + +Также имя создаваемого узла НЕ может быть переопределено свойством nodeName, оно +будет проигнорировано. + +=back + +=cut