1. Intent
Implement an OLE SRU server and integrate with an existing open source Z39.50/SRU bridge, prime candidate: Metaproxy.
2. Implementation
OLE SRU will be a new module added to the ole-docstore web application. Docstore currently supports retrieval of indexed data via SOLR api, and it will further enable SRU support.
2. Supported OLE-SRU Services
* SearchRetrieve
* Explain
* Scan (Will leave it out for the 1st pass, and then pick it up later)
3. OPAC Schema
<?xml version="1.0" encoding="UTF-8"?>
<!- OPAC XML. This is the output of yaz_display_OPAC ->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="opacRecord">
<xs:complexType>
<xs:sequence>
<xs:element name="bibliographicRecord">
</xs:element>
<xs:element name="holdings">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" ref="holding"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="holding">
<xs:complexType>
<xs:sequence>
<xs:element name="typeOfRecord" minOccurs="0" type="xs:string"/>
<xs:element name="encodingLevel" minOccurs="0" type="xs:string"/>
<xs:element name="format" minOccurs="0" type="xs:string"/>
<xs:element name="receiptAcqStatus" minOccurs="0" type="xs:string"/>
<xs:element name="generalRetention" minOccurs="0" type="xs:string"/>
<xs:element name="completeness" minOccurs="0" type="xs:string"/>
<xs:element name="dateOfReport" minOccurs="0" type="xs:string"/>
<xs:element name="nucCode" minOccurs="0" type="xs:string"/>
<xs:element name="localLocation" minOccurs="0" type="xs:string"/>
<xs:element name="shelvingLocation" minOccurs="0" type="xs:string"/>
<xs:element name="callNumber" minOccurs="0" type="xs:string"/>
<xs:element name="shelvingData" minOccurs="0" type="xs:string"/>
<xs:element name="copyNumber" minOccurs="0" type="xs:string"/>
<xs:element name="publicNote" minOccurs="0" type="xs:string"/>
<xs:element name="reproductionNote" minOccurs="0" type="xs:string"/>
<xs:element name="termsUseRepro" minOccurs="0" type="xs:string"/>
<xs:element name="enumAndChron" minOccurs="0" type="xs:string"/>
<xs:element name="volumes" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" ref="volume"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="circulations" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" ref="circulation"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="volume">
<xs:complexType>
<xs:sequence>
<xs:element name="enumeration" minOccurs="0" type="xs:string"/>
<xs:element name="chronology" minOccurs="0" type="xs:string"/>
<xs:element name="enumAndChron" minOccurs="0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="circulation">
<xs:complexType>
<xs:sequence>
<xs:element name="availableNow">
<xs:complexType>
<xs:attribute name="value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="availabilityDate" minOccurs="0" type="xs:string"/>
<xs:element name="availableThru" minOccurs="0" type="xs:string"/>
<xs:element name="restrictions" minOccurs="0" type="xs:string"/>
<xs:element name="itemId" minOccurs="0" type="xs:string"/>
<xs:element name="renewable">
<xs:complexType>
<xs:attribute name="value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="onHold">
<xs:complexType>
<xs:attribute name="value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="enumAndChron" minOccurs="0"/>
<xs:element name="midspine" minOccurs="0"/>
<xs:element name="temporaryLocation" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
4. Technical Details
- CQLParser - Parser that will parse the request into search parameters.
- SearchRetrieveWorker - Responsibility is to take the search parameters, retrieve SOLR/Docstore/Circulaation data
- OLESruResponseBuilder - Responsibility is to take the response from the SearchRetrieveWorker and build the OPAC response that z30.50 clients would understand as pe the schema above.
5. Testing
- Initial testing will be done using unit tests that will take in a request, parse and build the search parameters, retrieve the appropriate information, build the OPAC response and send it back to the client.
- Testing using meta proxy will be done once we have more clarity on how we wil use meta proxy as a front end client.