<min_spare_children>1</min_spare_children>
<max_spare_children>5</max_spare_children>
</unix_config>
+ <app_settings>
+ <oai>
+ <!-- Where necessary, override the default settings here in the app_settings element. -->
+
+ <!-- The OAI endpoint. The domain is the name of your proxy or frontend opac website. -->
+ <!-- <base_url>http://mydomain.org/opac/extras/oai</base_url> -->
+
+ <!-- <repository_name>My organization(s)</repository_name> -->
+ <!-- <admin_email>admin@mydomain.org</admin_email> -->
+
+ <!-- The maximum number of records in a ListRecords and ListIdentifiers response. -->
+ <!-- <max_count>50</max_count> -->
+
+ <!-- <granularity>YYYY-MM-DDThh:mm:ss</granularity> -->
+ <!-- <earliest_datestamp>0001-01-01</earliest_datestamp> -->
+ <!-- <deleted_record>yes</deleted_record> -->
+ <!-- <scheme>oai</scheme> -->
+ <!-- <repository_identifier>mydomain.org</repository_identifier> -->
+ <!-- <delimiter>:</delimiter> -->
+ <!-- <sample_identifier>oai:mydomain.org:12345</sample_identifier> -->
+ <!-- <list_sets>false</list_sets> -->
+
+ <!--
+ The metadataformat element contains the schema for the oai_dc and marcxml metadata formats.
+ Each schema needs a reference to an xslt document.
+ You can replace them with your custom xslt stylesheets.
+ Place those in the /<openils sysdir>/var/xsl folder.
+ You can also extend the OAI2 service further with new metadata schema.
+
+ Bibliographic and authority records share the same stylesheet.
+ Should you want to render them differently, use the
+ marc:datafield[@tag='901']/marc:subfield[@code='t']
+ value to identify the record type. -->
+
+ <!--
+ <metadataformat>
+ <oai_dc>
+ <namespace_uri>http://www.openarchives.org/OAI/2.0/oai_dc/</namespace_uri>
+ <schema_location>http://www.openarchives.org/OAI/2.0/oai_dc.xsd</schema_location>
+ <xslt>OAI2_OAIDC.xsl</xslt>
+ </oai_dc>
+ <marcxml>
+ <namespace_uri>http://www.loc.gov/MARC21/slim</namespace_uri>
+ <schema_location>http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd</schema_location>
+ <xslt>OAI2_MARC21slim.xsl</xslt>
+ </marcxml>
+ </metadataformat> -->
+
+ <!--
+ You can add different schema to the metadataformat element thus:
+ <mods>
+ <namespace_uri>http://www.loc.gov/mods/</namespace_uri>
+ <schema_location>http://www.loc.gov/standards/mods/mods.xsd</schema_location>
+ <xslt>my-custom-marc2mods.xsl</xslt>
+ </mods>
+ <my-metadata_prefix>
+ <namespace_uri>my-namespace_uri</namespace_uri>
+ <schema_location>my-schema_location</schema_location>
+ <xslt>my-marc2my-metadata.xsl</xslt>
+ </my-metadata_prefix>
+ -->
+
+ <!-- Change the way the asset copy values are mapped to which subfield codes: -->
+ <!--
+ <copies>
+ <a>location</a>
+ <b>owning_lib</b>
+ <c>callnumber</c>
+ <d>circlib</d>
+ <g>barcode</g>
+ <n>status</n>
+ </copies>
+ -->
+ <!-- Or add static values to the copies element like this:
+ <z>A value that always should for example be in the 852$z</z>
+ -->
+
+ <!-- Accept only 852$[barcode] values that match this regular expression. E.g.
+ <barcode_filter>^[A-Za-z0-9]+</barcode_filter>
+ only renders 852 datafields that contain barcodes values that begin with letters and numbers.
+ -->
+ <!--
+ <barcode_filter><barcode_filter>
+ -->
+
+ <!-- Accept only 852$[status] values that match this regular expression. E.g.
+ <status_filter>^Available$</status_filter>
+ only renders 852 datafields that contain status code values that exactly match the string 'Available'.
+ -->
+ <!--
+ <status_filter></status_filter>
+ -->
+ <oai>
+ </app_settings>
+
</open-ils.supercat>
<!-- server for accessing user info -->
</app_settings>
</open-ils.cstore>
- <open-ils.oai>
- <keepalive>5</keepalive>
- <stateless>1</stateless>
- <language>perl</language>
- <implementation>OpenILS::Application::OAI</implementation>
- <max_requests>199</max_requests>
- <unix_config>
- <unix_sock>open-ils.oai_unix.sock</unix_sock>
- <unix_pid>open-ils.oai_unix.pid</unix_pid>
- <max_requests>1000</max_requests>
- <unix_log>open-ils.oai_unix.log</unix_log>
- <min_children>1</min_children>
- <max_children>5</max_children>
- <min_spare_children>1</min_spare_children>
- <max_spare_children>2</max_spare_children>
- </unix_config>
- <app_settings>
-
- <!-- Where necessary, override the default settings here in the app_settings element. -->
-
- <!-- The OAI endpoint. The domain is the name of your proxy or frontend opac website. -->
- <!-- <base_url>http://mydomain.org/opac/extras/oai</base_url> -->
-
- <!-- <repository_name>My organization(s)</repository_name> -->
- <!-- <admin_email>admin@mydomain.org</admin_email> -->
-
- <!-- The maximum number of records in a ListRecords and ListIdentifiers response. -->
- <!-- <max_count>50</max_count> -->
-
- <!-- <granularity>YYYY-MM-DDThh:mm:ss</granularity> -->
- <!-- <earliest_datestamp>0001-01-01</earliest_datestamp> -->
- <!-- <deleted_record>yes</deleted_record> -->
- <!-- <scheme>oai</scheme> -->
- <!-- <repository_identifier>mydomain.org</repository_identifier> -->
- <!-- <delimiter>:</delimiter> -->
- <!-- <sample_identifier>oai:mydomain.org:12345</sample_identifier> -->
- <!-- <list_sets>false</list_sets> -->
-
- <!--
- The metadataformat element contains the schema for the oai_dc and marcxml metadata formats.
- Each schema needs a reference to an xslt document.
- You can replace them with your custom xslt stylesheets.
- Place those in the /<openils sysdir>/var/xsl folder.
- You can also extend the OAI2 service further with new metadata schema.
-
- Bibliographic and authority records share the same stylesheet.
- Should you want to render them differently, use the
- marc:datafield[@tag='901']/marc:subfield[@code='t']
- value to identify the record type. -->
-
- <!--
- <metadataformat>
- <oai_dc>
- <namespace_uri>http://www.openarchives.org/OAI/2.0/oai_dc/</namespace_uri>
- <schema_location>http://www.openarchives.org/OAI/2.0/oai_dc.xsd</schema_location>
- <xslt>OAI2_OAIDC.xsl</xslt>
- </oai_dc>
- <marcxml>
- <namespace_uri>http://www.loc.gov/MARC21/slim</namespace_uri>
- <schema_location>http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd</schema_location>
- <xslt>OAI2_MARC21slim.xsl</xslt>
- </marcxml>
- </metadataformat> -->
-
- <!--
- You can add different schema to the metadataformat element thus:
- <mods>
- <namespace_uri>http://www.loc.gov/mods/</namespace_uri>
- <schema_location>http://www.loc.gov/standards/mods/mods.xsd</schema_location>
- <xslt>my-custom-marc2mods.xsl</xslt>
- </mods>
- <my-metadata_prefix>
- <namespace_uri>my-namespace_uri</namespace_uri>
- <schema_location>my-schema_location</schema_location>
- <xslt>my-marc2my-metadata.xsl</xslt>
- </my-metadata_prefix>
- -->
-
- <!-- Change the way the asset copy values are mapped to which subfield codes: -->
- <!--
- <copies>
- <a>location</a>
- <b>owning_lib</b>
- <c>callnumber</c>
- <d>circlib</d>
- <g>barcode</g>
- <n>status</n>
- </copies>
- -->
- <!-- Or add static values to the copies element like this:
- <z>A value that always should for example be in the 852$z</z>
- -->
-
- <!-- Accept only 852$[barcode] values that match this regular expression. E.g.
- <barcode_filter>^[A-Za-z0-9]+</barcode_filter>
- only renders 852 datafields that contain barcodes values that begin with letters and numbers.
- -->
- <!--
- <barcode_filter><barcode_filter>
- -->
-
- <!-- Accept only 852$[status] values that match this regular expression. E.g.
- <status_filter>^Available$</status_filter>
- only renders 852 datafields that contain status code values that exactly match the string 'Available'.
- -->
- <!--
- <status_filter></status_filter>
- -->
-
- </app_settings>
- </open-ils.oai>
-
<open-ils.pcrud>
<keepalive>6</keepalive>
<migratable>1</migratable>
<appname>open-ils.justintime</appname>
<appname>open-ils.cstore</appname>
<appname>open-ils.collections</appname>
- <appname>open-ils.oai</appname>
<appname>open-ils.qstore</appname>
<appname>open-ils.reporter</appname>
<appname>open-ils.reporter-store</appname>
<!-- <appname>open-ils.resolver</appname> -->
<appname>open-ils.permacrud</appname>
- <appname>open-ils.oai</appname>
<appname>open-ils.pcrud</appname>
<appname>open-ils.trigger</appname>
<appname>open-ils.url_verify</appname>
<service>open-ils.courses</service>
<service>open-ils.curbside</service>
<service>open-ils.fielder</service>
- <service>open-ils.oai</service>
<service>open-ils.pcrud</service>
<service>open-ils.permacrud</service>
<service>open-ils.reporter</service>
# ... and this has some handy common methods
use OpenILS::Application::AppUtils;
+use OpenILS::Application::SuperCat::OAI;
+
my $parser = new XML::LibXML;
my $U = 'OpenILS::Application::AppUtils';
register_new_authorities_methods();
+ OpenILS::Application::SuperCat::OAI->child_init();
+
return 1;
}
-# OpenILS::WWW::OAI manages OAI2 requests and responses.
+# OpenILS::Application::SuperCat::OAI manages OAI2 requests and responses.
#
# Copyright (c) 2014-2017 International Institute of Social History
#
# Author: Lucien van Wouw <lwo@iisg.nl>
-package OpenILS::Application::OAI;
+package OpenILS::Application::SuperCat::OAI;
use strict; use warnings;
use base qw/OpenILS::Application/;
$_xslt = new XML::LibXSLT;
# Load the metadataformats that are configured.
- my $metadata_format = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.oai')->{'app_settings'}->{'metadataformat'};
+ my $metadata_format = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.supercat')->{'app_settings'}->{'oai'}->{'metadataformat'};
if ( $metadata_format ) {
for my $schema ( keys %$metadata_format ) {
$logger->info('Loading schema ' . $schema) ;
}
# Load the mapping of 852 holdings.
- my $copies = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.oai')->{'app_settings'}->{'copies'} ;
+ my $copies = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.supercat')->{'app_settings'}->{'oai'}->{'copies'} ;
if ( $copies ) {
foreach my $subfield_code (keys %$copies) {
my $value = $copies->{$subfield_code};
}
# Set the barcode filter and status filter
- $barcode_filter = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.oai')->{'app_settings'}->{'barcode_filter'};
- $status_filter = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.oai')->{'app_settings'}->{'status_filter'};
+ $barcode_filter = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.supercat')->{'app_settings'}->{'oai'}->{'barcode_filter'};
+ $status_filter = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.supercat')->{'app_settings'}->{'oai'}->{'status_filter'};
return 1;
}
__PACKAGE__->register_method(
method => 'list_record_formats',
- api_name => 'open-ils.oai.record.formats',
+ api_name => 'open-ils.supercat.oai.record.formats',
api_level => 1,
argc => 0,
signature =>
__PACKAGE__->register_method(
method => 'oai_biblio_retrieve',
- api_name => 'open-ils.oai.biblio.retrieve',
+ api_name => 'open-ils.supercat.oai.biblio.retrieve',
api_level => 1,
argc => 1,
signature =>
__PACKAGE__->register_method(
method => 'oai_authority_retrieve',
- api_name => 'open-ils.oai.authority.retrieve',
+ api_name => 'open-ils.supercat.oai.authority.retrieve',
api_level => 1,
argc => 1,
signature =>
__PACKAGE__->register_method(
method => 'oai_list_retrieve',
- api_name => 'open-ils.oai.list.retrieve',
+ api_name => 'open-ils.supercat.oai.list.retrieve',
api_level => 1,
argc => 1,
signature =>
my $idl = OpenSRF::Utils::SettingsClient->new->config_value('IDL');
Fieldmapper->import(IDL => $idl);
- $oai = OpenSRF::AppSession->create('open-ils.oai');
+ $oai = OpenSRF::AppSession->create('open-ils.supercat');
$parser = new XML::LibXML;
$xslt = new XML::LibXSLT;
- my $app_settings = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.oai')->{'app_settings'};
+ my $app_settings = OpenSRF::Utils::SettingsClient->new->config_value(apps => 'open-ils.supercat')->{'app_settings'}->{'oai'};
$base_url = $app_settings->{'base_url'} || 'localhost';
$base_url =~/(.*)\/$/ ; # Keep all minus the trailing forward slash.
$repository_identifier = $app_settings->{'repository_identifier'} || 'localhost';
my $rec_id = $1 ;
# Do we have a record ?
- my $record = $oai->request('open-ils.oai.list.retrieve', $record_class, $rec_id, undef, undef, undef, 1, $deleted_record)->gather(1) ;
+ my $record = $oai->request('open-ils.supercat.oai.list.retrieve', $record_class, $rec_id, undef, undef, undef, 1, $deleted_record)->gather(1) ;
if (@$record) {
$response = HTTP::OAI::GetRecord->new();
my $o = "Fieldmapper::oai::$record_class"->new(@$record[0]);
my ($record_class, $requestURL, $from, $until, $set, $metadataPrefix, $offset ) = @_;
my $response;
- my $r = $oai->request('open-ils.oai.list.retrieve', $record_class, $offset, $from, $until, $set, $max_count, $deleted_record)->gather(1) ;
+ my $r = $oai->request('open-ils.supercat.oai.list.retrieve', $record_class, $offset, $from, $until, $set, $max_count, $deleted_record)->gather(1) ;
if (@$r) {
my $cursor = 0 ;
$response = HTTP::OAI::ListIdentifiers->new();
my ($record_class, $requestURL, $from, $until, $set, $metadataPrefix, $offset ) = @_;
my $response;
- my $r = $oai->request('open-ils.oai.list.retrieve', $record_class, $offset, $from, $until, $set, $max_count, $deleted_record)->gather(1) ;
+ my $r = $oai->request('open-ils.supercat.oai.list.retrieve', $record_class, $offset, $from, $until, $set, $max_count, $deleted_record)->gather(1) ;
if (@$r) {
my $cursor = 0 ;
$response = HTTP::OAI::ListRecords->new();
if ( $o->deleted eq 'f' ) {
my $md = new HTTP::OAI::Metadata() ;
- my $xml = $oai->request('open-ils.oai.' . $record_class . '.retrieve', $o->rec_id, $metadataPrefix)->gather(1) ;
+ my $xml = $oai->request('open-ils.supercat.oai.' . $record_class . '.retrieve', $o->rec_id, $metadataPrefix)->gather(1) ;
$md->dom( $parser->parse_string('<metadata>' . $xml . '</metadata>') ); # Not sure why I need to add the metadata element,
$record->metadata( $md ); # because I expect ->metadata() would provide the wrapper for it.
}
# oai_metadataformats = { metadataPrefix => { schema, metadataNamespace } }
sub _load_oai_metadataformats {
- my $list = $oai->request('open-ils.oai.record.formats')->gather(1);
+ my $list = $oai->request('open-ils.supercat.oai.record.formats')->gather(1);
for my $record_browse_format ( @$list ) {
my %h = %$record_browse_format ;
my $metadataPrefix = (keys %h)[0] ;
-New OAI Service
-^^^^^^^^^^^^^^^
+OAI-PMH Data Provider Support
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-This module is an optional service that exposes your catalog through the [OAI2 protocol](http://www.openarchives.org/OAI/openarchivesprotocol.html).
+Evergreen can now act as an OAI-PMH data provider, exposing the catalog to
+harvesting through the [OAI2 protocol](http://www.openarchives.org/OAI/openarchivesprotocol.html).
Entry points
Default configuration
+++++++++++++++++++++
-See comments in opensrf.xml (in the open-ils.oai app_settings element)
-for default configuration and customization instructions. is commented
-in the open-ils.oai app_settings element.
+See comments in opensrf.xml (in the open-ils.supercat app_settings/oai element)
+for default configuration and customization instructions.
Upgrade Instructions
++++++++++++++++++++
-**Activate the service**
-
-Refer to the service in the opensrf.xml activeapps element:
-```xml
-....
-<activeapps>
- <appname>open-ils.oai</appname>
-```
-
-**Register the service with the router**
-
-Add the service to the public router in your opensrf_core.xml
-```xml
-<config>
- <opensrf>
- <routers>
- <router>
- <name>router</name>
- <domain>public.realm</domain>
- <services>
- <service>open-ils.oai</service>
- ...
-```
-
Optional: Setting the datestamp
+++++++++++++++++++++++++++++++