OLE z39.50 Technical Specification

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.

Operated as a Community Resource by the Open Library Foundation