ITS Software Development and Distribution: easyBorrow

easyBorrow provides a single user interface for requesting books from four shared resource systems. We use WorldCat as our starting point. Instead of passing the OpenURL from WorldCat directly to our link resolver, we intercept it and use the ISBN to 1) do a look-up in our catalog (we redirect if a circulating copy is available), 2) query our III INNReach catalog, 3) query two Sirsi-Dynix URSA consortium catalogs, and 4) default to our ILLiad system if the request can't be placed in one of the direct borrow systems. Instead of having to navigate different proprietary systems, each with its own search interface and login method, the user now searches once in WorldCat, authenticates once, and easyBorrow goes to work behind the scenes.


Technical Details
The service-oriented-architecture of easyBorrow allows others to adapt components of the open-source code. We've built a dozen web- APIs in PHP, Java (served via Tomcat), and Python (served via Django) -- coordinated by a Python script. In our implementation, PHP code handles user and administrative screens, detects the initial OpenUrl from WorldCat, calls a custom (PHP) API to our III OPAC to see if the desired ISBN is available, calls another Java/Tomcat API to authenticate the user and obtain required user-information, and updates a database request-processing queue. At that point a Python controller script takes over, which regularly checks for new requests. It calls -- as necessary -- two consortial Java/Tomcat API tunnelers, another Python consortial tunneler, a Java/Tomcat API tunneler for our Illiad interlibrary-loan system, and a Python/Django API tunneler which automatically adds users to the Illiad system. This controller script then sends users and staff confirmation emails.

Other web-service components include:

  • 'XISBN' service described below, written in Python/Django.

  • 'OCLC-to-ISBN' web service that looks at the WorldCat edition statement for items without an ISBN to find an alternate edition WITH an ISBN. This is particularly relevant for "classics" that have been republished many times. Written in Python/Django.

  • 'patronApi-translator' which takes the raw output of our III patronApi and improves it, written in PHP.

  • 'goodTitle' web- service which takes problematically-encoded OpenUrl titles and gets properly-encoded titles from OCLC, written in Python/Django.

  • 'stats' web-app which transfers request and history data to an archival database without patron-identifying information, as well as generates an RSS feed, written in Python/Django.

The easyBorrow application includes a tracking interface for users and an administrative interface for staff. In addition to the standalone tracking site, users can access their easyBorrow requests within their library catalog account. The administrative interface allows staff to monitor, search, and resubmit requests. Both interfaces are written in PHP; data is stored in a MySQL database.

Features soon to be released include:

  • An easyBorrow 'xISBN' web service which returns a subset of alternate ISBNs which match on language and format. The returned alternate ISBNs are re-entered as requests into the easyBorrow flow for the local III catalog and III InnReach system. All requests made to the easyBorrow xISBN service first look in a local MySQL database to see if there is 'recent' information for the requested ISBN (no older than a week). If there is, that information is returned; otherwise OCLC's xISBN service is queried and the local database is updated.

Areas under development include:

  • Investigate feasibility of using parameters other than ISBN.

  • Modify email received by a user when an item is not available from the service that accepted the request so that the user can automatically send the request back to easyBorrow on a new path.

  • Intercept and handle elegantly where possible 'item-missing' notifications from vendor products.

  • Modify the link resolver services menu which appears in sources such as A&I databases so that all book-type requests go to easyBorrow instead of directly to ILL.

  • Show user an intermediate screen when non-circulating copies are available for use at Brown. [easyBorrow currently redirects users to the local catalog only when a circulating copy is available.]

Code and License
We intend to host this code at a Brown University Library Software subversion repository with anonymous checkout access, but while that is being set up we are offering a Java API to Borrow Direct (a consortium of Brown, Columbia, Cornell, Dartmouth, University of Pennsylvania, Princeton, and Yale libraries) at Google Code under an LGPL license.

» March 2008 User Satisfaction Survey

» Users
» Requests
» Interface Choice

Project Links

Reports and Presentations

  • easyBorrow Project Description
  • easyBorrow Flow Chart
  • easyBorrow PowerPoint, October 2007

  • "Seems Seamless: Joining Library Borrowing Systems with Custom Programming"
    NERCOMP Annual Conference, Providence, RI, March 11, 2008 (PowerPoint)

    Abstract: Brown University Library's "easyBorrow" service is an example of local programming that stitches together multiple vendors' services, providing an apparently seamless interface for borrowing a book from any of five systems. Using teamwork, service-oriented architecture, and a determination to make it easy, easyBorrow's modular implementation allows for quick adjustments as situations (and services) change.

  • "easyBorrow at Brown: Piecing Together Library Borrowing Systems with Custom Programming", Boston Library Consortium, May 5, 2008 (PowerPoint)

  • "Don't Make Me Choose! (or, Just Get What I Need!): Making It Simple to Borrow"
    easyBorrow LITA 2008 National Forum, Cincinatti, Ohio (accepted)