From 947ecdf0132003bcab94957505f7c794b804ba04 Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Wed, 21 Dec 2016 15:03:18 +0100 Subject: [PATCH] Bug 17807: Use XSLT_Handler in Koha::OAI Content-Type: text/plain; charset=utf-8 Replacing some code in the OAI modules by a call to an existing module. Note that the xmldoc format is used in the transform call to get a xml document object. The stylesheet method of Repository now only returns the name of the xsl file to be used instead of a cached xslt object. Similar functionality inside XSLT_Handler is used when calling transform. Note: We still lack unit tests in this area. I did not see the need for adding something for stylesheet since it only returns a simple string. The other change is made in Record::new; there are no tests for this module yet and the heart of the change here is actually tested already in XSLT_Handler.t. Note: I benchmarked calls to Repository in the old and the new situation and did not see significant changes. Test plan: [1] Run t/db_dependent/Koha/OAI/Server.t [2] Run oai.pl with ListRecords and marcxml. [3] Run oai.pl with ListRecords and oai_dc. --- Koha/OAI/Server/Record.pm | 20 ++++++++++++++------ Koha/OAI/Server/Repository.pm | 31 ++++++++++--------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/Koha/OAI/Server/Record.pm b/Koha/OAI/Server/Record.pm index 542dfc4..7b1078b 100644 --- a/Koha/OAI/Server/Record.pm +++ b/Koha/OAI/Server/Record.pm @@ -21,6 +21,7 @@ package Koha::OAI::Server::Record; use Modern::Perl; use HTTP::OAI; use HTTP::OAI::Metadata::OAI_DC; +use XML::LibXML; use base ("HTTP::OAI::Record"); @@ -40,14 +41,21 @@ sub new { $self->header->setSpec($setSpec); } - my $parser = XML::LibXML->new(); - my $record_dom = $parser->parse_string( $marcxml ); - my $format = $args{metadataPrefix}; + my $format = $args{metadataPrefix}; + my $record_dom; if ( $format ne 'marcxml' ) { - my %args = ( + my $args = { OPACBaseURL => "'" . C4::Context->preference('OPACBaseURL') . "'" - ); - $record_dom = $repository->stylesheet($format)->transform($record_dom, %args); + }; + # call Koha::XSLT_Handler now + $record_dom = $repository->{xslt_engine}->transform({ + xml => $marcxml, + file => $repository->stylesheet($format), + parameters => $args, + format => 'xmldoc', + }); + } else { + $record_dom = XML::LibXML->new->parse_string( $marcxml ); } $self->metadata( HTTP::OAI::Metadata->new( dom => $record_dom ) ); diff --git a/Koha/OAI/Server/Repository.pm b/Koha/OAI/Server/Repository.pm index f4f30f6..372cdcd 100644 --- a/Koha/OAI/Server/Repository.pm +++ b/Koha/OAI/Server/Repository.pm @@ -31,13 +31,11 @@ use Koha::OAI::Server::GetRecord; use Koha::OAI::Server::ListRecords; use Koha::OAI::Server::ListIdentifiers; use XML::SAX::Writer; -use XML::LibXML; -use XML::LibXSLT; use YAML::Syck qw( LoadFile ); use CGI qw/:standard -oldstyle_urls/; use C4::Context; use C4::Biblio; - +use Koha::XSLT_Handler; =head1 NAME @@ -100,7 +98,7 @@ sub new { $self->{ koha_identifier } = C4::Context->preference("OAI-PMH:archiveID"); $self->{ koha_max_count } = C4::Context->preference("OAI-PMH:MaxCount"); $self->{ koha_metadata_format } = ['oai_dc', 'marcxml']; - $self->{ koha_stylesheet } = { }; # Build when needed + $self->{ xslt_engine } = Koha::XSLT_Handler->new; # Load configuration file if defined in OAI-PMH:ConfFile syspref if ( my $file = C4::Context->preference("OAI-PMH:ConfFile") ) { @@ -157,23 +155,14 @@ sub get_biblio_marcxml { sub stylesheet { my ( $self, $format ) = @_; - - my $stylesheet = $self->{ koha_stylesheet }->{ $format }; - unless ( $stylesheet ) { - my $xsl_file = $self->{ conf } - ? $self->{ conf }->{ format }->{ $format }->{ xsl_file } - : ( C4::Context->config('intrahtdocs') . - '/prog/en/xslt/' . - C4::Context->preference('marcflavour') . - 'slim2OAIDC.xsl' ); - my $parser = XML::LibXML->new(); - my $xslt = XML::LibXSLT->new(); - my $style_doc = $parser->parse_file( $xsl_file ); - $stylesheet = $xslt->parse_stylesheet( $style_doc ); - $self->{ koha_stylesheet }->{ $format } = $stylesheet; - } - - return $stylesheet; + my $xsl_file = $self->{ conf } + ? $self->{ conf }->{ format }->{ $format }->{ xsl_file } + : ( C4::Context->config('intrahtdocs') . + '/prog/en/xslt/' . + C4::Context->preference('marcflavour') . + 'slim2OAIDC.xsl' + ); + return $xsl_file; } 1; -- 2.1.4