umlaut 3.0.0alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +7 -0
- data/README.md +49 -0
- data/Rakefile +37 -0
- data/app/assets/images/error.gif +0 -0
- data/app/assets/images/export_bg_bot.gif +0 -0
- data/app/assets/images/export_bg_mid.gif +0 -0
- data/app/assets/images/export_bg_top.gif +0 -0
- data/app/assets/images/famfamfam/book_open.png +0 -0
- data/app/assets/images/famfamfam/cross.png +0 -0
- data/app/assets/images/famfamfam/page_sound.gif +0 -0
- data/app/assets/images/famfamfam/page_text.gif +0 -0
- data/app/assets/images/famfamfam/page_up.gif +0 -0
- data/app/assets/images/famfamfam/page_white.png +0 -0
- data/app/assets/images/famfamfam/readme.html +1495 -0
- data/app/assets/images/famfamfam/tiny_cross.png +0 -0
- data/app/assets/images/frame_remove.gif +0 -0
- data/app/assets/images/ico_go.gif +0 -0
- data/app/assets/images/jhu_findit.gif +0 -0
- data/app/assets/images/list_closed.png +0 -0
- data/app/assets/images/list_open.png +0 -0
- data/app/assets/images/more_info.gif +0 -0
- data/app/assets/images/rails.png +0 -0
- data/app/assets/images/request.gif +0 -0
- data/app/assets/images/spinner.gif +0 -0
- data/app/assets/javascripts/umlaut/ajax_windows.js +35 -0
- data/app/assets/javascripts/umlaut/ensure_window_size.js.erb +34 -0
- data/app/assets/javascripts/umlaut/expand_contract_toggle.js +25 -0
- data/app/assets/javascripts/umlaut/search_autocomplete.js +46 -0
- data/app/assets/javascripts/umlaut/simple_visible_toggle.js +8 -0
- data/app/assets/javascripts/umlaut/update_html.js +152 -0
- data/app/assets/javascripts/umlaut.js +17 -0
- data/app/assets/stylesheets/umlaut.css +857 -0
- data/app/controllers/application_controller.rb +14 -0
- data/app/controllers/export_email_controller.rb +123 -0
- data/app/controllers/js_helper_controller.rb +10 -0
- data/app/controllers/link_router_controller.rb +87 -0
- data/app/controllers/open_search_controller.rb +9 -0
- data/app/controllers/resolve_controller.rb +288 -0
- data/app/controllers/resource_controller.rb +83 -0
- data/app/controllers/search_controller.rb +328 -0
- data/app/controllers/search_methods/sfx3.rb +148 -0
- data/app/controllers/search_methods/sfx4.rb +257 -0
- data/app/controllers/search_methods/sfx_api.rb +47 -0
- data/app/controllers/store_controller.rb +64 -0
- data/app/controllers/umlaut/controller_behavior.rb +20 -0
- data/app/controllers/umlaut/controller_logic.rb +96 -0
- data/app/controllers/umlaut/error_handling.rb +48 -0
- data/app/controllers/umlaut_controller.rb +112 -0
- data/app/helpers/application_helper.rb +4 -0
- data/app/helpers/emailer_helper.rb +43 -0
- data/app/helpers/export_email_helper.rb +34 -0
- data/app/helpers/open_search_helper.rb +7 -0
- data/app/helpers/resolve_helper.rb +225 -0
- data/app/helpers/search_helper.rb +50 -0
- data/app/helpers/umlaut/footer_helper.rb +64 -0
- data/app/helpers/umlaut/helper.rb +62 -0
- data/app/helpers/umlaut/html_head_helper.rb +37 -0
- data/app/helpers/umlaut/url_generation.rb +77 -0
- data/app/mailers/emailer.rb +48 -0
- data/app/models/clickthrough.rb +2 -0
- data/app/models/collection.rb +259 -0
- data/app/models/crossref_lookup.rb +2 -0
- data/app/models/dispatched_service.rb +58 -0
- data/app/models/permalink.rb +29 -0
- data/app/models/referent.rb +473 -0
- data/app/models/referent_value.rb +14 -0
- data/app/models/request.rb +449 -0
- data/app/models/service_response.rb +179 -0
- data/app/models/service_store.rb +59 -0
- data/app/models/service_type_value.rb +58 -0
- data/app/models/service_wave.rb +150 -0
- data/app/models/sfx_db/az_additional_title.rb +11 -0
- data/app/models/sfx_db/az_letter_group.rb +11 -0
- data/app/models/sfx_db/az_title.rb +38 -0
- data/app/models/sfx_db/az_title_v2.rb +34 -0
- data/app/models/sfx_db/isbn.rb +12 -0
- data/app/models/sfx_db/issn.rb +12 -0
- data/app/models/sfx_db/object.rb +35 -0
- data/app/models/sfx_db/object_portfolio.rb +6 -0
- data/app/models/sfx_db/publisher.rb +10 -0
- data/app/models/sfx_db/sfx_db_base.rb +54 -0
- data/app/models/sfx_db/target.rb +9 -0
- data/app/models/sfx_db/target_service.rb +10 -0
- data/app/models/sfx_db/title.rb +10 -0
- data/app/models/sfx_db.rb +10 -0
- data/app/models/sfx_url.rb +35 -0
- data/app/views/emailer/citation.text.erb +28 -0
- data/app/views/emailer/short_citation.text.erb +8 -0
- data/app/views/export_email/_email.html.erb +25 -0
- data/app/views/export_email/_send_email.html.erb +3 -0
- data/app/views/export_email/_send_txt.html.erb +3 -0
- data/app/views/export_email/_txt.html.erb +62 -0
- data/app/views/export_email/email.html.erb +3 -0
- data/app/views/export_email/send_email.html.erb +1 -0
- data/app/views/export_email/send_txt.html.erb +1 -0
- data/app/views/export_email/txt.html.erb +3 -0
- data/app/views/js_helper/loader.erb.js +13 -0
- data/app/views/layouts/umlaut.html.erb +52 -0
- data/app/views/open_search/index.html.erb +9 -0
- data/app/views/resolve/_api_in_progress.xml.erb +21 -0
- data/app/views/resolve/_background_progress.html.erb +51 -0
- data/app/views/resolve/_background_updater.html.erb +38 -0
- data/app/views/resolve/_citation.html.erb +87 -0
- data/app/views/resolve/_coins.html.erb +1 -0
- data/app/views/resolve/_compact_citation.html.erb +33 -0
- data/app/views/resolve/_cover_image.html.erb +35 -0
- data/app/views/resolve/_fulltext.html.erb +55 -0
- data/app/views/resolve/_help.html.erb +17 -0
- data/app/views/resolve/_holding.html.erb +91 -0
- data/app/views/resolve/_related_items.html.erb +35 -0
- data/app/views/resolve/_search_inside.html.erb +62 -0
- data/app/views/resolve/_section_display.html.erb +49 -0
- data/app/views/resolve/_service_errors.html.erb +29 -0
- data/app/views/resolve/_standard_response_item.html.erb +89 -0
- data/app/views/resolve/api.xml.builder +72 -0
- data/app/views/resolve/background_status.html.erb +26 -0
- data/app/views/resolve/index.html.erb +73 -0
- data/app/views/resolve/partial_html_sections.xml.erb +30 -0
- data/app/views/search/_a_to_z.html.erb +6 -0
- data/app/views/search/_citation.html.erb +94 -0
- data/app/views/search/_pager.html.erb +60 -0
- data/app/views/search/books.html.erb +103 -0
- data/app/views/search/journal_search.html.erb +90 -0
- data/app/views/search/journals.html.erb +167 -0
- data/app/views/search/opensearch_description.rxml +10 -0
- data/app/views/testing/index.html.erb +1 -0
- data/app/views/umlaut/README +5 -0
- data/app/views/umlaut/error.html.erb +45 -0
- data/db/migrate/01_umlaut_init.rb +113 -0
- data/db/orig_fixed_data/service_type_values.yml +120 -0
- data/db/seeds.rb +7 -0
- data/lib/CronTab.rb +192 -0
- data/lib/aws_product_sign.rb +146 -0
- data/lib/exlibris/aleph/patron.rb +64 -0
- data/lib/exlibris/aleph/record.rb +54 -0
- data/lib/exlibris/aleph/rest_api.rb +29 -0
- data/lib/exlibris/primo/holding.rb +192 -0
- data/lib/exlibris/primo/rsrc.rb +17 -0
- data/lib/exlibris/primo/searcher.rb +276 -0
- data/lib/exlibris/primo/source/aleph.rb +46 -0
- data/lib/exlibris/primo/source/distribution/nyu_aleph.rb +323 -0
- data/lib/exlibris/primo/toc.rb +17 -0
- data/lib/exlibris/primo_ws.rb +140 -0
- data/lib/generators/templates/umlaut_services.yml +237 -0
- data/lib/generators/umlaut/asset_hooks_generator.rb +44 -0
- data/lib/generators/umlaut/install_generator.rb +110 -0
- data/lib/hip3/bib.rb +291 -0
- data/lib/hip3/bib_searcher.rb +302 -0
- data/lib/hip3/custom_field_lookup.rb +44 -0
- data/lib/hip3/holding.rb +50 -0
- data/lib/hip3/item.rb +65 -0
- data/lib/hip3/receipt.rb +7 -0
- data/lib/hip3/serial_copy.rb +82 -0
- data/lib/holding.rb +32 -0
- data/lib/marc_helper.rb +254 -0
- data/lib/metadata_helper.rb +312 -0
- data/lib/opensearch_feed.rb +398 -0
- data/lib/opensearch_query.rb +98 -0
- data/lib/referent_filter.rb +16 -0
- data/lib/referent_filters/dissertation_catch.rb +45 -0
- data/lib/section_renderer.rb +503 -0
- data/lib/service.rb +336 -0
- data/lib/service_adaptors/ajax_export.rb +37 -0
- data/lib/service_adaptors/amazon.rb +412 -0
- data/lib/service_adaptors/blacklight.rb +327 -0
- data/lib/service_adaptors/book_finder.rb +40 -0
- data/lib/service_adaptors/bx.rb +51 -0
- data/lib/service_adaptors/cover_thing.rb +73 -0
- data/lib/service_adaptors/elsevier_cover.rb +57 -0
- data/lib/service_adaptors/email_export.rb +10 -0
- data/lib/service_adaptors/ezproxy.rb +171 -0
- data/lib/service_adaptors/google_book_search.rb +442 -0
- data/lib/service_adaptors/gpo.rb +124 -0
- data/lib/service_adaptors/hathi_trust.rb +308 -0
- data/lib/service_adaptors/hip3_service.rb +150 -0
- data/lib/service_adaptors/hip_holding_search.rb +237 -0
- data/lib/service_adaptors/internet_archive.rb +488 -0
- data/lib/service_adaptors/isbn_db.rb +86 -0
- data/lib/service_adaptors/isi.rb +258 -0
- data/lib/service_adaptors/jcr.rb +146 -0
- data/lib/service_adaptors/opac.rb +351 -0
- data/lib/service_adaptors/open_library.rb +316 -0
- data/lib/service_adaptors/open_library_cover.rb +73 -0
- data/lib/service_adaptors/primo_service.rb +392 -0
- data/lib/service_adaptors/primo_source.rb +78 -0
- data/lib/service_adaptors/pubmed.rb +133 -0
- data/lib/service_adaptors/request_to_fixture.rb +68 -0
- data/lib/service_adaptors/scopus.rb +295 -0
- data/lib/service_adaptors/sfx-new.rb +557 -0
- data/lib/service_adaptors/sfx.rb +566 -0
- data/lib/service_adaptors/sfx_backchannel_record.rb +69 -0
- data/lib/service_adaptors/txt_holding_export.rb +32 -0
- data/lib/service_adaptors/ulrichs_cover.rb +57 -0
- data/lib/service_adaptors/ulrichs_link.rb +47 -0
- data/lib/service_adaptors/worldcat.rb +116 -0
- data/lib/service_adaptors/worldcat_identities.rb +591 -0
- data/lib/tasks/umlaut.rake +134 -0
- data/lib/umlaut/default_configuration.rb +5 -0
- data/lib/umlaut/routes.rb +136 -0
- data/lib/umlaut/version.rb +3 -0
- data/lib/umlaut.rb +37 -0
- data/lib/umlaut_configurable.rb +343 -0
- data/lib/umlaut_http.rb +100 -0
- data/lib/xml_schema_helper.rb +109 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/umlaut_controller.rb +112 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +45 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database-jhu.yml +44 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +34 -0
- data/test/dummy/config/environments/production.rb +60 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +61 -0
- data/test/dummy/config/umlaut_services.yml +237 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20111228211210_umlaut_init.rb +113 -0
- data/test/dummy/db/schema.rb +124 -0
- data/test/dummy/log/development.log +12981 -0
- data/test/dummy/log/production.log +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/cache/assets/C5F/340/sprockets%2F99692920160b7a279b86a80415b79db7 +0 -0
- data/test/dummy/tmp/cache/assets/C70/4D0/sprockets%2F034ad2036e623081bd352800786dfe80 +0 -0
- data/test/dummy/tmp/cache/assets/C73/920/sprockets%2Fd371318f22900492fd180f17c5e2a504 +9268 -0
- data/test/dummy/tmp/cache/assets/C80/980/sprockets%2Fc94807409c1523d43e18d25f35d93c41 +0 -0
- data/test/dummy/tmp/cache/assets/C8F/780/sprockets%2Fe47e28558116fb5f8038754e60d1961d +11769 -0
- data/test/dummy/tmp/cache/assets/CAA/EB0/sprockets%2F1d179210e8b76f1ea63c802688a015e4 +9271 -0
- data/test/dummy/tmp/cache/assets/CBB/9C0/sprockets%2F706f28923fb754cad04b9107c89986a1 +0 -0
- data/test/dummy/tmp/cache/assets/CBF/B60/sprockets%2F08ca89671549936265dcb673bf02e36f +0 -0
- data/test/dummy/tmp/cache/assets/CC9/9F0/sprockets%2F306166316e2cafd13c15e62b51a2339d +0 -0
- data/test/dummy/tmp/cache/assets/CF6/F20/sprockets%2F5b2ffa1103079dfd555197838f87a99f +0 -0
- data/test/dummy/tmp/cache/assets/CF7/2B0/sprockets%2F25a7c73655bd3598173b39d9f98bcd46 +862 -0
- data/test/dummy/tmp/cache/assets/CFE/080/sprockets%2F37fe9f4255baddbd549a659914929398 +0 -0
- data/test/dummy/tmp/cache/assets/D22/060/sprockets%2F9aec77b768e91a802d284271c58e2f7e +21357 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D33/6D0/sprockets%2F500129c57f1146e556ec3aacd6cd38c1 +0 -0
- data/test/dummy/tmp/cache/assets/D33/FD0/sprockets%2F2ba0b4e6334a77b923e5f770381bb2bf +0 -0
- data/test/dummy/tmp/cache/assets/D42/C20/sprockets%2Fbcf14e437b1582bf93b77670acf8e090 +21353 -0
- data/test/dummy/tmp/cache/assets/D50/A30/sprockets%2F7d8b294ac433db5d056538f8cf7c66b9 +0 -0
- data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +872 -0
- data/test/dummy/tmp/cache/assets/D65/590/sprockets%2Fc1bb92fc3406a126b7dd302edc96d629 +0 -0
- data/test/dummy/tmp/cache/assets/D71/6B0/sprockets%2Fde558b71b494cf09b1bf055c8dff0353 +0 -0
- data/test/dummy/tmp/cache/assets/D72/610/sprockets%2Fa8c708eeb30ef93de34d755d4f45d023 +859 -0
- data/test/dummy/tmp/cache/assets/D76/AD0/sprockets%2Fe2158cde93188cf5ab6457bc6d6602ec +0 -0
- data/test/dummy/tmp/cache/assets/D7A/E40/sprockets%2F9622ffcc499a57627cd1bb18fe31b8e4 +11772 -0
- data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
- data/test/dummy/tmp/cache/assets/D9B/770/sprockets%2F8aacf02eb7dbb0949704b28f27b87e0b +0 -0
- data/test/dummy/tmp/cache/assets/DA6/A80/sprockets%2F92e26d8e58d5bcc8b8f6c25d1b05b9c1 +0 -0
- data/test/dummy/tmp/cache/assets/DE8/790/sprockets%2Fd1333bde2b9aafcc712d11dd09ab35d8 +0 -0
- data/test/dummy/tmp/cache/assets/DF7/F30/sprockets%2F7bc16c4109b17fabe29f8ddbbf732d1c +374 -0
- data/test/dummy/tmp/cache/assets/E03/570/sprockets%2F493bdc0ac14cd4f57fdfe4253f992bde +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E0B/4B0/sprockets%2F7988df51a61c81ce6ede4a2d4c8cce4f +377 -0
- data/test/dummy/tmp/cache/assets/E5F/960/sprockets%2Fdc007b6cad5c7ef08e33ec28cfff0ef6 +0 -0
- data/test/fixtures/dispatched_services.yml +5 -0
- data/test/fixtures/permalinks.yml +5 -0
- data/test/fixtures/referent_values.yml +1734 -0
- data/test/fixtures/referents.yml +156 -0
- data/test/fixtures/requests.yml +284 -0
- data/test/fixtures/service_responses.yml +5 -0
- data/test/fixtures/sfx_urls.yml +4 -0
- data/test/performance/browsing_test.rb +9 -0
- data/test/test_helper.rb +10 -0
- data/test/umlaut_test.rb +7 -0
- data/test/unit/aleph_patron_test.rb +39 -0
- data/test/unit/aleph_record_benchmarks.rb +28 -0
- data/test/unit/aleph_record_test.rb +30 -0
- data/test/unit/aws_product_sign_test.rb +93 -0
- data/test/unit/collection_test.rb +76 -0
- data/test/unit/google_book_search_test.rb +101 -0
- data/test/unit/primo_searcher_test.rb +403 -0
- data/test/unit/primo_service_test.rb +939 -0
- data/test/unit/primo_ws_test.rb +131 -0
- data/test/unit/service_response_test.rb +9 -0
- data/test/unit/service_test.rb +33 -0
- metadata +580 -0
data/lib/umlaut_http.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# Helper module for service adaptors making HTTP requests, as most do.
|
2
|
+
# Eventually this may include some HTTP request wrapper methods that
|
3
|
+
# set timeout appropriately, and perhaps even do some HTTP level cacheing.
|
4
|
+
#
|
5
|
+
# Right now, just a helper method for generating headers for proxy-like requests.
|
6
|
+
|
7
|
+
module UmlautHttp
|
8
|
+
require 'net/http'
|
9
|
+
require 'net/https'
|
10
|
+
require 'uri'
|
11
|
+
|
12
|
+
# Generate headers for a proxy-like request, so a service adaptor
|
13
|
+
# can make a request to a foreign service that appears to be HTTP-proxied
|
14
|
+
# from the original client browser, instead of just originating from
|
15
|
+
# Umlaut. This in some cases helps get around service traffic limiting,
|
16
|
+
# and in general is more honest and gives the service some good information
|
17
|
+
# about the actual end user.
|
18
|
+
#
|
19
|
+
# Not generally neccesary for accessing actual APIs, but sometimes useful
|
20
|
+
# for screen scraping, or for an API intended to be client-side JS only.
|
21
|
+
#
|
22
|
+
# request is an Umlaut Request, which has in it information about
|
23
|
+
# original client request and ip. host is optional, and is the
|
24
|
+
# ultimate destination you will be sending the proxy-like request to.
|
25
|
+
# if supplied, a not entirely honest X-Forwarded-Host header will be
|
26
|
+
# added.
|
27
|
+
def proxy_like_headers(request, host = nil)
|
28
|
+
orig_env = request.http_env
|
29
|
+
if (request.http_env.nil? || ! request.http_env.kind_of?(Hash))
|
30
|
+
Rails.logger.warn("proxy_like_headers: orig_env arg is missing, proxy-like headers will be flawed. request id: #{request.id}. ")
|
31
|
+
orig_env = {}
|
32
|
+
end
|
33
|
+
|
34
|
+
header = {}
|
35
|
+
|
36
|
+
# Bunch of headers we proxy as-is from the original client request,
|
37
|
+
# supplying reasonable defaults.
|
38
|
+
|
39
|
+
header["User-Agent"] = orig_env['HTTP_USER_AGENT'] || 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0'
|
40
|
+
header['Accept'] = orig_env['HTTP_ACCEPT'] || 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
|
41
|
+
header['Accept-Language'] = orig_env['HTTP_ACCEPT_LANGUAGE'] || 'en-us,en;q=0.5'
|
42
|
+
header['Accept-Encoding'] = orig_env['HTTP_ACCEPT_ENCODING'] || ''
|
43
|
+
header["Accept-Charset"] = orig_env['HTTP_ACCEPT_CHARSET'] || 'UTF-8,*'
|
44
|
+
|
45
|
+
# Set referrer to be, well, an Umlaut page, like the one we are
|
46
|
+
# currently generating would be best. That is, the resolve link.
|
47
|
+
|
48
|
+
header["Referer"] = "http://#{orig_env['HTTP_HOST']}#{orig_env['REQUEST_URI']}"
|
49
|
+
|
50
|
+
# Proxy X-Forwarded headers.
|
51
|
+
|
52
|
+
# The original Client's ip, most important and honest. Look for
|
53
|
+
# and add on to any existing x-forwarded-for, if neccesary, as per
|
54
|
+
# x-forwarded-for convention.
|
55
|
+
|
56
|
+
header['X-Forwarded-For'] = (orig_env['HTTP_X_FORWARDED_FOR']) ?
|
57
|
+
(orig_env['HTTP_X_FORWARDED_FOR'].to_s + ', ' + request.client_ip_addr.to_s) :
|
58
|
+
request.client_ip_addr.to_s
|
59
|
+
|
60
|
+
#Theoretically the original host requested by the client in the Host HTTP request header. We're disembling a bit.
|
61
|
+
header['X-Forwarded-Host'] = host if host
|
62
|
+
# The proxy server: That is, Umlaut, us.
|
63
|
+
header['X-Forwarded-Server'] = orig_env['SERVER_NAME'] || ''
|
64
|
+
|
65
|
+
return header
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
# Right now the main thing this will do for you is (sort of, stupidly)
|
70
|
+
# maintain cookies given in redirects.
|
71
|
+
# Later it might do other cooler things. Returns a Net::HTTP::Response
|
72
|
+
def http_fetch(uri, options = {})
|
73
|
+
options[:max_redirects] ||= 8
|
74
|
+
options[:redirects_left] ||= options[:max_redirects]
|
75
|
+
options[:raise_on_http_error_code] = true unless options.has_key?(:raise_on_http_error_code)
|
76
|
+
|
77
|
+
uri = URI.parse(uri) unless uri.kind_of?(URI)
|
78
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
79
|
+
http.use_ssl = true if uri.scheme == "https"
|
80
|
+
headers = options[:headers] || {}
|
81
|
+
headers["Cookie"] = options[:cookies] if options[:cookies]
|
82
|
+
|
83
|
+
response = http.request_get(uri.request_uri, headers)
|
84
|
+
|
85
|
+
if ( response.kind_of?(Net::HTTPRedirection))
|
86
|
+
raise ArgumentError, "HTTP redirect too deep (max #{options[:max_redirects]})" if options[:redirects_left] <= 0
|
87
|
+
|
88
|
+
options[:cookies] = response['Set-Cookie']
|
89
|
+
|
90
|
+
options[:redirects_left] = options[:redirects_left] - 1
|
91
|
+
|
92
|
+
return http_fetch(response['location'], options)
|
93
|
+
else
|
94
|
+
response.value if options[:raise_on_http_error_code]
|
95
|
+
return response
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module XmlSchemaHelper
|
2
|
+
def self.xml_ns
|
3
|
+
{
|
4
|
+
"dlf" => "http://diglib.org/ilsdi/1.1",
|
5
|
+
"marc" => "http://www.loc.gov/MARC21/slim",
|
6
|
+
"daia" => "http://ws.gbv.de/daia/",
|
7
|
+
"atom" => "http://www.w3.org/2005/Atom",
|
8
|
+
"opensearch" => "http://a9.com/-/spec/opensearch/1.1/"
|
9
|
+
}
|
10
|
+
end
|
11
|
+
def xml_ns ; XmlSchemaHelper.xml_ns ; end
|
12
|
+
|
13
|
+
|
14
|
+
# Meant for use with "dlf_expanded" responses, but really of wide
|
15
|
+
# applicability. The input is a list of Nokogiri elements. Each element
|
16
|
+
# should contain as children 0-to-N recognized XML schema formats
|
17
|
+
# representing holdings data. XML nodes should be properly
|
18
|
+
# namespaced. (Cause that's how we'll recognize them.). Method will
|
19
|
+
# Create Umlaut 'holding' ServiceResponses for each one, taking what
|
20
|
+
# info it can get from the metadata.
|
21
|
+
#
|
22
|
+
# Note that when taking from an dlf_expanded doc, this means the
|
23
|
+
# the individual xml elements passed in can be dlf:item OR dlf:holdingsrec
|
24
|
+
#
|
25
|
+
# Recognized metadata formats:
|
26
|
+
# * dlf:simpleavailability from namespace: http://diglib.org/ilsdi/1.1
|
27
|
+
# * marc holdings, marc:record with type="Holdings" from namespace: http://www.loc.gov/MARC21/slim
|
28
|
+
# * daia from namespace: http://ws.gbv.de/daia/
|
29
|
+
#
|
30
|
+
# Method uses it's own logic for precedence when the same data element
|
31
|
+
# is found in multiple places.
|
32
|
+
#
|
33
|
+
# NOTE: Does NOT add a :url key, caller will want to add that themselves.
|
34
|
+
def xml_to_holdings(xml)
|
35
|
+
|
36
|
+
data = {}
|
37
|
+
|
38
|
+
data[:call_number] = xml_choose_first(xml,
|
39
|
+
marc_xpath("852", "h"))
|
40
|
+
|
41
|
+
data[:status] = xml_choose_first(xml,
|
42
|
+
"dlf:simpleavailability/dlf:availabilitymsg")
|
43
|
+
|
44
|
+
data[:location] = xml_choose_first(xml,
|
45
|
+
[ marc_xpath("852", "b"),
|
46
|
+
"daia:daia/daia:document/daia:item/daia:department"
|
47
|
+
])
|
48
|
+
|
49
|
+
data[:source_name] = data[:collection_str] = xml_choose_first(xml,
|
50
|
+
[ marc_xpath(852, "c"),
|
51
|
+
"daia:daia/daia:document/daia:item/daia:storage"
|
52
|
+
])
|
53
|
+
|
54
|
+
data[:copy_str] = xml_choose_first(xml, marc_xpath(852, "i"))
|
55
|
+
|
56
|
+
# get coverage strings from mfhd 866, 867, 868
|
57
|
+
data[:coverage_str_array] = []
|
58
|
+
xml.xpath("marc:record/marc:datafield[@tag='866' or @tag='867' or @tag='868']", xml_ns).each do |field|
|
59
|
+
value = ""
|
60
|
+
value += mfhd_coverage_prefix( field.attributes["tag"].text )
|
61
|
+
value += field.xpath("marc:subfield[@code='a']", xml_ns).text
|
62
|
+
if ( (notes = field.xpath("marc:subfield[@code='z']", xml_ns)).length > 0)
|
63
|
+
value += " -- #{notes.text}"
|
64
|
+
end
|
65
|
+
data[:coverage_str_array] << value
|
66
|
+
end
|
67
|
+
data[:coverage_str] = data[:coverage_str_array].join(" ")
|
68
|
+
|
69
|
+
data[:notes] = xml.xpath(marc_xpath(852, "z"), xml_ns).collect {|sf| sf.text.to_s}.join("\n")
|
70
|
+
|
71
|
+
data[:request_url] = xml_choose_first(xml, "daia:daia/daia:document/daia:item/daia:available/attribute::href")
|
72
|
+
|
73
|
+
if (data[:collection_str].blank? && data[:location].blank? && data[:call_number].blank? )
|
74
|
+
data[:collection_str] = xml_choose_first(xml, "dlf:simpleavailability/dlf:location")
|
75
|
+
end
|
76
|
+
|
77
|
+
# Add a display_text to be a good generic Umlaut service response
|
78
|
+
data[:display_text] = "#{data[:location]} #{data[:collection_str]} #{data[:call_number]} #{data[:copy_str]}"
|
79
|
+
|
80
|
+
# edition_str
|
81
|
+
return data
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
def marc_xpath(tag, sf_code)
|
86
|
+
"marc:record/marc:datafield[@tag='#{tag}']/marc:subfield[@code='#{sf_code}']"
|
87
|
+
end
|
88
|
+
def xml_choose_first(xml, path_array)
|
89
|
+
path_array = [path_array] if path_array.kind_of?(String)
|
90
|
+
|
91
|
+
path_array.each do |path|
|
92
|
+
candidate = xml.xpath(path, xml_ns)[0]
|
93
|
+
unless candidate.nil?
|
94
|
+
return candidate.text
|
95
|
+
end
|
96
|
+
end
|
97
|
+
return nil
|
98
|
+
end
|
99
|
+
|
100
|
+
# Translates from marc mfhd tags 866, 867, 868 to a prefix label
|
101
|
+
def mfhd_coverage_prefix(tag_str)
|
102
|
+
{
|
103
|
+
"866" => "",
|
104
|
+
"867" => "Supplements: ",
|
105
|
+
"868" => "Indexes: "
|
106
|
+
}[tag_str].to_s
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
data/test/dummy/Rakefile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
|
+
|
5
|
+
require File.expand_path('../config/application', __FILE__)
|
6
|
+
|
7
|
+
Dummy::Application.load_tasks
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
// Umlaut javascript required for proper functionality. The 'umlaut' file
|
3
|
+
// also forces require of jquery and jquery-ui, dependencies.
|
4
|
+
//= require 'umlaut'
|
5
|
+
// This is a manifest file that'll be compiled into including all the files listed below.
|
6
|
+
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
|
7
|
+
// be included in the compiled file accessible from http://example.com/assets/application.js
|
8
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
9
|
+
// the compiled file.
|
10
|
+
//
|
11
|
+
//= require jquery
|
12
|
+
//= require jquery_ujs
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* The base Umlaut styles:
|
3
|
+
*= require 'umlaut'
|
4
|
+
|
5
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
6
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
7
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
8
|
+
*= require_self
|
9
|
+
*= require_tree .
|
10
|
+
*/
|
11
|
+
|
12
|
+
/* Umlaut needs a jquery-ui theme CSS. Here's an easy way to get one,
|
13
|
+
you can replace with another theme. */
|
14
|
+
@import url(http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/ui-lightness/jquery-ui.css);
|
15
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'umlaut'
|
2
|
+
require 'umlaut_configurable'
|
3
|
+
|
4
|
+
# Superclass for all Umlaut controllers, to hold default behavior,
|
5
|
+
# also hold global configuration. It's a superclass rather than a module,
|
6
|
+
# so we can use Rails 3 hieararchical superclass view lookup too if we want,
|
7
|
+
# for general umlaut views. And also so local app can over-ride
|
8
|
+
# methods here once, and have it apply to all Umlaut controllers.
|
9
|
+
# But there's not much magic in here or anything, the
|
10
|
+
# common behavior is ordinary methods available to be called, mostly.
|
11
|
+
#
|
12
|
+
# This class is copied into the local app -- the default implementation
|
13
|
+
# does nothing but 'include Umlaut::ControllerBehavior'
|
14
|
+
#
|
15
|
+
# You will ordinarily set config here, and can also over-ride
|
16
|
+
# methods from Umlaut::ControllerBehavior if desired. Or add
|
17
|
+
# additional helpers to over-ride Umlaut helpers if needed.
|
18
|
+
class UmlautController < ApplicationController
|
19
|
+
include Umlaut::ControllerBehavior
|
20
|
+
|
21
|
+
# Some suggested configuration. More config keys
|
22
|
+
# are available, see UmlautConfigurable.set_default_configuration!
|
23
|
+
# implementation for list. Configuration actually uses
|
24
|
+
# a Confstruct object.
|
25
|
+
|
26
|
+
umlaut_config.configure do
|
27
|
+
# app_name 'Find It'
|
28
|
+
|
29
|
+
# URL to image to use for link resolver in some self-links,
|
30
|
+
# OR name of image asset in local app.
|
31
|
+
#link_img_url "http//something"
|
32
|
+
|
33
|
+
# Sometimes Umlaut sends out email, what email addr should it be from?
|
34
|
+
# from_email_addr 'no_reply@umlaut.example.com'
|
35
|
+
|
36
|
+
# Local layout for UmlautController's, instead of
|
37
|
+
# built in 'umlaut' layout?
|
38
|
+
# layout "application"
|
39
|
+
|
40
|
+
# A help url used on error page and a few other places.
|
41
|
+
# help_url "http://www.library.jhu.edu/services/askalib/index.html"
|
42
|
+
|
43
|
+
# If OpenURL came from manual entry of title/ISSN, and no match is found in
|
44
|
+
# link resolver knowledge base, display a warning to the user of potential
|
45
|
+
# typo?
|
46
|
+
# entry_not_in_kb_warning true
|
47
|
+
|
48
|
+
# rfr_ids used for umlaut generated pages.
|
49
|
+
# rfr_ids do
|
50
|
+
# opensearch "info:sid/umlaut.code4lib.org:opensearch"
|
51
|
+
# citation "info:sid/umlaut.code4lib.org:citation"
|
52
|
+
# azlist 'info:sid/umlaut.code4lib.org:azlist'
|
53
|
+
# end
|
54
|
+
|
55
|
+
# Referent filters. Sort of like SFX source parsers.
|
56
|
+
# hash, key is regexp to match a sid, value is filter object
|
57
|
+
# (see lib/referent_filters )
|
58
|
+
# add_referent_filters!( :match => /.*/, :filter => DissertationCatch.new )
|
59
|
+
|
60
|
+
# How many seconds between updates of the background updater for background
|
61
|
+
# services?
|
62
|
+
# poll_wait_seconds 4
|
63
|
+
|
64
|
+
# Configuration for the 'search' functions -- A-Z lookup
|
65
|
+
# and citation entry.
|
66
|
+
search do
|
67
|
+
# Is your SFX database connection, defined in database.yml under
|
68
|
+
# sfx_db and used for A-Z searches, Sfx3 or Sfx4? Other SearchMethods
|
69
|
+
# in addition to SFX direct db may be provided later.
|
70
|
+
#az_search_method SearchMethods::Sfx4
|
71
|
+
#az_search_method SearchMethods::Sfx3
|
72
|
+
|
73
|
+
# When talking directly to the SFX A-Z list database, you may
|
74
|
+
# need to set this, if you have multiple A-Z profiles configured
|
75
|
+
# and don't want to use the 'default.
|
76
|
+
# sfx_az_profile "default"
|
77
|
+
|
78
|
+
# can set to "_blank" etc.
|
79
|
+
# result_link_target nil
|
80
|
+
end
|
81
|
+
|
82
|
+
# config only relevant to SFX use
|
83
|
+
sfx do
|
84
|
+
# base sfx url to use for search actions, error condition backup,
|
85
|
+
# and some other purposes. For search actions (A-Z), direct database
|
86
|
+
# connection to your SFX db also needs to be defined in database.yml
|
87
|
+
# sfx_base_url 'http://sfx.library.jhu.edu:8000/jhu_sfx?'
|
88
|
+
#
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
# Umlaut tries to figure out from the SFX knowledge base
|
93
|
+
# which hosts are "SFX controlled", to avoid duplicating SFX
|
94
|
+
# urls with urls from catalog. But sometimes it misses some, or
|
95
|
+
# alternate hostnames for some. Regexps matching against
|
96
|
+
# urls can be included here. Eg,
|
97
|
+
# AppConfig::Base.additional_sfx_controlled_urls = [
|
98
|
+
# %r{^http://([^\.]\.)*pubmedcentral\.com}
|
99
|
+
# ]
|
100
|
+
# additional_sfx_controlled_urls = []
|
101
|
+
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
# Advanced topic, you can declaratively configure
|
106
|
+
# what sections of the resolve page are output where
|
107
|
+
# and how using resolve_sections and add_resolve_sections!
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
Bundler.require
|
6
|
+
require "umlaut"
|
7
|
+
|
8
|
+
module Dummy
|
9
|
+
class Application < Rails::Application
|
10
|
+
# Settings in config/environments/* take precedence over those specified here.
|
11
|
+
# Application configuration should go into files in config/initializers
|
12
|
+
# -- all .rb files in that directory are automatically loaded.
|
13
|
+
|
14
|
+
# Custom directories with classes and modules you want to be autoloadable.
|
15
|
+
# config.autoload_paths += %W(#{config.root}/extras)
|
16
|
+
|
17
|
+
# Only load the plugins named here, in the order given (default is alphabetical).
|
18
|
+
# :all can be used as a placeholder for all plugins not explicitly named.
|
19
|
+
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
20
|
+
|
21
|
+
# Activate observers that should always be running.
|
22
|
+
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
23
|
+
|
24
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
25
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
26
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
27
|
+
|
28
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
29
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
30
|
+
# config.i18n.default_locale = :de
|
31
|
+
|
32
|
+
# Configure the default encoding used in templates for Ruby 1.9.
|
33
|
+
config.encoding = "utf-8"
|
34
|
+
|
35
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
36
|
+
config.filter_parameters += [:password]
|
37
|
+
|
38
|
+
# Enable the asset pipeline
|
39
|
+
config.assets.enabled = true
|
40
|
+
|
41
|
+
# Version of your assets, change this if you want to expire all your assets
|
42
|
+
config.assets.version = '1.0'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|