Mercurial > pub > buggler
view lib/Benzin/Bugzilla/XmlWriter.pm @ 10:14a966369278
working version of exporting bugs from bugzilla in tj3 format (without bookings)
author | cin |
---|---|
date | Mon, 07 Sep 2015 01:37:11 +0300 |
parents | |
children | 4eb9fdf4efa9 |
line wrap: on
line source
package Benzin::Bugzilla::XmlWriter; our %Transform = ( 'Benzin::Bugzilla::Bug' => 'WriteBug', 'Benzin::Bugzilla::BugComment' => 'WriteBugComment', 'HASH' => 'WriteHash', -plain => 'WriteValue', -default => 'WriteValue' ); use IMPL::Const qw(:prop); use IMPL::declare { require => { XMLWriter => 'XML::Writer', Bug => 'Benzin::Bugzilla::Bug', BugComment => 'Benzin::Bugzilla::BugComment' }, base => [ 'IMPL::Transform' => sub { %Transform } ], props => [ _writer => PROP_RW ] }; use fields qw(_writer); sub CTOR { my SELF $this = shift; $this->_writer(XMLWriter->new(@_)); } sub WriteBugList { my SELF $this = shift; my $bugs = shift || []; my $writer = $this->_writer; $writer->xmlDecl("UTF-8"); $writer->startTag("bugzilla"); foreach my $bug (@$bugs) { $writer->startTag("bug"); $this->WriteBug($bug); $writer->endTag(); } $writer->endTag(); } sub WriteBug { my SELF $this = shift; my $value = shift; my $writer = $this->_writer; foreach my $field ( @{ Bug->BUG_FIELDS } ) { next unless $value->{$field}; $this->WriteElement( $field, $value->{$field} ); } } sub WriteBugComment { my SELF $this = shift; my $value = shift; my $writer = $this->_writer; foreach my $field ( @{ BugComment->COMMENT_FIELDS } ) { next unless $value->{$field}; $this->WriteElement( $field, $value->{$field} ); } } sub WriteHash { my SELF $this = shift; my $value = shift; while(my ($k,$v) = each %$value) { $this->WriteElement($k,$v); } } sub WriteElement { my SELF $this = shift; my ( $name, $data ) = @_; my $writer = $this->_writer; my @values = ref($data) && ref($data) eq 'ARRAY' ? @{$data} : $data; foreach my $v (@values) { $writer->startTag($name); $this->Transform( $v ); $writer->endTag; } } sub WriteValue { my SELF $this = shift; my $value = shift; $this->_writer->characters($value) if defined $value; } 1;