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.
Files changed (293) hide show
  1. data/LICENSE +7 -0
  2. data/README.md +49 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/images/error.gif +0 -0
  5. data/app/assets/images/export_bg_bot.gif +0 -0
  6. data/app/assets/images/export_bg_mid.gif +0 -0
  7. data/app/assets/images/export_bg_top.gif +0 -0
  8. data/app/assets/images/famfamfam/book_open.png +0 -0
  9. data/app/assets/images/famfamfam/cross.png +0 -0
  10. data/app/assets/images/famfamfam/page_sound.gif +0 -0
  11. data/app/assets/images/famfamfam/page_text.gif +0 -0
  12. data/app/assets/images/famfamfam/page_up.gif +0 -0
  13. data/app/assets/images/famfamfam/page_white.png +0 -0
  14. data/app/assets/images/famfamfam/readme.html +1495 -0
  15. data/app/assets/images/famfamfam/tiny_cross.png +0 -0
  16. data/app/assets/images/frame_remove.gif +0 -0
  17. data/app/assets/images/ico_go.gif +0 -0
  18. data/app/assets/images/jhu_findit.gif +0 -0
  19. data/app/assets/images/list_closed.png +0 -0
  20. data/app/assets/images/list_open.png +0 -0
  21. data/app/assets/images/more_info.gif +0 -0
  22. data/app/assets/images/rails.png +0 -0
  23. data/app/assets/images/request.gif +0 -0
  24. data/app/assets/images/spinner.gif +0 -0
  25. data/app/assets/javascripts/umlaut/ajax_windows.js +35 -0
  26. data/app/assets/javascripts/umlaut/ensure_window_size.js.erb +34 -0
  27. data/app/assets/javascripts/umlaut/expand_contract_toggle.js +25 -0
  28. data/app/assets/javascripts/umlaut/search_autocomplete.js +46 -0
  29. data/app/assets/javascripts/umlaut/simple_visible_toggle.js +8 -0
  30. data/app/assets/javascripts/umlaut/update_html.js +152 -0
  31. data/app/assets/javascripts/umlaut.js +17 -0
  32. data/app/assets/stylesheets/umlaut.css +857 -0
  33. data/app/controllers/application_controller.rb +14 -0
  34. data/app/controllers/export_email_controller.rb +123 -0
  35. data/app/controllers/js_helper_controller.rb +10 -0
  36. data/app/controllers/link_router_controller.rb +87 -0
  37. data/app/controllers/open_search_controller.rb +9 -0
  38. data/app/controllers/resolve_controller.rb +288 -0
  39. data/app/controllers/resource_controller.rb +83 -0
  40. data/app/controllers/search_controller.rb +328 -0
  41. data/app/controllers/search_methods/sfx3.rb +148 -0
  42. data/app/controllers/search_methods/sfx4.rb +257 -0
  43. data/app/controllers/search_methods/sfx_api.rb +47 -0
  44. data/app/controllers/store_controller.rb +64 -0
  45. data/app/controllers/umlaut/controller_behavior.rb +20 -0
  46. data/app/controllers/umlaut/controller_logic.rb +96 -0
  47. data/app/controllers/umlaut/error_handling.rb +48 -0
  48. data/app/controllers/umlaut_controller.rb +112 -0
  49. data/app/helpers/application_helper.rb +4 -0
  50. data/app/helpers/emailer_helper.rb +43 -0
  51. data/app/helpers/export_email_helper.rb +34 -0
  52. data/app/helpers/open_search_helper.rb +7 -0
  53. data/app/helpers/resolve_helper.rb +225 -0
  54. data/app/helpers/search_helper.rb +50 -0
  55. data/app/helpers/umlaut/footer_helper.rb +64 -0
  56. data/app/helpers/umlaut/helper.rb +62 -0
  57. data/app/helpers/umlaut/html_head_helper.rb +37 -0
  58. data/app/helpers/umlaut/url_generation.rb +77 -0
  59. data/app/mailers/emailer.rb +48 -0
  60. data/app/models/clickthrough.rb +2 -0
  61. data/app/models/collection.rb +259 -0
  62. data/app/models/crossref_lookup.rb +2 -0
  63. data/app/models/dispatched_service.rb +58 -0
  64. data/app/models/permalink.rb +29 -0
  65. data/app/models/referent.rb +473 -0
  66. data/app/models/referent_value.rb +14 -0
  67. data/app/models/request.rb +449 -0
  68. data/app/models/service_response.rb +179 -0
  69. data/app/models/service_store.rb +59 -0
  70. data/app/models/service_type_value.rb +58 -0
  71. data/app/models/service_wave.rb +150 -0
  72. data/app/models/sfx_db/az_additional_title.rb +11 -0
  73. data/app/models/sfx_db/az_letter_group.rb +11 -0
  74. data/app/models/sfx_db/az_title.rb +38 -0
  75. data/app/models/sfx_db/az_title_v2.rb +34 -0
  76. data/app/models/sfx_db/isbn.rb +12 -0
  77. data/app/models/sfx_db/issn.rb +12 -0
  78. data/app/models/sfx_db/object.rb +35 -0
  79. data/app/models/sfx_db/object_portfolio.rb +6 -0
  80. data/app/models/sfx_db/publisher.rb +10 -0
  81. data/app/models/sfx_db/sfx_db_base.rb +54 -0
  82. data/app/models/sfx_db/target.rb +9 -0
  83. data/app/models/sfx_db/target_service.rb +10 -0
  84. data/app/models/sfx_db/title.rb +10 -0
  85. data/app/models/sfx_db.rb +10 -0
  86. data/app/models/sfx_url.rb +35 -0
  87. data/app/views/emailer/citation.text.erb +28 -0
  88. data/app/views/emailer/short_citation.text.erb +8 -0
  89. data/app/views/export_email/_email.html.erb +25 -0
  90. data/app/views/export_email/_send_email.html.erb +3 -0
  91. data/app/views/export_email/_send_txt.html.erb +3 -0
  92. data/app/views/export_email/_txt.html.erb +62 -0
  93. data/app/views/export_email/email.html.erb +3 -0
  94. data/app/views/export_email/send_email.html.erb +1 -0
  95. data/app/views/export_email/send_txt.html.erb +1 -0
  96. data/app/views/export_email/txt.html.erb +3 -0
  97. data/app/views/js_helper/loader.erb.js +13 -0
  98. data/app/views/layouts/umlaut.html.erb +52 -0
  99. data/app/views/open_search/index.html.erb +9 -0
  100. data/app/views/resolve/_api_in_progress.xml.erb +21 -0
  101. data/app/views/resolve/_background_progress.html.erb +51 -0
  102. data/app/views/resolve/_background_updater.html.erb +38 -0
  103. data/app/views/resolve/_citation.html.erb +87 -0
  104. data/app/views/resolve/_coins.html.erb +1 -0
  105. data/app/views/resolve/_compact_citation.html.erb +33 -0
  106. data/app/views/resolve/_cover_image.html.erb +35 -0
  107. data/app/views/resolve/_fulltext.html.erb +55 -0
  108. data/app/views/resolve/_help.html.erb +17 -0
  109. data/app/views/resolve/_holding.html.erb +91 -0
  110. data/app/views/resolve/_related_items.html.erb +35 -0
  111. data/app/views/resolve/_search_inside.html.erb +62 -0
  112. data/app/views/resolve/_section_display.html.erb +49 -0
  113. data/app/views/resolve/_service_errors.html.erb +29 -0
  114. data/app/views/resolve/_standard_response_item.html.erb +89 -0
  115. data/app/views/resolve/api.xml.builder +72 -0
  116. data/app/views/resolve/background_status.html.erb +26 -0
  117. data/app/views/resolve/index.html.erb +73 -0
  118. data/app/views/resolve/partial_html_sections.xml.erb +30 -0
  119. data/app/views/search/_a_to_z.html.erb +6 -0
  120. data/app/views/search/_citation.html.erb +94 -0
  121. data/app/views/search/_pager.html.erb +60 -0
  122. data/app/views/search/books.html.erb +103 -0
  123. data/app/views/search/journal_search.html.erb +90 -0
  124. data/app/views/search/journals.html.erb +167 -0
  125. data/app/views/search/opensearch_description.rxml +10 -0
  126. data/app/views/testing/index.html.erb +1 -0
  127. data/app/views/umlaut/README +5 -0
  128. data/app/views/umlaut/error.html.erb +45 -0
  129. data/db/migrate/01_umlaut_init.rb +113 -0
  130. data/db/orig_fixed_data/service_type_values.yml +120 -0
  131. data/db/seeds.rb +7 -0
  132. data/lib/CronTab.rb +192 -0
  133. data/lib/aws_product_sign.rb +146 -0
  134. data/lib/exlibris/aleph/patron.rb +64 -0
  135. data/lib/exlibris/aleph/record.rb +54 -0
  136. data/lib/exlibris/aleph/rest_api.rb +29 -0
  137. data/lib/exlibris/primo/holding.rb +192 -0
  138. data/lib/exlibris/primo/rsrc.rb +17 -0
  139. data/lib/exlibris/primo/searcher.rb +276 -0
  140. data/lib/exlibris/primo/source/aleph.rb +46 -0
  141. data/lib/exlibris/primo/source/distribution/nyu_aleph.rb +323 -0
  142. data/lib/exlibris/primo/toc.rb +17 -0
  143. data/lib/exlibris/primo_ws.rb +140 -0
  144. data/lib/generators/templates/umlaut_services.yml +237 -0
  145. data/lib/generators/umlaut/asset_hooks_generator.rb +44 -0
  146. data/lib/generators/umlaut/install_generator.rb +110 -0
  147. data/lib/hip3/bib.rb +291 -0
  148. data/lib/hip3/bib_searcher.rb +302 -0
  149. data/lib/hip3/custom_field_lookup.rb +44 -0
  150. data/lib/hip3/holding.rb +50 -0
  151. data/lib/hip3/item.rb +65 -0
  152. data/lib/hip3/receipt.rb +7 -0
  153. data/lib/hip3/serial_copy.rb +82 -0
  154. data/lib/holding.rb +32 -0
  155. data/lib/marc_helper.rb +254 -0
  156. data/lib/metadata_helper.rb +312 -0
  157. data/lib/opensearch_feed.rb +398 -0
  158. data/lib/opensearch_query.rb +98 -0
  159. data/lib/referent_filter.rb +16 -0
  160. data/lib/referent_filters/dissertation_catch.rb +45 -0
  161. data/lib/section_renderer.rb +503 -0
  162. data/lib/service.rb +336 -0
  163. data/lib/service_adaptors/ajax_export.rb +37 -0
  164. data/lib/service_adaptors/amazon.rb +412 -0
  165. data/lib/service_adaptors/blacklight.rb +327 -0
  166. data/lib/service_adaptors/book_finder.rb +40 -0
  167. data/lib/service_adaptors/bx.rb +51 -0
  168. data/lib/service_adaptors/cover_thing.rb +73 -0
  169. data/lib/service_adaptors/elsevier_cover.rb +57 -0
  170. data/lib/service_adaptors/email_export.rb +10 -0
  171. data/lib/service_adaptors/ezproxy.rb +171 -0
  172. data/lib/service_adaptors/google_book_search.rb +442 -0
  173. data/lib/service_adaptors/gpo.rb +124 -0
  174. data/lib/service_adaptors/hathi_trust.rb +308 -0
  175. data/lib/service_adaptors/hip3_service.rb +150 -0
  176. data/lib/service_adaptors/hip_holding_search.rb +237 -0
  177. data/lib/service_adaptors/internet_archive.rb +488 -0
  178. data/lib/service_adaptors/isbn_db.rb +86 -0
  179. data/lib/service_adaptors/isi.rb +258 -0
  180. data/lib/service_adaptors/jcr.rb +146 -0
  181. data/lib/service_adaptors/opac.rb +351 -0
  182. data/lib/service_adaptors/open_library.rb +316 -0
  183. data/lib/service_adaptors/open_library_cover.rb +73 -0
  184. data/lib/service_adaptors/primo_service.rb +392 -0
  185. data/lib/service_adaptors/primo_source.rb +78 -0
  186. data/lib/service_adaptors/pubmed.rb +133 -0
  187. data/lib/service_adaptors/request_to_fixture.rb +68 -0
  188. data/lib/service_adaptors/scopus.rb +295 -0
  189. data/lib/service_adaptors/sfx-new.rb +557 -0
  190. data/lib/service_adaptors/sfx.rb +566 -0
  191. data/lib/service_adaptors/sfx_backchannel_record.rb +69 -0
  192. data/lib/service_adaptors/txt_holding_export.rb +32 -0
  193. data/lib/service_adaptors/ulrichs_cover.rb +57 -0
  194. data/lib/service_adaptors/ulrichs_link.rb +47 -0
  195. data/lib/service_adaptors/worldcat.rb +116 -0
  196. data/lib/service_adaptors/worldcat_identities.rb +591 -0
  197. data/lib/tasks/umlaut.rake +134 -0
  198. data/lib/umlaut/default_configuration.rb +5 -0
  199. data/lib/umlaut/routes.rb +136 -0
  200. data/lib/umlaut/version.rb +3 -0
  201. data/lib/umlaut.rb +37 -0
  202. data/lib/umlaut_configurable.rb +343 -0
  203. data/lib/umlaut_http.rb +100 -0
  204. data/lib/xml_schema_helper.rb +109 -0
  205. data/test/dummy/Rakefile +7 -0
  206. data/test/dummy/app/assets/javascripts/application.js +13 -0
  207. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  208. data/test/dummy/app/controllers/application_controller.rb +3 -0
  209. data/test/dummy/app/controllers/umlaut_controller.rb +112 -0
  210. data/test/dummy/app/helpers/application_helper.rb +2 -0
  211. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  212. data/test/dummy/config/application.rb +45 -0
  213. data/test/dummy/config/boot.rb +10 -0
  214. data/test/dummy/config/database-jhu.yml +44 -0
  215. data/test/dummy/config/database.yml +25 -0
  216. data/test/dummy/config/environment.rb +5 -0
  217. data/test/dummy/config/environments/development.rb +34 -0
  218. data/test/dummy/config/environments/production.rb +60 -0
  219. data/test/dummy/config/environments/test.rb +39 -0
  220. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  221. data/test/dummy/config/initializers/inflections.rb +10 -0
  222. data/test/dummy/config/initializers/mime_types.rb +5 -0
  223. data/test/dummy/config/initializers/secret_token.rb +7 -0
  224. data/test/dummy/config/initializers/session_store.rb +8 -0
  225. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  226. data/test/dummy/config/locales/en.yml +5 -0
  227. data/test/dummy/config/routes.rb +61 -0
  228. data/test/dummy/config/umlaut_services.yml +237 -0
  229. data/test/dummy/config.ru +4 -0
  230. data/test/dummy/db/migrate/20111228211210_umlaut_init.rb +113 -0
  231. data/test/dummy/db/schema.rb +124 -0
  232. data/test/dummy/log/development.log +12981 -0
  233. data/test/dummy/log/production.log +0 -0
  234. data/test/dummy/public/404.html +26 -0
  235. data/test/dummy/public/422.html +26 -0
  236. data/test/dummy/public/500.html +26 -0
  237. data/test/dummy/public/favicon.ico +0 -0
  238. data/test/dummy/script/rails +6 -0
  239. data/test/dummy/tmp/cache/assets/C5F/340/sprockets%2F99692920160b7a279b86a80415b79db7 +0 -0
  240. data/test/dummy/tmp/cache/assets/C70/4D0/sprockets%2F034ad2036e623081bd352800786dfe80 +0 -0
  241. data/test/dummy/tmp/cache/assets/C73/920/sprockets%2Fd371318f22900492fd180f17c5e2a504 +9268 -0
  242. data/test/dummy/tmp/cache/assets/C80/980/sprockets%2Fc94807409c1523d43e18d25f35d93c41 +0 -0
  243. data/test/dummy/tmp/cache/assets/C8F/780/sprockets%2Fe47e28558116fb5f8038754e60d1961d +11769 -0
  244. data/test/dummy/tmp/cache/assets/CAA/EB0/sprockets%2F1d179210e8b76f1ea63c802688a015e4 +9271 -0
  245. data/test/dummy/tmp/cache/assets/CBB/9C0/sprockets%2F706f28923fb754cad04b9107c89986a1 +0 -0
  246. data/test/dummy/tmp/cache/assets/CBF/B60/sprockets%2F08ca89671549936265dcb673bf02e36f +0 -0
  247. data/test/dummy/tmp/cache/assets/CC9/9F0/sprockets%2F306166316e2cafd13c15e62b51a2339d +0 -0
  248. data/test/dummy/tmp/cache/assets/CF6/F20/sprockets%2F5b2ffa1103079dfd555197838f87a99f +0 -0
  249. data/test/dummy/tmp/cache/assets/CF7/2B0/sprockets%2F25a7c73655bd3598173b39d9f98bcd46 +862 -0
  250. data/test/dummy/tmp/cache/assets/CFE/080/sprockets%2F37fe9f4255baddbd549a659914929398 +0 -0
  251. data/test/dummy/tmp/cache/assets/D22/060/sprockets%2F9aec77b768e91a802d284271c58e2f7e +21357 -0
  252. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  253. data/test/dummy/tmp/cache/assets/D33/6D0/sprockets%2F500129c57f1146e556ec3aacd6cd38c1 +0 -0
  254. data/test/dummy/tmp/cache/assets/D33/FD0/sprockets%2F2ba0b4e6334a77b923e5f770381bb2bf +0 -0
  255. data/test/dummy/tmp/cache/assets/D42/C20/sprockets%2Fbcf14e437b1582bf93b77670acf8e090 +21353 -0
  256. data/test/dummy/tmp/cache/assets/D50/A30/sprockets%2F7d8b294ac433db5d056538f8cf7c66b9 +0 -0
  257. data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +872 -0
  258. data/test/dummy/tmp/cache/assets/D65/590/sprockets%2Fc1bb92fc3406a126b7dd302edc96d629 +0 -0
  259. data/test/dummy/tmp/cache/assets/D71/6B0/sprockets%2Fde558b71b494cf09b1bf055c8dff0353 +0 -0
  260. data/test/dummy/tmp/cache/assets/D72/610/sprockets%2Fa8c708eeb30ef93de34d755d4f45d023 +859 -0
  261. data/test/dummy/tmp/cache/assets/D76/AD0/sprockets%2Fe2158cde93188cf5ab6457bc6d6602ec +0 -0
  262. data/test/dummy/tmp/cache/assets/D7A/E40/sprockets%2F9622ffcc499a57627cd1bb18fe31b8e4 +11772 -0
  263. data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  264. data/test/dummy/tmp/cache/assets/D9B/770/sprockets%2F8aacf02eb7dbb0949704b28f27b87e0b +0 -0
  265. data/test/dummy/tmp/cache/assets/DA6/A80/sprockets%2F92e26d8e58d5bcc8b8f6c25d1b05b9c1 +0 -0
  266. data/test/dummy/tmp/cache/assets/DE8/790/sprockets%2Fd1333bde2b9aafcc712d11dd09ab35d8 +0 -0
  267. data/test/dummy/tmp/cache/assets/DF7/F30/sprockets%2F7bc16c4109b17fabe29f8ddbbf732d1c +374 -0
  268. data/test/dummy/tmp/cache/assets/E03/570/sprockets%2F493bdc0ac14cd4f57fdfe4253f992bde +0 -0
  269. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  270. data/test/dummy/tmp/cache/assets/E0B/4B0/sprockets%2F7988df51a61c81ce6ede4a2d4c8cce4f +377 -0
  271. data/test/dummy/tmp/cache/assets/E5F/960/sprockets%2Fdc007b6cad5c7ef08e33ec28cfff0ef6 +0 -0
  272. data/test/fixtures/dispatched_services.yml +5 -0
  273. data/test/fixtures/permalinks.yml +5 -0
  274. data/test/fixtures/referent_values.yml +1734 -0
  275. data/test/fixtures/referents.yml +156 -0
  276. data/test/fixtures/requests.yml +284 -0
  277. data/test/fixtures/service_responses.yml +5 -0
  278. data/test/fixtures/sfx_urls.yml +4 -0
  279. data/test/performance/browsing_test.rb +9 -0
  280. data/test/test_helper.rb +10 -0
  281. data/test/umlaut_test.rb +7 -0
  282. data/test/unit/aleph_patron_test.rb +39 -0
  283. data/test/unit/aleph_record_benchmarks.rb +28 -0
  284. data/test/unit/aleph_record_test.rb +30 -0
  285. data/test/unit/aws_product_sign_test.rb +93 -0
  286. data/test/unit/collection_test.rb +76 -0
  287. data/test/unit/google_book_search_test.rb +101 -0
  288. data/test/unit/primo_searcher_test.rb +403 -0
  289. data/test/unit/primo_service_test.rb +939 -0
  290. data/test/unit/primo_ws_test.rb +131 -0
  291. data/test/unit/service_response_test.rb +9 -0
  292. data/test/unit/service_test.rb +33 -0
  293. metadata +580 -0
@@ -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
@@ -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,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -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,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag "application" %>
6
+ <%= javascript_include_tag "application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -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
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)