triannon-client 0.1.0 → 0.2.0.pre.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.env_example +1 -1
  3. data/.travis.yml +1 -2
  4. data/README.md +12 -3
  5. data/bin/test.sh +8 -9
  6. data/lib/triannon-client.rb +8 -3
  7. data/lib/triannon-client/triannon_client.rb +180 -0
  8. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml +4088 -0
  9. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml +4088 -0
  10. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml +4088 -0
  11. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +4088 -0
  12. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trig_.yml +4088 -0
  13. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/trix_.yml +4088 -0
  14. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +4088 -0
  15. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +4088 -0
  16. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +4088 -0
  17. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/n3_.yml +4088 -0
  18. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +4088 -0
  19. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +4088 -0
  20. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/cannot_get_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +4088 -0
  21. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/ld_json_.yml +4946 -0
  22. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml +4088 -0
  23. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml +4088 -0
  24. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml +4088 -0
  25. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +4088 -0
  26. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/rdf_xml_.yml +2565 -0
  27. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/trig_.yml +4088 -0
  28. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/trix_.yml +4088 -0
  29. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +4088 -0
  30. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +4088 -0
  31. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +4088 -0
  32. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_application/x-turtle_.yml +2566 -0
  33. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/n3_.yml +4088 -0
  34. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +4088 -0
  35. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +4088 -0
  36. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/turtle_.yml +2566 -0
  37. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/gets_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +4088 -0
  38. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_accepting_JSON-LD_content.yml +2502 -0
  39. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_accepting_a_default_JSON-LD_content.yml +2502 -0
  40. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_using_a_default_JSON-LD_content.yml +2502 -0
  41. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/ld_json_.yml +2502 -0
  42. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/n-quads_.yml +2502 -0
  43. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/n-triples_.yml +2502 -0
  44. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_json_.yml +2502 -0
  45. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_n3_.yml +2502 -0
  46. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/rdf_xml_.yml +2502 -0
  47. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/trig_.yml +2502 -0
  48. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/trix_.yml +2502 -0
  49. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/turtle_.yml +2502 -0
  50. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-ld_json_.yml +2502 -0
  51. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-trig_.yml +2502 -0
  52. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_application/x-turtle_.yml +2502 -0
  53. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/n3_.yml +2502 -0
  54. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/rdf_n3_.yml +2502 -0
  55. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/rdf_turtle_.yml +2502 -0
  56. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/turtle_.yml +2502 -0
  57. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_content_type_text/x-nquads_.yml +2502 -0
  58. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_optional_content_type_parameter.yml +2502 -0
  59. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_content_type/requests_an_open_annotation_by_ID_with_turtle_content_type_parameter.yml +2502 -0
  60. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/checks_the_annotation_ID.yml +2561 -0
  61. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/logs_exceptions.yml +2502 -0
  62. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/raises_an_argument_error_with_a_nil_ID.yml +2502 -0
  63. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/raises_an_argument_error_with_an_empty_string_ID.yml +2502 -0
  64. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/raises_an_argument_error_with_an_integer_ID.yml +2502 -0
  65. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/returns_an_EMPTY_RDF_graph_for_a_500_server_response.yml +2502 -0
  66. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/returns_an_EMPTY_RDF_graph_with_a_valid_ID_for_NO_annotation_on_the_server.yml +3623 -0
  67. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/with_no_content_type/returns_an_RDF_graph_with_a_valid_ID_for_an_annotation_on_the_server.yml +4946 -0
  68. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/checks_the_annotation_ID.yml +2502 -0
  69. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/logs_exceptions.yml +2502 -0
  70. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_a_nil_ID.yml +2502 -0
  71. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_an_empty_string_ID.yml +2502 -0
  72. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/raises_an_argument_error_with_an_integer_ID.yml +2502 -0
  73. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/requests_an_open_annotation_by_ID_accepting_a_default_JSON-LD_content.yml +2502 -0
  74. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_EMPTY_RDF_graph_for_a_500_server_response.yml +2502 -0
  75. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_EMPTY_RDF_graph_with_a_valid_ID_for_NO_annotation_on_the_server.yml +3328 -0
  76. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_annotation/without_content_type/returns_an_RDF_graph_with_a_valid_ID_for_an_annotation_on_the_server.yml +4946 -0
  77. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_iiif_annotation/requests_an_open_annotation_by_ID_using_a_IIIF_profile.yml +2746 -0
  78. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_iiif_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml +2746 -0
  79. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_oa_annotation/requests_an_open_annotation_by_ID_using_an_OA_profile.yml +4946 -0
  80. data/spec/fixtures/vcr_cassettes/TriannonClient/GET_annotation_by_ID_/_get_oa_annotation/returns_an_RDF_Graph_of_an_open_annotation.yml +4946 -0
  81. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/deletes_an_open_annotation_that_exists.yml +2548 -0
  82. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/fails_to_delete_an_open_annotation_that_does_NOT_exist.yml +123 -0
  83. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_false_for_a_500_response_to_a_DELETE_request.yml +64 -0
  84. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_true_for_a_200_response_to_a_DELETE_request.yml +64 -0
  85. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_true_for_a_202_response_to_a_DELETE_request.yml +64 -0
  86. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/returns_true_for_a_204_response_to_a_DELETE_request.yml +64 -0
  87. data/spec/fixtures/vcr_cassettes/TriannonClient/_delete_annotation/validates_the_annotation_ID.yml +64 -0
  88. data/spec/fixtures/vcr_cassettes/TriannonClient/_get_annotations/returns_an_RDF_Graph.yml +295 -0
  89. data/spec/fixtures/vcr_cassettes/TriannonClient/_get_annotations/returns_an_RDF_Graph_that_contains_an_AnnotationList.yml +295 -0
  90. data/spec/fixtures/vcr_cassettes/TriannonClient/_get_annotations/returns_an_annotation_list_with_an_annotation_created_by_a_prior_POST.yml +2795 -0
  91. data/spec/fixtures/vcr_cassettes/TriannonClient/_post_annotation/does_not_raise_an_error_when_submitting_a_valid_open_annotation.yml +2502 -0
  92. data/spec/fixtures/vcr_cassettes/TriannonClient/_post_annotation/returns_a_RestClient_Response_object.yml +2502 -0
  93. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_id/returns_a_String_ID_from_the_RDF_URI_of_an_annotation.yml +2502 -0
  94. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_id/returns_a_String_ID_that_is_not_empty.yml +2502 -0
  95. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_uri/returns_an_RDF_URI_from_an_RDF_Graph_of_an_annotation.yml +2502 -0
  96. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_annotation_uri/returns_an_RDF_URI_that_is_a_valid_URI.yml +2550 -0
  97. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/accepts_a_RestClient_Response_instance.yml +4898 -0
  98. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/raises_ArgumentError_when_given_an_empty_String.yml +2502 -0
  99. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/raises_ArgumentError_when_given_nil.yml +2502 -0
  100. data/spec/fixtures/vcr_cassettes/TriannonClient/response_processing_utilities/_response2graph/returns_an_RDF_Graph.yml +2502 -0
  101. data/spec/lib/triannon-client/triannon_client_spec.rb +502 -0
  102. data/spec/spec_helper.rb +12 -1
  103. data/triannon-client.gemspec +5 -2
  104. metadata +234 -7
  105. data/Gemfile.lock +0 -203
  106. data/lib/triannon-client/triannon-client.rb +0 -135
  107. data/spec/lib/triannon-client/triannon-client_spec.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07b7dcae42e6b63eced37e16ee442d2db563eaa0
4
- data.tar.gz: 0e24d31959302b0722a1f72e735a0d3b06902814
3
+ metadata.gz: f0c1db12b26befc300bf3361898e2b563aa30665
4
+ data.tar.gz: 74d9163686393f4d6e9e94b9794c436763d89f4c
5
5
  SHA512:
6
- metadata.gz: d0423905c2873604f3fc43a18c93b57f998065b0720f7f02fc215af31b7ffcdfd7cfa6617d99bd4d77b12ac1a383a3880b502b63966a081ee7ff55a275a57dad
7
- data.tar.gz: df43ac27b95f8427ff9d21083235a219687a19affd3c9ab99081ec559f6dddb41e9a9e2a1c52bb75beeb15236125649b7891e7e68b3628b2ebc2a6842cedbf25
6
+ metadata.gz: 6b401b1b4607a4ca99d4bd05c7330fd92696b5e846f6f9a69cdb4b7acda23a4bd019311926769edb1d1f3ba5e0b40da04b50198fd5d601c50e28aa0276da55a0
7
+ data.tar.gz: 5757bdfcc9b73fba5bea1ec3d069bd46d352a303e0129bb7b077c2f189f7b051c4a8d2d1cf11b621864004dbf3a1f745a78186fc9da70b3934be6e9757b1ca99
data/.env_example CHANGED
@@ -11,7 +11,7 @@ export DEBUG=false
11
11
  export TRIANNON_LOG_FILE='log/triannon_client.log'
12
12
 
13
13
  # Configure the triannon service
14
- export TRIANNON_HOST='triannon.example.org'
14
+ export TRIANNON_HOST='http://localhost:3000'
15
15
  export TRIANNON_USER=''
16
16
  export TRIANNON_PASS=''
17
17
 
data/.travis.yml CHANGED
@@ -5,10 +5,9 @@ install: ./bin/setup.sh
5
5
  script: ./bin/test.sh
6
6
 
7
7
  notifications:
8
- email: false
8
+ email: triannon-commits@lists.stanford.edu
9
9
 
10
10
  rvm:
11
- - 1.9.3
12
11
  - 2.0.0
13
12
  - 2.1.5
14
13
  - 2.2.0
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  [![Build Status](https://travis-ci.org/sul-dlss/triannon-client.svg?branch=master)](https://travis-ci.org/sul-dlss/triannon-client) [![Coverage Status](https://coveralls.io/repos/sul-dlss/triannon-client/badge.png)](https://coveralls.io/r/sul-dlss/triannon-client) [![Dependency Status](https://gemnasium.com/sul-dlss/triannon-client.svg)](https://gemnasium.com/sul-dlss/triannon-client) [![Gem Version](https://badge.fury.io/rb/triannon-client.svg)](http://badge.fury.io/rb/triannon-client)
2
2
 
3
+
4
+ # Under construction!
5
+
6
+ Use at your own risk!
7
+
8
+
3
9
  # Triannon Client
4
10
 
5
11
  A client for the triannon service, see also
@@ -47,7 +53,7 @@ tc = TriannonClient::TriannonClient.new
47
53
 
48
54
  ```ruby
49
55
  # return an RDF::Graph
50
- graph = tc.get_annoations
56
+ graph = tc.get_annotations
51
57
  ```
52
58
 
53
59
  ### Get a particular annotation
@@ -76,8 +82,11 @@ tc.post_annotation(open_annotation_jsonld)
76
82
 
77
83
  ### Delete an annotation
78
84
 
79
- #### TODO
80
-
85
+ ```ruby
86
+ uri = RDF::URI.parse('http://your.triannon-server.com/annotations/5314746b-f1eb-473a-a273-46c1afe5f530')
87
+ id = tc.annotation_id(uri) #=> 5314746b-f1eb-473a-a273-46c1afe5f530
88
+ tc.delete_annotation(id)
89
+ ```
81
90
 
82
91
  ## Development
83
92
 
data/bin/test.sh CHANGED
@@ -2,15 +2,14 @@
2
2
 
3
3
  set -e
4
4
 
5
- if [ -s .env ]; then
6
- mv .env .env_bak
7
- fi
8
-
5
+ [[ -s .env ]] && mv .env .env_bak
9
6
  cp .env_example .env
10
- .binstubs/rspec
11
- #.binstubs/cucumber --strict
12
7
 
13
- if [ -s .env_bak ]; then
14
- mv .env_bak .env
15
- fi
8
+ # The `|| echo ''` enables the bash script to continue after rspec failure
9
+ EXIT=0
10
+ .binstubs/rspec --color || EXIT=1
11
+ #.binstubs/cucumber --strict || EXIT=1
12
+
13
+ [[ -s .env_bak ]] && mv .env_bak .env
14
+ exit $EXIT
16
15
 
@@ -1,17 +1,23 @@
1
1
  require 'dotenv'
2
2
  Dotenv.load
3
+ # The pry dependency must be available when the client is configured to
4
+ # run in debug mode, where it will fall into a pry console for rescue blocks.
3
5
  require 'pry'
4
6
  require 'pry-doc'
5
7
  # require rest client prior to linkeddata, so the latter can use it.
6
8
  require 'rest-client'
9
+ # If a proxy is present, RestClient needs explicit configuration to use it.
10
+ # (The ruby stdlib http client will use a proxy automatically.)
7
11
  RestClient.proxy = ENV['http_proxy'] unless ENV['http_proxy'].nil?
8
12
  RestClient.proxy = ENV['HTTP_PROXY'] unless ENV['HTTP_PROXY'].nil?
9
13
  require 'linkeddata'
10
14
  require_relative 'triannon-client/configuration'
11
- require_relative 'triannon-client/triannon-client'
15
+ require_relative 'triannon-client/triannon_client'
12
16
 
17
+ # TriannonClient is a utility wrapper on RestClient and RDF::Graph for
18
+ # working with open annotations in a Triannon server, see
19
+ # https://github.com/sul-dlss/triannon
13
20
  module TriannonClient
14
-
15
21
  # configuration at the module level, see
16
22
  # http://brandonhilkert.com/blog/ruby-gem-configuration-patterns/
17
23
 
@@ -30,5 +36,4 @@ module TriannonClient
30
36
  def self.configure
31
37
  yield(configuration)
32
38
  end
33
-
34
39
  end
@@ -0,0 +1,180 @@
1
+ module TriannonClient
2
+ class TriannonClient
3
+ # Triannon may not support all content types in RDF::Format.content_types,
4
+ # but the client code is more generic using this as a reasonable set; this
5
+ # allows triannon to evolve support for anything supported by RDF::Format.
6
+ CONTENT_ERROR = 'content_type not found in RDF::Format.content_types'
7
+ CONTENT_TYPES = RDF::Format.content_types.keys
8
+
9
+ JSONLD_TYPE = 'application/ld+json'
10
+ PROFILE_IIIF = 'http://iiif.io/api/presentation/2/context.json'
11
+ PROFILE_OA = 'http://www.w3.org/ns/oa-context-20130208.json'
12
+ CONTENT_TYPE_IIIF = "#{JSONLD_TYPE}; profile=\"#{PROFILE_IIIF}\""
13
+ CONTENT_TYPE_OA = "#{JSONLD_TYPE}; profile=\"#{PROFILE_OA}\""
14
+
15
+ attr_reader :config
16
+ attr_accessor :site
17
+
18
+ def initialize
19
+ # Configure triannon-app service
20
+ @config = ::TriannonClient.configuration
21
+ @site = RestClient::Resource.new(
22
+ @config.host,
23
+ user: @config.user,
24
+ password: @config.pass,
25
+ open_timeout: 5,
26
+ read_timeout: 30
27
+ )
28
+ end
29
+
30
+ # Delete an annotation
31
+ # @param id [String] an annotation ID
32
+ # @response [true|false] true when successful
33
+ def delete_annotation(id)
34
+ check_id(id)
35
+ begin
36
+ response = @site["/annotations/#{id}"].delete
37
+ # HTTP DELETE response codes: A successful response SHOULD be
38
+ # 200 (OK) if the response includes an entity describing the status,
39
+ # 202 (Accepted) if the action has not yet been enacted, or
40
+ # 204 (No Content) if the action has been enacted but the response
41
+ # does not include an entity.
42
+ [200, 202, 204].include? response.code
43
+ rescue => e
44
+ binding.pry if @config.debug
45
+ @config.logger.error("Failed to DELETE annotation: #{id}, #{e.message}")
46
+ false
47
+ end
48
+ end
49
+
50
+ # POST and open annotation to triannon; the response contains an ID
51
+ # @param oa [JSON-LD] a json-ld object with an open annotation context
52
+ # @return response [RestClient::Response|nil]
53
+ def post_annotation(oa)
54
+ post_data = {
55
+ 'commit' => 'Create Annotation',
56
+ 'annotation' => {'data' => oa}
57
+ }
58
+ response = nil
59
+ tries = 0
60
+ begin
61
+ tries += 1
62
+ # TODO: add Accept content type, somehow?
63
+ response = @site["/annotations/"].post post_data, :content_type => JSONLD_TYPE, :accept => JSONLD_TYPE
64
+ rescue => e
65
+ sleep 1*tries
66
+ retry if tries < 3
67
+ response = e.response
68
+ binding.pry if @config.debug
69
+ @config.logger.error("Failed to POST annotation: #{response.code}: #{response.body}")
70
+ end
71
+ return response
72
+ end
73
+
74
+ # Get annotations
75
+ # @param content_type [String] HTTP mime type (defaults to 'application/ld+json')
76
+ # @response [RDF::Graph] RDF::Graph of open annotations (can be empty on failure)
77
+ def get_annotations(content_type=JSONLD_TYPE)
78
+ check_content_type(content_type)
79
+ begin
80
+ response = @site['/annotations'].get({:accept => content_type})
81
+ # TODO: switch yard for different response.code?
82
+ # TODO: log a failure for a response.code == 404
83
+ response2graph(response)
84
+ rescue => e
85
+ binding.pry if @config.debug
86
+ @config.logger.error("Failed to GET annotations: #{e.message}")
87
+ RDF::Graph.new # return an empty graph
88
+ end
89
+ end
90
+
91
+ # Get an annotation (with a default annotation context)
92
+ # @param id [String] String representation of an annotation ID
93
+ # @param content_type [String] HTTP mime type (defaults to 'application/ld+json')
94
+ # @response [RDF::Graph] RDF::Graph of the annotation (can be empty on failure)
95
+ def get_annotation(id, content_type=JSONLD_TYPE)
96
+ check_id(id)
97
+ check_content_type(content_type)
98
+ uri = "/annotations/#{id}"
99
+ begin
100
+ response = @site[uri].get({:accept => content_type})
101
+ # TODO: switch yard for different response.code?
102
+ response2graph(response)
103
+ rescue => e
104
+ # response = e.response
105
+ binding.pry if @config.debug
106
+ @config.logger.error("Failed to GET annotation: #{id}, #{e.message}")
107
+ RDF::Graph.new # return an empty graph
108
+ end
109
+ end
110
+
111
+ # Get an annotation using a IIIF context
112
+ # @param id [String] String representation of an annotation ID
113
+ # @response [RDF::Graph] RDF::Graph of the annotation (can be empty on failure)
114
+ def get_iiif_annotation(id)
115
+ get_annotation(id, CONTENT_TYPE_IIIF)
116
+ end
117
+
118
+ # Get an annotation using an open annotation context
119
+ # @param id [String] String representation of an annotation ID
120
+ # @response [RDF::Graph] RDF::Graph of the annotation (can be empty on failure)
121
+ def get_oa_annotation(id)
122
+ get_annotation(id, CONTENT_TYPE_OA)
123
+ end
124
+
125
+ # Parse a Triannon response into an RDF::Graph
126
+ # @param response [RestClient::Response] A RestClient::Response from Triannon
127
+ # @response graph [RDF::Graph] An RDF::Graph instance
128
+ def response2graph(response)
129
+ unless response.is_a? RestClient::Response
130
+ raise ArgumentError, 'response must be a RestClient::Response'
131
+ end
132
+ content_type = response.headers[:content_type]
133
+ check_content_type(content_type)
134
+ g = RDF::Graph.new
135
+ begin
136
+ format = RDF::Format.for(:content_type => content_type)
137
+ format.reader.new(response) do |reader|
138
+ reader.each_statement {|s| g << s }
139
+ end
140
+ rescue
141
+ binding.pry if @config.debug
142
+ @config.logger.error("Failed to parse response into RDF::Graph: #{e.message}")
143
+ end
144
+ g
145
+ end
146
+
147
+ # query an annotation graph to extract a URI for the first open annotation
148
+ # @param graph [RDF::Graph] An RDF::Graph of an open annotation
149
+ # @response uri [RDF::URI|nil] A URI for an open annotation
150
+ def annotation_uri(graph)
151
+ raise ArgumentError, 'graph is not an RDF::Graph' unless graph.instance_of? RDF::Graph
152
+ q = [:s, RDF.type, RDF::Vocab::OA.Annotation]
153
+ graph.query(q).collect {|s| s.subject }.first
154
+ end
155
+
156
+ # extract an annotation ID from the URI
157
+ # @param uri [RDF::URI] An RDF::URI for an annotation
158
+ # @response id [String|nil] An ID for an annotation
159
+ def annotation_id(uri)
160
+ raise ArgumentError, 'uri is not an RDF::URI' unless uri.instance_of? RDF::URI
161
+ uri.path.split('/').last
162
+ end
163
+
164
+
165
+ private
166
+
167
+ def check_content_type(content_type)
168
+ type = content_type.split(';').first # strip off any parameters
169
+ raise ArgumentError, CONTENT_ERROR unless CONTENT_TYPES.include? type
170
+ end
171
+
172
+ def check_id(id)
173
+ raise ArgumentError, 'ID must be a String' unless id.instance_of? String
174
+ raise ArgumentError, 'Invalid ID' if id.nil? || id.empty?
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
@@ -0,0 +1,4088 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:3000/annotations/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: commit=Create%20Annotation&annotation[data]=%7B%22%40context%22%3A%22http%3A%2F%2Fiiif.io%2Fapi%2Fpresentation%2F2%2Fcontext.json%22%2C%22%40graph%22%3A%5B%7B%22%40id%22%3A%22_%3Ag70349699654640%22%2C%22%40type%22%3A%5B%22dctypes%3AText%22%2C%22cnt%3AContentAsText%22%5D%2C%22chars%22%3A%22I%20love%20this!%22%2C%22format%22%3A%22text%2Fplain%22%2C%22language%22%3A%22en%22%7D%2C%7B%22%40type%22%3A%22oa%3AAnnotation%22%2C%22motivation%22%3A%22oa%3Acommenting%22%2C%22on%22%3A%22http%3A%2F%2Fpurl.stanford.edu%2Fkq131cs7229%22%2C%22resource%22%3A%22_%3Ag70349699654640%22%7D%5D%7D
9
+ headers:
10
+ Accept:
11
+ - application/ld+json
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Content-Length:
17
+ - '580'
18
+ User-Agent:
19
+ - Ruby
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: 'Created '
24
+ headers:
25
+ X-Frame-Options:
26
+ - SAMEORIGIN
27
+ X-Xss-Protection:
28
+ - 1; mode=block
29
+ X-Content-Type-Options:
30
+ - nosniff
31
+ Content-Type:
32
+ - application/ld+json; charset=utf-8
33
+ Etag:
34
+ - W/"f113b0552ba9dbec937aeba328b64bb1"
35
+ Cache-Control:
36
+ - max-age=0, private, must-revalidate
37
+ X-Request-Id:
38
+ - 11e54218-2a3d-4b0f-8897-942728ada5da
39
+ X-Runtime:
40
+ - '2.558069'
41
+ Server:
42
+ - WEBrick/1.3.1 (Ruby/2.1.5/2014-11-13)
43
+ Date:
44
+ - Tue, 05 May 2015 19:18:18 GMT
45
+ Content-Length:
46
+ - '431'
47
+ Connection:
48
+ - Keep-Alive
49
+ Set-Cookie:
50
+ - _internal_session=dW9OVzkrMjZ2U2FSdWZmbXY3UnFIKzBDanVUTzBqN0JxR0tnOVdRUjExMk9pZEx5Rnp1SCtPYXczczYxaTdBMDR6M2tMTTNhT0VwM251RW9NakNXU1RKd3QzUktETllaRlRUeGxMZmVTc1RBcFNlbEhiT3hvWThUbUFhakZJYU1lbnZyekIrOTBSN2xtYlJUMUozeCthVEs4T3lzT1k1K1pib1pxajUxYTh0TURhb0NMVWN6KzVNejVLOW9BZEVOMDFVZXZRNVNqVDc4aHZ2MG9PMW4ydXhQQ2NPNWZJNk5xc0ZPM3BzYzA5ST0tLXFaOFh6MkJDSWgyZ3o3VzRoN0EvZkE9PQ%3D%3D--d9f7edfc721e0d55f30eea241672fd520c12ef69;
51
+ path=/; HttpOnly
52
+ - request_method=POST; path=/
53
+ body:
54
+ encoding: UTF-8
55
+ string: '{"@context":"http://www.w3.org/ns/oa-context-20130208.json","@graph":[{"@id":"_:g70090571180100","@type":["dctypes:Text","cnt:ContentAsText"],"chars":"I
56
+ love this!","format":"text/plain","language":"en"},{"@id":"http://your.triannon-server.com/annotations/875190ee-1fa4-4298-916b-147d1cbce91f","@type":"oa:Annotation","hasBody":"_:g70090571180100","hasTarget":"http://purl.stanford.edu/kq131cs7229","motivatedBy":"oa:commenting"}]}'
57
+ http_version:
58
+ recorded_at: Tue, 05 May 2015 19:18:18 GMT
59
+ - request:
60
+ method: get
61
+ uri: http://www.w3.org/ns/oa-context-20130208.json
62
+ body:
63
+ encoding: US-ASCII
64
+ string: ''
65
+ headers:
66
+ Accept:
67
+ - application/ld+json, application/json
68
+ Accept-Encoding:
69
+ - gzip, deflate
70
+ User-Agent:
71
+ - Ruby
72
+ response:
73
+ status:
74
+ code: 307
75
+ message: Temporary Redirect
76
+ headers:
77
+ Date:
78
+ - Tue, 05 May 2015 19:18:18 GMT
79
+ Server:
80
+ - Apache/2
81
+ Location:
82
+ - http://www.w3.org/ns/oa.jsonld
83
+ Cache-Control:
84
+ - max-age=21600
85
+ Expires:
86
+ - Wed, 06 May 2015 01:18:18 GMT
87
+ Content-Length:
88
+ - '240'
89
+ Content-Type:
90
+ - text/html; charset=iso-8859-1
91
+ body:
92
+ encoding: UTF-8
93
+ string: |
94
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
95
+ <html><head>
96
+ <title>307 Temporary Redirect</title>
97
+ </head><body>
98
+ <h1>Temporary Redirect</h1>
99
+ <p>The document has moved <a href="http://www.w3.org/ns/oa.jsonld">here</a>.</p>
100
+ </body></html>
101
+ http_version:
102
+ recorded_at: Tue, 05 May 2015 19:18:18 GMT
103
+ - request:
104
+ method: get
105
+ uri: http://www.w3.org/ns/oa.jsonld
106
+ body:
107
+ encoding: US-ASCII
108
+ string: ''
109
+ headers:
110
+ Accept:
111
+ - application/ld+json, application/json
112
+ Accept-Encoding:
113
+ - gzip, deflate
114
+ Cookie:
115
+ - ''
116
+ User-Agent:
117
+ - Ruby
118
+ response:
119
+ status:
120
+ code: 200
121
+ message: OK
122
+ headers:
123
+ Date:
124
+ - Tue, 05 May 2015 19:18:18 GMT
125
+ Server:
126
+ - Apache/2
127
+ Last-Modified:
128
+ - Tue, 06 May 2014 11:14:49 GMT
129
+ Etag:
130
+ - '"b533-4f8b95b2a9c40"'
131
+ Accept-Ranges:
132
+ - bytes
133
+ Content-Length:
134
+ - '46387'
135
+ Cache-Control:
136
+ - max-age=21600
137
+ Expires:
138
+ - Wed, 06 May 2015 01:18:18 GMT
139
+ P3p:
140
+ - policyref="http://www.w3.org/2014/08/p3p.xml"
141
+ Access-Control-Allow-Origin:
142
+ - "*"
143
+ Content-Type:
144
+ - application/ld+json
145
+ body:
146
+ encoding: UTF-8
147
+ string: |+
148
+ {
149
+ "@context": {
150
+ "oa": "http://www.w3.org/ns/oa#",
151
+ "cnt": "http://www.w3.org/2011/content#",
152
+ "dc": "http://purl.org/dc/elements/1.1/",
153
+ "dcterms": "http://purl.org/dc/terms/",
154
+ "dctypes": "http://purl.org/dc/dcmitype/",
155
+ "foaf": "http://xmlns.com/foaf/0.1/",
156
+ "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
157
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
158
+ "skos": "http://www.w3.org/2004/02/skos/core#",
159
+ "owl": "http://www.w3.org/2002/07/owl#",
160
+ "prov": "http://www.w3.org/ns/prov#",
161
+ "trig": "http://www.w3.org/2004/03/trix/rdfg-1/",
162
+ "xsd": "http://www.w3.org/2001/XMLSchema#",
163
+
164
+
165
+ "hasBody" : {"@type":"@id", "@id" : "oa:hasBody"},
166
+ "hasTarget" : {"@type":"@id", "@id" : "oa:hasTarget"},
167
+ "hasSource" : {"@type":"@id", "@id" : "oa:hasSource"},
168
+ "hasSelector" : {"@type":"@id", "@id" : "oa:hasSelector"},
169
+ "hasState" : {"@type":"@id", "@id" : "oa:hasState"},
170
+ "hasScope" : {"@type":"@id", "@id" : "oa:hasScope"},
171
+ "annotatedBy" : {"@type":"@id", "@id" : "oa:annotatedBy"},
172
+ "serializedBy" : {"@type":"@id", "@id" : "oa:serializedBy"},
173
+ "motivatedBy" : {"@type":"@id", "@id" : "oa:motivatedBy"},
174
+ "equivalentTo" : {"@type":"@id", "@id" : "oa:equivalentTo"},
175
+ "styledBy" : {"@type":"@id", "@id" : "oa:styledBy"},
176
+ "cachedSource" : {"@type":"@id", "@id" : "oa:cachedSource"},
177
+ "conformsTo" : {"@type":"@id", "@id" : "dcterms:conformsTo"},
178
+ "default" : {"@type":"@id", "@id" : "oa:default"},
179
+ "item" : {"@type":"@id", "@id" : "oa:item"},
180
+ "first": {"@type":"@id", "@id" : "rdf:first"},
181
+ "rest": {"@type":"@id", "@id" : "rdf:rest", "@container" : "@list"},
182
+
183
+ "annotatedAt" : { "@type": "xsd:dateTimeStamp", "@id": "oa:annotatedAt" },
184
+ "end" : { "@type": "xsd:nonNegativeInteger", "@id": "oa:end" },
185
+ "exact" : "oa:exact",
186
+ "prefix" : "oa:prefix",
187
+ "serializedAt" : { "@type": "xsd:dateTimeStamp", "@id": "oa:serializedAt" },
188
+ "start" : { "@type": "xsd:nonNegativeInteger", "@id": "oa:start" },
189
+ "styleClass" : "oa:styleClass",
190
+ "suffix" : "oa:suffix",
191
+ "when" : { "@type": "xsd:dateTimeStamp", "@id": "oa:when" },
192
+
193
+ "chars" : "cnt:chars",
194
+ "bytes" : "cnt:bytes",
195
+ "format" : "dc:format",
196
+ "language" : "dc:language",
197
+ "value" : "rdf:value",
198
+ "label" : "rdfs:label",
199
+ "name" : "foaf:name",
200
+ "mbox" : "foaf:mbox"
201
+
202
+ },
203
+ "@graph": [
204
+ {
205
+ "@id": "oa:annotatedBy",
206
+ "@type": "owl:ObjectProperty",
207
+ "rdfs:comment": {
208
+ "@language": "en",
209
+ "@value": "The object of the relationship is a resource that identifies the agent responsible for creating the Annotation. This may be either a human or software agent. \n\nThere SHOULD be exactly 1 oa:annotatedBy relationship per Annotation, but MAY be 0 or more than 1, as the Annotation may be anonymous, or multiple agents may have worked together on it.\n\nIt is RECOMMENDED to use these and other FOAF terms to describe agents: foaf:Person, prov:SoftwareAgent, foaf:Organization, foaf:name, foaf:mbox, foaf:openid, foaf:homepage"
210
+ },
211
+ "rdfs:domain": {
212
+ "@id": "oa:Annotation"
213
+ },
214
+ "rdfs:isDefinedBy": {
215
+ "@id": "oa:"
216
+ },
217
+ "rdfs:label": {
218
+ "@language": "en",
219
+ "@value": "annotatedBy"
220
+ },
221
+ "rdfs:subPropertyOf": {
222
+ "@id": "prov:wasAttributedTo"
223
+ }
224
+ },
225
+ {
226
+ "@id": "oa:commenting",
227
+ "@type": [
228
+ "oa:Motivation",
229
+ "owl:NamedIndividual"
230
+ ],
231
+ "rdfs:comment": {
232
+ "@language": "en",
233
+ "@value": "The motivation that represents a commentary about or review of the target resource(s). For example to provide a commentary about a particular PDF."
234
+ },
235
+ "skos:inScheme": {
236
+ "@id": "oa:motivationScheme"
237
+ },
238
+ "skos:prefLabel": {
239
+ "@language": "en",
240
+ "@value": "commenting"
241
+ }
242
+ },
243
+ {
244
+ "@id": "oa:SvgSelector",
245
+ "@type": "owl:Class",
246
+ "rdfs:comment": {
247
+ "@language": "en",
248
+ "@value": "A Selector which selects an area specified as an SVG shape.\n\nThe SVG document should either be retrievable by resolving the URI of this resource, or be included as an Embedded Resource using cnt:Content.\n\nIt is RECOMMENDED that the document contain only a single shape element and that element SHOULD be one of: path, rect, circle, ellipse, polyline, polygon or g. The g element SHOULD ONLY be used to construct a multi-element group, for example to define a donut shape requiring an outer circle and a clipped inner circle.\n\nThe dimensions of both the shape and the SVG canvas MUST be relative to the dimensions of the Source resource. For example, given an image which is 600 pixels by 400 pixels, and the desired section is a circle of 100 pixel radius at the center of the image, then the SVG element would be: <circle cx=\"300\" cy=\"200\" r=\"100\"/>\n\nIt is NOT RECOMMENDED to include style information within the SVG element, nor Javascript, animation, text or other non shape oriented information. Clients SHOULD ignore such information if present."
249
+ },
250
+ "rdfs:isDefinedBy": {
251
+ "@id": "oa:"
252
+ },
253
+ "rdfs:label": {
254
+ "@language": "en",
255
+ "@value": "SvgSelector"
256
+ },
257
+ "rdfs:subClassOf": {
258
+ "@id": "oa:Selector"
259
+ }
260
+ },
261
+ {
262
+ "@id": "oa:Selector",
263
+ "@type": "owl:Class",
264
+ "rdfs:comment": {
265
+ "@language": "en",
266
+ "@value": "A resource which describes the segment of interest in a representation of a Source resource, indicated with oa:hasSelector from the Specific Resource. \n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe nature of the Selector will be dependent on the type of the representation for which the segment is conveyed. The specific type of selector should be indicated using a subclass of oa:Selector.\n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
267
+ },
268
+ "rdfs:isDefinedBy": {
269
+ "@id": "oa:"
270
+ },
271
+ "rdfs:label": {
272
+ "@language": "en",
273
+ "@value": "Selector"
274
+ }
275
+ },
276
+ {
277
+ "@id": "oa:Style",
278
+ "@type": "owl:Class",
279
+ "rdfs:comment": {
280
+ "@language": "en",
281
+ "@value": "A resource which describes the style in which the selection or resource should be rendered, indicated with oa:styledBy from an oa:Annotation.\n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe content of the resource provides the rendering hints about the Annotation's constituent resources. \n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
282
+ },
283
+ "rdfs:isDefinedBy": {
284
+ "@id": "oa:"
285
+ },
286
+ "rdfs:label": {
287
+ "@language": "en",
288
+ "@value": "Style"
289
+ }
290
+ },
291
+ {
292
+ "@id": "oa:exact",
293
+ "@type": "owl:DatatypeProperty",
294
+ "rdfs:comment": {
295
+ "@language": "en",
296
+ "@value": "A copy of the text which is being selected, after normalization.\n\nSee oa:TextQuoteSelector."
297
+ },
298
+ "rdfs:domain": {
299
+ "@id": "oa:Selector"
300
+ },
301
+ "rdfs:isDefinedBy": {
302
+ "@id": "oa:"
303
+ },
304
+ "rdfs:label": {
305
+ "@language": "en",
306
+ "@value": "exact"
307
+ }
308
+ },
309
+ {
310
+ "@id": "oa:hasBody",
311
+ "@type": "owl:ObjectProperty",
312
+ "rdfs:comment": {
313
+ "@language": "en",
314
+ "@value": "The relationship between oa:Annotation and body. The body is somehow \"about\" the oa:hasTarget of the annotation.\n\nThe Body may be of any media type, and contain any type of content. The Body SHOULD be identified by HTTP URIs unless they are embedded within the Annotation.\n\nEmbedded bodies SHOULD be instances of cnt:ContentAsText and embed their content with cnt:chars. They SHOULD declare their media type with dc:format, and MAY indicate their language using dc:language and a RFC-3066 language tag. \n\nThere is no OA class provided for \"Body\" as a body might be a target of a different annotation. However, there SHOULD be 1 or more content-based classes associated with the body resources of an Annotation, and the dctypes: vocabulary is recommended for this purpose, for instance dctypes:Text to declare textual content.\n"
315
+ },
316
+ "rdfs:domain": {
317
+ "@id": "oa:Annotation"
318
+ },
319
+ "rdfs:isDefinedBy": {
320
+ "@id": "oa:"
321
+ },
322
+ "rdfs:label": {
323
+ "@language": "en",
324
+ "@value": "hasBody"
325
+ }
326
+ },
327
+ {
328
+ "@id": "oa:Choice",
329
+ "@type": "owl:Class",
330
+ "rdfs:comment": {
331
+ "@language": "en",
332
+ "@value": "A multiplicity construct that conveys to a consuming application that it should select one of the constituent resources to display to the user, and not render/use all of them. \n\noa:Choice can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 1 or more oa:item relationships for each oa:Choice.\n\nThere SHOULD be exactly 1 default relationship for each Choice."
333
+ },
334
+ "rdfs:isDefinedBy": {
335
+ "@id": "oa:"
336
+ },
337
+ "rdfs:label": {
338
+ "@language": "en",
339
+ "@value": "Choice"
340
+ },
341
+ "rdfs:subClassOf": {
342
+ "@id": "rdf:Alt"
343
+ }
344
+ },
345
+ {
346
+ "@id": "oa:when",
347
+ "@type": "owl:DatatypeProperty",
348
+ "rdfs:comment": {
349
+ "@language": "en",
350
+ "@value": "The timestamp at which the Source resource should be interpreted for the Annotation, typically the time that the Annotation was created."
351
+ },
352
+ "rdfs:domain": {
353
+ "@id": "oa:TimeState"
354
+ },
355
+ "rdfs:isDefinedBy": {
356
+ "@id": "oa:"
357
+ },
358
+ "rdfs:label": {
359
+ "@language": "en",
360
+ "@value": "when"
361
+ },
362
+ "rdfs:range": {
363
+ "@id": "xsd:dateTimeStamp"
364
+ }
365
+ },
366
+ {
367
+ "@id": "oa:serializedBy",
368
+ "@type": "owl:ObjectProperty",
369
+ "rdfs:comment": {
370
+ "@language": "en",
371
+ "@value": "The object of the relationship is the agent, likely software, responsible for generating the serialization of the Annotation's serialization. \n\nIt is RECOMMENDED to use these and other FOAF terms to describe agents: foaf:Person, prov:SoftwareAgent, foaf:Organization, foaf:name, foaf:mbox, foaf:openid, foaf:homepage\n\nThere MAY be 0 or more oa:serializedBy relationships per Annotation."
372
+ },
373
+ "rdfs:domain": {
374
+ "@id": "oa:Annotation"
375
+ },
376
+ "rdfs:isDefinedBy": {
377
+ "@id": "oa:"
378
+ },
379
+ "rdfs:label": {
380
+ "@language": "en",
381
+ "@value": "serializedBy"
382
+ },
383
+ "rdfs:subPropertyOf": {
384
+ "@id": "prov:wasAttributedTo"
385
+ }
386
+ },
387
+ {
388
+ "@id": "oa:motivatedBy",
389
+ "@type": "owl:ObjectProperty",
390
+ "rdfs:comment": {
391
+ "@language": "en",
392
+ "@value": "The relationship between an Annotation and a Motivation, indicating the reasons why the Annotation was created.\n\nEach Annotation SHOULD have at least one oa:motivatedBy relationship, and MAY be more than 1."
393
+ },
394
+ "rdfs:domain": {
395
+ "@id": "oa:Annotation"
396
+ },
397
+ "rdfs:isDefinedBy": {
398
+ "@id": "oa:"
399
+ },
400
+ "rdfs:label": {
401
+ "@language": "en",
402
+ "@value": "motivatedBy"
403
+ },
404
+ "rdfs:range": {
405
+ "@id": "oa:Motivation"
406
+ }
407
+ },
408
+ {
409
+ "@id": "oa:moderating",
410
+ "@type": [
411
+ "oa:Motivation",
412
+ "owl:NamedIndividual"
413
+ ],
414
+ "rdfs:comment": {
415
+ "@language": "en",
416
+ "@value": "The motivation that represents an assignment of value or quality to the target resource(s). For example annotating an Annotation to moderate it up in a trust network or threaded discussion."
417
+ },
418
+ "skos:inScheme": {
419
+ "@id": "oa:motivationScheme"
420
+ },
421
+ "skos:prefLabel": {
422
+ "@language": "en",
423
+ "@value": "moderating"
424
+ }
425
+ },
426
+ {
427
+ "@id": "oa:highlighting",
428
+ "@type": [
429
+ "oa:Motivation",
430
+ "owl:NamedIndividual"
431
+ ],
432
+ "rdfs:comment": {
433
+ "@language": "en",
434
+ "@value": "The motivation that represents a highlighted section of the target resource or segment. For example to draw attention to the selected text that the annotator disagrees with. A Highlight may or may not have a Body resource"
435
+ },
436
+ "skos:inScheme": {
437
+ "@id": "oa:motivationScheme"
438
+ },
439
+ "skos:prefLabel": {
440
+ "@language": "en",
441
+ "@value": "highlighting"
442
+ }
443
+ },
444
+ {
445
+ "@id": "oa:styledBy",
446
+ "@type": "owl:ObjectProperty",
447
+ "rdfs:comment": {
448
+ "@language": "en",
449
+ "@value": "The relationship between a oa:Annotation and a oa:Style.\n\nThere MAY be 0 or 1 styledBy relationships for each Annotation.\n\nIf there are multiple Style resources that must be associated with the Annotation, then the use of the Multiplicity Constructs oa:Choice, oa:Composite or oa:List is RECOMMENDED."
450
+ },
451
+ "rdfs:domain": {
452
+ "@id": "oa:Annotation"
453
+ },
454
+ "rdfs:isDefinedBy": {
455
+ "@id": "oa:"
456
+ },
457
+ "rdfs:label": {
458
+ "@language": "en",
459
+ "@value": "styledBy"
460
+ },
461
+ "rdfs:range": {
462
+ "@id": "oa:Style"
463
+ }
464
+ },
465
+ {
466
+ "@id": "oa:FragmentSelector",
467
+ "@type": "owl:Class",
468
+ "rdfs:comment": {
469
+ "@language": "en",
470
+ "@value": "A Selector which describes the segment of interest in a representation, through the use of the fragment identifier component of a URI.\n\nIt is RECOMMENDED to use oa:FragmentSelector as the selector on a Specific Resource rather than annotating the fragment URI directly, in order to improve discoverability of annotation on the Source.\n\nThe oa:FragmentSelector MUST have exactly 1 rdf:value property, containing the fragment identifier component of a URI that describes the segment of interest in the resource, excluding the initial \"#\".\n\nThe Fragment Selector SHOULD have a dcterms:conformsTo relationship with the object being the specification that defines the syntax of the fragment, for instance <http://tools.ietf.org/rfc/rfc3236> for HTML fragments. "
471
+ },
472
+ "rdfs:isDefinedBy": {
473
+ "@id": "oa:"
474
+ },
475
+ "rdfs:label": {
476
+ "@language": "en",
477
+ "@value": "FragmentSelector"
478
+ },
479
+ "rdfs:subClassOf": {
480
+ "@id": "oa:Selector"
481
+ }
482
+ },
483
+ {
484
+ "@id": "oa:SpecificResource",
485
+ "@type": "owl:Class",
486
+ "rdfs:comment": {
487
+ "@language": "en",
488
+ "@value": "A resource identifies part of another Source resource, a particular representation of a resource, a resource with styling hints for renders, or any combination of these. \n\nThe Specific Resource takes the role of oa:hasBody or oa:hasTarget in an oa:Annotation instead of the Source resource.\n\nThere MUST be exactly 1 oa:hasSource relationship associated with a Specific Resource.\n\nThere MUST be exactly 0 or 1 oa:hasSelector relationship associated with a Specific Resource.\n\nThere MAY be 0 or 1 oa:hasState relationship for each Specific Resource.\n\nIf the Specific Resource has an HTTP URI, then the exact segment of the Source resource that it identifies, and only the segment, MUST be returned when the URI is dereferenced. For example, if the segment of interest is a region of an image and the Specific Resource has an HTTP URI, then dereferencing it MUST return the selected region of the image as it was at the time when the annotation was created. Typically this would be a burden to support, and thus the Specific Resource SHOULD be identified by a globally unique URI, such as a UUID URN. If it is not considered important to allow other Annotations or systems to refer to the Specific Resource, then a blank node MAY be used instead."
489
+ },
490
+ "rdfs:isDefinedBy": {
491
+ "@id": "oa:"
492
+ },
493
+ "rdfs:label": {
494
+ "@language": "en",
495
+ "@value": "SpecificResource"
496
+ }
497
+ },
498
+ {
499
+ "@id": "oa:annotatedAt",
500
+ "@type": "owl:DatatypeProperty",
501
+ "rdfs:comment": {
502
+ "@language": "en",
503
+ "@value": "The time at which the Annotation was created. \n\nThere SHOULD be exactly 1 oa:annotatedAt property per Annotation, and MUST NOT be more than 1. The datetime MUST be expressed in the xsd:dateTime format, and SHOULD have a timezone specified."
504
+ },
505
+ "rdfs:domain": {
506
+ "@id": "oa:Annotation"
507
+ },
508
+ "rdfs:isDefinedBy": {
509
+ "@id": "oa:"
510
+ },
511
+ "rdfs:label": {
512
+ "@language": "en",
513
+ "@value": "annotatedAt"
514
+ },
515
+ "rdfs:range": {
516
+ "@id": "xsd:dateTimeStamp"
517
+ }
518
+ },
519
+ {
520
+ "@id": "oa:editing",
521
+ "@type": [
522
+ "oa:Motivation",
523
+ "owl:NamedIndividual"
524
+ ],
525
+ "rdfs:comment": {
526
+ "@language": "en",
527
+ "@value": "The motivation that represents a request for a modification or edit to the target resource. For example, an Annotation that requests a typo to be corrected."
528
+ },
529
+ "skos:inScheme": {
530
+ "@id": "oa:motivationScheme"
531
+ },
532
+ "skos:prefLabel": {
533
+ "@language": "en",
534
+ "@value": "editing"
535
+ }
536
+ },
537
+ {
538
+ "@id": "oa:Annotation",
539
+ "@type": "owl:Class",
540
+ "rdfs:comment": {
541
+ "@language": "en",
542
+ "@value": "Typically an Annotation has a single Body (oa:hasBody), which is the comment or other descriptive resource, and a single Target (oa:hasTarget) that the Body is somehow \"about\". The Body provides the information which is annotating the Target. \n\nThis \"aboutness\" may be further clarified or extended to notions such as classifying or identifying with oa:motivatedBy."
543
+ },
544
+ "rdfs:isDefinedBy": {
545
+ "@id": "oa:"
546
+ },
547
+ "rdfs:label": {
548
+ "@language": "en",
549
+ "@value": "Annotation"
550
+ }
551
+ },
552
+ {
553
+ "@id": "oa:equivalentTo",
554
+ "@type": "owl:ObjectProperty",
555
+ "rdfs:comment": {
556
+ "@language": "en",
557
+ "@value": "The subject and object resources of the oa:equivalentTo relationship represent the same resource, but potentially have different metadata such as oa:serializedBy, oa:serializedAt and serialization format. oa:equivalentTo is a symmetrical and transitive relationship; if A oa:equivalentTo B, then it is also true that B oa:equivalent A; and that if B oa:equivalentTo C, then it is also true that A oa:equivalentTo C. \n\nThe Annotation MAY include 0 or more instances of the oa:equivalentTo relationship between copies of the Annotation or other resources, and SHOULD include as many as are available.\n\nIf a system publishes an embedded resource (a cnt:Content) at a new HTTP URI, then it SHOULD express the oa:equivalentTo relationship between the resource's URN and the new URI from which it is available."
558
+ },
559
+ "rdfs:isDefinedBy": {
560
+ "@id": "oa:"
561
+ },
562
+ "rdfs:label": {
563
+ "@language": "en",
564
+ "@value": "equivalentTo"
565
+ },
566
+ "rdfs:subPropertyOf": {
567
+ "@id": "prov:alternateOf"
568
+ }
569
+ },
570
+ {
571
+ "@id": "oa:Motivation",
572
+ "@type": "owl:Class",
573
+ "rdfs:comment": {
574
+ "@language": "en",
575
+ "@value": "The Motivation for creating an Annotation, indicated with oa:motivatedBy, is a reason for its creation, and might include things like oa:replying to another annotation, oa:commenting on a resource, or oa:linking to a related resource.\n\nEach Annotation SHOULD have at least one oa:motivatedBy relationship to an instance of oa:Motivation, which is a subClass of skos:Concept."
576
+ },
577
+ "rdfs:isDefinedBy": {
578
+ "@id": "oa:"
579
+ },
580
+ "rdfs:label": {
581
+ "@language": "en",
582
+ "@value": "Motivation"
583
+ },
584
+ "rdfs:subClassOf": {
585
+ "@id": "skos:Concept"
586
+ }
587
+ },
588
+ {
589
+ "@id": "oa:tagging",
590
+ "@type": [
591
+ "oa:Motivation",
592
+ "owl:NamedIndividual"
593
+ ],
594
+ "rdfs:comment": {
595
+ "@language": "en",
596
+ "@value": "The motivation that represents adding a Tag on the target resource(s). One or more of the bodies of the annotation should be typed as a oa:Tag or oa:SemanticTag."
597
+ },
598
+ "skos:inScheme": {
599
+ "@id": "oa:motivationScheme"
600
+ },
601
+ "skos:prefLabel": {
602
+ "@language": "en",
603
+ "@value": "tagging"
604
+ }
605
+ },
606
+ {
607
+ "@id": "oa:List",
608
+ "@type": "owl:Class",
609
+ "rdfs:comment": {
610
+ "@language": "en",
611
+ "@value": "A multiplicity construct that conveys to a consuming application that all of the constituent resources are required for the Annotation to be correctly interpreted, and in a particular order. \n\noa:List can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 2 or more oa:item relationships for each oa:List, with their order defined using the rdf:List construct of rdf:first/rdf:rest/rdf:nil.\n\nAll the elements of the list should also be declared using oa:item, and each of the oa:items should appear at least once in the list."
612
+ },
613
+ "rdfs:isDefinedBy": {
614
+ "@id": "oa:"
615
+ },
616
+ "rdfs:label": {
617
+ "@language": "en",
618
+ "@value": "List"
619
+ },
620
+ "rdfs:subClassOf": {
621
+ "@id": "oa:Composite"
622
+ }
623
+ },
624
+ {
625
+ "@id": "oa:TextQuoteSelector",
626
+ "@type": "owl:Class",
627
+ "rdfs:comment": {
628
+ "@language": "en",
629
+ "@value": "A Selector that describes a textual segment by means of quoting it, plus passages before or after it.\n\nFor example, if the document were \"abcdefghijklmnopqrstuvwxyz\", one could select \"efg\" by a oa:prefix of \"abcd\", the quotation of oa:exact \"efg\" and a oa:suffix of \"hijk\".\n\nThe text MUST be normalized before recording.\n\nEach TextQuoteSelector MUST have exactly 1 oa:exact property.\n\nEach TextQuoteSelector SHOULD have exactly 1 oa:prefix property, and MUST NOT have more than 1.\n\nEach TextQuoteSelector SHOULD have exactly 1 oa:suffix property, and MUST NOT have more than 1."
630
+ },
631
+ "rdfs:isDefinedBy": {
632
+ "@id": "oa:"
633
+ },
634
+ "rdfs:label": {
635
+ "@language": "en",
636
+ "@value": "TextQuoteSelector"
637
+ },
638
+ "rdfs:subClassOf": {
639
+ "@id": "oa:Selector"
640
+ }
641
+ },
642
+ {
643
+ "@id": "oa:cachedSource",
644
+ "@type": "owl:ObjectProperty",
645
+ "rdfs:comment": {
646
+ "@language": "en",
647
+ "@value": "A link to a copy of the Source resource's representation appropriate for the Annotation, typically a copy of the original at the time that the Annotation was created"
648
+ },
649
+ "rdfs:domain": {
650
+ "@id": "oa:TimeState"
651
+ },
652
+ "rdfs:isDefinedBy": {
653
+ "@id": "oa:"
654
+ },
655
+ "rdfs:label": {
656
+ "@language": "en",
657
+ "@value": "cachedSource"
658
+ }
659
+ },
660
+ {
661
+ "@id": "oa:bookmarking",
662
+ "@type": [
663
+ "oa:Motivation",
664
+ "owl:NamedIndividual"
665
+ ],
666
+ "rdfs:comment": {
667
+ "@language": "en",
668
+ "@value": "The motivation that represents the creation of a bookmark to the target resources or recorded point or points within one or more resources. For example, an Annotation that bookmarks the point in a text where the reader finished reading. Bookmark Annotations may or may not have a Body resource."
669
+ },
670
+ "skos:inScheme": {
671
+ "@id": "oa:motivationScheme"
672
+ },
673
+ "skos:prefLabel": {
674
+ "@language": "en",
675
+ "@value": "bookmarking"
676
+ }
677
+ },
678
+ {
679
+ "@id": "oa:SemanticTag",
680
+ "@type": "owl:Class",
681
+ "rdfs:comment": {
682
+ "@language": "en",
683
+ "@value": "A class assigned to the Body when it is a semantic tagging resource; a URI that identifies a concept, rather than an embedded string, frequently a term from a controlled vocabulary.\n\nIt is NOT RECOMMENDED to use the URI of a document as a Semantic Tag, as it might also be used as a regular Body in other Annotations which would inherit the oa:SemanticTag class assignment. Instead it is more appropriate to create a new URI and link it to the document, using the foaf:page predicate."
684
+ },
685
+ "rdfs:isDefinedBy": {
686
+ "@id": "oa:"
687
+ },
688
+ "rdfs:label": {
689
+ "@language": "en",
690
+ "@value": "SemanticTag"
691
+ },
692
+ "rdfs:subClassOf": {
693
+ "@id": "oa:Tag"
694
+ }
695
+ },
696
+ {
697
+ "@id": "oa:hasSource",
698
+ "@type": "owl:ObjectProperty",
699
+ "rdfs:comment": {
700
+ "@language": "en",
701
+ "@value": "The relationship between a oa:SpecificResource and the resource that it is a more specific representation of. \n\nThere MUST be exactly 1 oa:hasSource relationship associated with a Specific Resource."
702
+ },
703
+ "rdfs:domain": {
704
+ "@id": "oa:SpecificResource"
705
+ },
706
+ "rdfs:isDefinedBy": {
707
+ "@id": "oa:"
708
+ },
709
+ "rdfs:label": {
710
+ "@language": "en",
711
+ "@value": "hasSource"
712
+ }
713
+ },
714
+ {
715
+ "@id": "oa:default",
716
+ "@type": "owl:ObjectProperty",
717
+ "rdfs:comment": {
718
+ "@language": "en",
719
+ "@value": "The constituent resource of a oa:Choice to use as a default option, if there is no other means to determine which would be most appropriate.\n\nThere SHOULD be exactly 1 default relationship for each Choice."
720
+ },
721
+ "rdfs:domain": {
722
+ "@id": "oa:Choice"
723
+ },
724
+ "rdfs:isDefinedBy": {
725
+ "@id": "oa:"
726
+ },
727
+ "rdfs:label": {
728
+ "@language": "en",
729
+ "@value": "default"
730
+ },
731
+ "rdfs:subPropertyOf": {
732
+ "@id": "oa:item"
733
+ }
734
+ },
735
+ {
736
+ "@id": "oa:hasSelector",
737
+ "@type": "owl:ObjectProperty",
738
+ "rdfs:comment": {
739
+ "@language": "en",
740
+ "@value": "The relationship between a oa:SpecificResource and a oa:Selector.\n\nThere MUST be exactly 0 or 1 oa:hasSelector relationship associated with a \nSpecific Resource. \n\nIf multiple Selectors are required, either to express a choice between different optional, equivalent selectors, or a chain of selectors that should all be processed, it is necessary to use oa:Choice, oa:Composite or oa:List as a selector."
741
+ },
742
+ "rdfs:domain": {
743
+ "@id": "oa:SpecificResource"
744
+ },
745
+ "rdfs:isDefinedBy": {
746
+ "@id": "oa:"
747
+ },
748
+ "rdfs:label": {
749
+ "@language": "en",
750
+ "@value": "hasSelector"
751
+ },
752
+ "rdfs:range": {
753
+ "@id": "oa:Selector"
754
+ }
755
+ },
756
+ {
757
+ "@id": "oa:hasTarget",
758
+ "@type": "owl:ObjectProperty",
759
+ "rdfs:comment": {
760
+ "@language": "en",
761
+ "@value": "The relationship between oa:Annotation and target. The target resource is what the oa:hasBody is somewhat \"about\".\n\nThe target may be of any media type, and contain any type of content. The target SHOULD be identified by HTTP URIs unless they are embedded within the Annotation.\n\nEmbedded targets SHOULD be instances of cnt:ContentAsText and embed their content with cnt:chars. They SHOULD declare their media type with dc:format, and MAY indicate their language using dc:language and a RFC-3066 language tag. \n\nThere is no OA class provided for \"Target\" as a target might be a body in a different annotation. However, there SHOULD be 1 or more content-based classes associated with the target resources of an Annotation, and the dctypes: vocabulary is recommended for this purpose, for instance dctypes:Text to declare textual content."
762
+ },
763
+ "rdfs:domain": {
764
+ "@id": "oa:Annotation"
765
+ },
766
+ "rdfs:isDefinedBy": {
767
+ "@id": "oa:"
768
+ },
769
+ "rdfs:label": {
770
+ "@language": "en",
771
+ "@value": "hasTarget"
772
+ }
773
+ },
774
+ {
775
+ "@id": "oa:TextPositionSelector",
776
+ "@type": "owl:Class",
777
+ "rdfs:comment": {
778
+ "@language": "en",
779
+ "@value": "An oa:Selector which describes a range of text based on its start and end positions.\n\nThe text MUST be normalized before counting characters. For a Selector that works from the bitstream rather than the rendered characters, see oa:DataPositionSelector.\n\nEach oa:TextPositionSelector MUST have exactly 1 oa:start property.\n\nEach oa:TextPositionSelector MUST have exactly 1 oa:end property."
780
+ },
781
+ "rdfs:isDefinedBy": {
782
+ "@id": "oa:"
783
+ },
784
+ "rdfs:label": {
785
+ "@language": "en",
786
+ "@value": "TextPositionSelector"
787
+ },
788
+ "rdfs:subClassOf": {
789
+ "@id": "oa:Selector"
790
+ }
791
+ },
792
+ {
793
+ "@id": "oa:serializedAt",
794
+ "@type": "owl:DatatypeProperty",
795
+ "rdfs:comment": {
796
+ "@language": "en",
797
+ "@value": "The time at which the agent referenced by oa:serializedBy generated the first serialization of the Annotation, and any subsequent substantially different one. The annotation graph MUST have changed for this property to be updated, and as such represents the last modified datestamp for the Annotation. This might be used to determine if it should be re-imported into a triplestore when discovered. \n\nThere MAY be exactly 1 oa:serializedAt property per Annotation, and MUST NOT be more than 1. The datetime MUST be expressed in the xsd:dateTime format, and SHOULD have a timezone specified.\n"
798
+ },
799
+ "rdfs:domain": {
800
+ "@id": "oa:Annotation"
801
+ },
802
+ "rdfs:isDefinedBy": {
803
+ "@id": "oa:"
804
+ },
805
+ "rdfs:label": {
806
+ "@language": "en",
807
+ "@value": "serializedAt"
808
+ },
809
+ "rdfs:range": {
810
+ "@id": "xsd:dateTimeStamp"
811
+ }
812
+ },
813
+ {
814
+ "@id": "oa:Composite",
815
+ "@type": "owl:Class",
816
+ "rdfs:comment": {
817
+ "@language": "en",
818
+ "@value": "A multiplicity construct that conveys to a consuming application that all of the constituent resources are required for the Annotation to be correctly interpreted. \n\noa:Composite can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 2 or more oa:item relationships for each oa:Composite."
819
+ },
820
+ "rdfs:isDefinedBy": {
821
+ "@id": "oa:"
822
+ },
823
+ "rdfs:label": "Composite",
824
+ "rdfs:subClassOf": {
825
+ "@id": "rdf:Bag"
826
+ }
827
+ },
828
+ {
829
+ "@id": "oa:classifying",
830
+ "@type": [
831
+ "oa:Motivation",
832
+ "owl:NamedIndividual"
833
+ ],
834
+ "rdfs:comment": {
835
+ "@language": "en",
836
+ "@value": "The motivation that represents the assignment of a classification type, typically from a controlled vocabulary, to the target resource(s). For example to classify an Image resource as a Portrait."
837
+ },
838
+ "skos:inScheme": {
839
+ "@id": "oa:motivationScheme"
840
+ },
841
+ "skos:prefLabel": {
842
+ "@language": "en",
843
+ "@value": "classifying"
844
+ }
845
+ },
846
+ {
847
+ "@id": "oa:identifying",
848
+ "@type": [
849
+ "oa:Motivation",
850
+ "owl:NamedIndividual"
851
+ ],
852
+ "rdfs:comment": {
853
+ "@language": "en",
854
+ "@value": "The motivation that represents the assignment of an identity to the target resource(s). For example, annotating the name of a city in a string of text with the URI that identifies it."
855
+ },
856
+ "skos:inScheme": {
857
+ "@id": "oa:motivationScheme"
858
+ },
859
+ "skos:prefLabel": {
860
+ "@language": "en",
861
+ "@value": "identifying"
862
+ }
863
+ },
864
+ {
865
+ "@id": "oa:HttpRequestState",
866
+ "@type": "owl:Class",
867
+ "rdfs:comment": {
868
+ "@language": "en",
869
+ "@value": "A resource which describes how to retrieve an appropriate representation of the Source resource for the Annotation, based on the HTTP Request headers to send to the server.\n\nThere MUST be exactly 1 rdf:value property per HttpRequestState, containing HTTP request headers as a single, complete string, exactly as they would appear in an HTTP request. "
870
+ },
871
+ "rdfs:isDefinedBy": {
872
+ "@id": "oa:"
873
+ },
874
+ "rdfs:label": {
875
+ "@language": "en",
876
+ "@value": "HttpRequestState"
877
+ },
878
+ "rdfs:subClassOf": {
879
+ "@id": "oa:State"
880
+ }
881
+ },
882
+ {
883
+ "@id": "oa:DataPositionSelector",
884
+ "@type": "owl:Class",
885
+ "rdfs:comment": {
886
+ "@language": "en",
887
+ "@value": "A Selector which describes a range of data based on its start and end positions within the byte stream of the representation.\n\nEach DataPositionSelector MUST have exactly 1 oa:start property.\n\nEach TextPositionSelector MUST have exactly 1 oa:end property.\n\nSee oa:TextPositionSelector for selection at normalized character level rather than bytestream level."
888
+ },
889
+ "rdfs:isDefinedBy": {
890
+ "@id": "oa:"
891
+ },
892
+ "rdfs:label": {
893
+ "@language": "en",
894
+ "@value": "DataPositionSelector"
895
+ },
896
+ "rdfs:subClassOf": {
897
+ "@id": "oa:Selector"
898
+ }
899
+ },
900
+ {
901
+ "@id": "oa:linking",
902
+ "@type": [
903
+ "oa:Motivation",
904
+ "owl:NamedIndividual"
905
+ ],
906
+ "rdfs:comment": {
907
+ "@language": "en",
908
+ "@value": "The motivation that represents an untyped link to a resource related to the target."
909
+ },
910
+ "skos:inScheme": {
911
+ "@id": "oa:motivationScheme"
912
+ },
913
+ "skos:prefLabel": {
914
+ "@language": "en",
915
+ "@value": "linking"
916
+ }
917
+ },
918
+ {
919
+ "@id": "oa:motivationScheme",
920
+ "@type": [
921
+ "skos:ConceptScheme",
922
+ "owl:NamedIndividual"
923
+ ],
924
+ "rdfs:comment": {
925
+ "@language": "en",
926
+ "@value": "The concept scheme for Open Annotation Motivations"
927
+ },
928
+ "rdfs:label": {
929
+ "@language": "en",
930
+ "@value": "motivationScheme"
931
+ }
932
+ },
933
+ {
934
+ "@id": "oa:replying",
935
+ "@type": [
936
+ "oa:Motivation",
937
+ "owl:NamedIndividual"
938
+ ],
939
+ "rdfs:comment": {
940
+ "@language": "en",
941
+ "@value": "The motivation that represents a reply to a previous statement, either an Annotation or another resource. For example providing the assistance requested in the above."
942
+ },
943
+ "skos:inScheme": {
944
+ "@id": "oa:motivationScheme"
945
+ },
946
+ "skos:prefLabel": {
947
+ "@language": "en",
948
+ "@value": "replying"
949
+ }
950
+ },
951
+ {
952
+ "@id": "oa:start",
953
+ "@type": "owl:DatatypeProperty",
954
+ "rdfs:comment": {
955
+ "@language": "en",
956
+ "@value": "The starting position of the segment of text or bytes. The first character/byte in the full text/stream is position 0. The character/byte indicated at position oa:start is included within the selected segment. \n\nSee oa:DataPositionSelector and oa:TextPositionSelector."
957
+ },
958
+ "rdfs:domain": {
959
+ "@id": "oa:Selector"
960
+ },
961
+ "rdfs:isDefinedBy": {
962
+ "@id": "oa:"
963
+ },
964
+ "rdfs:label": {
965
+ "@language": "en",
966
+ "@value": "start"
967
+ },
968
+ "rdfs:range": {
969
+ "@id": "xsd:nonNegativeInteger"
970
+ }
971
+ },
972
+ {
973
+ "@id": "oa:end",
974
+ "@type": "owl:DatatypeProperty",
975
+ "rdfs:comment": {
976
+ "@language": "en",
977
+ "@value": "The end position of the segment of text or bytes. The first character/byte in the full text/stream is position 0. The character/byte indicated at position oa:end is NOT included within the selected segment. \n\nSee oa:DataPositionSelector and oa:oa:TextPositionSelector."
978
+ },
979
+ "rdfs:domain": {
980
+ "@id": "oa:Selector"
981
+ },
982
+ "rdfs:isDefinedBy": {
983
+ "@id": "oa:"
984
+ },
985
+ "rdfs:label": {
986
+ "@language": "en",
987
+ "@value": "end"
988
+ },
989
+ "rdfs:range": {
990
+ "@id": "xsd:nonNegativeInteger"
991
+ }
992
+ },
993
+ {
994
+ "@id": "oa:TimeState",
995
+ "@type": "owl:Class",
996
+ "rdfs:comment": {
997
+ "@language": "en",
998
+ "@value": "A resource which describes how to retrieve a representation of the Source resource that is temporally appropriate for the Annotation.\n\nThere MUST be at least one of oa:cachedSource or oa:when specified. If there is more than 1, each gives an alternative copy of the representation."
999
+ },
1000
+ "rdfs:isDefinedBy": {
1001
+ "@id": "oa:"
1002
+ },
1003
+ "rdfs:label": {
1004
+ "@language": "en",
1005
+ "@value": "TimeState"
1006
+ },
1007
+ "rdfs:subClassOf": {
1008
+ "@id": "oa:State"
1009
+ }
1010
+ },
1011
+ {
1012
+ "@id": "oa:State",
1013
+ "@type": "owl:Class",
1014
+ "rdfs:comment": {
1015
+ "@language": "en",
1016
+ "@value": "A resource which describes how to retrieve an appropriate representation of the Source resource, indicated with oa:hasState from the Specific Resource.\n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
1017
+ },
1018
+ "rdfs:isDefinedBy": {
1019
+ "@id": "oa:"
1020
+ },
1021
+ "rdfs:label": {
1022
+ "@language": "en",
1023
+ "@value": "State"
1024
+ }
1025
+ },
1026
+ {
1027
+ "@id": "oa:CssStyle",
1028
+ "@type": "owl:Class",
1029
+ "rdfs:comment": {
1030
+ "@language": "en",
1031
+ "@value": "A resource which describes styles for resources participating in the Annotation using CSS.\n\nSpecific Resources MAY be assigned a CSS style class using oa:styleClass.\n\nThe CSS resource MAY have its own dereferencable URI that provides the information. For example, \"Style1\" in the diagram below might actually have the URI \"http://www.example.com/styles/annotations.css\". It MAY be embedded within the Annotation using the inline constructions described in Embedding Resources."
1032
+ },
1033
+ "rdfs:isDefinedBy": {
1034
+ "@id": "oa:"
1035
+ },
1036
+ "rdfs:label": {
1037
+ "@language": "en",
1038
+ "@value": "CssStyle"
1039
+ },
1040
+ "rdfs:subClassOf": {
1041
+ "@id": "oa:Style"
1042
+ }
1043
+ },
1044
+ {
1045
+ "@id": "oa:item",
1046
+ "@type": "owl:ObjectProperty",
1047
+ "rdfs:comment": {
1048
+ "@language": "en",
1049
+ "@value": "The relationship between a multiplicity construct node and its constituent resources.\n\nThere MUST be 1 or more item relationships for each multiplicity construct oa:Choice, oa:Composite and oa:List."
1050
+ },
1051
+ "rdfs:isDefinedBy": {
1052
+ "@id": "oa:"
1053
+ },
1054
+ "rdfs:label": {
1055
+ "@language": "en",
1056
+ "@value": "item"
1057
+ },
1058
+ "rdfs:subPropertyOf": {
1059
+ "@id": "rdfs:member"
1060
+ }
1061
+ },
1062
+ {
1063
+ "@id": "oa:hasScope",
1064
+ "@type": "owl:ObjectProperty",
1065
+ "rdfs:comment": {
1066
+ "@language": "en",
1067
+ "@value": "The relationship between a Specific Resource and the resource that provides the scope or context for it in this Annotation.\n\nThere MAY be 0 or more hasScope relationships for each Specific Resource."
1068
+ },
1069
+ "rdfs:domain": {
1070
+ "@id": "oa:SpecificResource"
1071
+ },
1072
+ "rdfs:isDefinedBy": {
1073
+ "@id": "oa:"
1074
+ },
1075
+ "rdfs:label": {
1076
+ "@language": "en",
1077
+ "@value": "hasScope"
1078
+ }
1079
+ },
1080
+ {
1081
+ "@id": "oa:suffix",
1082
+ "@type": "owl:DatatypeProperty",
1083
+ "rdfs:comment": {
1084
+ "@language": "en",
1085
+ "@value": "The snippet of text that occurs immediately after the text which is being selected. \n\nSee oa:TextQuoteSelector."
1086
+ },
1087
+ "rdfs:domain": {
1088
+ "@id": "oa:Selector"
1089
+ },
1090
+ "rdfs:isDefinedBy": {
1091
+ "@id": "oa:"
1092
+ },
1093
+ "rdfs:label": {
1094
+ "@language": "en",
1095
+ "@value": "suffix"
1096
+ }
1097
+ },
1098
+ {
1099
+ "@id": "oa:hasState",
1100
+ "@type": "owl:ObjectProperty",
1101
+ "rdfs:comment": {
1102
+ "@language": "en",
1103
+ "@value": "The relationship between a oa:SpecificResource and a oa:State resource.\n\nThere MAY be 0 or 1 oa:hasState relationship for each SpecificResource.\n\nIf there are multiple State resources that must be associated with the specific resource, then the use of the Multiplicity Constructs oa:Choice, oa:Composite or oa:List is RECOMMENDED."
1104
+ },
1105
+ "rdfs:domain": {
1106
+ "@id": "oa:SpecificResource"
1107
+ },
1108
+ "rdfs:isDefinedBy": {
1109
+ "@id": "oa:"
1110
+ },
1111
+ "rdfs:label": {
1112
+ "@language": "en",
1113
+ "@value": "hasState"
1114
+ },
1115
+ "rdfs:range": {
1116
+ "@id": "oa:State"
1117
+ }
1118
+ },
1119
+ {
1120
+ "@id": "oa:",
1121
+ "@type": "owl:Ontology",
1122
+ "dc:contributor": {
1123
+ "@language": "en",
1124
+ "@value": "Stian Soiland-Reyes"
1125
+ },
1126
+ "dc:creator": [
1127
+ {
1128
+ "@language": "en",
1129
+ "@value": "Robert Sanderson"
1130
+ },
1131
+ {
1132
+ "@language": "it",
1133
+ "@value": "Paolo Ciccarese"
1134
+ },
1135
+ {
1136
+ "@language": "vls",
1137
+ "@value": "Herbert Van de Sompel"
1138
+ }
1139
+ ],
1140
+ "dc:description": {
1141
+ "@language": "en",
1142
+ "@value": "The Open Annotation Core Data Model specifies an interoperable framework for creating associations between related resources, annotations, using a methodology that conforms to the Architecture of the World Wide Web. Open Annotations can easily be shared between platforms, with sufficient richness of expression to satisfy complex requirements while remaining simple enough to also allow for the most common use cases, such as attaching a piece of text to a single web resource.\n\nAn Annotation is considered to be a set of connected resources, typically including a body and target, where the body is somehow about the target. The full model supports additional functionality, enabling semantic annotations, embedding content, selecting segments of resources, choosing the appropriate representation of a resource and providing styling hints for consuming clients."
1143
+ },
1144
+ "dc:title": {
1145
+ "@language": "en",
1146
+ "@value": "Open Annotation Data Model"
1147
+ },
1148
+ "dcterms:modified": {
1149
+ "@type": "xsd:dateTime",
1150
+ "@value": "2013-02-22T21:40:51+01:00"
1151
+ },
1152
+ "owl:versionIRI": {
1153
+ "@id": "http://www.openannotation.org/spec/core/20130208/oa.owl"
1154
+ },
1155
+ "owl:versionInfo": "0.9.20130208",
1156
+ "rdfs:comment": {
1157
+ "@language": "en",
1158
+ "@value": "The Open Annotation Core Data Model specifies an interoperable framework for creating associations between related resources, annotations, using a methodology that conforms to the Architecture of the World Wide Web.\n\nThis ontology is a non-normative OWL formalization of the textual OA specification at http://www.openannotation.org/spec/core/20130208/index.html\n\nNote that OWL imports are disabled in the published version in order to reduce external implications, improve OWL 2 Profile conformity and increase interoperability. Some OWL tools might thus misleadingly show this ontology as (re)defining properties like skos:prefLabel."
1159
+ },
1160
+ "rdfs:seeAlso": {
1161
+ "@id": "http://www.openannotation.org/spec/core/20130208/index.html"
1162
+ }
1163
+ },
1164
+ {
1165
+ "@id": "oa:questioning",
1166
+ "@type": [
1167
+ "oa:Motivation",
1168
+ "owl:NamedIndividual"
1169
+ ],
1170
+ "rdfs:comment": {
1171
+ "@language": "en",
1172
+ "@value": "The motivation that represents asking a question about the target resource(s). For example to ask for assistance with a particular section of text, or question its veracity."
1173
+ },
1174
+ "skos:inScheme": {
1175
+ "@id": "oa:motivationScheme"
1176
+ },
1177
+ "skos:prefLabel": {
1178
+ "@language": "en",
1179
+ "@value": "questioning"
1180
+ }
1181
+ },
1182
+ {
1183
+ "@id": "oa:describing",
1184
+ "@type": [
1185
+ "oa:Motivation",
1186
+ "owl:NamedIndividual"
1187
+ ],
1188
+ "rdfs:comment": {
1189
+ "@language": "en",
1190
+ "@value": "The motivation that represents a description of the target resource(s), as opposed to a comment about them. For example describing the above PDF's contents, rather than commenting on their accuracy."
1191
+ },
1192
+ "skos:inScheme": {
1193
+ "@id": "oa:motivationScheme"
1194
+ },
1195
+ "skos:prefLabel": {
1196
+ "@language": "en",
1197
+ "@value": "describing"
1198
+ }
1199
+ },
1200
+ {
1201
+ "@id": "oa:styleClass",
1202
+ "@type": "owl:DatatypeProperty",
1203
+ "rdfs:comment": {
1204
+ "@language": "en",
1205
+ "@value": "The string name of the class used in the CSS description that should be applied to the Specific Resource.\n\nThere MAY be 0 or more styleClass properties on a Specific Resource.\n\nSee oa:CssStyle."
1206
+ },
1207
+ "rdfs:domain": {
1208
+ "@id": "oa:SpecificResource"
1209
+ },
1210
+ "rdfs:isDefinedBy": {
1211
+ "@id": "oa:"
1212
+ },
1213
+ "rdfs:label": {
1214
+ "@language": "en",
1215
+ "@value": "styleClass"
1216
+ }
1217
+ },
1218
+ {
1219
+ "@id": "oa:Tag",
1220
+ "@type": "owl:Class",
1221
+ "rdfs:comment": {
1222
+ "@language": "en",
1223
+ "@value": "A class assigned to the Body when it is a tag, such as a embedded text string with cnt:chars.\n\nTags are typically keywords or labels, and used for organization, description or discovery of the resource being tagged. In the Semantic Web, URIs are used instead of strings to avoid the issue of polysemy where one word has multiple meanings, such usage MUST be indicated using the subclass oa:SemanticTag.\n\nAnnotations that tag resources, either with text or semantic tags, SHOULD also have the oa:tagging motivation to make the reason for the Annotation more clear to applications, and MAY have other motivations as well."
1224
+ },
1225
+ "rdfs:isDefinedBy": {
1226
+ "@id": "oa:"
1227
+ },
1228
+ "rdfs:label": {
1229
+ "@language": "en",
1230
+ "@value": "Tag"
1231
+ }
1232
+ },
1233
+ {
1234
+ "@id": "oa:prefix",
1235
+ "@type": "owl:DatatypeProperty",
1236
+ "rdfs:comment": {
1237
+ "@language": "en",
1238
+ "@value": "A snippet of text that occurs immediately before the text which is being selected.\n\nSee oa:TextQuoteSelector."
1239
+ },
1240
+ "rdfs:domain": {
1241
+ "@id": "oa:Selector"
1242
+ },
1243
+ "rdfs:isDefinedBy": {
1244
+ "@id": "oa:"
1245
+ },
1246
+ "rdfs:label": {
1247
+ "@language": "en",
1248
+ "@value": "prefix"
1249
+ }
1250
+ }
1251
+ ]
1252
+ }
1253
+
1254
+
1255
+ http_version:
1256
+ recorded_at: Tue, 05 May 2015 19:18:18 GMT
1257
+ - request:
1258
+ method: get
1259
+ uri: http://www.w3.org/ns/oa-context-20130208.json
1260
+ body:
1261
+ encoding: US-ASCII
1262
+ string: ''
1263
+ headers:
1264
+ Accept:
1265
+ - application/ld+json, application/json
1266
+ Accept-Encoding:
1267
+ - gzip, deflate
1268
+ User-Agent:
1269
+ - Ruby
1270
+ response:
1271
+ status:
1272
+ code: 307
1273
+ message: Temporary Redirect
1274
+ headers:
1275
+ Date:
1276
+ - Tue, 05 May 2015 19:18:19 GMT
1277
+ Server:
1278
+ - Apache/2
1279
+ Location:
1280
+ - http://www.w3.org/ns/oa.jsonld
1281
+ Cache-Control:
1282
+ - max-age=21600
1283
+ Expires:
1284
+ - Wed, 06 May 2015 01:18:19 GMT
1285
+ Content-Length:
1286
+ - '240'
1287
+ Content-Type:
1288
+ - text/html; charset=iso-8859-1
1289
+ body:
1290
+ encoding: UTF-8
1291
+ string: |
1292
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
1293
+ <html><head>
1294
+ <title>307 Temporary Redirect</title>
1295
+ </head><body>
1296
+ <h1>Temporary Redirect</h1>
1297
+ <p>The document has moved <a href="http://www.w3.org/ns/oa.jsonld">here</a>.</p>
1298
+ </body></html>
1299
+ http_version:
1300
+ recorded_at: Tue, 05 May 2015 19:18:19 GMT
1301
+ - request:
1302
+ method: get
1303
+ uri: http://www.w3.org/ns/oa.jsonld
1304
+ body:
1305
+ encoding: US-ASCII
1306
+ string: ''
1307
+ headers:
1308
+ Accept:
1309
+ - application/ld+json, application/json
1310
+ Accept-Encoding:
1311
+ - gzip, deflate
1312
+ Cookie:
1313
+ - ''
1314
+ User-Agent:
1315
+ - Ruby
1316
+ response:
1317
+ status:
1318
+ code: 200
1319
+ message: OK
1320
+ headers:
1321
+ Date:
1322
+ - Tue, 05 May 2015 19:18:19 GMT
1323
+ Server:
1324
+ - Apache/2
1325
+ Last-Modified:
1326
+ - Tue, 06 May 2014 11:14:49 GMT
1327
+ Etag:
1328
+ - '"b533-4f8b95b2a9c40"'
1329
+ Accept-Ranges:
1330
+ - bytes
1331
+ Content-Length:
1332
+ - '46387'
1333
+ Cache-Control:
1334
+ - max-age=21600
1335
+ Expires:
1336
+ - Wed, 06 May 2015 01:18:19 GMT
1337
+ P3p:
1338
+ - policyref="http://www.w3.org/2014/08/p3p.xml"
1339
+ Access-Control-Allow-Origin:
1340
+ - "*"
1341
+ Content-Type:
1342
+ - application/ld+json
1343
+ body:
1344
+ encoding: UTF-8
1345
+ string: |+
1346
+ {
1347
+ "@context": {
1348
+ "oa": "http://www.w3.org/ns/oa#",
1349
+ "cnt": "http://www.w3.org/2011/content#",
1350
+ "dc": "http://purl.org/dc/elements/1.1/",
1351
+ "dcterms": "http://purl.org/dc/terms/",
1352
+ "dctypes": "http://purl.org/dc/dcmitype/",
1353
+ "foaf": "http://xmlns.com/foaf/0.1/",
1354
+ "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
1355
+ "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
1356
+ "skos": "http://www.w3.org/2004/02/skos/core#",
1357
+ "owl": "http://www.w3.org/2002/07/owl#",
1358
+ "prov": "http://www.w3.org/ns/prov#",
1359
+ "trig": "http://www.w3.org/2004/03/trix/rdfg-1/",
1360
+ "xsd": "http://www.w3.org/2001/XMLSchema#",
1361
+
1362
+
1363
+ "hasBody" : {"@type":"@id", "@id" : "oa:hasBody"},
1364
+ "hasTarget" : {"@type":"@id", "@id" : "oa:hasTarget"},
1365
+ "hasSource" : {"@type":"@id", "@id" : "oa:hasSource"},
1366
+ "hasSelector" : {"@type":"@id", "@id" : "oa:hasSelector"},
1367
+ "hasState" : {"@type":"@id", "@id" : "oa:hasState"},
1368
+ "hasScope" : {"@type":"@id", "@id" : "oa:hasScope"},
1369
+ "annotatedBy" : {"@type":"@id", "@id" : "oa:annotatedBy"},
1370
+ "serializedBy" : {"@type":"@id", "@id" : "oa:serializedBy"},
1371
+ "motivatedBy" : {"@type":"@id", "@id" : "oa:motivatedBy"},
1372
+ "equivalentTo" : {"@type":"@id", "@id" : "oa:equivalentTo"},
1373
+ "styledBy" : {"@type":"@id", "@id" : "oa:styledBy"},
1374
+ "cachedSource" : {"@type":"@id", "@id" : "oa:cachedSource"},
1375
+ "conformsTo" : {"@type":"@id", "@id" : "dcterms:conformsTo"},
1376
+ "default" : {"@type":"@id", "@id" : "oa:default"},
1377
+ "item" : {"@type":"@id", "@id" : "oa:item"},
1378
+ "first": {"@type":"@id", "@id" : "rdf:first"},
1379
+ "rest": {"@type":"@id", "@id" : "rdf:rest", "@container" : "@list"},
1380
+
1381
+ "annotatedAt" : { "@type": "xsd:dateTimeStamp", "@id": "oa:annotatedAt" },
1382
+ "end" : { "@type": "xsd:nonNegativeInteger", "@id": "oa:end" },
1383
+ "exact" : "oa:exact",
1384
+ "prefix" : "oa:prefix",
1385
+ "serializedAt" : { "@type": "xsd:dateTimeStamp", "@id": "oa:serializedAt" },
1386
+ "start" : { "@type": "xsd:nonNegativeInteger", "@id": "oa:start" },
1387
+ "styleClass" : "oa:styleClass",
1388
+ "suffix" : "oa:suffix",
1389
+ "when" : { "@type": "xsd:dateTimeStamp", "@id": "oa:when" },
1390
+
1391
+ "chars" : "cnt:chars",
1392
+ "bytes" : "cnt:bytes",
1393
+ "format" : "dc:format",
1394
+ "language" : "dc:language",
1395
+ "value" : "rdf:value",
1396
+ "label" : "rdfs:label",
1397
+ "name" : "foaf:name",
1398
+ "mbox" : "foaf:mbox"
1399
+
1400
+ },
1401
+ "@graph": [
1402
+ {
1403
+ "@id": "oa:annotatedBy",
1404
+ "@type": "owl:ObjectProperty",
1405
+ "rdfs:comment": {
1406
+ "@language": "en",
1407
+ "@value": "The object of the relationship is a resource that identifies the agent responsible for creating the Annotation. This may be either a human or software agent. \n\nThere SHOULD be exactly 1 oa:annotatedBy relationship per Annotation, but MAY be 0 or more than 1, as the Annotation may be anonymous, or multiple agents may have worked together on it.\n\nIt is RECOMMENDED to use these and other FOAF terms to describe agents: foaf:Person, prov:SoftwareAgent, foaf:Organization, foaf:name, foaf:mbox, foaf:openid, foaf:homepage"
1408
+ },
1409
+ "rdfs:domain": {
1410
+ "@id": "oa:Annotation"
1411
+ },
1412
+ "rdfs:isDefinedBy": {
1413
+ "@id": "oa:"
1414
+ },
1415
+ "rdfs:label": {
1416
+ "@language": "en",
1417
+ "@value": "annotatedBy"
1418
+ },
1419
+ "rdfs:subPropertyOf": {
1420
+ "@id": "prov:wasAttributedTo"
1421
+ }
1422
+ },
1423
+ {
1424
+ "@id": "oa:commenting",
1425
+ "@type": [
1426
+ "oa:Motivation",
1427
+ "owl:NamedIndividual"
1428
+ ],
1429
+ "rdfs:comment": {
1430
+ "@language": "en",
1431
+ "@value": "The motivation that represents a commentary about or review of the target resource(s). For example to provide a commentary about a particular PDF."
1432
+ },
1433
+ "skos:inScheme": {
1434
+ "@id": "oa:motivationScheme"
1435
+ },
1436
+ "skos:prefLabel": {
1437
+ "@language": "en",
1438
+ "@value": "commenting"
1439
+ }
1440
+ },
1441
+ {
1442
+ "@id": "oa:SvgSelector",
1443
+ "@type": "owl:Class",
1444
+ "rdfs:comment": {
1445
+ "@language": "en",
1446
+ "@value": "A Selector which selects an area specified as an SVG shape.\n\nThe SVG document should either be retrievable by resolving the URI of this resource, or be included as an Embedded Resource using cnt:Content.\n\nIt is RECOMMENDED that the document contain only a single shape element and that element SHOULD be one of: path, rect, circle, ellipse, polyline, polygon or g. The g element SHOULD ONLY be used to construct a multi-element group, for example to define a donut shape requiring an outer circle and a clipped inner circle.\n\nThe dimensions of both the shape and the SVG canvas MUST be relative to the dimensions of the Source resource. For example, given an image which is 600 pixels by 400 pixels, and the desired section is a circle of 100 pixel radius at the center of the image, then the SVG element would be: <circle cx=\"300\" cy=\"200\" r=\"100\"/>\n\nIt is NOT RECOMMENDED to include style information within the SVG element, nor Javascript, animation, text or other non shape oriented information. Clients SHOULD ignore such information if present."
1447
+ },
1448
+ "rdfs:isDefinedBy": {
1449
+ "@id": "oa:"
1450
+ },
1451
+ "rdfs:label": {
1452
+ "@language": "en",
1453
+ "@value": "SvgSelector"
1454
+ },
1455
+ "rdfs:subClassOf": {
1456
+ "@id": "oa:Selector"
1457
+ }
1458
+ },
1459
+ {
1460
+ "@id": "oa:Selector",
1461
+ "@type": "owl:Class",
1462
+ "rdfs:comment": {
1463
+ "@language": "en",
1464
+ "@value": "A resource which describes the segment of interest in a representation of a Source resource, indicated with oa:hasSelector from the Specific Resource. \n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe nature of the Selector will be dependent on the type of the representation for which the segment is conveyed. The specific type of selector should be indicated using a subclass of oa:Selector.\n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
1465
+ },
1466
+ "rdfs:isDefinedBy": {
1467
+ "@id": "oa:"
1468
+ },
1469
+ "rdfs:label": {
1470
+ "@language": "en",
1471
+ "@value": "Selector"
1472
+ }
1473
+ },
1474
+ {
1475
+ "@id": "oa:Style",
1476
+ "@type": "owl:Class",
1477
+ "rdfs:comment": {
1478
+ "@language": "en",
1479
+ "@value": "A resource which describes the style in which the selection or resource should be rendered, indicated with oa:styledBy from an oa:Annotation.\n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe content of the resource provides the rendering hints about the Annotation's constituent resources. \n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
1480
+ },
1481
+ "rdfs:isDefinedBy": {
1482
+ "@id": "oa:"
1483
+ },
1484
+ "rdfs:label": {
1485
+ "@language": "en",
1486
+ "@value": "Style"
1487
+ }
1488
+ },
1489
+ {
1490
+ "@id": "oa:exact",
1491
+ "@type": "owl:DatatypeProperty",
1492
+ "rdfs:comment": {
1493
+ "@language": "en",
1494
+ "@value": "A copy of the text which is being selected, after normalization.\n\nSee oa:TextQuoteSelector."
1495
+ },
1496
+ "rdfs:domain": {
1497
+ "@id": "oa:Selector"
1498
+ },
1499
+ "rdfs:isDefinedBy": {
1500
+ "@id": "oa:"
1501
+ },
1502
+ "rdfs:label": {
1503
+ "@language": "en",
1504
+ "@value": "exact"
1505
+ }
1506
+ },
1507
+ {
1508
+ "@id": "oa:hasBody",
1509
+ "@type": "owl:ObjectProperty",
1510
+ "rdfs:comment": {
1511
+ "@language": "en",
1512
+ "@value": "The relationship between oa:Annotation and body. The body is somehow \"about\" the oa:hasTarget of the annotation.\n\nThe Body may be of any media type, and contain any type of content. The Body SHOULD be identified by HTTP URIs unless they are embedded within the Annotation.\n\nEmbedded bodies SHOULD be instances of cnt:ContentAsText and embed their content with cnt:chars. They SHOULD declare their media type with dc:format, and MAY indicate their language using dc:language and a RFC-3066 language tag. \n\nThere is no OA class provided for \"Body\" as a body might be a target of a different annotation. However, there SHOULD be 1 or more content-based classes associated with the body resources of an Annotation, and the dctypes: vocabulary is recommended for this purpose, for instance dctypes:Text to declare textual content.\n"
1513
+ },
1514
+ "rdfs:domain": {
1515
+ "@id": "oa:Annotation"
1516
+ },
1517
+ "rdfs:isDefinedBy": {
1518
+ "@id": "oa:"
1519
+ },
1520
+ "rdfs:label": {
1521
+ "@language": "en",
1522
+ "@value": "hasBody"
1523
+ }
1524
+ },
1525
+ {
1526
+ "@id": "oa:Choice",
1527
+ "@type": "owl:Class",
1528
+ "rdfs:comment": {
1529
+ "@language": "en",
1530
+ "@value": "A multiplicity construct that conveys to a consuming application that it should select one of the constituent resources to display to the user, and not render/use all of them. \n\noa:Choice can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 1 or more oa:item relationships for each oa:Choice.\n\nThere SHOULD be exactly 1 default relationship for each Choice."
1531
+ },
1532
+ "rdfs:isDefinedBy": {
1533
+ "@id": "oa:"
1534
+ },
1535
+ "rdfs:label": {
1536
+ "@language": "en",
1537
+ "@value": "Choice"
1538
+ },
1539
+ "rdfs:subClassOf": {
1540
+ "@id": "rdf:Alt"
1541
+ }
1542
+ },
1543
+ {
1544
+ "@id": "oa:when",
1545
+ "@type": "owl:DatatypeProperty",
1546
+ "rdfs:comment": {
1547
+ "@language": "en",
1548
+ "@value": "The timestamp at which the Source resource should be interpreted for the Annotation, typically the time that the Annotation was created."
1549
+ },
1550
+ "rdfs:domain": {
1551
+ "@id": "oa:TimeState"
1552
+ },
1553
+ "rdfs:isDefinedBy": {
1554
+ "@id": "oa:"
1555
+ },
1556
+ "rdfs:label": {
1557
+ "@language": "en",
1558
+ "@value": "when"
1559
+ },
1560
+ "rdfs:range": {
1561
+ "@id": "xsd:dateTimeStamp"
1562
+ }
1563
+ },
1564
+ {
1565
+ "@id": "oa:serializedBy",
1566
+ "@type": "owl:ObjectProperty",
1567
+ "rdfs:comment": {
1568
+ "@language": "en",
1569
+ "@value": "The object of the relationship is the agent, likely software, responsible for generating the serialization of the Annotation's serialization. \n\nIt is RECOMMENDED to use these and other FOAF terms to describe agents: foaf:Person, prov:SoftwareAgent, foaf:Organization, foaf:name, foaf:mbox, foaf:openid, foaf:homepage\n\nThere MAY be 0 or more oa:serializedBy relationships per Annotation."
1570
+ },
1571
+ "rdfs:domain": {
1572
+ "@id": "oa:Annotation"
1573
+ },
1574
+ "rdfs:isDefinedBy": {
1575
+ "@id": "oa:"
1576
+ },
1577
+ "rdfs:label": {
1578
+ "@language": "en",
1579
+ "@value": "serializedBy"
1580
+ },
1581
+ "rdfs:subPropertyOf": {
1582
+ "@id": "prov:wasAttributedTo"
1583
+ }
1584
+ },
1585
+ {
1586
+ "@id": "oa:motivatedBy",
1587
+ "@type": "owl:ObjectProperty",
1588
+ "rdfs:comment": {
1589
+ "@language": "en",
1590
+ "@value": "The relationship between an Annotation and a Motivation, indicating the reasons why the Annotation was created.\n\nEach Annotation SHOULD have at least one oa:motivatedBy relationship, and MAY be more than 1."
1591
+ },
1592
+ "rdfs:domain": {
1593
+ "@id": "oa:Annotation"
1594
+ },
1595
+ "rdfs:isDefinedBy": {
1596
+ "@id": "oa:"
1597
+ },
1598
+ "rdfs:label": {
1599
+ "@language": "en",
1600
+ "@value": "motivatedBy"
1601
+ },
1602
+ "rdfs:range": {
1603
+ "@id": "oa:Motivation"
1604
+ }
1605
+ },
1606
+ {
1607
+ "@id": "oa:moderating",
1608
+ "@type": [
1609
+ "oa:Motivation",
1610
+ "owl:NamedIndividual"
1611
+ ],
1612
+ "rdfs:comment": {
1613
+ "@language": "en",
1614
+ "@value": "The motivation that represents an assignment of value or quality to the target resource(s). For example annotating an Annotation to moderate it up in a trust network or threaded discussion."
1615
+ },
1616
+ "skos:inScheme": {
1617
+ "@id": "oa:motivationScheme"
1618
+ },
1619
+ "skos:prefLabel": {
1620
+ "@language": "en",
1621
+ "@value": "moderating"
1622
+ }
1623
+ },
1624
+ {
1625
+ "@id": "oa:highlighting",
1626
+ "@type": [
1627
+ "oa:Motivation",
1628
+ "owl:NamedIndividual"
1629
+ ],
1630
+ "rdfs:comment": {
1631
+ "@language": "en",
1632
+ "@value": "The motivation that represents a highlighted section of the target resource or segment. For example to draw attention to the selected text that the annotator disagrees with. A Highlight may or may not have a Body resource"
1633
+ },
1634
+ "skos:inScheme": {
1635
+ "@id": "oa:motivationScheme"
1636
+ },
1637
+ "skos:prefLabel": {
1638
+ "@language": "en",
1639
+ "@value": "highlighting"
1640
+ }
1641
+ },
1642
+ {
1643
+ "@id": "oa:styledBy",
1644
+ "@type": "owl:ObjectProperty",
1645
+ "rdfs:comment": {
1646
+ "@language": "en",
1647
+ "@value": "The relationship between a oa:Annotation and a oa:Style.\n\nThere MAY be 0 or 1 styledBy relationships for each Annotation.\n\nIf there are multiple Style resources that must be associated with the Annotation, then the use of the Multiplicity Constructs oa:Choice, oa:Composite or oa:List is RECOMMENDED."
1648
+ },
1649
+ "rdfs:domain": {
1650
+ "@id": "oa:Annotation"
1651
+ },
1652
+ "rdfs:isDefinedBy": {
1653
+ "@id": "oa:"
1654
+ },
1655
+ "rdfs:label": {
1656
+ "@language": "en",
1657
+ "@value": "styledBy"
1658
+ },
1659
+ "rdfs:range": {
1660
+ "@id": "oa:Style"
1661
+ }
1662
+ },
1663
+ {
1664
+ "@id": "oa:FragmentSelector",
1665
+ "@type": "owl:Class",
1666
+ "rdfs:comment": {
1667
+ "@language": "en",
1668
+ "@value": "A Selector which describes the segment of interest in a representation, through the use of the fragment identifier component of a URI.\n\nIt is RECOMMENDED to use oa:FragmentSelector as the selector on a Specific Resource rather than annotating the fragment URI directly, in order to improve discoverability of annotation on the Source.\n\nThe oa:FragmentSelector MUST have exactly 1 rdf:value property, containing the fragment identifier component of a URI that describes the segment of interest in the resource, excluding the initial \"#\".\n\nThe Fragment Selector SHOULD have a dcterms:conformsTo relationship with the object being the specification that defines the syntax of the fragment, for instance <http://tools.ietf.org/rfc/rfc3236> for HTML fragments. "
1669
+ },
1670
+ "rdfs:isDefinedBy": {
1671
+ "@id": "oa:"
1672
+ },
1673
+ "rdfs:label": {
1674
+ "@language": "en",
1675
+ "@value": "FragmentSelector"
1676
+ },
1677
+ "rdfs:subClassOf": {
1678
+ "@id": "oa:Selector"
1679
+ }
1680
+ },
1681
+ {
1682
+ "@id": "oa:SpecificResource",
1683
+ "@type": "owl:Class",
1684
+ "rdfs:comment": {
1685
+ "@language": "en",
1686
+ "@value": "A resource identifies part of another Source resource, a particular representation of a resource, a resource with styling hints for renders, or any combination of these. \n\nThe Specific Resource takes the role of oa:hasBody or oa:hasTarget in an oa:Annotation instead of the Source resource.\n\nThere MUST be exactly 1 oa:hasSource relationship associated with a Specific Resource.\n\nThere MUST be exactly 0 or 1 oa:hasSelector relationship associated with a Specific Resource.\n\nThere MAY be 0 or 1 oa:hasState relationship for each Specific Resource.\n\nIf the Specific Resource has an HTTP URI, then the exact segment of the Source resource that it identifies, and only the segment, MUST be returned when the URI is dereferenced. For example, if the segment of interest is a region of an image and the Specific Resource has an HTTP URI, then dereferencing it MUST return the selected region of the image as it was at the time when the annotation was created. Typically this would be a burden to support, and thus the Specific Resource SHOULD be identified by a globally unique URI, such as a UUID URN. If it is not considered important to allow other Annotations or systems to refer to the Specific Resource, then a blank node MAY be used instead."
1687
+ },
1688
+ "rdfs:isDefinedBy": {
1689
+ "@id": "oa:"
1690
+ },
1691
+ "rdfs:label": {
1692
+ "@language": "en",
1693
+ "@value": "SpecificResource"
1694
+ }
1695
+ },
1696
+ {
1697
+ "@id": "oa:annotatedAt",
1698
+ "@type": "owl:DatatypeProperty",
1699
+ "rdfs:comment": {
1700
+ "@language": "en",
1701
+ "@value": "The time at which the Annotation was created. \n\nThere SHOULD be exactly 1 oa:annotatedAt property per Annotation, and MUST NOT be more than 1. The datetime MUST be expressed in the xsd:dateTime format, and SHOULD have a timezone specified."
1702
+ },
1703
+ "rdfs:domain": {
1704
+ "@id": "oa:Annotation"
1705
+ },
1706
+ "rdfs:isDefinedBy": {
1707
+ "@id": "oa:"
1708
+ },
1709
+ "rdfs:label": {
1710
+ "@language": "en",
1711
+ "@value": "annotatedAt"
1712
+ },
1713
+ "rdfs:range": {
1714
+ "@id": "xsd:dateTimeStamp"
1715
+ }
1716
+ },
1717
+ {
1718
+ "@id": "oa:editing",
1719
+ "@type": [
1720
+ "oa:Motivation",
1721
+ "owl:NamedIndividual"
1722
+ ],
1723
+ "rdfs:comment": {
1724
+ "@language": "en",
1725
+ "@value": "The motivation that represents a request for a modification or edit to the target resource. For example, an Annotation that requests a typo to be corrected."
1726
+ },
1727
+ "skos:inScheme": {
1728
+ "@id": "oa:motivationScheme"
1729
+ },
1730
+ "skos:prefLabel": {
1731
+ "@language": "en",
1732
+ "@value": "editing"
1733
+ }
1734
+ },
1735
+ {
1736
+ "@id": "oa:Annotation",
1737
+ "@type": "owl:Class",
1738
+ "rdfs:comment": {
1739
+ "@language": "en",
1740
+ "@value": "Typically an Annotation has a single Body (oa:hasBody), which is the comment or other descriptive resource, and a single Target (oa:hasTarget) that the Body is somehow \"about\". The Body provides the information which is annotating the Target. \n\nThis \"aboutness\" may be further clarified or extended to notions such as classifying or identifying with oa:motivatedBy."
1741
+ },
1742
+ "rdfs:isDefinedBy": {
1743
+ "@id": "oa:"
1744
+ },
1745
+ "rdfs:label": {
1746
+ "@language": "en",
1747
+ "@value": "Annotation"
1748
+ }
1749
+ },
1750
+ {
1751
+ "@id": "oa:equivalentTo",
1752
+ "@type": "owl:ObjectProperty",
1753
+ "rdfs:comment": {
1754
+ "@language": "en",
1755
+ "@value": "The subject and object resources of the oa:equivalentTo relationship represent the same resource, but potentially have different metadata such as oa:serializedBy, oa:serializedAt and serialization format. oa:equivalentTo is a symmetrical and transitive relationship; if A oa:equivalentTo B, then it is also true that B oa:equivalent A; and that if B oa:equivalentTo C, then it is also true that A oa:equivalentTo C. \n\nThe Annotation MAY include 0 or more instances of the oa:equivalentTo relationship between copies of the Annotation or other resources, and SHOULD include as many as are available.\n\nIf a system publishes an embedded resource (a cnt:Content) at a new HTTP URI, then it SHOULD express the oa:equivalentTo relationship between the resource's URN and the new URI from which it is available."
1756
+ },
1757
+ "rdfs:isDefinedBy": {
1758
+ "@id": "oa:"
1759
+ },
1760
+ "rdfs:label": {
1761
+ "@language": "en",
1762
+ "@value": "equivalentTo"
1763
+ },
1764
+ "rdfs:subPropertyOf": {
1765
+ "@id": "prov:alternateOf"
1766
+ }
1767
+ },
1768
+ {
1769
+ "@id": "oa:Motivation",
1770
+ "@type": "owl:Class",
1771
+ "rdfs:comment": {
1772
+ "@language": "en",
1773
+ "@value": "The Motivation for creating an Annotation, indicated with oa:motivatedBy, is a reason for its creation, and might include things like oa:replying to another annotation, oa:commenting on a resource, or oa:linking to a related resource.\n\nEach Annotation SHOULD have at least one oa:motivatedBy relationship to an instance of oa:Motivation, which is a subClass of skos:Concept."
1774
+ },
1775
+ "rdfs:isDefinedBy": {
1776
+ "@id": "oa:"
1777
+ },
1778
+ "rdfs:label": {
1779
+ "@language": "en",
1780
+ "@value": "Motivation"
1781
+ },
1782
+ "rdfs:subClassOf": {
1783
+ "@id": "skos:Concept"
1784
+ }
1785
+ },
1786
+ {
1787
+ "@id": "oa:tagging",
1788
+ "@type": [
1789
+ "oa:Motivation",
1790
+ "owl:NamedIndividual"
1791
+ ],
1792
+ "rdfs:comment": {
1793
+ "@language": "en",
1794
+ "@value": "The motivation that represents adding a Tag on the target resource(s). One or more of the bodies of the annotation should be typed as a oa:Tag or oa:SemanticTag."
1795
+ },
1796
+ "skos:inScheme": {
1797
+ "@id": "oa:motivationScheme"
1798
+ },
1799
+ "skos:prefLabel": {
1800
+ "@language": "en",
1801
+ "@value": "tagging"
1802
+ }
1803
+ },
1804
+ {
1805
+ "@id": "oa:List",
1806
+ "@type": "owl:Class",
1807
+ "rdfs:comment": {
1808
+ "@language": "en",
1809
+ "@value": "A multiplicity construct that conveys to a consuming application that all of the constituent resources are required for the Annotation to be correctly interpreted, and in a particular order. \n\noa:List can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 2 or more oa:item relationships for each oa:List, with their order defined using the rdf:List construct of rdf:first/rdf:rest/rdf:nil.\n\nAll the elements of the list should also be declared using oa:item, and each of the oa:items should appear at least once in the list."
1810
+ },
1811
+ "rdfs:isDefinedBy": {
1812
+ "@id": "oa:"
1813
+ },
1814
+ "rdfs:label": {
1815
+ "@language": "en",
1816
+ "@value": "List"
1817
+ },
1818
+ "rdfs:subClassOf": {
1819
+ "@id": "oa:Composite"
1820
+ }
1821
+ },
1822
+ {
1823
+ "@id": "oa:TextQuoteSelector",
1824
+ "@type": "owl:Class",
1825
+ "rdfs:comment": {
1826
+ "@language": "en",
1827
+ "@value": "A Selector that describes a textual segment by means of quoting it, plus passages before or after it.\n\nFor example, if the document were \"abcdefghijklmnopqrstuvwxyz\", one could select \"efg\" by a oa:prefix of \"abcd\", the quotation of oa:exact \"efg\" and a oa:suffix of \"hijk\".\n\nThe text MUST be normalized before recording.\n\nEach TextQuoteSelector MUST have exactly 1 oa:exact property.\n\nEach TextQuoteSelector SHOULD have exactly 1 oa:prefix property, and MUST NOT have more than 1.\n\nEach TextQuoteSelector SHOULD have exactly 1 oa:suffix property, and MUST NOT have more than 1."
1828
+ },
1829
+ "rdfs:isDefinedBy": {
1830
+ "@id": "oa:"
1831
+ },
1832
+ "rdfs:label": {
1833
+ "@language": "en",
1834
+ "@value": "TextQuoteSelector"
1835
+ },
1836
+ "rdfs:subClassOf": {
1837
+ "@id": "oa:Selector"
1838
+ }
1839
+ },
1840
+ {
1841
+ "@id": "oa:cachedSource",
1842
+ "@type": "owl:ObjectProperty",
1843
+ "rdfs:comment": {
1844
+ "@language": "en",
1845
+ "@value": "A link to a copy of the Source resource's representation appropriate for the Annotation, typically a copy of the original at the time that the Annotation was created"
1846
+ },
1847
+ "rdfs:domain": {
1848
+ "@id": "oa:TimeState"
1849
+ },
1850
+ "rdfs:isDefinedBy": {
1851
+ "@id": "oa:"
1852
+ },
1853
+ "rdfs:label": {
1854
+ "@language": "en",
1855
+ "@value": "cachedSource"
1856
+ }
1857
+ },
1858
+ {
1859
+ "@id": "oa:bookmarking",
1860
+ "@type": [
1861
+ "oa:Motivation",
1862
+ "owl:NamedIndividual"
1863
+ ],
1864
+ "rdfs:comment": {
1865
+ "@language": "en",
1866
+ "@value": "The motivation that represents the creation of a bookmark to the target resources or recorded point or points within one or more resources. For example, an Annotation that bookmarks the point in a text where the reader finished reading. Bookmark Annotations may or may not have a Body resource."
1867
+ },
1868
+ "skos:inScheme": {
1869
+ "@id": "oa:motivationScheme"
1870
+ },
1871
+ "skos:prefLabel": {
1872
+ "@language": "en",
1873
+ "@value": "bookmarking"
1874
+ }
1875
+ },
1876
+ {
1877
+ "@id": "oa:SemanticTag",
1878
+ "@type": "owl:Class",
1879
+ "rdfs:comment": {
1880
+ "@language": "en",
1881
+ "@value": "A class assigned to the Body when it is a semantic tagging resource; a URI that identifies a concept, rather than an embedded string, frequently a term from a controlled vocabulary.\n\nIt is NOT RECOMMENDED to use the URI of a document as a Semantic Tag, as it might also be used as a regular Body in other Annotations which would inherit the oa:SemanticTag class assignment. Instead it is more appropriate to create a new URI and link it to the document, using the foaf:page predicate."
1882
+ },
1883
+ "rdfs:isDefinedBy": {
1884
+ "@id": "oa:"
1885
+ },
1886
+ "rdfs:label": {
1887
+ "@language": "en",
1888
+ "@value": "SemanticTag"
1889
+ },
1890
+ "rdfs:subClassOf": {
1891
+ "@id": "oa:Tag"
1892
+ }
1893
+ },
1894
+ {
1895
+ "@id": "oa:hasSource",
1896
+ "@type": "owl:ObjectProperty",
1897
+ "rdfs:comment": {
1898
+ "@language": "en",
1899
+ "@value": "The relationship between a oa:SpecificResource and the resource that it is a more specific representation of. \n\nThere MUST be exactly 1 oa:hasSource relationship associated with a Specific Resource."
1900
+ },
1901
+ "rdfs:domain": {
1902
+ "@id": "oa:SpecificResource"
1903
+ },
1904
+ "rdfs:isDefinedBy": {
1905
+ "@id": "oa:"
1906
+ },
1907
+ "rdfs:label": {
1908
+ "@language": "en",
1909
+ "@value": "hasSource"
1910
+ }
1911
+ },
1912
+ {
1913
+ "@id": "oa:default",
1914
+ "@type": "owl:ObjectProperty",
1915
+ "rdfs:comment": {
1916
+ "@language": "en",
1917
+ "@value": "The constituent resource of a oa:Choice to use as a default option, if there is no other means to determine which would be most appropriate.\n\nThere SHOULD be exactly 1 default relationship for each Choice."
1918
+ },
1919
+ "rdfs:domain": {
1920
+ "@id": "oa:Choice"
1921
+ },
1922
+ "rdfs:isDefinedBy": {
1923
+ "@id": "oa:"
1924
+ },
1925
+ "rdfs:label": {
1926
+ "@language": "en",
1927
+ "@value": "default"
1928
+ },
1929
+ "rdfs:subPropertyOf": {
1930
+ "@id": "oa:item"
1931
+ }
1932
+ },
1933
+ {
1934
+ "@id": "oa:hasSelector",
1935
+ "@type": "owl:ObjectProperty",
1936
+ "rdfs:comment": {
1937
+ "@language": "en",
1938
+ "@value": "The relationship between a oa:SpecificResource and a oa:Selector.\n\nThere MUST be exactly 0 or 1 oa:hasSelector relationship associated with a \nSpecific Resource. \n\nIf multiple Selectors are required, either to express a choice between different optional, equivalent selectors, or a chain of selectors that should all be processed, it is necessary to use oa:Choice, oa:Composite or oa:List as a selector."
1939
+ },
1940
+ "rdfs:domain": {
1941
+ "@id": "oa:SpecificResource"
1942
+ },
1943
+ "rdfs:isDefinedBy": {
1944
+ "@id": "oa:"
1945
+ },
1946
+ "rdfs:label": {
1947
+ "@language": "en",
1948
+ "@value": "hasSelector"
1949
+ },
1950
+ "rdfs:range": {
1951
+ "@id": "oa:Selector"
1952
+ }
1953
+ },
1954
+ {
1955
+ "@id": "oa:hasTarget",
1956
+ "@type": "owl:ObjectProperty",
1957
+ "rdfs:comment": {
1958
+ "@language": "en",
1959
+ "@value": "The relationship between oa:Annotation and target. The target resource is what the oa:hasBody is somewhat \"about\".\n\nThe target may be of any media type, and contain any type of content. The target SHOULD be identified by HTTP URIs unless they are embedded within the Annotation.\n\nEmbedded targets SHOULD be instances of cnt:ContentAsText and embed their content with cnt:chars. They SHOULD declare their media type with dc:format, and MAY indicate their language using dc:language and a RFC-3066 language tag. \n\nThere is no OA class provided for \"Target\" as a target might be a body in a different annotation. However, there SHOULD be 1 or more content-based classes associated with the target resources of an Annotation, and the dctypes: vocabulary is recommended for this purpose, for instance dctypes:Text to declare textual content."
1960
+ },
1961
+ "rdfs:domain": {
1962
+ "@id": "oa:Annotation"
1963
+ },
1964
+ "rdfs:isDefinedBy": {
1965
+ "@id": "oa:"
1966
+ },
1967
+ "rdfs:label": {
1968
+ "@language": "en",
1969
+ "@value": "hasTarget"
1970
+ }
1971
+ },
1972
+ {
1973
+ "@id": "oa:TextPositionSelector",
1974
+ "@type": "owl:Class",
1975
+ "rdfs:comment": {
1976
+ "@language": "en",
1977
+ "@value": "An oa:Selector which describes a range of text based on its start and end positions.\n\nThe text MUST be normalized before counting characters. For a Selector that works from the bitstream rather than the rendered characters, see oa:DataPositionSelector.\n\nEach oa:TextPositionSelector MUST have exactly 1 oa:start property.\n\nEach oa:TextPositionSelector MUST have exactly 1 oa:end property."
1978
+ },
1979
+ "rdfs:isDefinedBy": {
1980
+ "@id": "oa:"
1981
+ },
1982
+ "rdfs:label": {
1983
+ "@language": "en",
1984
+ "@value": "TextPositionSelector"
1985
+ },
1986
+ "rdfs:subClassOf": {
1987
+ "@id": "oa:Selector"
1988
+ }
1989
+ },
1990
+ {
1991
+ "@id": "oa:serializedAt",
1992
+ "@type": "owl:DatatypeProperty",
1993
+ "rdfs:comment": {
1994
+ "@language": "en",
1995
+ "@value": "The time at which the agent referenced by oa:serializedBy generated the first serialization of the Annotation, and any subsequent substantially different one. The annotation graph MUST have changed for this property to be updated, and as such represents the last modified datestamp for the Annotation. This might be used to determine if it should be re-imported into a triplestore when discovered. \n\nThere MAY be exactly 1 oa:serializedAt property per Annotation, and MUST NOT be more than 1. The datetime MUST be expressed in the xsd:dateTime format, and SHOULD have a timezone specified.\n"
1996
+ },
1997
+ "rdfs:domain": {
1998
+ "@id": "oa:Annotation"
1999
+ },
2000
+ "rdfs:isDefinedBy": {
2001
+ "@id": "oa:"
2002
+ },
2003
+ "rdfs:label": {
2004
+ "@language": "en",
2005
+ "@value": "serializedAt"
2006
+ },
2007
+ "rdfs:range": {
2008
+ "@id": "xsd:dateTimeStamp"
2009
+ }
2010
+ },
2011
+ {
2012
+ "@id": "oa:Composite",
2013
+ "@type": "owl:Class",
2014
+ "rdfs:comment": {
2015
+ "@language": "en",
2016
+ "@value": "A multiplicity construct that conveys to a consuming application that all of the constituent resources are required for the Annotation to be correctly interpreted. \n\noa:Composite can be used as the object of the object of the oa:hasBody, oa:hasTarget, oa:hasSelector, oa:hasState, oa:styledBy and oa:hasScope relationships, \n\nThere MUST be 2 or more oa:item relationships for each oa:Composite."
2017
+ },
2018
+ "rdfs:isDefinedBy": {
2019
+ "@id": "oa:"
2020
+ },
2021
+ "rdfs:label": "Composite",
2022
+ "rdfs:subClassOf": {
2023
+ "@id": "rdf:Bag"
2024
+ }
2025
+ },
2026
+ {
2027
+ "@id": "oa:classifying",
2028
+ "@type": [
2029
+ "oa:Motivation",
2030
+ "owl:NamedIndividual"
2031
+ ],
2032
+ "rdfs:comment": {
2033
+ "@language": "en",
2034
+ "@value": "The motivation that represents the assignment of a classification type, typically from a controlled vocabulary, to the target resource(s). For example to classify an Image resource as a Portrait."
2035
+ },
2036
+ "skos:inScheme": {
2037
+ "@id": "oa:motivationScheme"
2038
+ },
2039
+ "skos:prefLabel": {
2040
+ "@language": "en",
2041
+ "@value": "classifying"
2042
+ }
2043
+ },
2044
+ {
2045
+ "@id": "oa:identifying",
2046
+ "@type": [
2047
+ "oa:Motivation",
2048
+ "owl:NamedIndividual"
2049
+ ],
2050
+ "rdfs:comment": {
2051
+ "@language": "en",
2052
+ "@value": "The motivation that represents the assignment of an identity to the target resource(s). For example, annotating the name of a city in a string of text with the URI that identifies it."
2053
+ },
2054
+ "skos:inScheme": {
2055
+ "@id": "oa:motivationScheme"
2056
+ },
2057
+ "skos:prefLabel": {
2058
+ "@language": "en",
2059
+ "@value": "identifying"
2060
+ }
2061
+ },
2062
+ {
2063
+ "@id": "oa:HttpRequestState",
2064
+ "@type": "owl:Class",
2065
+ "rdfs:comment": {
2066
+ "@language": "en",
2067
+ "@value": "A resource which describes how to retrieve an appropriate representation of the Source resource for the Annotation, based on the HTTP Request headers to send to the server.\n\nThere MUST be exactly 1 rdf:value property per HttpRequestState, containing HTTP request headers as a single, complete string, exactly as they would appear in an HTTP request. "
2068
+ },
2069
+ "rdfs:isDefinedBy": {
2070
+ "@id": "oa:"
2071
+ },
2072
+ "rdfs:label": {
2073
+ "@language": "en",
2074
+ "@value": "HttpRequestState"
2075
+ },
2076
+ "rdfs:subClassOf": {
2077
+ "@id": "oa:State"
2078
+ }
2079
+ },
2080
+ {
2081
+ "@id": "oa:DataPositionSelector",
2082
+ "@type": "owl:Class",
2083
+ "rdfs:comment": {
2084
+ "@language": "en",
2085
+ "@value": "A Selector which describes a range of data based on its start and end positions within the byte stream of the representation.\n\nEach DataPositionSelector MUST have exactly 1 oa:start property.\n\nEach TextPositionSelector MUST have exactly 1 oa:end property.\n\nSee oa:TextPositionSelector for selection at normalized character level rather than bytestream level."
2086
+ },
2087
+ "rdfs:isDefinedBy": {
2088
+ "@id": "oa:"
2089
+ },
2090
+ "rdfs:label": {
2091
+ "@language": "en",
2092
+ "@value": "DataPositionSelector"
2093
+ },
2094
+ "rdfs:subClassOf": {
2095
+ "@id": "oa:Selector"
2096
+ }
2097
+ },
2098
+ {
2099
+ "@id": "oa:linking",
2100
+ "@type": [
2101
+ "oa:Motivation",
2102
+ "owl:NamedIndividual"
2103
+ ],
2104
+ "rdfs:comment": {
2105
+ "@language": "en",
2106
+ "@value": "The motivation that represents an untyped link to a resource related to the target."
2107
+ },
2108
+ "skos:inScheme": {
2109
+ "@id": "oa:motivationScheme"
2110
+ },
2111
+ "skos:prefLabel": {
2112
+ "@language": "en",
2113
+ "@value": "linking"
2114
+ }
2115
+ },
2116
+ {
2117
+ "@id": "oa:motivationScheme",
2118
+ "@type": [
2119
+ "skos:ConceptScheme",
2120
+ "owl:NamedIndividual"
2121
+ ],
2122
+ "rdfs:comment": {
2123
+ "@language": "en",
2124
+ "@value": "The concept scheme for Open Annotation Motivations"
2125
+ },
2126
+ "rdfs:label": {
2127
+ "@language": "en",
2128
+ "@value": "motivationScheme"
2129
+ }
2130
+ },
2131
+ {
2132
+ "@id": "oa:replying",
2133
+ "@type": [
2134
+ "oa:Motivation",
2135
+ "owl:NamedIndividual"
2136
+ ],
2137
+ "rdfs:comment": {
2138
+ "@language": "en",
2139
+ "@value": "The motivation that represents a reply to a previous statement, either an Annotation or another resource. For example providing the assistance requested in the above."
2140
+ },
2141
+ "skos:inScheme": {
2142
+ "@id": "oa:motivationScheme"
2143
+ },
2144
+ "skos:prefLabel": {
2145
+ "@language": "en",
2146
+ "@value": "replying"
2147
+ }
2148
+ },
2149
+ {
2150
+ "@id": "oa:start",
2151
+ "@type": "owl:DatatypeProperty",
2152
+ "rdfs:comment": {
2153
+ "@language": "en",
2154
+ "@value": "The starting position of the segment of text or bytes. The first character/byte in the full text/stream is position 0. The character/byte indicated at position oa:start is included within the selected segment. \n\nSee oa:DataPositionSelector and oa:TextPositionSelector."
2155
+ },
2156
+ "rdfs:domain": {
2157
+ "@id": "oa:Selector"
2158
+ },
2159
+ "rdfs:isDefinedBy": {
2160
+ "@id": "oa:"
2161
+ },
2162
+ "rdfs:label": {
2163
+ "@language": "en",
2164
+ "@value": "start"
2165
+ },
2166
+ "rdfs:range": {
2167
+ "@id": "xsd:nonNegativeInteger"
2168
+ }
2169
+ },
2170
+ {
2171
+ "@id": "oa:end",
2172
+ "@type": "owl:DatatypeProperty",
2173
+ "rdfs:comment": {
2174
+ "@language": "en",
2175
+ "@value": "The end position of the segment of text or bytes. The first character/byte in the full text/stream is position 0. The character/byte indicated at position oa:end is NOT included within the selected segment. \n\nSee oa:DataPositionSelector and oa:oa:TextPositionSelector."
2176
+ },
2177
+ "rdfs:domain": {
2178
+ "@id": "oa:Selector"
2179
+ },
2180
+ "rdfs:isDefinedBy": {
2181
+ "@id": "oa:"
2182
+ },
2183
+ "rdfs:label": {
2184
+ "@language": "en",
2185
+ "@value": "end"
2186
+ },
2187
+ "rdfs:range": {
2188
+ "@id": "xsd:nonNegativeInteger"
2189
+ }
2190
+ },
2191
+ {
2192
+ "@id": "oa:TimeState",
2193
+ "@type": "owl:Class",
2194
+ "rdfs:comment": {
2195
+ "@language": "en",
2196
+ "@value": "A resource which describes how to retrieve a representation of the Source resource that is temporally appropriate for the Annotation.\n\nThere MUST be at least one of oa:cachedSource or oa:when specified. If there is more than 1, each gives an alternative copy of the representation."
2197
+ },
2198
+ "rdfs:isDefinedBy": {
2199
+ "@id": "oa:"
2200
+ },
2201
+ "rdfs:label": {
2202
+ "@language": "en",
2203
+ "@value": "TimeState"
2204
+ },
2205
+ "rdfs:subClassOf": {
2206
+ "@id": "oa:State"
2207
+ }
2208
+ },
2209
+ {
2210
+ "@id": "oa:State",
2211
+ "@type": "owl:Class",
2212
+ "rdfs:comment": {
2213
+ "@language": "en",
2214
+ "@value": "A resource which describes how to retrieve an appropriate representation of the Source resource, indicated with oa:hasState from the Specific Resource.\n\nThis class is not used directly in Annotations, only its subclasses are.\n\nThe Specifier's description MAY be conveyed as an external or embedded resource (cnt:Content), or as RDF properties within the graph. The description SHOULD use existing standards whenever possible. If the Specifier has an HTTP URI, then its description, and only its description, MUST be returned when the URI is dereferenced."
2215
+ },
2216
+ "rdfs:isDefinedBy": {
2217
+ "@id": "oa:"
2218
+ },
2219
+ "rdfs:label": {
2220
+ "@language": "en",
2221
+ "@value": "State"
2222
+ }
2223
+ },
2224
+ {
2225
+ "@id": "oa:CssStyle",
2226
+ "@type": "owl:Class",
2227
+ "rdfs:comment": {
2228
+ "@language": "en",
2229
+ "@value": "A resource which describes styles for resources participating in the Annotation using CSS.\n\nSpecific Resources MAY be assigned a CSS style class using oa:styleClass.\n\nThe CSS resource MAY have its own dereferencable URI that provides the information. For example, \"Style1\" in the diagram below might actually have the URI \"http://www.example.com/styles/annotations.css\". It MAY be embedded within the Annotation using the inline constructions described in Embedding Resources."
2230
+ },
2231
+ "rdfs:isDefinedBy": {
2232
+ "@id": "oa:"
2233
+ },
2234
+ "rdfs:label": {
2235
+ "@language": "en",
2236
+ "@value": "CssStyle"
2237
+ },
2238
+ "rdfs:subClassOf": {
2239
+ "@id": "oa:Style"
2240
+ }
2241
+ },
2242
+ {
2243
+ "@id": "oa:item",
2244
+ "@type": "owl:ObjectProperty",
2245
+ "rdfs:comment": {
2246
+ "@language": "en",
2247
+ "@value": "The relationship between a multiplicity construct node and its constituent resources.\n\nThere MUST be 1 or more item relationships for each multiplicity construct oa:Choice, oa:Composite and oa:List."
2248
+ },
2249
+ "rdfs:isDefinedBy": {
2250
+ "@id": "oa:"
2251
+ },
2252
+ "rdfs:label": {
2253
+ "@language": "en",
2254
+ "@value": "item"
2255
+ },
2256
+ "rdfs:subPropertyOf": {
2257
+ "@id": "rdfs:member"
2258
+ }
2259
+ },
2260
+ {
2261
+ "@id": "oa:hasScope",
2262
+ "@type": "owl:ObjectProperty",
2263
+ "rdfs:comment": {
2264
+ "@language": "en",
2265
+ "@value": "The relationship between a Specific Resource and the resource that provides the scope or context for it in this Annotation.\n\nThere MAY be 0 or more hasScope relationships for each Specific Resource."
2266
+ },
2267
+ "rdfs:domain": {
2268
+ "@id": "oa:SpecificResource"
2269
+ },
2270
+ "rdfs:isDefinedBy": {
2271
+ "@id": "oa:"
2272
+ },
2273
+ "rdfs:label": {
2274
+ "@language": "en",
2275
+ "@value": "hasScope"
2276
+ }
2277
+ },
2278
+ {
2279
+ "@id": "oa:suffix",
2280
+ "@type": "owl:DatatypeProperty",
2281
+ "rdfs:comment": {
2282
+ "@language": "en",
2283
+ "@value": "The snippet of text that occurs immediately after the text which is being selected. \n\nSee oa:TextQuoteSelector."
2284
+ },
2285
+ "rdfs:domain": {
2286
+ "@id": "oa:Selector"
2287
+ },
2288
+ "rdfs:isDefinedBy": {
2289
+ "@id": "oa:"
2290
+ },
2291
+ "rdfs:label": {
2292
+ "@language": "en",
2293
+ "@value": "suffix"
2294
+ }
2295
+ },
2296
+ {
2297
+ "@id": "oa:hasState",
2298
+ "@type": "owl:ObjectProperty",
2299
+ "rdfs:comment": {
2300
+ "@language": "en",
2301
+ "@value": "The relationship between a oa:SpecificResource and a oa:State resource.\n\nThere MAY be 0 or 1 oa:hasState relationship for each SpecificResource.\n\nIf there are multiple State resources that must be associated with the specific resource, then the use of the Multiplicity Constructs oa:Choice, oa:Composite or oa:List is RECOMMENDED."
2302
+ },
2303
+ "rdfs:domain": {
2304
+ "@id": "oa:SpecificResource"
2305
+ },
2306
+ "rdfs:isDefinedBy": {
2307
+ "@id": "oa:"
2308
+ },
2309
+ "rdfs:label": {
2310
+ "@language": "en",
2311
+ "@value": "hasState"
2312
+ },
2313
+ "rdfs:range": {
2314
+ "@id": "oa:State"
2315
+ }
2316
+ },
2317
+ {
2318
+ "@id": "oa:",
2319
+ "@type": "owl:Ontology",
2320
+ "dc:contributor": {
2321
+ "@language": "en",
2322
+ "@value": "Stian Soiland-Reyes"
2323
+ },
2324
+ "dc:creator": [
2325
+ {
2326
+ "@language": "en",
2327
+ "@value": "Robert Sanderson"
2328
+ },
2329
+ {
2330
+ "@language": "it",
2331
+ "@value": "Paolo Ciccarese"
2332
+ },
2333
+ {
2334
+ "@language": "vls",
2335
+ "@value": "Herbert Van de Sompel"
2336
+ }
2337
+ ],
2338
+ "dc:description": {
2339
+ "@language": "en",
2340
+ "@value": "The Open Annotation Core Data Model specifies an interoperable framework for creating associations between related resources, annotations, using a methodology that conforms to the Architecture of the World Wide Web. Open Annotations can easily be shared between platforms, with sufficient richness of expression to satisfy complex requirements while remaining simple enough to also allow for the most common use cases, such as attaching a piece of text to a single web resource.\n\nAn Annotation is considered to be a set of connected resources, typically including a body and target, where the body is somehow about the target. The full model supports additional functionality, enabling semantic annotations, embedding content, selecting segments of resources, choosing the appropriate representation of a resource and providing styling hints for consuming clients."
2341
+ },
2342
+ "dc:title": {
2343
+ "@language": "en",
2344
+ "@value": "Open Annotation Data Model"
2345
+ },
2346
+ "dcterms:modified": {
2347
+ "@type": "xsd:dateTime",
2348
+ "@value": "2013-02-22T21:40:51+01:00"
2349
+ },
2350
+ "owl:versionIRI": {
2351
+ "@id": "http://www.openannotation.org/spec/core/20130208/oa.owl"
2352
+ },
2353
+ "owl:versionInfo": "0.9.20130208",
2354
+ "rdfs:comment": {
2355
+ "@language": "en",
2356
+ "@value": "The Open Annotation Core Data Model specifies an interoperable framework for creating associations between related resources, annotations, using a methodology that conforms to the Architecture of the World Wide Web.\n\nThis ontology is a non-normative OWL formalization of the textual OA specification at http://www.openannotation.org/spec/core/20130208/index.html\n\nNote that OWL imports are disabled in the published version in order to reduce external implications, improve OWL 2 Profile conformity and increase interoperability. Some OWL tools might thus misleadingly show this ontology as (re)defining properties like skos:prefLabel."
2357
+ },
2358
+ "rdfs:seeAlso": {
2359
+ "@id": "http://www.openannotation.org/spec/core/20130208/index.html"
2360
+ }
2361
+ },
2362
+ {
2363
+ "@id": "oa:questioning",
2364
+ "@type": [
2365
+ "oa:Motivation",
2366
+ "owl:NamedIndividual"
2367
+ ],
2368
+ "rdfs:comment": {
2369
+ "@language": "en",
2370
+ "@value": "The motivation that represents asking a question about the target resource(s). For example to ask for assistance with a particular section of text, or question its veracity."
2371
+ },
2372
+ "skos:inScheme": {
2373
+ "@id": "oa:motivationScheme"
2374
+ },
2375
+ "skos:prefLabel": {
2376
+ "@language": "en",
2377
+ "@value": "questioning"
2378
+ }
2379
+ },
2380
+ {
2381
+ "@id": "oa:describing",
2382
+ "@type": [
2383
+ "oa:Motivation",
2384
+ "owl:NamedIndividual"
2385
+ ],
2386
+ "rdfs:comment": {
2387
+ "@language": "en",
2388
+ "@value": "The motivation that represents a description of the target resource(s), as opposed to a comment about them. For example describing the above PDF's contents, rather than commenting on their accuracy."
2389
+ },
2390
+ "skos:inScheme": {
2391
+ "@id": "oa:motivationScheme"
2392
+ },
2393
+ "skos:prefLabel": {
2394
+ "@language": "en",
2395
+ "@value": "describing"
2396
+ }
2397
+ },
2398
+ {
2399
+ "@id": "oa:styleClass",
2400
+ "@type": "owl:DatatypeProperty",
2401
+ "rdfs:comment": {
2402
+ "@language": "en",
2403
+ "@value": "The string name of the class used in the CSS description that should be applied to the Specific Resource.\n\nThere MAY be 0 or more styleClass properties on a Specific Resource.\n\nSee oa:CssStyle."
2404
+ },
2405
+ "rdfs:domain": {
2406
+ "@id": "oa:SpecificResource"
2407
+ },
2408
+ "rdfs:isDefinedBy": {
2409
+ "@id": "oa:"
2410
+ },
2411
+ "rdfs:label": {
2412
+ "@language": "en",
2413
+ "@value": "styleClass"
2414
+ }
2415
+ },
2416
+ {
2417
+ "@id": "oa:Tag",
2418
+ "@type": "owl:Class",
2419
+ "rdfs:comment": {
2420
+ "@language": "en",
2421
+ "@value": "A class assigned to the Body when it is a tag, such as a embedded text string with cnt:chars.\n\nTags are typically keywords or labels, and used for organization, description or discovery of the resource being tagged. In the Semantic Web, URIs are used instead of strings to avoid the issue of polysemy where one word has multiple meanings, such usage MUST be indicated using the subclass oa:SemanticTag.\n\nAnnotations that tag resources, either with text or semantic tags, SHOULD also have the oa:tagging motivation to make the reason for the Annotation more clear to applications, and MAY have other motivations as well."
2422
+ },
2423
+ "rdfs:isDefinedBy": {
2424
+ "@id": "oa:"
2425
+ },
2426
+ "rdfs:label": {
2427
+ "@language": "en",
2428
+ "@value": "Tag"
2429
+ }
2430
+ },
2431
+ {
2432
+ "@id": "oa:prefix",
2433
+ "@type": "owl:DatatypeProperty",
2434
+ "rdfs:comment": {
2435
+ "@language": "en",
2436
+ "@value": "A snippet of text that occurs immediately before the text which is being selected.\n\nSee oa:TextQuoteSelector."
2437
+ },
2438
+ "rdfs:domain": {
2439
+ "@id": "oa:Selector"
2440
+ },
2441
+ "rdfs:isDefinedBy": {
2442
+ "@id": "oa:"
2443
+ },
2444
+ "rdfs:label": {
2445
+ "@language": "en",
2446
+ "@value": "prefix"
2447
+ }
2448
+ }
2449
+ ]
2450
+ }
2451
+
2452
+
2453
+ http_version:
2454
+ recorded_at: Tue, 05 May 2015 19:18:19 GMT
2455
+ - request:
2456
+ method: get
2457
+ uri: http://localhost:3000/annotations/875190ee-1fa4-4298-916b-147d1cbce91f
2458
+ body:
2459
+ encoding: US-ASCII
2460
+ string: ''
2461
+ headers:
2462
+ Accept:
2463
+ - application/n-quads
2464
+ Accept-Encoding:
2465
+ - gzip, deflate
2466
+ User-Agent:
2467
+ - Ruby
2468
+ response:
2469
+ status:
2470
+ code: 406
2471
+ message: 'Not Acceptable '
2472
+ headers:
2473
+ Content-Type:
2474
+ - text/html; charset=utf-8
2475
+ Content-Length:
2476
+ - '129110'
2477
+ X-Request-Id:
2478
+ - a015b04f-7a5f-4651-9f13-d51723dd92e4
2479
+ X-Runtime:
2480
+ - '0.239855'
2481
+ Server:
2482
+ - WEBrick/1.3.1 (Ruby/2.1.5/2014-11-13)
2483
+ Date:
2484
+ - Tue, 05 May 2015 19:18:19 GMT
2485
+ Connection:
2486
+ - Keep-Alive
2487
+ body:
2488
+ encoding: UTF-8
2489
+ string: "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\"
2490
+ />\n <title>Action Controller: Exception caught</title>\n <style>\n body
2491
+ {\n background-color: #FAFAFA;\n color: #333;\n margin: 0px;\n
2492
+ \ }\n\n body, p, ol, ul, td {\n font-family: helvetica, verdana,
2493
+ arial, sans-serif;\n font-size: 13px;\n line-height: 18px;\n }\n\n
2494
+ \ pre {\n font-size: 11px;\n white-space: pre-wrap;\n }\n\n
2495
+ \ pre.box {\n border: 1px solid #EEE;\n padding: 10px;\n margin:
2496
+ 0px;\n width: 958px;\n }\n\n header {\n color: #F0F0F0;\n
2497
+ \ background: #C52F24;\n padding: 0.5em 1.5em;\n }\n\n h1 {\n
2498
+ \ margin: 0.2em 0;\n line-height: 1.1em;\n font-size: 2em;\n
2499
+ \ }\n\n h2 {\n color: #C52F24;\n line-height: 25px;\n }\n\n
2500
+ \ .details {\n border: 1px solid #D0D0D0;\n border-radius: 4px;\n
2501
+ \ margin: 1em 0px;\n display: block;\n width: 978px;\n }\n\n
2502
+ \ .summary {\n padding: 8px 15px;\n border-bottom: 1px solid #D0D0D0;\n
2503
+ \ display: block;\n }\n\n .details pre {\n margin: 5px;\n border:
2504
+ none;\n }\n\n #container {\n box-sizing: border-box;\n width:
2505
+ 100%;\n padding: 0 1.5em;\n }\n\n .source * {\n margin: 0px;\n
2506
+ \ padding: 0px;\n }\n\n .source {\n border: 1px solid #D9D9D9;\n
2507
+ \ background: #ECECEC;\n width: 978px;\n }\n\n .source pre
2508
+ {\n padding: 10px 0px;\n border: none;\n }\n\n .source .data
2509
+ {\n font-size: 80%;\n overflow: auto;\n background-color: #FFF;\n
2510
+ \ }\n\n .info {\n padding: 0.5em;\n }\n\n .source .data .line_numbers
2511
+ {\n background-color: #ECECEC;\n color: #AAA;\n padding: 1em
2512
+ .5em;\n border-right: 1px solid #DDD;\n text-align: right;\n }\n\n
2513
+ \ .line {\n padding-left: 10px;\n }\n\n .line:hover {\n background-color:
2514
+ #F6F6F6;\n }\n\n .line.active {\n background-color: #FFCCCC;\n
2515
+ \ }\n\n .hidden {\n display: none;\n }\n\n a { color: #980905;
2516
+ }\n a:visited { color: #666; }\n a.trace-frames { color: #666; }\n a:hover
2517
+ { color: #C52F24; }\n a.trace-frames.selected { color: #C52F24 }\n\n \n
2518
+ \ </style>\n\n <script>\n var toggle = function(id) {\n var s = document.getElementById(id).style;\n
2519
+ \ s.display = s.display == 'none' ? 'block' : 'none';\n return false;\n
2520
+ \ }\n var show = function(id) {\n document.getElementById(id).style.display
2521
+ = 'block';\n }\n var hide = function(id) {\n document.getElementById(id).style.display
2522
+ = 'none';\n }\n var toggleTrace = function() {\n return toggle('blame_trace');\n
2523
+ \ }\n var toggleSessionDump = function() {\n return toggle('session_dump');\n
2524
+ \ }\n var toggleEnvDump = function() {\n return toggle('env_dump');\n
2525
+ \ }\n </script>\n</head>\n<body>\n\n<header>\n <h1>\n ActionController::UnknownFormat\n
2526
+ \ in Triannon::AnnotationsController#show\n </h1>\n</header>\n\n<div
2527
+ id=\"container\">\n <h2>ActionController::UnknownFormat</h2>\n\n <div
2528
+ class=\"source \" id=\"frame-source-0\">\n <div class=\"info\">\n Extracted
2529
+ source (around line <strong>#218</strong>):\n </div>\n <div class=\"data\">\n
2530
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2531
+ \ <td>\n <pre class=\"line_numbers\">\n<span>216</span>\n<span>217</span>\n<span>218</span>\n<span>219</span>\n<span>220</span>\n<span>221</span>\n
2532
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2533
+ class=\"line\"> response ? response.call : render({})\n</div><div class=\"line\">
2534
+ \ else\n</div><div class=\"line active\"> raise ActionController::UnknownFormat\n</div><div
2535
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
2536
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2537
+ hidden\" id=\"frame-source-1\">\n <div class=\"info\">\n Extracted
2538
+ source (around line <strong>#21</strong>):\n </div>\n <div class=\"data\">\n
2539
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2540
+ \ <td>\n <pre class=\"line_numbers\">\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n<span>24</span>\n
2541
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2542
+ class=\"line\"> def show\n</div><div class=\"line\"> # TODO: json.set!
2543
+ &quot;@context&quot;, Triannon::JsonldContext::OA_DATED_CONTEXT_URL - would
2544
+ this work?\n</div><div class=\"line active\"> respond_to do |format|\n</div><div
2545
+ class=\"line\"> format.jsonld {\n</div><div class=\"line\"> context_url
2546
+ = context_url_from_accept ? context_url_from_accept : context_url_from_link\n</div><div
2547
+ class=\"line\"> if context_url &amp;&amp; context_url == Triannon::JsonldContext::IIIF_CONTEXT_URL\n</div>\n</pre>\n</td>\n
2548
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2549
+ hidden\" id=\"frame-source-2\">\n <div class=\"info\">\n Extracted
2550
+ source (around line <strong>#4</strong>):\n </div>\n <div class=\"data\">\n
2551
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2552
+ \ <td>\n <pre class=\"line_numbers\">\n<span>2</span>\n<span>3</span>\n<span>4</span>\n<span>5</span>\n<span>6</span>\n<span>7</span>\n
2553
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2554
+ class=\"line\"> module ImplicitRender\n</div><div class=\"line\"> def
2555
+ send_action(method, *args)\n</div><div class=\"line active\"> ret = super\n</div><div
2556
+ class=\"line\"> default_render unless performed?\n</div><div class=\"line\">
2557
+ \ ret\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n
2558
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2559
+ id=\"frame-source-3\">\n <div class=\"info\">\n Extracted source
2560
+ (around line <strong>#198</strong>):\n </div>\n <div class=\"data\">\n
2561
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2562
+ \ <td>\n <pre class=\"line_numbers\">\n<span>196</span>\n<span>197</span>\n<span>198</span>\n<span>199</span>\n<span>200</span>\n<span>201</span>\n
2563
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2564
+ class=\"line\"> # which is *not* necessarily the same as the action name.\n</div><div
2565
+ class=\"line\"> def process_action(method_name, *args)\n</div><div class=\"line
2566
+ active\"> send_action(method_name, *args)\n</div><div class=\"line\">
2567
+ \ end\n</div><div class=\"line\">\n</div><div class=\"line\"> # Actually
2568
+ call the method associated with the action. Override\n</div>\n</pre>\n</td>\n
2569
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2570
+ hidden\" id=\"frame-source-4\">\n <div class=\"info\">\n Extracted
2571
+ source (around line <strong>#10</strong>):\n </div>\n <div class=\"data\">\n
2572
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2573
+ \ <td>\n <pre class=\"line_numbers\">\n<span>8</span>\n<span>9</span>\n<span>10</span>\n<span>11</span>\n<span>12</span>\n<span>13</span>\n
2574
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2575
+ class=\"line\"> def process_action(*) #:nodoc:\n</div><div class=\"line\">
2576
+ \ self.formats = request.formats.map(&amp;:ref).compact\n</div><div class=\"line
2577
+ active\"> super\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div><div
2578
+ class=\"line\"> # Check for double render errors and set the content_type
2579
+ after rendering.\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2580
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-5\">\n
2581
+ \ <div class=\"info\">\n Extracted source (around line <strong>#20</strong>):\n
2582
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2583
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2584
+ class=\"line_numbers\">\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n
2585
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2586
+ class=\"line\"> def process_action(*args)\n</div><div class=\"line\"> run_callbacks(:process_action)
2587
+ do\n</div><div class=\"line active\"> super\n</div><div class=\"line\">
2588
+ \ end\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
2589
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2590
+ hidden\" id=\"frame-source-6\">\n <div class=\"info\">\n Extracted
2591
+ source (around line <strong>#117</strong>):\n </div>\n <div class=\"data\">\n
2592
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2593
+ \ <td>\n <pre class=\"line_numbers\">\n<span>115</span>\n<span>116</span>\n<span>117</span>\n<span>118</span>\n<span>119</span>\n<span>120</span>\n
2594
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2595
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> block
2596
+ = env.run_block\n</div><div class=\"line active\"> env.value = !env.halted
2597
+ &amp;&amp; (!block || block.call)\n</div><div class=\"line\"> env\n</div><div
2598
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
2599
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2600
+ hidden\" id=\"frame-source-7\">\n <div class=\"info\">\n Extracted
2601
+ source (around line <strong>#117</strong>):\n </div>\n <div class=\"data\">\n
2602
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2603
+ \ <td>\n <pre class=\"line_numbers\">\n<span>115</span>\n<span>116</span>\n<span>117</span>\n<span>118</span>\n<span>119</span>\n<span>120</span>\n
2604
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2605
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> block
2606
+ = env.run_block\n</div><div class=\"line active\"> env.value = !env.halted
2607
+ &amp;&amp; (!block || block.call)\n</div><div class=\"line\"> env\n</div><div
2608
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
2609
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2610
+ hidden\" id=\"frame-source-8\">\n <div class=\"info\">\n Extracted
2611
+ source (around line <strong>#151</strong>):\n </div>\n <div class=\"data\">\n
2612
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2613
+ \ <td>\n <pre class=\"line_numbers\">\n<span>149</span>\n<span>150</span>\n<span>151</span>\n<span>152</span>\n<span>153</span>\n<span>154</span>\n
2614
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2615
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2616
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2617
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2618
+ \ private_class_method :halting_and_conditional\n</div>\n</pre>\n</td>\n
2619
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2620
+ hidden\" id=\"frame-source-9\">\n <div class=\"info\">\n Extracted
2621
+ source (around line <strong>#151</strong>):\n </div>\n <div class=\"data\">\n
2622
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2623
+ \ <td>\n <pre class=\"line_numbers\">\n<span>149</span>\n<span>150</span>\n<span>151</span>\n<span>152</span>\n<span>153</span>\n<span>154</span>\n
2624
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2625
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2626
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2627
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2628
+ \ private_class_method :halting_and_conditional\n</div>\n</pre>\n</td>\n
2629
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2630
+ hidden\" id=\"frame-source-10\">\n <div class=\"info\">\n Extracted
2631
+ source (around line <strong>#151</strong>):\n </div>\n <div class=\"data\">\n
2632
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2633
+ \ <td>\n <pre class=\"line_numbers\">\n<span>149</span>\n<span>150</span>\n<span>151</span>\n<span>152</span>\n<span>153</span>\n<span>154</span>\n
2634
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2635
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2636
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2637
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2638
+ \ private_class_method :halting_and_conditional\n</div>\n</pre>\n</td>\n
2639
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2640
+ hidden\" id=\"frame-source-11\">\n <div class=\"info\">\n Extracted
2641
+ source (around line <strong>#234</strong>):\n </div>\n <div class=\"data\">\n
2642
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2643
+ \ <td>\n <pre class=\"line_numbers\">\n<span>232</span>\n<span>233</span>\n<span>234</span>\n<span>235</span>\n<span>236</span>\n<span>237</span>\n
2644
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2645
+ class=\"line\"> def self.halting(next_callback, user_callback)\n</div><div
2646
+ class=\"line\"> lambda { |env|\n</div><div class=\"line active\">
2647
+ \ env = next_callback.call env\n</div><div class=\"line\"> unless
2648
+ env.halted\n</div><div class=\"line\"> user_callback.call env.target,
2649
+ env.value\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
2650
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2651
+ hidden\" id=\"frame-source-12\">\n <div class=\"info\">\n Extracted
2652
+ source (around line <strong>#234</strong>):\n </div>\n <div class=\"data\">\n
2653
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2654
+ \ <td>\n <pre class=\"line_numbers\">\n<span>232</span>\n<span>233</span>\n<span>234</span>\n<span>235</span>\n<span>236</span>\n<span>237</span>\n
2655
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2656
+ class=\"line\"> def self.halting(next_callback, user_callback)\n</div><div
2657
+ class=\"line\"> lambda { |env|\n</div><div class=\"line active\">
2658
+ \ env = next_callback.call env\n</div><div class=\"line\"> unless
2659
+ env.halted\n</div><div class=\"line\"> user_callback.call env.target,
2660
+ env.value\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
2661
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2662
+ hidden\" id=\"frame-source-13\">\n <div class=\"info\">\n Extracted
2663
+ source (around line <strong>#169</strong>):\n </div>\n <div class=\"data\">\n
2664
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2665
+ \ <td>\n <pre class=\"line_numbers\">\n<span>167</span>\n<span>168</span>\n<span>169</span>\n<span>170</span>\n<span>171</span>\n<span>172</span>\n
2666
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2667
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2668
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2669
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2670
+ \ private_class_method :halting\n</div>\n</pre>\n</td>\n </tr>\n
2671
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2672
+ id=\"frame-source-14\">\n <div class=\"info\">\n Extracted source
2673
+ (around line <strong>#169</strong>):\n </div>\n <div class=\"data\">\n
2674
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2675
+ \ <td>\n <pre class=\"line_numbers\">\n<span>167</span>\n<span>168</span>\n<span>169</span>\n<span>170</span>\n<span>171</span>\n<span>172</span>\n
2676
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2677
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2678
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2679
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2680
+ \ private_class_method :halting\n</div>\n</pre>\n</td>\n </tr>\n
2681
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2682
+ id=\"frame-source-15\">\n <div class=\"info\">\n Extracted source
2683
+ (around line <strong>#169</strong>):\n </div>\n <div class=\"data\">\n
2684
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2685
+ \ <td>\n <pre class=\"line_numbers\">\n<span>167</span>\n<span>168</span>\n<span>169</span>\n<span>170</span>\n<span>171</span>\n<span>172</span>\n
2686
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2687
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2688
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2689
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2690
+ \ private_class_method :halting\n</div>\n</pre>\n</td>\n </tr>\n
2691
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2692
+ id=\"frame-source-16\">\n <div class=\"info\">\n Extracted source
2693
+ (around line <strong>#169</strong>):\n </div>\n <div class=\"data\">\n
2694
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2695
+ \ <td>\n <pre class=\"line_numbers\">\n<span>167</span>\n<span>168</span>\n<span>169</span>\n<span>170</span>\n<span>171</span>\n<span>172</span>\n
2696
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2697
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2698
+ class=\"line active\"> next_callback.call env\n</div><div class=\"line\">
2699
+ \ }\n</div><div class=\"line\"> end\n</div><div class=\"line\">
2700
+ \ private_class_method :halting\n</div>\n</pre>\n</td>\n </tr>\n
2701
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2702
+ id=\"frame-source-17\">\n <div class=\"info\">\n Extracted source
2703
+ (around line <strong>#92</strong>):\n </div>\n <div class=\"data\">\n
2704
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2705
+ \ <td>\n <pre class=\"line_numbers\">\n<span>90</span>\n<span>91</span>\n<span>92</span>\n<span>93</span>\n<span>94</span>\n<span>95</span>\n
2706
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2707
+ class=\"line\"> runner = callbacks.compile\n</div><div class=\"line\">
2708
+ \ e = Filters::Environment.new(self, false, nil, block)\n</div><div
2709
+ class=\"line active\"> runner.call(e).value\n</div><div class=\"line\">
2710
+ \ end\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
2711
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2712
+ hidden\" id=\"frame-source-18\">\n <div class=\"info\">\n Extracted
2713
+ source (around line <strong>#92</strong>):\n </div>\n <div class=\"data\">\n
2714
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2715
+ \ <td>\n <pre class=\"line_numbers\">\n<span>90</span>\n<span>91</span>\n<span>92</span>\n<span>93</span>\n<span>94</span>\n<span>95</span>\n
2716
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2717
+ class=\"line\"> runner = callbacks.compile\n</div><div class=\"line\">
2718
+ \ e = Filters::Environment.new(self, false, nil, block)\n</div><div
2719
+ class=\"line active\"> runner.call(e).value\n</div><div class=\"line\">
2720
+ \ end\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
2721
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2722
+ hidden\" id=\"frame-source-19\">\n <div class=\"info\">\n Extracted
2723
+ source (around line <strong>#734</strong>):\n </div>\n <div class=\"data\">\n
2724
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2725
+ \ <td>\n <pre class=\"line_numbers\">\n<span>732</span>\n<span>733</span>\n<span>734</span>\n<span>735</span>\n<span>736</span>\n<span>737</span>\n
2726
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2727
+ class=\"line\"> module_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1\n</div><div
2728
+ class=\"line\"> def _run_#{name}_callbacks(&amp;block)\n</div><div
2729
+ class=\"line active\"> _run_callbacks(_#{name}_callbacks, &amp;block)\n</div><div
2730
+ class=\"line\"> end\n</div><div class=\"line\"> RUBY\n</div><div
2731
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2732
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-20\">\n
2733
+ \ <div class=\"info\">\n Extracted source (around line <strong>#81</strong>):\n
2734
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2735
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2736
+ class=\"line_numbers\">\n<span>79</span>\n<span>80</span>\n<span>81</span>\n<span>82</span>\n<span>83</span>\n<span>84</span>\n
2737
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2738
+ class=\"line\"> # end\n</div><div class=\"line\"> def run_callbacks(kind,
2739
+ &amp;block)\n</div><div class=\"line active\"> send &quot;_run_#{kind}_callbacks&quot;,
2740
+ &amp;block\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div><div
2741
+ class=\"line\"> private\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2742
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-21\">\n
2743
+ \ <div class=\"info\">\n Extracted source (around line <strong>#19</strong>):\n
2744
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2745
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2746
+ class=\"line_numbers\">\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n
2747
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2748
+ class=\"line\"> # process_action callbacks around the normal behavior.\n</div><div
2749
+ class=\"line\"> def process_action(*args)\n</div><div class=\"line active\">
2750
+ \ run_callbacks(:process_action) do\n</div><div class=\"line\"> super\n</div><div
2751
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
2752
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2753
+ hidden\" id=\"frame-source-22\">\n <div class=\"info\">\n Extracted
2754
+ source (around line <strong>#29</strong>):\n </div>\n <div class=\"data\">\n
2755
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2756
+ \ <td>\n <pre class=\"line_numbers\">\n<span>27</span>\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n
2757
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2758
+ class=\"line\"> private\n</div><div class=\"line\"> def process_action(*args)\n</div><div
2759
+ class=\"line active\"> super\n</div><div class=\"line\"> rescue
2760
+ Exception =&gt; exception\n</div><div class=\"line\"> request.env[&#39;action_dispatch.show_detailed_exceptions&#39;]
2761
+ ||= show_detailed_exceptions?\n</div><div class=\"line\"> rescue_with_handler(exception)
2762
+ || raise(exception)\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2763
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-23\">\n
2764
+ \ <div class=\"info\">\n Extracted source (around line <strong>#31</strong>):\n
2765
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2766
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2767
+ class=\"line_numbers\">\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n<span>34</span>\n
2768
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2769
+ class=\"line\">\n</div><div class=\"line\"> ActiveSupport::Notifications.instrument(&quot;process_action.action_controller&quot;,
2770
+ raw_payload) do |payload|\n</div><div class=\"line active\"> result
2771
+ = super\n</div><div class=\"line\"> payload[:status] = response.status\n</div><div
2772
+ class=\"line\"> append_info_to_payload(payload)\n</div><div class=\"line\">
2773
+ \ result\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2774
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-24\">\n
2775
+ \ <div class=\"info\">\n Extracted source (around line <strong>#164</strong>):\n
2776
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2777
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2778
+ class=\"line_numbers\">\n<span>162</span>\n<span>163</span>\n<span>164</span>\n<span>165</span>\n<span>166</span>\n<span>167</span>\n
2779
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2780
+ class=\"line\"> def instrument(name, payload = {})\n</div><div class=\"line\">
2781
+ \ if notifier.listening?(name)\n</div><div class=\"line active\"> instrumenter.instrument(name,
2782
+ payload) { yield payload if block_given? }\n</div><div class=\"line\"> else\n</div><div
2783
+ class=\"line\"> yield payload if block_given?\n</div><div class=\"line\">
2784
+ \ end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
2785
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-25\">\n <div
2786
+ class=\"info\">\n Extracted source (around line <strong>#20</strong>):\n
2787
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2788
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2789
+ class=\"line_numbers\">\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n
2790
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2791
+ class=\"line\"> start name, payload\n</div><div class=\"line\"> begin\n</div><div
2792
+ class=\"line active\"> yield payload\n</div><div class=\"line\">
2793
+ \ rescue Exception =&gt; e\n</div><div class=\"line\"> payload[:exception]
2794
+ = [e.class.name, e.message]\n</div><div class=\"line\"> raise e\n</div>\n</pre>\n</td>\n
2795
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2796
+ hidden\" id=\"frame-source-26\">\n <div class=\"info\">\n Extracted
2797
+ source (around line <strong>#164</strong>):\n </div>\n <div class=\"data\">\n
2798
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2799
+ \ <td>\n <pre class=\"line_numbers\">\n<span>162</span>\n<span>163</span>\n<span>164</span>\n<span>165</span>\n<span>166</span>\n<span>167</span>\n
2800
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2801
+ class=\"line\"> def instrument(name, payload = {})\n</div><div class=\"line\">
2802
+ \ if notifier.listening?(name)\n</div><div class=\"line active\"> instrumenter.instrument(name,
2803
+ payload) { yield payload if block_given? }\n</div><div class=\"line\"> else\n</div><div
2804
+ class=\"line\"> yield payload if block_given?\n</div><div class=\"line\">
2805
+ \ end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
2806
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-27\">\n <div
2807
+ class=\"info\">\n Extracted source (around line <strong>#30</strong>):\n
2808
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2809
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2810
+ class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
2811
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2812
+ class=\"line\"> ActiveSupport::Notifications.instrument(&quot;start_processing.action_controller&quot;,
2813
+ raw_payload.dup)\n</div><div class=\"line\">\n</div><div class=\"line active\">
2814
+ \ ActiveSupport::Notifications.instrument(&quot;process_action.action_controller&quot;,
2815
+ raw_payload) do |payload|\n</div><div class=\"line\"> result = super\n</div><div
2816
+ class=\"line\"> payload[:status] = response.status\n</div><div class=\"line\">
2817
+ \ append_info_to_payload(payload)\n</div>\n</pre>\n</td>\n </tr>\n
2818
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2819
+ id=\"frame-source-28\">\n <div class=\"info\">\n Extracted source
2820
+ (around line <strong>#250</strong>):\n </div>\n <div class=\"data\">\n
2821
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2822
+ \ <td>\n <pre class=\"line_numbers\">\n<span>248</span>\n<span>249</span>\n<span>250</span>\n<span>251</span>\n<span>252</span>\n<span>253</span>\n
2823
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2824
+ class=\"line\"> request.filtered_parameters.merge! wrapped_filtered_hash\n</div><div
2825
+ class=\"line\"> end\n</div><div class=\"line active\"> super\n</div><div
2826
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
2827
+ \ private\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
2828
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-29\">\n <div
2829
+ class=\"info\">\n Extracted source (around line <strong>#18</strong>):\n
2830
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2831
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2832
+ class=\"line_numbers\">\n<span>16</span>\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n
2833
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2834
+ class=\"line\"> # and it won&#39;t be cleaned up by the method below.\n</div><div
2835
+ class=\"line\"> ActiveRecord::LogSubscriber.reset_runtime\n</div><div
2836
+ class=\"line active\"> super\n</div><div class=\"line\"> end\n</div><div
2837
+ class=\"line\">\n</div><div class=\"line\"> def cleanup_view_runtime\n</div>\n</pre>\n</td>\n
2838
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2839
+ hidden\" id=\"frame-source-30\">\n <div class=\"info\">\n Extracted
2840
+ source (around line <strong>#137</strong>):\n </div>\n <div class=\"data\">\n
2841
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2842
+ \ <td>\n <pre class=\"line_numbers\">\n<span>135</span>\n<span>136</span>\n<span>137</span>\n<span>138</span>\n<span>139</span>\n<span>140</span>\n
2843
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2844
+ class=\"line\"> @_response_body = nil\n</div><div class=\"line\">\n</div><div
2845
+ class=\"line active\"> process_action(action_name, *args)\n</div><div
2846
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
2847
+ \ # Delegates to the class&#39; #controller_path\n</div>\n</pre>\n</td>\n
2848
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2849
+ hidden\" id=\"frame-source-31\">\n <div class=\"info\">\n Extracted
2850
+ source (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
2851
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2852
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
2853
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2854
+ class=\"line\"> def process(*) #:nodoc:\n</div><div class=\"line\"> old_config,
2855
+ I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)\n</div><div
2856
+ class=\"line active\"> super\n</div><div class=\"line\"> ensure\n</div><div
2857
+ class=\"line\"> I18n.config = old_config\n</div><div class=\"line\">
2858
+ \ end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
2859
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-32\">\n <div
2860
+ class=\"info\">\n Extracted source (around line <strong>#195</strong>):\n
2861
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2862
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2863
+ class=\"line_numbers\">\n<span>193</span>\n<span>194</span>\n<span>195</span>\n<span>196</span>\n<span>197</span>\n<span>198</span>\n
2864
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2865
+ class=\"line\"> @_env = request.env\n</div><div class=\"line\"> @_env[&#39;action_controller.instance&#39;]
2866
+ = self\n</div><div class=\"line active\"> process(name)\n</div><div class=\"line\">
2867
+ \ to_a\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
2868
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
2869
+ hidden\" id=\"frame-source-33\">\n <div class=\"info\">\n Extracted
2870
+ source (around line <strong>#13</strong>):\n </div>\n <div class=\"data\">\n
2871
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2872
+ \ <td>\n <pre class=\"line_numbers\">\n<span>11</span>\n<span>12</span>\n<span>13</span>\n<span>14</span>\n<span>15</span>\n<span>16</span>\n
2873
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2874
+ class=\"line\"> def dispatch(action, request)\n</div><div class=\"line\">
2875
+ \ set_response!(request)\n</div><div class=\"line active\"> super(action,
2876
+ request)\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div><div
2877
+ class=\"line\"> def response_body=(body)\n</div>\n</pre>\n</td>\n </tr>\n
2878
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2879
+ id=\"frame-source-34\">\n <div class=\"info\">\n Extracted source
2880
+ (around line <strong>#236</strong>):\n </div>\n <div class=\"data\">\n
2881
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2882
+ \ <td>\n <pre class=\"line_numbers\">\n<span>234</span>\n<span>235</span>\n<span>236</span>\n<span>237</span>\n<span>238</span>\n<span>239</span>\n
2883
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2884
+ class=\"line\"> end\n</div><div class=\"line\"> else\n</div><div
2885
+ class=\"line active\"> lambda { |env| new.dispatch(name, klass.new(env))
2886
+ }\n</div><div class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
2887
+ class=\"line\">\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2888
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-35\">\n
2889
+ \ <div class=\"info\">\n Extracted source (around line <strong>#73</strong>):\n
2890
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2891
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2892
+ class=\"line_numbers\">\n<span>71</span>\n<span>72</span>\n<span>73</span>\n<span>74</span>\n<span>75</span>\n<span>76</span>\n
2893
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2894
+ class=\"line\">\n</div><div class=\"line\"> def dispatch(controller,
2895
+ action, env)\n</div><div class=\"line active\"> controller.action(action).call(env)\n</div><div
2896
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
2897
+ \ def normalize_controller!(params)\n</div>\n</pre>\n</td>\n </tr>\n
2898
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2899
+ id=\"frame-source-36\">\n <div class=\"info\">\n Extracted source
2900
+ (around line <strong>#73</strong>):\n </div>\n <div class=\"data\">\n
2901
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2902
+ \ <td>\n <pre class=\"line_numbers\">\n<span>71</span>\n<span>72</span>\n<span>73</span>\n<span>74</span>\n<span>75</span>\n<span>76</span>\n
2903
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2904
+ class=\"line\">\n</div><div class=\"line\"> def dispatch(controller,
2905
+ action, env)\n</div><div class=\"line active\"> controller.action(action).call(env)\n</div><div
2906
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
2907
+ \ def normalize_controller!(params)\n</div>\n</pre>\n</td>\n </tr>\n
2908
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2909
+ id=\"frame-source-37\">\n <div class=\"info\">\n Extracted source
2910
+ (around line <strong>#42</strong>):\n </div>\n <div class=\"data\">\n
2911
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2912
+ \ <td>\n <pre class=\"line_numbers\">\n<span>40</span>\n<span>41</span>\n<span>42</span>\n<span>43</span>\n<span>44</span>\n<span>45</span>\n
2913
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2914
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line
2915
+ active\"> dispatch(controller, params[:action], req.env)\n</div><div
2916
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
2917
+ \ def prepare_params!(params)\n</div>\n</pre>\n</td>\n </tr>\n
2918
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2919
+ id=\"frame-source-38\">\n <div class=\"info\">\n Extracted source
2920
+ (around line <strong>#49</strong>):\n </div>\n <div class=\"data\">\n
2921
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2922
+ \ <td>\n <pre class=\"line_numbers\">\n<span>47</span>\n<span>48</span>\n<span>49</span>\n<span>50</span>\n<span>51</span>\n<span>52</span>\n
2923
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2924
+ class=\"line\">\n</div><div class=\"line\"> if dispatcher?\n</div><div
2925
+ class=\"line active\"> @app.serve req\n</div><div class=\"line\">
2926
+ \ else\n</div><div class=\"line\"> @app.call req.env\n</div><div
2927
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2928
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-39\">\n
2929
+ \ <div class=\"info\">\n Extracted source (around line <strong>#43</strong>):\n
2930
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2931
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2932
+ class=\"line_numbers\">\n<span>41</span>\n<span>42</span>\n<span>43</span>\n<span>44</span>\n<span>45</span>\n<span>46</span>\n
2933
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2934
+ class=\"line\"> req.path_parameters = set_params.merge parameters\n</div><div
2935
+ class=\"line\">\n</div><div class=\"line active\"> status, headers,
2936
+ body = route.app.serve(req)\n</div><div class=\"line\">\n</div><div class=\"line\">
2937
+ \ if &#39;pass&#39; == headers[&#39;X-Cascade&#39;]\n</div><div class=\"line\">
2938
+ \ req.script_name = script_name\n</div>\n</pre>\n</td>\n </tr>\n
2939
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2940
+ id=\"frame-source-40\">\n <div class=\"info\">\n Extracted source
2941
+ (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
2942
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2943
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
2944
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2945
+ class=\"line\">\n</div><div class=\"line\"> def serve(req)\n</div><div
2946
+ class=\"line active\"> find_routes(req).each do |match, parameters,
2947
+ route|\n</div><div class=\"line\"> set_params = req.path_parameters\n</div><div
2948
+ class=\"line\"> path_info = req.path_info\n</div><div class=\"line\">
2949
+ \ script_name = req.script_name\n</div>\n</pre>\n</td>\n </tr>\n
2950
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2951
+ id=\"frame-source-41\">\n <div class=\"info\">\n Extracted source
2952
+ (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
2953
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2954
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
2955
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2956
+ class=\"line\">\n</div><div class=\"line\"> def serve(req)\n</div><div
2957
+ class=\"line active\"> find_routes(req).each do |match, parameters,
2958
+ route|\n</div><div class=\"line\"> set_params = req.path_parameters\n</div><div
2959
+ class=\"line\"> path_info = req.path_info\n</div><div class=\"line\">
2960
+ \ script_name = req.script_name\n</div>\n</pre>\n</td>\n </tr>\n
2961
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2962
+ id=\"frame-source-42\">\n <div class=\"info\">\n Extracted source
2963
+ (around line <strong>#802</strong>):\n </div>\n <div class=\"data\">\n
2964
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2965
+ \ <td>\n <pre class=\"line_numbers\">\n<span>800</span>\n<span>801</span>\n<span>802</span>\n<span>803</span>\n<span>804</span>\n<span>805</span>\n
2966
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2967
+ class=\"line\"> req = request_class.new(env)\n</div><div class=\"line\">
2968
+ \ req.path_info = Journey::Router::Utils.normalize_path(req.path_info)\n</div><div
2969
+ class=\"line active\"> @router.serve(req)\n</div><div class=\"line\">
2970
+ \ end\n</div><div class=\"line\">\n</div><div class=\"line\"> def
2971
+ recognize_path(path, environment = {})\n</div>\n</pre>\n</td>\n </tr>\n
2972
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2973
+ id=\"frame-source-43\">\n <div class=\"info\">\n Extracted source
2974
+ (around line <strong>#518</strong>):\n </div>\n <div class=\"data\">\n
2975
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2976
+ \ <td>\n <pre class=\"line_numbers\">\n<span>516</span>\n<span>517</span>\n<span>518</span>\n<span>519</span>\n<span>520</span>\n<span>521</span>\n
2977
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2978
+ class=\"line\"> env[&quot;ROUTES_#{routes.object_id}_SCRIPT_NAME&quot;]
2979
+ = env[&#39;SCRIPT_NAME&#39;].dup\n</div><div class=\"line\"> end\n</div><div
2980
+ class=\"line active\"> app.call(env)\n</div><div class=\"line\"> end\n</div><div
2981
+ class=\"line\">\n</div><div class=\"line\"> # Defines additional Rack env
2982
+ configuration that is added on each call.\n</div>\n</pre>\n</td>\n </tr>\n
2983
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
2984
+ id=\"frame-source-44\">\n <div class=\"info\">\n Extracted source
2985
+ (around line <strong>#194</strong>):\n </div>\n <div class=\"data\">\n
2986
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
2987
+ \ <td>\n <pre class=\"line_numbers\">\n<span>192</span>\n<span>193</span>\n<span>194</span>\n<span>195</span>\n<span>196</span>\n<span>197</span>\n
2988
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
2989
+ class=\"line\"> def method_missing(name, *args, &amp;block)\n</div><div
2990
+ class=\"line\"> if instance.respond_to?(name)\n</div><div class=\"line
2991
+ active\"> instance.public_send(name, *args, &amp;block)\n</div><div
2992
+ class=\"line\"> else\n</div><div class=\"line\"> super\n</div><div
2993
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
2994
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-45\">\n
2995
+ \ <div class=\"info\">\n Extracted source (around line <strong>#194</strong>):\n
2996
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
2997
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
2998
+ class=\"line_numbers\">\n<span>192</span>\n<span>193</span>\n<span>194</span>\n<span>195</span>\n<span>196</span>\n<span>197</span>\n
2999
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3000
+ class=\"line\"> def method_missing(name, *args, &amp;block)\n</div><div
3001
+ class=\"line\"> if instance.respond_to?(name)\n</div><div class=\"line
3002
+ active\"> instance.public_send(name, *args, &amp;block)\n</div><div
3003
+ class=\"line\"> else\n</div><div class=\"line\"> super\n</div><div
3004
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3005
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-46\">\n
3006
+ \ <div class=\"info\">\n Extracted source (around line <strong>#51</strong>):\n
3007
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3008
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3009
+ class=\"line_numbers\">\n<span>49</span>\n<span>50</span>\n<span>51</span>\n<span>52</span>\n<span>53</span>\n<span>54</span>\n
3010
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3011
+ class=\"line\"> @app.serve req\n</div><div class=\"line\"> else\n</div><div
3012
+ class=\"line active\"> @app.call req.env\n</div><div class=\"line\">
3013
+ \ end\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div>\n</pre>\n</td>\n
3014
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3015
+ hidden\" id=\"frame-source-47\">\n <div class=\"info\">\n Extracted
3016
+ source (around line <strong>#43</strong>):\n </div>\n <div class=\"data\">\n
3017
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3018
+ \ <td>\n <pre class=\"line_numbers\">\n<span>41</span>\n<span>42</span>\n<span>43</span>\n<span>44</span>\n<span>45</span>\n<span>46</span>\n
3019
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3020
+ class=\"line\"> req.path_parameters = set_params.merge parameters\n</div><div
3021
+ class=\"line\">\n</div><div class=\"line active\"> status, headers,
3022
+ body = route.app.serve(req)\n</div><div class=\"line\">\n</div><div class=\"line\">
3023
+ \ if &#39;pass&#39; == headers[&#39;X-Cascade&#39;]\n</div><div class=\"line\">
3024
+ \ req.script_name = script_name\n</div>\n</pre>\n</td>\n </tr>\n
3025
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3026
+ id=\"frame-source-48\">\n <div class=\"info\">\n Extracted source
3027
+ (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
3028
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3029
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
3030
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3031
+ class=\"line\">\n</div><div class=\"line\"> def serve(req)\n</div><div
3032
+ class=\"line active\"> find_routes(req).each do |match, parameters,
3033
+ route|\n</div><div class=\"line\"> set_params = req.path_parameters\n</div><div
3034
+ class=\"line\"> path_info = req.path_info\n</div><div class=\"line\">
3035
+ \ script_name = req.script_name\n</div>\n</pre>\n</td>\n </tr>\n
3036
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3037
+ id=\"frame-source-49\">\n <div class=\"info\">\n Extracted source
3038
+ (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
3039
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3040
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
3041
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3042
+ class=\"line\">\n</div><div class=\"line\"> def serve(req)\n</div><div
3043
+ class=\"line active\"> find_routes(req).each do |match, parameters,
3044
+ route|\n</div><div class=\"line\"> set_params = req.path_parameters\n</div><div
3045
+ class=\"line\"> path_info = req.path_info\n</div><div class=\"line\">
3046
+ \ script_name = req.script_name\n</div>\n</pre>\n</td>\n </tr>\n
3047
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3048
+ id=\"frame-source-50\">\n <div class=\"info\">\n Extracted source
3049
+ (around line <strong>#802</strong>):\n </div>\n <div class=\"data\">\n
3050
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3051
+ \ <td>\n <pre class=\"line_numbers\">\n<span>800</span>\n<span>801</span>\n<span>802</span>\n<span>803</span>\n<span>804</span>\n<span>805</span>\n
3052
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3053
+ class=\"line\"> req = request_class.new(env)\n</div><div class=\"line\">
3054
+ \ req.path_info = Journey::Router::Utils.normalize_path(req.path_info)\n</div><div
3055
+ class=\"line active\"> @router.serve(req)\n</div><div class=\"line\">
3056
+ \ end\n</div><div class=\"line\">\n</div><div class=\"line\"> def
3057
+ recognize_path(path, environment = {})\n</div>\n</pre>\n</td>\n </tr>\n
3058
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3059
+ id=\"frame-source-51\">\n <div class=\"info\">\n Extracted source
3060
+ (around line <strong>#24</strong>):\n </div>\n <div class=\"data\">\n
3061
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3062
+ \ <td>\n <pre class=\"line_numbers\">\n<span>22</span>\n<span>23</span>\n<span>24</span>\n<span>25</span>\n<span>26</span>\n<span>27</span>\n
3063
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3064
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3065
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">\n</div><div
3066
+ class=\"line\"> if etag_status?(status) &amp;&amp; etag_body?(body) &amp;&amp;
3067
+ !skip_caching?(headers)\n</div><div class=\"line\"> original_body =
3068
+ body\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
3069
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-52\">\n <div
3070
+ class=\"info\">\n Extracted source (around line <strong>#25</strong>):\n
3071
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3072
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3073
+ class=\"line_numbers\">\n<span>23</span>\n<span>24</span>\n<span>25</span>\n<span>26</span>\n<span>27</span>\n<span>28</span>\n
3074
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3075
+ class=\"line\"> case env[REQUEST_METHOD]\n</div><div class=\"line\">
3076
+ \ when &quot;GET&quot;, &quot;HEAD&quot;\n</div><div class=\"line active\">
3077
+ \ status, headers, body = @app.call(env)\n</div><div class=\"line\">
3078
+ \ headers = Utils::HeaderHash.new(headers)\n</div><div class=\"line\">
3079
+ \ if status == 200 &amp;&amp; fresh?(env, headers)\n</div><div class=\"line\">
3080
+ \ status = 304\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3081
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-53\">\n
3082
+ \ <div class=\"info\">\n Extracted source (around line <strong>#13</strong>):\n
3083
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3084
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3085
+ class=\"line_numbers\">\n<span>11</span>\n<span>12</span>\n<span>13</span>\n<span>14</span>\n<span>15</span>\n<span>16</span>\n
3086
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3087
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3088
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">\n</div><div
3089
+ class=\"line\"> if env[REQUEST_METHOD] == HEAD\n</div><div class=\"line\">
3090
+ \ [\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
3091
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-54\">\n <div
3092
+ class=\"info\">\n Extracted source (around line <strong>#27</strong>):\n
3093
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3094
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3095
+ class=\"line_numbers\">\n<span>25</span>\n<span>26</span>\n<span>27</span>\n<span>28</span>\n<span>29</span>\n<span>30</span>\n
3096
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3097
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line
3098
+ active\"> @app.call(env)\n</div><div class=\"line\"> end\n</div><div
3099
+ class=\"line\">\n</div><div class=\"line\"> private\n</div>\n</pre>\n</td>\n
3100
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3101
+ hidden\" id=\"frame-source-55\">\n <div class=\"info\">\n Extracted
3102
+ source (around line <strong>#260</strong>):\n </div>\n <div class=\"data\">\n
3103
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3104
+ \ <td>\n <pre class=\"line_numbers\">\n<span>258</span>\n<span>259</span>\n<span>260</span>\n<span>261</span>\n<span>262</span>\n<span>263</span>\n
3105
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3106
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3107
+ active\"> @app.call(env)\n</div><div class=\"line\"> ensure\n</div><div
3108
+ class=\"line\"> session = Request::Session.find(env) || {}\n</div><div
3109
+ class=\"line\"> flash_hash = env[KEY]\n</div>\n</pre>\n</td>\n </tr>\n
3110
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3111
+ id=\"frame-source-56\">\n <div class=\"info\">\n Extracted source
3112
+ (around line <strong>#225</strong>):\n </div>\n <div class=\"data\">\n
3113
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3114
+ \ <td>\n <pre class=\"line_numbers\">\n<span>223</span>\n<span>224</span>\n<span>225</span>\n<span>226</span>\n<span>227</span>\n<span>228</span>\n
3115
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3116
+ class=\"line\"> def context(env, app=@app)\n</div><div class=\"line\">
3117
+ \ prepare_session(env)\n</div><div class=\"line active\"> status,
3118
+ headers, body = app.call(env)\n</div><div class=\"line\"> commit_session(env,
3119
+ status, headers, body)\n</div><div class=\"line\"> end\n</div><div
3120
+ class=\"line\">\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3121
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-57\">\n
3122
+ \ <div class=\"info\">\n Extracted source (around line <strong>#220</strong>):\n
3123
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3124
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3125
+ class=\"line_numbers\">\n<span>218</span>\n<span>219</span>\n<span>220</span>\n<span>221</span>\n<span>222</span>\n<span>223</span>\n
3126
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3127
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div
3128
+ class=\"line active\"> context(env)\n</div><div class=\"line\"> end\n</div><div
3129
+ class=\"line\">\n</div><div class=\"line\"> def context(env, app=@app)\n</div>\n</pre>\n</td>\n
3130
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3131
+ hidden\" id=\"frame-source-58\">\n <div class=\"info\">\n Extracted
3132
+ source (around line <strong>#560</strong>):\n </div>\n <div class=\"data\">\n
3133
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3134
+ \ <td>\n <pre class=\"line_numbers\">\n<span>558</span>\n<span>559</span>\n<span>560</span>\n<span>561</span>\n<span>562</span>\n<span>563</span>\n
3135
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3136
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3137
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">\n</div><div
3138
+ class=\"line\"> if cookie_jar = env[&#39;action_dispatch.cookies&#39;]\n</div><div
3139
+ class=\"line\"> unless cookie_jar.committed?\n</div>\n</pre>\n</td>\n
3140
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3141
+ hidden\" id=\"frame-source-59\">\n <div class=\"info\">\n Extracted
3142
+ source (around line <strong>#36</strong>):\n </div>\n <div class=\"data\">\n
3143
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3144
+ \ <td>\n <pre class=\"line_numbers\">\n<span>34</span>\n<span>35</span>\n<span>36</span>\n<span>37</span>\n<span>38</span>\n<span>39</span>\n
3145
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3146
+ class=\"line\"> connection.enable_query_cache!\n</div><div class=\"line\">\n</div><div
3147
+ class=\"line active\"> response = @app.call(env)\n</div><div class=\"line\">
3148
+ \ response[2] = Rack::BodyProxy.new(response[2]) do\n</div><div class=\"line\">
3149
+ \ restore_query_cache_settings(connection_id, enabled)\n</div><div class=\"line\">
3150
+ \ end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
3151
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-60\">\n <div
3152
+ class=\"info\">\n Extracted source (around line <strong>#647</strong>):\n
3153
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3154
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3155
+ class=\"line_numbers\">\n<span>645</span>\n<span>646</span>\n<span>647</span>\n<span>648</span>\n<span>649</span>\n<span>650</span>\n
3156
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3157
+ class=\"line\"> testing = env[&#39;rack.test&#39;]\n</div><div class=\"line\">\n</div><div
3158
+ class=\"line active\"> response = @app.call(env)\n</div><div class=\"line\">
3159
+ \ response[2] = ::Rack::BodyProxy.new(response[2]) do\n</div><div class=\"line\">
3160
+ \ ActiveRecord::Base.clear_active_connections! unless testing\n</div><div
3161
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3162
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-61\">\n
3163
+ \ <div class=\"info\">\n Extracted source (around line <strong>#378</strong>):\n
3164
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3165
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3166
+ class=\"line_numbers\">\n<span>376</span>\n<span>377</span>\n<span>378</span>\n<span>379</span>\n<span>380</span>\n<span>381</span>\n
3167
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3168
+ class=\"line\"> end\n</div><div class=\"line\"> end\n</div><div
3169
+ class=\"line active\"> @app.call(env)\n</div><div class=\"line\"> end\n</div><div
3170
+ class=\"line\">\n</div><div class=\"line\"> private\n</div>\n</pre>\n</td>\n
3171
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3172
+ hidden\" id=\"frame-source-62\">\n <div class=\"info\">\n Extracted
3173
+ source (around line <strong>#29</strong>):\n </div>\n <div class=\"data\">\n
3174
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3175
+ \ <td>\n <pre class=\"line_numbers\">\n<span>27</span>\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n
3176
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3177
+ class=\"line\"> result = run_callbacks :call do\n</div><div class=\"line\">
3178
+ \ begin\n</div><div class=\"line active\"> @app.call(env)\n</div><div
3179
+ class=\"line\"> rescue =&gt; error\n</div><div class=\"line\"> end\n</div><div
3180
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3181
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-63\">\n
3182
+ \ <div class=\"info\">\n Extracted source (around line <strong>#88</strong>):\n
3183
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3184
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3185
+ class=\"line_numbers\">\n<span>86</span>\n<span>87</span>\n<span>88</span>\n<span>89</span>\n<span>90</span>\n<span>91</span>\n
3186
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3187
+ class=\"line\"> def _run_callbacks(callbacks, &amp;block)\n</div><div class=\"line\">
3188
+ \ if callbacks.empty?\n</div><div class=\"line active\"> block.call
3189
+ if block\n</div><div class=\"line\"> else\n</div><div class=\"line\">
3190
+ \ runner = callbacks.compile\n</div><div class=\"line\"> e =
3191
+ Filters::Environment.new(self, false, nil, block)\n</div>\n</pre>\n</td>\n
3192
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3193
+ hidden\" id=\"frame-source-64\">\n <div class=\"info\">\n Extracted
3194
+ source (around line <strong>#88</strong>):\n </div>\n <div class=\"data\">\n
3195
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3196
+ \ <td>\n <pre class=\"line_numbers\">\n<span>86</span>\n<span>87</span>\n<span>88</span>\n<span>89</span>\n<span>90</span>\n<span>91</span>\n
3197
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3198
+ class=\"line\"> def _run_callbacks(callbacks, &amp;block)\n</div><div class=\"line\">
3199
+ \ if callbacks.empty?\n</div><div class=\"line active\"> block.call
3200
+ if block\n</div><div class=\"line\"> else\n</div><div class=\"line\">
3201
+ \ runner = callbacks.compile\n</div><div class=\"line\"> e =
3202
+ Filters::Environment.new(self, false, nil, block)\n</div>\n</pre>\n</td>\n
3203
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3204
+ hidden\" id=\"frame-source-65\">\n <div class=\"info\">\n Extracted
3205
+ source (around line <strong>#734</strong>):\n </div>\n <div class=\"data\">\n
3206
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3207
+ \ <td>\n <pre class=\"line_numbers\">\n<span>732</span>\n<span>733</span>\n<span>734</span>\n<span>735</span>\n<span>736</span>\n<span>737</span>\n
3208
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3209
+ class=\"line\"> module_eval &lt;&lt;-RUBY, __FILE__, __LINE__ + 1\n</div><div
3210
+ class=\"line\"> def _run_#{name}_callbacks(&amp;block)\n</div><div
3211
+ class=\"line active\"> _run_callbacks(_#{name}_callbacks, &amp;block)\n</div><div
3212
+ class=\"line\"> end\n</div><div class=\"line\"> RUBY\n</div><div
3213
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3214
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-66\">\n
3215
+ \ <div class=\"info\">\n Extracted source (around line <strong>#81</strong>):\n
3216
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3217
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3218
+ class=\"line_numbers\">\n<span>79</span>\n<span>80</span>\n<span>81</span>\n<span>82</span>\n<span>83</span>\n<span>84</span>\n
3219
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3220
+ class=\"line\"> # end\n</div><div class=\"line\"> def run_callbacks(kind,
3221
+ &amp;block)\n</div><div class=\"line active\"> send &quot;_run_#{kind}_callbacks&quot;,
3222
+ &amp;block\n</div><div class=\"line\"> end\n</div><div class=\"line\">\n</div><div
3223
+ class=\"line\"> private\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3224
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-67\">\n
3225
+ \ <div class=\"info\">\n Extracted source (around line <strong>#27</strong>):\n
3226
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3227
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3228
+ class=\"line_numbers\">\n<span>25</span>\n<span>26</span>\n<span>27</span>\n<span>28</span>\n<span>29</span>\n<span>30</span>\n
3229
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3230
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> error =
3231
+ nil\n</div><div class=\"line active\"> result = run_callbacks :call do\n</div><div
3232
+ class=\"line\"> begin\n</div><div class=\"line\"> @app.call(env)\n</div><div
3233
+ class=\"line\"> rescue =&gt; error\n</div>\n</pre>\n</td>\n </tr>\n
3234
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3235
+ id=\"frame-source-68\">\n <div class=\"info\">\n Extracted source
3236
+ (around line <strong>#73</strong>):\n </div>\n <div class=\"data\">\n
3237
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3238
+ \ <td>\n <pre class=\"line_numbers\">\n<span>71</span>\n<span>72</span>\n<span>73</span>\n<span>74</span>\n<span>75</span>\n<span>76</span>\n
3239
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3240
+ class=\"line\"> prepare!\n</div><div class=\"line\">\n</div><div class=\"line
3241
+ active\"> response = @app.call(env)\n</div><div class=\"line\"> response[2]
3242
+ = ::Rack::BodyProxy.new(response[2]) { cleanup! }\n</div><div class=\"line\">\n</div><div
3243
+ class=\"line\"> response\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3244
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-69\">\n
3245
+ \ <div class=\"info\">\n Extracted source (around line <strong>#78</strong>):\n
3246
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3247
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3248
+ class=\"line_numbers\">\n<span>76</span>\n<span>77</span>\n<span>78</span>\n<span>79</span>\n<span>80</span>\n<span>81</span>\n
3249
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3250
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> env[&quot;action_dispatch.remote_ip&quot;]
3251
+ = GetIp.new(env, self)\n</div><div class=\"line active\"> @app.call(env)\n</div><div
3252
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
3253
+ \ # The GetIp class exists as a way to defer processing of the request data\n</div>\n</pre>\n</td>\n
3254
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3255
+ hidden\" id=\"frame-source-70\">\n <div class=\"info\">\n Extracted
3256
+ source (around line <strong>#17</strong>):\n </div>\n <div class=\"data\">\n
3257
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3258
+ \ <td>\n <pre class=\"line_numbers\">\n<span>15</span>\n<span>16</span>\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n
3259
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3260
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3261
+ active\"> _, headers, body = response = @app.call(env)\n</div><div class=\"line\">\n</div><div
3262
+ class=\"line\"> if headers[&#39;X-Cascade&#39;] == &#39;pass&#39;\n</div><div
3263
+ class=\"line\"> body.close if body.respond_to?(:close)\n</div>\n</pre>\n</td>\n
3264
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3265
+ hidden\" id=\"frame-source-71\">\n <div class=\"info\">\n Extracted
3266
+ source (around line <strong>#37</strong>):\n </div>\n <div class=\"data\">\n
3267
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3268
+ \ <td>\n <pre class=\"line_numbers\">\n<span>35</span>\n<span>36</span>\n<span>37</span>\n<span>38</span>\n<span>39</span>\n<span>40</span>\n
3269
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3270
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line
3271
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">\n</div><div
3272
+ class=\"line\"> if exception = env[&#39;web_console.exception&#39;]\n</div><div
3273
+ class=\"line\"> session = Session.from_exception(exception)\n</div>\n</pre>\n</td>\n
3274
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3275
+ hidden\" id=\"frame-source-72\">\n <div class=\"info\">\n Extracted
3276
+ source (around line <strong>#30</strong>):\n </div>\n <div class=\"data\">\n
3277
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3278
+ \ <td>\n <pre class=\"line_numbers\">\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n<span>32</span>\n<span>33</span>\n
3279
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3280
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3281
+ active\"> @app.call(env)\n</div><div class=\"line\"> rescue Exception
3282
+ =&gt; exception\n</div><div class=\"line\"> if env[&#39;action_dispatch.show_exceptions&#39;]
3283
+ == false\n</div><div class=\"line\"> raise exception\n</div>\n</pre>\n</td>\n
3284
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3285
+ hidden\" id=\"frame-source-73\">\n <div class=\"info\">\n Extracted
3286
+ source (around line <strong>#38</strong>):\n </div>\n <div class=\"data\">\n
3287
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3288
+ \ <td>\n <pre class=\"line_numbers\">\n<span>36</span>\n<span>37</span>\n<span>38</span>\n<span>39</span>\n<span>40</span>\n<span>41</span>\n
3289
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3290
+ class=\"line\"> instrumenter.start &#39;request.action_dispatch&#39;,
3291
+ request: request\n</div><div class=\"line\"> logger.info { started_request_message(request)
3292
+ }\n</div><div class=\"line active\"> resp = @app.call(env)\n</div><div
3293
+ class=\"line\"> resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request)
3294
+ }\n</div><div class=\"line\"> resp\n</div><div class=\"line\"> rescue
3295
+ Exception\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
3296
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-74\">\n <div
3297
+ class=\"info\">\n Extracted source (around line <strong>#20</strong>):\n
3298
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3299
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3300
+ class=\"line_numbers\">\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n
3301
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3302
+ class=\"line\">\n</div><div class=\"line\"> if logger.respond_to?(:tagged)\n</div><div
3303
+ class=\"line active\"> logger.tagged(compute_tags(request)) { call_app(request,
3304
+ env) }\n</div><div class=\"line\"> else\n</div><div class=\"line\">
3305
+ \ call_app(request, env)\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
3306
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3307
+ hidden\" id=\"frame-source-75\">\n <div class=\"info\">\n Extracted
3308
+ source (around line <strong>#68</strong>):\n </div>\n <div class=\"data\">\n
3309
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3310
+ \ <td>\n <pre class=\"line_numbers\">\n<span>66</span>\n<span>67</span>\n<span>68</span>\n<span>69</span>\n<span>70</span>\n<span>71</span>\n
3311
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3312
+ class=\"line\">\n</div><div class=\"line\"> def tagged(*tags)\n</div><div
3313
+ class=\"line active\"> formatter.tagged(*tags) { yield self }\n</div><div
3314
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
3315
+ \ def flush\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3316
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-76\">\n
3317
+ \ <div class=\"info\">\n Extracted source (around line <strong>#26</strong>):\n
3318
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3319
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3320
+ class=\"line_numbers\">\n<span>24</span>\n<span>25</span>\n<span>26</span>\n<span>27</span>\n<span>28</span>\n<span>29</span>\n
3321
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3322
+ class=\"line\"> def tagged(*tags)\n</div><div class=\"line\"> new_tags
3323
+ = push_tags(*tags)\n</div><div class=\"line active\"> yield self\n</div><div
3324
+ class=\"line\"> ensure\n</div><div class=\"line\"> pop_tags(new_tags.size)\n</div><div
3325
+ class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3326
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-77\">\n
3327
+ \ <div class=\"info\">\n Extracted source (around line <strong>#68</strong>):\n
3328
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3329
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3330
+ class=\"line_numbers\">\n<span>66</span>\n<span>67</span>\n<span>68</span>\n<span>69</span>\n<span>70</span>\n<span>71</span>\n
3331
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3332
+ class=\"line\">\n</div><div class=\"line\"> def tagged(*tags)\n</div><div
3333
+ class=\"line active\"> formatter.tagged(*tags) { yield self }\n</div><div
3334
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line\">
3335
+ \ def flush\n</div>\n</pre>\n</td>\n </tr>\n </table>\n
3336
+ \ </div>\n </div>\n <div class=\"source hidden\" id=\"frame-source-78\">\n
3337
+ \ <div class=\"info\">\n Extracted source (around line <strong>#20</strong>):\n
3338
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3339
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3340
+ class=\"line_numbers\">\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n
3341
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3342
+ class=\"line\">\n</div><div class=\"line\"> if logger.respond_to?(:tagged)\n</div><div
3343
+ class=\"line active\"> logger.tagged(compute_tags(request)) { call_app(request,
3344
+ env) }\n</div><div class=\"line\"> else\n</div><div class=\"line\">
3345
+ \ call_app(request, env)\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n
3346
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3347
+ hidden\" id=\"frame-source-79\">\n <div class=\"info\">\n Extracted
3348
+ source (around line <strong>#21</strong>):\n </div>\n <div class=\"data\">\n
3349
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3350
+ \ <td>\n <pre class=\"line_numbers\">\n<span>19</span>\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n<span>24</span>\n
3351
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3352
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> env[&quot;action_dispatch.request_id&quot;]
3353
+ = external_request_id(env) || internal_request_id\n</div><div class=\"line
3354
+ active\"> @app.call(env).tap { |_status, headers, _body| headers[&quot;X-Request-Id&quot;]
3355
+ = env[&quot;action_dispatch.request_id&quot;] }\n</div><div class=\"line\">
3356
+ \ end\n</div><div class=\"line\">\n</div><div class=\"line\"> private\n</div>\n</pre>\n</td>\n
3357
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3358
+ hidden\" id=\"frame-source-80\">\n <div class=\"info\">\n Extracted
3359
+ source (around line <strong>#22</strong>):\n </div>\n <div class=\"data\">\n
3360
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3361
+ \ <td>\n <pre class=\"line_numbers\">\n<span>20</span>\n<span>21</span>\n<span>22</span>\n<span>23</span>\n<span>24</span>\n<span>25</span>\n
3362
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3363
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line
3364
+ active\"> @app.call(env)\n</div><div class=\"line\"> end\n</div><div
3365
+ class=\"line\">\n</div><div class=\"line\"> def method_override(env)\n</div>\n</pre>\n</td>\n
3366
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3367
+ hidden\" id=\"frame-source-81\">\n <div class=\"info\">\n Extracted
3368
+ source (around line <strong>#18</strong>):\n </div>\n <div class=\"data\">\n
3369
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3370
+ \ <td>\n <pre class=\"line_numbers\">\n<span>16</span>\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n<span>21</span>\n
3371
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3372
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> start_time
3373
+ = Time.now\n</div><div class=\"line active\"> status, headers, body =
3374
+ @app.call(env)\n</div><div class=\"line\"> request_time = Time.now -
3375
+ start_time\n</div><div class=\"line\">\n</div><div class=\"line\"> if
3376
+ !headers.has_key?(@header_name)\n</div>\n</pre>\n</td>\n </tr>\n
3377
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3378
+ id=\"frame-source-82\">\n <div class=\"info\">\n Extracted source
3379
+ (around line <strong>#28</strong>):\n </div>\n <div class=\"data\">\n
3380
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3381
+ \ <td>\n <pre class=\"line_numbers\">\n<span>26</span>\n<span>27</span>\n<span>28</span>\n<span>29</span>\n<span>30</span>\n<span>31</span>\n
3382
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3383
+ class=\"line\"> def call(env)\n</div><div class=\"line\"> LocalCacheRegistry.set_cache_for(local_cache_key,
3384
+ LocalStore.new)\n</div><div class=\"line active\"> response = @app.call(env)\n</div><div
3385
+ class=\"line\"> response[2] = ::Rack::BodyProxy.new(response[2])
3386
+ do\n</div><div class=\"line\"> LocalCacheRegistry.set_cache_for(local_cache_key,
3387
+ nil)\n</div><div class=\"line\"> end\n</div>\n</pre>\n</td>\n </tr>\n
3388
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3389
+ id=\"frame-source-83\">\n <div class=\"info\">\n Extracted source
3390
+ (around line <strong>#17</strong>):\n </div>\n <div class=\"data\">\n
3391
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3392
+ \ <td>\n <pre class=\"line_numbers\">\n<span>15</span>\n<span>16</span>\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n
3393
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3394
+ class=\"line\"> old, env[FLAG] = env[FLAG], false\n</div><div class=\"line\">
3395
+ \ @mutex.lock\n</div><div class=\"line active\"> response = @app.call(env)\n</div><div
3396
+ class=\"line\"> body = BodyProxy.new(response[2]) { @mutex.unlock }\n</div><div
3397
+ class=\"line\"> response[2] = body\n</div><div class=\"line\"> response\n</div>\n</pre>\n</td>\n
3398
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3399
+ hidden\" id=\"frame-source-84\">\n <div class=\"info\">\n Extracted
3400
+ source (around line <strong>#113</strong>):\n </div>\n <div class=\"data\">\n
3401
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3402
+ \ <td>\n <pre class=\"line_numbers\">\n<span>111</span>\n<span>112</span>\n<span>113</span>\n<span>114</span>\n<span>115</span>\n<span>116</span>\n
3403
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3404
+ class=\"line\"> end\n</div><div class=\"line\">\n</div><div class=\"line
3405
+ active\"> @app.call(env)\n</div><div class=\"line\"> end\n</div><div
3406
+ class=\"line\"> end\n</div><div class=\"line\">end\n</div>\n</pre>\n</td>\n
3407
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3408
+ hidden\" id=\"frame-source-85\">\n <div class=\"info\">\n Extracted
3409
+ source (around line <strong>#113</strong>):\n </div>\n <div class=\"data\">\n
3410
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3411
+ \ <td>\n <pre class=\"line_numbers\">\n<span>111</span>\n<span>112</span>\n<span>113</span>\n<span>114</span>\n<span>115</span>\n<span>116</span>\n
3412
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3413
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3414
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">
3415
+ \ if body.respond_to?(:to_path)\n</div><div class=\"line\"> case
3416
+ type = variation(env)\n</div><div class=\"line\"> when &#39;X-Accel-Redirect&#39;\n</div>\n</pre>\n</td>\n
3417
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3418
+ hidden\" id=\"frame-source-86\">\n <div class=\"info\">\n Extracted
3419
+ source (around line <strong>#518</strong>):\n </div>\n <div class=\"data\">\n
3420
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3421
+ \ <td>\n <pre class=\"line_numbers\">\n<span>516</span>\n<span>517</span>\n<span>518</span>\n<span>519</span>\n<span>520</span>\n<span>521</span>\n
3422
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3423
+ class=\"line\"> env[&quot;ROUTES_#{routes.object_id}_SCRIPT_NAME&quot;]
3424
+ = env[&#39;SCRIPT_NAME&#39;].dup\n</div><div class=\"line\"> end\n</div><div
3425
+ class=\"line active\"> app.call(env)\n</div><div class=\"line\"> end\n</div><div
3426
+ class=\"line\">\n</div><div class=\"line\"> # Defines additional Rack env
3427
+ configuration that is added on each call.\n</div>\n</pre>\n</td>\n </tr>\n
3428
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3429
+ id=\"frame-source-87\">\n <div class=\"info\">\n Extracted source
3430
+ (around line <strong>#164</strong>):\n </div>\n <div class=\"data\">\n
3431
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3432
+ \ <td>\n <pre class=\"line_numbers\">\n<span>162</span>\n<span>163</span>\n<span>164</span>\n<span>165</span>\n<span>166</span>\n<span>167</span>\n
3433
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3434
+ class=\"line\"> env[&quot;ORIGINAL_FULLPATH&quot;] = build_original_fullpath(env)\n</div><div
3435
+ class=\"line\"> env[&quot;ORIGINAL_SCRIPT_NAME&quot;] = env[&quot;SCRIPT_NAME&quot;]\n</div><div
3436
+ class=\"line active\"> super(env)\n</div><div class=\"line\"> end\n</div><div
3437
+ class=\"line\">\n</div><div class=\"line\"> # Reload application routes
3438
+ regardless if they changed or not.\n</div>\n</pre>\n</td>\n </tr>\n
3439
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3440
+ id=\"frame-source-88\">\n <div class=\"info\">\n Extracted source
3441
+ (around line <strong>#17</strong>):\n </div>\n <div class=\"data\">\n
3442
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3443
+ \ <td>\n <pre class=\"line_numbers\">\n<span>15</span>\n<span>16</span>\n<span>17</span>\n<span>18</span>\n<span>19</span>\n<span>20</span>\n
3444
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3445
+ class=\"line\"> old, env[FLAG] = env[FLAG], false\n</div><div class=\"line\">
3446
+ \ @mutex.lock\n</div><div class=\"line active\"> response = @app.call(env)\n</div><div
3447
+ class=\"line\"> body = BodyProxy.new(response[2]) { @mutex.unlock }\n</div><div
3448
+ class=\"line\"> response[2] = body\n</div><div class=\"line\"> response\n</div>\n</pre>\n</td>\n
3449
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3450
+ hidden\" id=\"frame-source-89\">\n <div class=\"info\">\n Extracted
3451
+ source (around line <strong>#15</strong>):\n </div>\n <div class=\"data\">\n
3452
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3453
+ \ <td>\n <pre class=\"line_numbers\">\n<span>13</span>\n<span>14</span>\n<span>15</span>\n<span>16</span>\n<span>17</span>\n<span>18</span>\n
3454
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3455
+ class=\"line\">\n</div><div class=\"line\"> def call(env)\n</div><div class=\"line
3456
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">
3457
+ \ headers = HeaderHash.new(headers)\n</div><div class=\"line\">\n</div><div
3458
+ class=\"line\"> if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i)
3459
+ &amp;&amp;\n</div>\n</pre>\n</td>\n </tr>\n </table>\n </div>\n
3460
+ \ </div>\n <div class=\"source hidden\" id=\"frame-source-90\">\n <div
3461
+ class=\"info\">\n Extracted source (around line <strong>#89</strong>):\n
3462
+ \ </div>\n <div class=\"data\">\n <table cellpadding=\"0\"
3463
+ cellspacing=\"0\" class=\"lines\">\n <tr>\n <td>\n <pre
3464
+ class=\"line_numbers\">\n<span>87</span>\n<span>88</span>\n<span>89</span>\n<span>90</span>\n<span>91</span>\n<span>92</span>\n
3465
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3466
+ class=\"line\"> env[&quot;REQUEST_PATH&quot;] ||= [env[&quot;SCRIPT_NAME&quot;],
3467
+ env[PATH_INFO]].join\n</div><div class=\"line\">\n</div><div class=\"line
3468
+ active\"> status, headers, body = @app.call(env)\n</div><div class=\"line\">
3469
+ \ begin\n</div><div class=\"line\"> res.status = status.to_i\n</div><div
3470
+ class=\"line\"> headers.each { |k, vs|\n</div>\n</pre>\n</td>\n </tr>\n
3471
+ \ </table>\n </div>\n </div>\n <div class=\"source hidden\"
3472
+ id=\"frame-source-91\">\n <div class=\"info\">\n Extracted source
3473
+ (around line <strong>#138</strong>):\n </div>\n <div class=\"data\">\n
3474
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3475
+ \ <td>\n <pre class=\"line_numbers\">\n<span>136</span>\n<span>137</span>\n<span>138</span>\n<span>139</span>\n<span>140</span>\n<span>141</span>\n
3476
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3477
+ class=\"line\"> si = servlet.get_instance(self, *options)\n</div><div
3478
+ class=\"line\"> @logger.debug(format(&quot;%s is invoked.&quot;, si.class.name))\n</div><div
3479
+ class=\"line active\"> si.service(req, res)\n</div><div class=\"line\">
3480
+ \ end\n</div><div class=\"line\">\n</div><div class=\"line\"> ##\n</div>\n</pre>\n</td>\n
3481
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3482
+ hidden\" id=\"frame-source-92\">\n <div class=\"info\">\n Extracted
3483
+ source (around line <strong>#94</strong>):\n </div>\n <div class=\"data\">\n
3484
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3485
+ \ <td>\n <pre class=\"line_numbers\">\n<span>92</span>\n<span>93</span>\n<span>94</span>\n<span>95</span>\n<span>96</span>\n<span>97</span>\n
3486
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3487
+ class=\"line\"> callback.call(req, res)\n</div><div class=\"line\">
3488
+ \ end\n</div><div class=\"line active\"> server.service(req,
3489
+ res)\n</div><div class=\"line\"> rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout
3490
+ =&gt; ex\n</div><div class=\"line\"> res.set_error(ex)\n</div><div
3491
+ class=\"line\"> rescue HTTPStatus::Error =&gt; ex\n</div>\n</pre>\n</td>\n
3492
+ \ </tr>\n </table>\n </div>\n </div>\n <div class=\"source
3493
+ hidden\" id=\"frame-source-93\">\n <div class=\"info\">\n Extracted
3494
+ source (around line <strong>#295</strong>):\n </div>\n <div class=\"data\">\n
3495
+ \ <table cellpadding=\"0\" cellspacing=\"0\" class=\"lines\">\n <tr>\n
3496
+ \ <td>\n <pre class=\"line_numbers\">\n<span>293</span>\n<span>294</span>\n<span>295</span>\n<span>296</span>\n<span>297</span>\n<span>298</span>\n
3497
+ \ </pre>\n </td>\n<td width=\"100%\">\n<pre>\n<div
3498
+ class=\"line\"> end\n</div><div class=\"line\"> call_callback(:AcceptCallback,
3499
+ sock)\n</div><div class=\"line active\"> block ? block.call(sock)
3500
+ : run(sock)\n</div><div class=\"line\"> rescue Errno::ENOTCONN\n</div><div
3501
+ class=\"line\"> @logger.debug &quot;Errno::ENOTCONN raised&quot;\n</div><div
3502
+ class=\"line\"> rescue ServerError =&gt; ex\n</div>\n</pre>\n</td>\n
3503
+ \ </tr>\n </table>\n </div>\n </div>\n\n \n<p><code>Rails.root:
3504
+ /data/src/dlss/ld4l_data/annotations/triannon/spec/internal</code></p>\n\n<div
3505
+ id=\"traces\">\n <a href=\"#\" onclick=\"hide(&#39;Framework-Trace&#39;);hide(&#39;Full-Trace&#39;);show(&#39;Application-Trace&#39;);;
3506
+ return false;\">Application Trace</a> |\n <a href=\"#\" onclick=\"hide(&#39;Application-Trace&#39;);hide(&#39;Full-Trace&#39;);show(&#39;Framework-Trace&#39;);;
3507
+ return false;\">Framework Trace</a> |\n <a href=\"#\" onclick=\"hide(&#39;Application-Trace&#39;);hide(&#39;Framework-Trace&#39;);show(&#39;Full-Trace&#39;);;
3508
+ return false;\">Full Trace</a> \n\n <div id=\"Application-Trace\" style=\"display:
3509
+ none;\">\n <pre><code></code></pre>\n </div>\n <div id=\"Framework-Trace\"
3510
+ style=\"display: none;\">\n <pre><code><a class=\"trace-frames\" data-frame-id=\"0\"
3511
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/mime_responds.rb:218:in
3512
+ `respond_to&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"1\" href=\"#\">/data/src/dlss/ld4l_data/annotations/triannon/app/controllers/triannon/annotations_controller.rb:21:in
3513
+ `show&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"2\" href=\"#\">actionpack
3514
+ (4.2.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action&#39;</a><br><a
3515
+ class=\"trace-frames\" data-frame-id=\"3\" href=\"#\">actionpack (4.2.0) lib/abstract_controller/base.rb:198:in
3516
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"4\"
3517
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rendering.rb:10:in
3518
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"5\"
3519
+ href=\"#\">actionpack (4.2.0) lib/abstract_controller/callbacks.rb:20:in `block
3520
+ in process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"6\"
3521
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call&#39;</a><br><a
3522
+ class=\"trace-frames\" data-frame-id=\"7\" href=\"#\">activesupport (4.2.0)
3523
+ lib/active_support/callbacks.rb:117:in `call&#39;</a><br><a class=\"trace-frames\"
3524
+ data-frame-id=\"8\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:151:in
3525
+ `block in halting_and_conditional&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"9\"
3526
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `call&#39;</a><br><a
3527
+ class=\"trace-frames\" data-frame-id=\"10\" href=\"#\">activesupport (4.2.0)
3528
+ lib/active_support/callbacks.rb:151:in `block in halting_and_conditional&#39;</a><br><a
3529
+ class=\"trace-frames\" data-frame-id=\"11\" href=\"#\">activesupport (4.2.0)
3530
+ lib/active_support/callbacks.rb:234:in `call&#39;</a><br><a class=\"trace-frames\"
3531
+ data-frame-id=\"12\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:234:in
3532
+ `block in halting&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"13\"
3533
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call&#39;</a><br><a
3534
+ class=\"trace-frames\" data-frame-id=\"14\" href=\"#\">activesupport (4.2.0)
3535
+ lib/active_support/callbacks.rb:169:in `block in halting&#39;</a><br><a class=\"trace-frames\"
3536
+ data-frame-id=\"15\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:169:in
3537
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"16\" href=\"#\">activesupport
3538
+ (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting&#39;</a><br><a
3539
+ class=\"trace-frames\" data-frame-id=\"17\" href=\"#\">activesupport (4.2.0)
3540
+ lib/active_support/callbacks.rb:92:in `call&#39;</a><br><a class=\"trace-frames\"
3541
+ data-frame-id=\"18\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:92:in
3542
+ `_run_callbacks&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"19\"
3543
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks&#39;</a><br><a
3544
+ class=\"trace-frames\" data-frame-id=\"20\" href=\"#\">activesupport (4.2.0)
3545
+ lib/active_support/callbacks.rb:81:in `run_callbacks&#39;</a><br><a class=\"trace-frames\"
3546
+ data-frame-id=\"21\" href=\"#\">actionpack (4.2.0) lib/abstract_controller/callbacks.rb:19:in
3547
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"22\"
3548
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rescue.rb:29:in
3549
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"23\"
3550
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:31:in
3551
+ `block in process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"24\"
3552
+ href=\"#\">activesupport (4.2.0) lib/active_support/notifications.rb:164:in
3553
+ `block in instrument&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"25\"
3554
+ href=\"#\">activesupport (4.2.0) lib/active_support/notifications/instrumenter.rb:20:in
3555
+ `instrument&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"26\" href=\"#\">activesupport
3556
+ (4.2.0) lib/active_support/notifications.rb:164:in `instrument&#39;</a><br><a
3557
+ class=\"trace-frames\" data-frame-id=\"27\" href=\"#\">actionpack (4.2.0)
3558
+ lib/action_controller/metal/instrumentation.rb:30:in `process_action&#39;</a><br><a
3559
+ class=\"trace-frames\" data-frame-id=\"28\" href=\"#\">actionpack (4.2.0)
3560
+ lib/action_controller/metal/params_wrapper.rb:250:in `process_action&#39;</a><br><a
3561
+ class=\"trace-frames\" data-frame-id=\"29\" href=\"#\">activerecord (4.2.0)
3562
+ lib/active_record/railties/controller_runtime.rb:18:in `process_action&#39;</a><br><a
3563
+ class=\"trace-frames\" data-frame-id=\"30\" href=\"#\">actionpack (4.2.0)
3564
+ lib/abstract_controller/base.rb:137:in `process&#39;</a><br><a class=\"trace-frames\"
3565
+ data-frame-id=\"31\" href=\"#\">actionview (4.2.0) lib/action_view/rendering.rb:30:in
3566
+ `process&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"32\" href=\"#\">actionpack
3567
+ (4.2.0) lib/action_controller/metal.rb:195:in `dispatch&#39;</a><br><a class=\"trace-frames\"
3568
+ data-frame-id=\"33\" href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in
3569
+ `dispatch&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"34\" href=\"#\">actionpack
3570
+ (4.2.0) lib/action_controller/metal.rb:236:in `block in action&#39;</a><br><a
3571
+ class=\"trace-frames\" data-frame-id=\"35\" href=\"#\">actionpack (4.2.0)
3572
+ lib/action_dispatch/routing/route_set.rb:73:in `call&#39;</a><br><a class=\"trace-frames\"
3573
+ data-frame-id=\"36\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in
3574
+ `dispatch&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"37\" href=\"#\">actionpack
3575
+ (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve&#39;</a><br><a
3576
+ class=\"trace-frames\" data-frame-id=\"38\" href=\"#\">actionpack (4.2.0)
3577
+ lib/action_dispatch/routing/mapper.rb:49:in `serve&#39;</a><br><a class=\"trace-frames\"
3578
+ data-frame-id=\"39\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in
3579
+ `block in serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"40\"
3580
+ href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in
3581
+ `each&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"41\" href=\"#\">actionpack
3582
+ (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve&#39;</a><br><a
3583
+ class=\"trace-frames\" data-frame-id=\"42\" href=\"#\">actionpack (4.2.0)
3584
+ lib/action_dispatch/routing/route_set.rb:802:in `call&#39;</a><br><a class=\"trace-frames\"
3585
+ data-frame-id=\"43\" href=\"#\">railties (4.2.0) lib/rails/engine.rb:518:in
3586
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"44\" href=\"#\">railties
3587
+ (4.2.0) lib/rails/railtie.rb:194:in `public_send&#39;</a><br><a class=\"trace-frames\"
3588
+ data-frame-id=\"45\" href=\"#\">railties (4.2.0) lib/rails/railtie.rb:194:in
3589
+ `method_missing&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"46\"
3590
+ href=\"#\">actionpack (4.2.0) lib/action_dispatch/routing/mapper.rb:51:in
3591
+ `serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"47\" href=\"#\">actionpack
3592
+ (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve&#39;</a><br><a
3593
+ class=\"trace-frames\" data-frame-id=\"48\" href=\"#\">actionpack (4.2.0)
3594
+ lib/action_dispatch/journey/router.rb:30:in `each&#39;</a><br><a class=\"trace-frames\"
3595
+ data-frame-id=\"49\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in
3596
+ `serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"50\" href=\"#\">actionpack
3597
+ (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call&#39;</a><br><a
3598
+ class=\"trace-frames\" data-frame-id=\"51\" href=\"#\">rack (1.6.0) lib/rack/etag.rb:24:in
3599
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"52\" href=\"#\">rack
3600
+ (1.6.0) lib/rack/conditionalget.rb:25:in `call&#39;</a><br><a class=\"trace-frames\"
3601
+ data-frame-id=\"53\" href=\"#\">rack (1.6.0) lib/rack/head.rb:13:in `call&#39;</a><br><a
3602
+ class=\"trace-frames\" data-frame-id=\"54\" href=\"#\">actionpack (4.2.0)
3603
+ lib/action_dispatch/middleware/params_parser.rb:27:in `call&#39;</a><br><a
3604
+ class=\"trace-frames\" data-frame-id=\"55\" href=\"#\">actionpack (4.2.0)
3605
+ lib/action_dispatch/middleware/flash.rb:260:in `call&#39;</a><br><a class=\"trace-frames\"
3606
+ data-frame-id=\"56\" href=\"#\">rack (1.6.0) lib/rack/session/abstract/id.rb:225:in
3607
+ `context&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"57\" href=\"#\">rack
3608
+ (1.6.0) lib/rack/session/abstract/id.rb:220:in `call&#39;</a><br><a class=\"trace-frames\"
3609
+ data-frame-id=\"58\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in
3610
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"59\" href=\"#\">activerecord
3611
+ (4.2.0) lib/active_record/query_cache.rb:36:in `call&#39;</a><br><a class=\"trace-frames\"
3612
+ data-frame-id=\"60\" href=\"#\">activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in
3613
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"61\" href=\"#\">activerecord
3614
+ (4.2.0) lib/active_record/migration.rb:378:in `call&#39;</a><br><a class=\"trace-frames\"
3615
+ data-frame-id=\"62\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in
3616
+ `block in call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"63\"
3617
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call&#39;</a><br><a
3618
+ class=\"trace-frames\" data-frame-id=\"64\" href=\"#\">activesupport (4.2.0)
3619
+ lib/active_support/callbacks.rb:88:in `_run_callbacks&#39;</a><br><a class=\"trace-frames\"
3620
+ data-frame-id=\"65\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:734:in
3621
+ `_run_call_callbacks&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"66\"
3622
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks&#39;</a><br><a
3623
+ class=\"trace-frames\" data-frame-id=\"67\" href=\"#\">actionpack (4.2.0)
3624
+ lib/action_dispatch/middleware/callbacks.rb:27:in `call&#39;</a><br><a class=\"trace-frames\"
3625
+ data-frame-id=\"68\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/reloader.rb:73:in
3626
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"69\" href=\"#\">actionpack
3627
+ (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call&#39;</a><br><a
3628
+ class=\"trace-frames\" data-frame-id=\"70\" href=\"#\">actionpack (4.2.0)
3629
+ lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call&#39;</a><br><a
3630
+ class=\"trace-frames\" data-frame-id=\"71\" href=\"#\">web-console (2.1.2)
3631
+ lib/web_console/middleware.rb:37:in `call&#39;</a><br><a class=\"trace-frames\"
3632
+ data-frame-id=\"72\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in
3633
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"73\" href=\"#\">railties
3634
+ (4.2.0) lib/rails/rack/logger.rb:38:in `call_app&#39;</a><br><a class=\"trace-frames\"
3635
+ data-frame-id=\"74\" href=\"#\">railties (4.2.0) lib/rails/rack/logger.rb:20:in
3636
+ `block in call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"75\"
3637
+ href=\"#\">activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in
3638
+ `block in tagged&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"76\"
3639
+ href=\"#\">activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in
3640
+ `tagged&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"77\" href=\"#\">activesupport
3641
+ (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged&#39;</a><br><a
3642
+ class=\"trace-frames\" data-frame-id=\"78\" href=\"#\">railties (4.2.0) lib/rails/rack/logger.rb:20:in
3643
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"79\" href=\"#\">actionpack
3644
+ (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call&#39;</a><br><a
3645
+ class=\"trace-frames\" data-frame-id=\"80\" href=\"#\">rack (1.6.0) lib/rack/methodoverride.rb:22:in
3646
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"81\" href=\"#\">rack
3647
+ (1.6.0) lib/rack/runtime.rb:18:in `call&#39;</a><br><a class=\"trace-frames\"
3648
+ data-frame-id=\"82\" href=\"#\">activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in
3649
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"83\" href=\"#\">rack
3650
+ (1.6.0) lib/rack/lock.rb:17:in `call&#39;</a><br><a class=\"trace-frames\"
3651
+ data-frame-id=\"84\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in
3652
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"85\" href=\"#\">rack
3653
+ (1.6.0) lib/rack/sendfile.rb:113:in `call&#39;</a><br><a class=\"trace-frames\"
3654
+ data-frame-id=\"86\" href=\"#\">railties (4.2.0) lib/rails/engine.rb:518:in
3655
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"87\" href=\"#\">railties
3656
+ (4.2.0) lib/rails/application.rb:164:in `call&#39;</a><br><a class=\"trace-frames\"
3657
+ data-frame-id=\"88\" href=\"#\">rack (1.6.0) lib/rack/lock.rb:17:in `call&#39;</a><br><a
3658
+ class=\"trace-frames\" data-frame-id=\"89\" href=\"#\">rack (1.6.0) lib/rack/content_length.rb:15:in
3659
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"90\" href=\"#\">rack
3660
+ (1.6.0) lib/rack/handler/webrick.rb:89:in `service&#39;</a><br><a class=\"trace-frames\"
3661
+ data-frame-id=\"91\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:138:in
3662
+ `service&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"92\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:94:in
3663
+ `run&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"93\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/server.rb:295:in
3664
+ `block in start_thread&#39;</a><br></code></pre>\n </div>\n <div id=\"Full-Trace\"
3665
+ style=\"display: block;\">\n <pre><code><a class=\"trace-frames\" data-frame-id=\"0\"
3666
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/mime_responds.rb:218:in
3667
+ `respond_to&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"1\" href=\"#\">/data/src/dlss/ld4l_data/annotations/triannon/app/controllers/triannon/annotations_controller.rb:21:in
3668
+ `show&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"2\" href=\"#\">actionpack
3669
+ (4.2.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action&#39;</a><br><a
3670
+ class=\"trace-frames\" data-frame-id=\"3\" href=\"#\">actionpack (4.2.0) lib/abstract_controller/base.rb:198:in
3671
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"4\"
3672
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rendering.rb:10:in
3673
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"5\"
3674
+ href=\"#\">actionpack (4.2.0) lib/abstract_controller/callbacks.rb:20:in `block
3675
+ in process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"6\"
3676
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call&#39;</a><br><a
3677
+ class=\"trace-frames\" data-frame-id=\"7\" href=\"#\">activesupport (4.2.0)
3678
+ lib/active_support/callbacks.rb:117:in `call&#39;</a><br><a class=\"trace-frames\"
3679
+ data-frame-id=\"8\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:151:in
3680
+ `block in halting_and_conditional&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"9\"
3681
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `call&#39;</a><br><a
3682
+ class=\"trace-frames\" data-frame-id=\"10\" href=\"#\">activesupport (4.2.0)
3683
+ lib/active_support/callbacks.rb:151:in `block in halting_and_conditional&#39;</a><br><a
3684
+ class=\"trace-frames\" data-frame-id=\"11\" href=\"#\">activesupport (4.2.0)
3685
+ lib/active_support/callbacks.rb:234:in `call&#39;</a><br><a class=\"trace-frames\"
3686
+ data-frame-id=\"12\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:234:in
3687
+ `block in halting&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"13\"
3688
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call&#39;</a><br><a
3689
+ class=\"trace-frames\" data-frame-id=\"14\" href=\"#\">activesupport (4.2.0)
3690
+ lib/active_support/callbacks.rb:169:in `block in halting&#39;</a><br><a class=\"trace-frames\"
3691
+ data-frame-id=\"15\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:169:in
3692
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"16\" href=\"#\">activesupport
3693
+ (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting&#39;</a><br><a
3694
+ class=\"trace-frames\" data-frame-id=\"17\" href=\"#\">activesupport (4.2.0)
3695
+ lib/active_support/callbacks.rb:92:in `call&#39;</a><br><a class=\"trace-frames\"
3696
+ data-frame-id=\"18\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:92:in
3697
+ `_run_callbacks&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"19\"
3698
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks&#39;</a><br><a
3699
+ class=\"trace-frames\" data-frame-id=\"20\" href=\"#\">activesupport (4.2.0)
3700
+ lib/active_support/callbacks.rb:81:in `run_callbacks&#39;</a><br><a class=\"trace-frames\"
3701
+ data-frame-id=\"21\" href=\"#\">actionpack (4.2.0) lib/abstract_controller/callbacks.rb:19:in
3702
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"22\"
3703
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rescue.rb:29:in
3704
+ `process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"23\"
3705
+ href=\"#\">actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:31:in
3706
+ `block in process_action&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"24\"
3707
+ href=\"#\">activesupport (4.2.0) lib/active_support/notifications.rb:164:in
3708
+ `block in instrument&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"25\"
3709
+ href=\"#\">activesupport (4.2.0) lib/active_support/notifications/instrumenter.rb:20:in
3710
+ `instrument&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"26\" href=\"#\">activesupport
3711
+ (4.2.0) lib/active_support/notifications.rb:164:in `instrument&#39;</a><br><a
3712
+ class=\"trace-frames\" data-frame-id=\"27\" href=\"#\">actionpack (4.2.0)
3713
+ lib/action_controller/metal/instrumentation.rb:30:in `process_action&#39;</a><br><a
3714
+ class=\"trace-frames\" data-frame-id=\"28\" href=\"#\">actionpack (4.2.0)
3715
+ lib/action_controller/metal/params_wrapper.rb:250:in `process_action&#39;</a><br><a
3716
+ class=\"trace-frames\" data-frame-id=\"29\" href=\"#\">activerecord (4.2.0)
3717
+ lib/active_record/railties/controller_runtime.rb:18:in `process_action&#39;</a><br><a
3718
+ class=\"trace-frames\" data-frame-id=\"30\" href=\"#\">actionpack (4.2.0)
3719
+ lib/abstract_controller/base.rb:137:in `process&#39;</a><br><a class=\"trace-frames\"
3720
+ data-frame-id=\"31\" href=\"#\">actionview (4.2.0) lib/action_view/rendering.rb:30:in
3721
+ `process&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"32\" href=\"#\">actionpack
3722
+ (4.2.0) lib/action_controller/metal.rb:195:in `dispatch&#39;</a><br><a class=\"trace-frames\"
3723
+ data-frame-id=\"33\" href=\"#\">actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in
3724
+ `dispatch&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"34\" href=\"#\">actionpack
3725
+ (4.2.0) lib/action_controller/metal.rb:236:in `block in action&#39;</a><br><a
3726
+ class=\"trace-frames\" data-frame-id=\"35\" href=\"#\">actionpack (4.2.0)
3727
+ lib/action_dispatch/routing/route_set.rb:73:in `call&#39;</a><br><a class=\"trace-frames\"
3728
+ data-frame-id=\"36\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in
3729
+ `dispatch&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"37\" href=\"#\">actionpack
3730
+ (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve&#39;</a><br><a
3731
+ class=\"trace-frames\" data-frame-id=\"38\" href=\"#\">actionpack (4.2.0)
3732
+ lib/action_dispatch/routing/mapper.rb:49:in `serve&#39;</a><br><a class=\"trace-frames\"
3733
+ data-frame-id=\"39\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in
3734
+ `block in serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"40\"
3735
+ href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in
3736
+ `each&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"41\" href=\"#\">actionpack
3737
+ (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve&#39;</a><br><a
3738
+ class=\"trace-frames\" data-frame-id=\"42\" href=\"#\">actionpack (4.2.0)
3739
+ lib/action_dispatch/routing/route_set.rb:802:in `call&#39;</a><br><a class=\"trace-frames\"
3740
+ data-frame-id=\"43\" href=\"#\">railties (4.2.0) lib/rails/engine.rb:518:in
3741
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"44\" href=\"#\">railties
3742
+ (4.2.0) lib/rails/railtie.rb:194:in `public_send&#39;</a><br><a class=\"trace-frames\"
3743
+ data-frame-id=\"45\" href=\"#\">railties (4.2.0) lib/rails/railtie.rb:194:in
3744
+ `method_missing&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"46\"
3745
+ href=\"#\">actionpack (4.2.0) lib/action_dispatch/routing/mapper.rb:51:in
3746
+ `serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"47\" href=\"#\">actionpack
3747
+ (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve&#39;</a><br><a
3748
+ class=\"trace-frames\" data-frame-id=\"48\" href=\"#\">actionpack (4.2.0)
3749
+ lib/action_dispatch/journey/router.rb:30:in `each&#39;</a><br><a class=\"trace-frames\"
3750
+ data-frame-id=\"49\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in
3751
+ `serve&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"50\" href=\"#\">actionpack
3752
+ (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call&#39;</a><br><a
3753
+ class=\"trace-frames\" data-frame-id=\"51\" href=\"#\">rack (1.6.0) lib/rack/etag.rb:24:in
3754
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"52\" href=\"#\">rack
3755
+ (1.6.0) lib/rack/conditionalget.rb:25:in `call&#39;</a><br><a class=\"trace-frames\"
3756
+ data-frame-id=\"53\" href=\"#\">rack (1.6.0) lib/rack/head.rb:13:in `call&#39;</a><br><a
3757
+ class=\"trace-frames\" data-frame-id=\"54\" href=\"#\">actionpack (4.2.0)
3758
+ lib/action_dispatch/middleware/params_parser.rb:27:in `call&#39;</a><br><a
3759
+ class=\"trace-frames\" data-frame-id=\"55\" href=\"#\">actionpack (4.2.0)
3760
+ lib/action_dispatch/middleware/flash.rb:260:in `call&#39;</a><br><a class=\"trace-frames\"
3761
+ data-frame-id=\"56\" href=\"#\">rack (1.6.0) lib/rack/session/abstract/id.rb:225:in
3762
+ `context&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"57\" href=\"#\">rack
3763
+ (1.6.0) lib/rack/session/abstract/id.rb:220:in `call&#39;</a><br><a class=\"trace-frames\"
3764
+ data-frame-id=\"58\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in
3765
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"59\" href=\"#\">activerecord
3766
+ (4.2.0) lib/active_record/query_cache.rb:36:in `call&#39;</a><br><a class=\"trace-frames\"
3767
+ data-frame-id=\"60\" href=\"#\">activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in
3768
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"61\" href=\"#\">activerecord
3769
+ (4.2.0) lib/active_record/migration.rb:378:in `call&#39;</a><br><a class=\"trace-frames\"
3770
+ data-frame-id=\"62\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in
3771
+ `block in call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"63\"
3772
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call&#39;</a><br><a
3773
+ class=\"trace-frames\" data-frame-id=\"64\" href=\"#\">activesupport (4.2.0)
3774
+ lib/active_support/callbacks.rb:88:in `_run_callbacks&#39;</a><br><a class=\"trace-frames\"
3775
+ data-frame-id=\"65\" href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:734:in
3776
+ `_run_call_callbacks&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"66\"
3777
+ href=\"#\">activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks&#39;</a><br><a
3778
+ class=\"trace-frames\" data-frame-id=\"67\" href=\"#\">actionpack (4.2.0)
3779
+ lib/action_dispatch/middleware/callbacks.rb:27:in `call&#39;</a><br><a class=\"trace-frames\"
3780
+ data-frame-id=\"68\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/reloader.rb:73:in
3781
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"69\" href=\"#\">actionpack
3782
+ (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call&#39;</a><br><a
3783
+ class=\"trace-frames\" data-frame-id=\"70\" href=\"#\">actionpack (4.2.0)
3784
+ lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call&#39;</a><br><a
3785
+ class=\"trace-frames\" data-frame-id=\"71\" href=\"#\">web-console (2.1.2)
3786
+ lib/web_console/middleware.rb:37:in `call&#39;</a><br><a class=\"trace-frames\"
3787
+ data-frame-id=\"72\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in
3788
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"73\" href=\"#\">railties
3789
+ (4.2.0) lib/rails/rack/logger.rb:38:in `call_app&#39;</a><br><a class=\"trace-frames\"
3790
+ data-frame-id=\"74\" href=\"#\">railties (4.2.0) lib/rails/rack/logger.rb:20:in
3791
+ `block in call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"75\"
3792
+ href=\"#\">activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in
3793
+ `block in tagged&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"76\"
3794
+ href=\"#\">activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in
3795
+ `tagged&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"77\" href=\"#\">activesupport
3796
+ (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged&#39;</a><br><a
3797
+ class=\"trace-frames\" data-frame-id=\"78\" href=\"#\">railties (4.2.0) lib/rails/rack/logger.rb:20:in
3798
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"79\" href=\"#\">actionpack
3799
+ (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call&#39;</a><br><a
3800
+ class=\"trace-frames\" data-frame-id=\"80\" href=\"#\">rack (1.6.0) lib/rack/methodoverride.rb:22:in
3801
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"81\" href=\"#\">rack
3802
+ (1.6.0) lib/rack/runtime.rb:18:in `call&#39;</a><br><a class=\"trace-frames\"
3803
+ data-frame-id=\"82\" href=\"#\">activesupport (4.2.0) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in
3804
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"83\" href=\"#\">rack
3805
+ (1.6.0) lib/rack/lock.rb:17:in `call&#39;</a><br><a class=\"trace-frames\"
3806
+ data-frame-id=\"84\" href=\"#\">actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in
3807
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"85\" href=\"#\">rack
3808
+ (1.6.0) lib/rack/sendfile.rb:113:in `call&#39;</a><br><a class=\"trace-frames\"
3809
+ data-frame-id=\"86\" href=\"#\">railties (4.2.0) lib/rails/engine.rb:518:in
3810
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"87\" href=\"#\">railties
3811
+ (4.2.0) lib/rails/application.rb:164:in `call&#39;</a><br><a class=\"trace-frames\"
3812
+ data-frame-id=\"88\" href=\"#\">rack (1.6.0) lib/rack/lock.rb:17:in `call&#39;</a><br><a
3813
+ class=\"trace-frames\" data-frame-id=\"89\" href=\"#\">rack (1.6.0) lib/rack/content_length.rb:15:in
3814
+ `call&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"90\" href=\"#\">rack
3815
+ (1.6.0) lib/rack/handler/webrick.rb:89:in `service&#39;</a><br><a class=\"trace-frames\"
3816
+ data-frame-id=\"91\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:138:in
3817
+ `service&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"92\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:94:in
3818
+ `run&#39;</a><br><a class=\"trace-frames\" data-frame-id=\"93\" href=\"#\">/home/dlweber/.rbenv/versions/2.1.5/lib/ruby/2.1.0/webrick/server.rb:295:in
3819
+ `block in start_thread&#39;</a><br></code></pre>\n </div>\n\n <script
3820
+ type=\"text/javascript\">\n var traceFrames = document.getElementsByClassName('trace-frames');\n
3821
+ \ var selectedFrame, currentSource = document.getElementById('frame-source-0');\n\n
3822
+ \ // Add click listeners for all stack frames\n for (var i = 0; i < traceFrames.length;
3823
+ i++) {\n traceFrames[i].addEventListener('click', function(e) {\n e.preventDefault();\n
3824
+ \ var target = e.target;\n var frame_id = target.dataset.frameId;\n\n
3825
+ \ if (selectedFrame) {\n selectedFrame.className = selectedFrame.className.replace(\"selected\",
3826
+ \"\");\n }\n\n target.className += \" selected\";\n selectedFrame
3827
+ = target;\n\n // Change the extracted source code\n changeSourceExtract(frame_id);\n
3828
+ \ });\n\n function changeSourceExtract(frame_id) {\n var el
3829
+ = document.getElementById('frame-source-' + frame_id);\n if (currentSource
3830
+ && el) {\n currentSource.className += \" hidden\";\n el.className
3831
+ = el.className.replace(\" hidden\", \"\");\n currentSource = el;\n
3832
+ \ }\n }\n }\n </script>\n</div>\n\n \n\n<h2 style=\"margin-top:
3833
+ 30px\">Request</h2>\n<p><b>Parameters</b>:</p> <pre>{&quot;id&quot;=&gt;&quot;875190ee-1fa4-4298-916b-147d1cbce91f&quot;}</pre>\n\n<div
3834
+ class=\"details\">\n <div class=\"summary\"><a href=\"#\" onclick=\"return
3835
+ toggleSessionDump()\">Toggle session dump</a></div>\n <div id=\"session_dump\"
3836
+ style=\"display:none\"><pre></pre></div>\n</div>\n\n<div class=\"details\">\n
3837
+ \ <div class=\"summary\"><a href=\"#\" onclick=\"return toggleEnvDump()\">Toggle
3838
+ env dump</a></div>\n <div id=\"env_dump\" style=\"display:none\"><pre>GATEWAY_INTERFACE:
3839
+ &quot;CGI/1.1&quot;\nHTTP_ACCEPT: &quot;application/n-quads&quot;\nHTTP_ACCEPT_ENCODING:
3840
+ &quot;gzip, deflate&quot;\nREMOTE_ADDR: &quot;127.0.0.1&quot;\nREMOTE_HOST:
3841
+ &quot;127.0.0.1&quot;\nSERVER_NAME: &quot;localhost&quot;\nSERVER_PROTOCOL:
3842
+ &quot;HTTP/1.1&quot;</pre></div>\n</div>\n\n<h2 style=\"margin-top: 30px\">Response</h2>\n<p><b>Headers</b>:</p>
3843
+ <pre>None</pre>\n\n</div>\n\n\n</body>\n</html>\n<div id=\"console\"\n data-remote-path='console/repl_sessions/1a7a538504d83f501305bd1f1084ade1'\n
3844
+ \ data-initial-prompt='>> '>\n</div>\n\n\n<script type=\"text/javascript\">\n(function()
3845
+ {\n // DOM helpers\nfunction hasClass(el, className) {\n var regex = new
3846
+ RegExp('(?:^|\\\\s)' + className + '(?!\\\\S)', 'g');\n return el.className.match(regex);\n}\n\nfunction
3847
+ addClass(el, className) {\n el.className += \" \" + className;\n}\n\nfunction
3848
+ removeClass(el, className) {\n var regex = new RegExp('(?:^|\\\\s)' + className
3849
+ + '(?!\\\\S)', 'g');\n el.className = el.className.replace(regex, '');\n}\n\nfunction
3850
+ removeAllChildren(el) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n
3851
+ \ }\n}\n\nfunction escapeHTML(html) {\n return html\n .replace(/&/g, '&amp;')\n
3852
+ \ .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g,
3853
+ '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/`/g, '&#x60;');\n}\n\n//
3854
+ Add CSS styles dynamically. This probably doesnt work for IE <8.\nvar style
3855
+ = document.createElement('style');\nstyle.type = 'text/css';\nstyle.innerHTML
3856
+ = \"#console { position: fixed; left: 0; bottom: 0; width: 100%; height: 148px;
3857
+ border: 1px solid; padding: 0 0 4px 0; overflow: none; margin: 0; background:
3858
+ none repeat scroll 0% 0% #333; z-index: 9999; }\\n#console div.console-inner
3859
+ { font-family: monospace; font-size: 11px; height: 100%; overflow: auto; background:
3860
+ #333; border: 0; padding: 0; margin: 0; }\\n#console div.console-prompt-box
3861
+ { color: #FFF; }\\n#console pre.console-message { color: #1AD027; margin:
3862
+ 0; border: 0; white-space: pre-wrap; background-color: #333; padding: 0; }\\n#console
3863
+ div.console-focus span.console-cursor { background: #FEFEFE; color: #333;
3864
+ font-weight: bold; }\\n#console div#resizer { width: 100%; height: 4px; cursor:
3865
+ ns-resize; }\\n#console input#clipboard { height: 0px; padding: 0px; margin:
3866
+ 0px; width: 0px; margin-left: -1000px; }\\n#console span.console-prompt-label
3867
+ { display: inline; color: #FFF; background: none repeat scroll 0% 0% #333;
3868
+ border: 0; padding: 0; }\\n#console pre.console-prompt-display { display:
3869
+ inline; color: #FFF; background: none repeat scroll 0% 0% #333; border: 0;
3870
+ padding: 0; }\\n\"\n;\ndocument.getElementsByTagName('head')[0].appendChild(style);\n\n/**\n
3871
+ * Constructor for command storage.\n * It uses localStorage if available.
3872
+ Otherwise fallback to normal JS array.\n */\nfunction CommandStorage() {\n
3873
+ \ this.previousCommands = [];\n var previousCommandOffset = 0;\n var hasLocalStorage
3874
+ = typeof window.localStorage !== 'undefined';\n var STORAGE_KEY = \"web_console_previous_commands\";\n
3875
+ \ var MAX_STORAGE = 100;\n\n if (hasLocalStorage) {\n this.previousCommands
3876
+ = JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];\n previousCommandOffset
3877
+ = this.previousCommands.length;\n }\n\n this.addCommand = function(command)
3878
+ {\n previousCommandOffset = this.previousCommands.push(command);\n\n if
3879
+ (previousCommandOffset > MAX_STORAGE) {\n this.previousCommands.splice(0,
3880
+ 1);\n previousCommandOffset = MAX_STORAGE;\n }\n\n if (hasLocalStorage)
3881
+ {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(this.previousCommands));\n
3882
+ \ }\n };\n\n this.navigate = function(offset) {\n previousCommandOffset
3883
+ += offset;\n\n if (previousCommandOffset < 0) {\n previousCommandOffset
3884
+ = -1;\n return null;\n }\n\n if (previousCommandOffset >= this.previousCommands.length)
3885
+ {\n previousCommandOffset = this.previousCommands.length;\n return
3886
+ null;\n }\n\n return this.previousCommands[previousCommandOffset];\n
3887
+ \ }\n}\n\n// HTML strings for dynamic elements.\nvar consoleInnerHtml = \"<div
3888
+ id=\\'resizer\\'><\\/div>\\n<div class=\\'console-inner\\'><\\/div>\\n<input
3889
+ id=\\'clipboard\\' type=\\'text\\'>\\n\"\n;\nvar promptBoxHtml = \"<span class=\\'console-prompt-label\\'><\\/span>\\n<pre
3890
+ class=\\'console-prompt-display\\'><\\/pre>\\n\"\n;\n\n// REPLConsole Constructor\nfunction
3891
+ REPLConsole(config) {\n this.commandStorage = new CommandStorage();\n this.prompt
3892
+ = config && config.promptLabel ? config.promptLabel : ' >>';\n this.commandHandle
3893
+ = config && config.commandHandle ? config.commandHandle : function() { return
3894
+ this; }\n}\n\n\nREPLConsole.prototype.install = function(container) {\n var
3895
+ _this = this;\n\n document.onkeydown = function(ev) {\n if (_this.focused)
3896
+ { _this.onKeyDown(ev); }\n };\n\n document.onkeypress = function(ev) {\n
3897
+ \ if (_this.focused) { _this.onKeyPress(ev); }\n };\n\n document.addEventListener('mousedown',
3898
+ function(ev) {\n var el = ev.target || ev.srcElement;\n\n if (el) {\n
3899
+ \ do {\n if (el === container) {\n _this.focus();\n return;\n
3900
+ \ }\n } while (el = el.parentNode);\n\n _this.blur();\n }\n
3901
+ \ });\n\n // Render the console.\n container.innerHTML = consoleInnerHtml;\n\n
3902
+ \ // Make the console resizable.\n document.getElementById('resizer').addEventListener('mousedown',
3903
+ function(ev) {\n var startY = ev.clientY;\n var startHeight
3904
+ \ = parseInt(document.defaultView.getComputedStyle(container).height,
3905
+ 10);\n var consoleInner = document.getElementsByClassName('console-inner')[0];\n
3906
+ \ var innerScrollTopStart = consoleInner.scrollTop;\n var innerClientHeightStart
3907
+ \ = consoleInner.clientHeight;\n\n var doDrag = function(e) {\n container.style.height
3908
+ = (startHeight + startY - e.clientY) + 'px';\n consoleInner.scrollTop
3909
+ = innerScrollTopStart + (innerClientHeightStart - consoleInner.clientHeight);\n
3910
+ \ };\n\n var stopDrag = function(e) {\n document.documentElement.removeEventListener('mousemove',
3911
+ doDrag, false);\n document.documentElement.removeEventListener('mouseup',
3912
+ stopDrag, false);\n };\n\n document.documentElement.addEventListener('mousemove',
3913
+ doDrag, false);\n document.documentElement.addEventListener('mouseup',
3914
+ stopDrag, false);\n });\n\n // Initialize\n this.inner = container.getElementsByClassName('console-inner')[0];\n
3915
+ \ this.clipboard = document.getElementById('clipboard');\n this.newPromptBox();\n};\n\nREPLConsole.prototype.focus
3916
+ = function() {\n if (! this.focused) {\n this.focused = true;\n if
3917
+ (! hasClass(this.inner, \"console-focus\")) {\n addClass(this.inner,
3918
+ \"console-focus\");\n }\n this.scrollToBottom();\n }\n};\n\nREPLConsole.prototype.blur
3919
+ = function() {\n this.focused = false;\n removeClass(this.inner, \"console-focus\");\n};\n\n/**\n
3920
+ * Add a new empty prompt box to the console.\n */\nREPLConsole.prototype.newPromptBox
3921
+ = function() {\n // Remove the caret from previous prompt display if any.\n
3922
+ \ if (this.promptDisplay) {\n this.removeCaretFromPrompt();\n }\n\n var
3923
+ promptBox = document.createElement('div');\n promptBox.className = \"console-prompt-box\";\n
3924
+ \ promptBox.innerHTML = promptBoxHtml;\n this.promptLabel = promptBox.getElementsByClassName('console-prompt-label')[0];\n
3925
+ \ this.promptDisplay = promptBox.getElementsByClassName('console-prompt-display')[0];\n
3926
+ \ // Render the prompt box\n this.setInput(\"\");\n this.promptLabel.innerHTML
3927
+ = this.prompt;\n this.inner.appendChild(promptBox);\n this.scrollToBottom();\n};\n\n/**\n
3928
+ * Remove the caret from the prompt box,\n * mainly before adding a new prompt
3929
+ box.\n * For simplicity, just re-render the prompt box\n * with caret position
3930
+ -1.\n */\nREPLConsole.prototype.removeCaretFromPrompt = function() {\n this.setInput(this._input,
3931
+ -1);\n};\n\nREPLConsole.prototype.setInput = function(input, caretPos) {\n
3932
+ \ this._caretPos = caretPos === undefined ? input.length : caretPos;\n this._input
3933
+ = input;\n this.renderInput();\n};\n\n/**\n * Add some text to the existing
3934
+ input.\n */\nREPLConsole.prototype.addToInput = function(val, caretPos) {\n
3935
+ \ caretPos = caretPos || this._caretPos;\n var before = this._input.substring(0,
3936
+ caretPos);\n var after = this._input.substring(caretPos, this._input.length);\n
3937
+ \ var newInput = before + val + after;\n this.setInput(newInput, caretPos
3938
+ + val.length);\n};\n\n/**\n * Render the input prompt. This is called whenever\n
3939
+ * the user input changes, sometimes not very efficient.\n */\nREPLConsole.prototype.renderInput
3940
+ = function() {\n // Clear the current input.\n removeAllChildren(this.promptDisplay);\n\n
3941
+ \ var promptCursor = document.createElement('span');\n promptCursor.className
3942
+ = \"console-cursor\";\n var before, current, after;\n\n if (this._caretPos
3943
+ < 0) {\n before = this._input;\n current = after = \"\";\n } else if
3944
+ (this._caretPos === this._input.length) {\n before = this._input;\n current
3945
+ = \"\\u00A0\";\n after = \"\";\n } else {\n before = this._input.substring(0,
3946
+ this._caretPos);\n current = this._input.charAt(this._caretPos);\n after
3947
+ = this._input.substring(this._caretPos + 1, this._input.length);\n }\n\n
3948
+ \ this.promptDisplay.appendChild(document.createTextNode(before));\n promptCursor.appendChild(document.createTextNode(current));\n
3949
+ \ this.promptDisplay.appendChild(promptCursor);\n this.promptDisplay.appendChild(document.createTextNode(after));\n};\n\nREPLConsole.prototype.writeOutput
3950
+ = function(output) {\n var consoleMessage = document.createElement('pre');\n
3951
+ \ consoleMessage.className = \"console-message\";\n consoleMessage.innerHTML
3952
+ = escapeHTML(output);\n this.inner.appendChild(consoleMessage);\n this.newPromptBox();\n};\n\nREPLConsole.prototype.onEnterKey
3953
+ = function() {\n var input = this._input;\n\n if(input != \"\" && input
3954
+ !== undefined) {\n this.commandStorage.addCommand(input);\n }\n\n this.commandHandle(input);\n};\n\nREPLConsole.prototype.onNavigateHistory
3955
+ = function(offset) {\n var command = this.commandStorage.navigate(offset)
3956
+ || \"\";\n this.setInput(command);\n};\n\n/**\n * Handle control keys like
3957
+ up, down, left, right.\n */\nREPLConsole.prototype.onKeyDown = function(ev)
3958
+ {\n switch (ev.keyCode) {\n case 13:\n // Enter key\n this.onEnterKey();\n
3959
+ \ ev.preventDefault();\n break;\n case 80:\n // Ctrl-P\n
3960
+ \ if (! ev.ctrlKey) break;\n case 38:\n // Up arrow\n this.onNavigateHistory(-1);\n
3961
+ \ ev.preventDefault();\n break;\n case 78:\n // Ctrl-N\n
3962
+ \ if (! ev.ctrlKey) break;\n case 40:\n // Down arrow\n this.onNavigateHistory(1);\n
3963
+ \ ev.preventDefault();\n break;\n case 37:\n // Left arrow\n
3964
+ \ var caretPos = this._caretPos > 0 ? this._caretPos - 1 : this._caretPos;\n
3965
+ \ this.setInput(this._input, caretPos);\n ev.preventDefault();\n
3966
+ \ break;\n case 39:\n // Right arrow\n var length = this._input.length;\n
3967
+ \ var caretPos = this._caretPos < length ? this._caretPos + 1 : this._caretPos;\n
3968
+ \ this.setInput(this._input, caretPos);\n ev.preventDefault();\n
3969
+ \ break;\n case 8:\n // Delete\n this.deleteAtCurrent();\n
3970
+ \ ev.preventDefault();\n break;\n default:\n break;\n }\n\n
3971
+ \ if (ev.ctrlKey || ev.metaKey) {\n // Set focus to our clipboard in case
3972
+ they hit the \"v\" key\n this.clipboard.focus();\n if (ev.keyCode ==
3973
+ 86) {\n // Pasting to clipboard doesn't happen immediately,\n //
3974
+ so we have to wait for a while to get the pasted text.\n var _this =
3975
+ this;\n setTimeout(function() {\n _this.addToInput(_this.clipboard.value);\n
3976
+ \ _this.clipboard.value = \"\";\n _this.clipboard.blur();\n },
3977
+ 10);\n }\n }\n\n ev.stopPropagation();\n};\n\n/**\n * Handle input key
3978
+ press.\n */\nREPLConsole.prototype.onKeyPress = function(ev) {\n // Only
3979
+ write to the console if it's a single key press.\n if (ev.ctrlKey || ev.metaKey)
3980
+ { return; }\n var keyCode = ev.keyCode || ev.which;\n this.insertAtCurrent(String.fromCharCode(keyCode));\n
3981
+ \ ev.stopPropagation();\n ev.preventDefault();\n};\n\n/**\n * Delete a character
3982
+ at the current position.\n */\nREPLConsole.prototype.deleteAtCurrent = function()
3983
+ {\n if (this._caretPos > 0) {\n var caretPos = this._caretPos - 1;\n var
3984
+ before = this._input.substring(0, caretPos);\n var after = this._input.substring(this._caretPos,
3985
+ this._input.length);\n this.setInput(before + after, caretPos);\n }\n};\n\n/**\n
3986
+ * Insert a character at the current position.\n */\nREPLConsole.prototype.insertAtCurrent
3987
+ = function(char) {\n var before = this._input.substring(0, this._caretPos);\n
3988
+ \ var after = this._input.substring(this._caretPos, this._input.length);\n
3989
+ \ this.setInput(before + char + after, this._caretPos + 1);\n};\n\nREPLConsole.prototype.scrollToBottom
3990
+ = function() {\n this.inner.scrollTop = this.inner.scrollHeight;\n};\n\nwindow.REPLConsole
3991
+ = REPLConsole;\n\n}).call(this);\n</script>\n\n<script type=\"text/javascript\">\n(function()
3992
+ {\n var consoleDiv = document.getElementById('console');\nvar replConsole
3993
+ = new REPLConsole({\n promptLabel: consoleDiv.dataset.initialPrompt,\n commandHandle:
3994
+ function(line) {\n var _this = this;\n var xhr = new XMLHttpRequest();\n
3995
+ \ var url = consoleDiv.dataset.remotePath;\n var params = \"input=\"
3996
+ + encodeURIComponent(line);\n\n xhr.open(\"PUT\", url, true);\n xhr.setRequestHeader(\"Content-Type\",
3997
+ \"application/x-www-form-urlencoded\");\n xhr.setRequestHeader(\"X-Requested-With\",
3998
+ \"XMLHttpRequest\");\n xhr.send(params);\n\n xhr.onreadystatechange
3999
+ = function() {\n if (xhr.readyState === 4) {\n var response =
4000
+ JSON.parse(xhr.responseText);\n _this.writeOutput(response.output);\n
4001
+ \ }\n }\n }\n});\n\nreplConsole.install(consoleDiv);\n\n}).call(this);\n</script>\n\n\n
4002
+ \ <script type=\"text/javascript\">\n(function() {\n // Try intercept traces
4003
+ links in Rails 4.2.\nvar traceFrames = document.getElementsByClassName('trace-frames');\nvar
4004
+ selectedFrame, currentSource = document.getElementById('frame-source-0');\n\n//
4005
+ Add click listeners for all stack frames\nfor (var i = 0; i < traceFrames.length;
4006
+ i++) {\n traceFrames[i].addEventListener('click', function(e) {\n e.preventDefault();\n
4007
+ \ var target = e.target;\n var frameId = target.dataset.frameId;\n\n
4008
+ \ // Change the binding of the console.\n changeBinding(frameId, function()
4009
+ {\n if (selectedFrame) {\n selectedFrame.className = selectedFrame.className.replace(\"selected\",
4010
+ \"\");\n }\n\n target.className += \" selected\";\n selectedFrame
4011
+ = target;\n });\n\n // Change the extracted source code\n changeSourceExtract(frameId);\n
4012
+ \ });\n}\n\nfunction changeBinding(frameId, callback) {\n var consoleEl =
4013
+ document.getElementById('console');\n if (! consoleEl) { return; }\n var
4014
+ url = consoleEl.dataset.remotePath + \"/trace\";\n var params = \"frame_id=\"
4015
+ + encodeURIComponent(frameId);\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\",
4016
+ url, true);\n xhr.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n
4017
+ \ xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n xhr.send(params);\n
4018
+ \ xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n
4019
+ \ callback();\n }\n }\n}\n\nfunction changeSourceExtract(frameId)
4020
+ {\n var el = document.getElementById('frame-source-' + frameId);\n if (currentSource
4021
+ && el) {\n currentSource.className += \" hidden\";\n el.className =
4022
+ el.className.replace(\" hidden\", \"\");\n currentSource = el;\n }\n}\n\n//
4023
+ Push the error page body upwards the size of the console.\n//\n// While, I
4024
+ wouldn't like to do that on every custom page (so I don't screw\n// user's
4025
+ layouts), I think a lot of developers want to see all of the content\n// on
4026
+ the default Rails error page.\n//\n// Since it's quite special as is now,
4027
+ being a bit more special in the name of\n// better user experience, won't
4028
+ hurt.\ndocument.addEventListener('DOMContentLoaded', function() {\n var consoleElement
4029
+ = document.getElementById('console');\n var resizerElement = document.getElementById('resizer')\n
4030
+ \ var containerElement = document.getElementById('container');\n\n function
4031
+ setContainerElementBottomMargin(pixels) {\n containerElement.style.marginBottom
4032
+ = pixels + 'px';\n }\n\n var currentConsoleElementHeight = consoleElement.offsetHeight;\n
4033
+ \ setContainerElementBottomMargin(currentConsoleElementHeight);\n\n resizerElement.addEventListener('mousedown',
4034
+ function(event) {\n function recordConsoleElementHeight(event) {\n resizerElement.removeEventListener('mouseup',
4035
+ recordConsoleElementHeight);\n\n var currentConsoleElementHeight = consoleElement.offsetHeight;\n
4036
+ \ setContainerElementBottomMargin(currentConsoleElementHeight);\n }\n\n
4037
+ \ resizerElement.addEventListener('mouseup', recordConsoleElementHeight);\n
4038
+ \ });\n});\n\n}).call(this);\n</script>\n\n"
4039
+ http_version:
4040
+ recorded_at: Tue, 05 May 2015 19:18:19 GMT
4041
+ - request:
4042
+ method: delete
4043
+ uri: http://localhost:3000/annotations/875190ee-1fa4-4298-916b-147d1cbce91f
4044
+ body:
4045
+ encoding: US-ASCII
4046
+ string: ''
4047
+ headers:
4048
+ Accept:
4049
+ - "*/*; q=0.5, application/xml"
4050
+ Accept-Encoding:
4051
+ - gzip, deflate
4052
+ User-Agent:
4053
+ - Ruby
4054
+ response:
4055
+ status:
4056
+ code: 204
4057
+ message: 'No Content '
4058
+ headers:
4059
+ X-Frame-Options:
4060
+ - SAMEORIGIN
4061
+ X-Xss-Protection:
4062
+ - 1; mode=block
4063
+ X-Content-Type-Options:
4064
+ - nosniff
4065
+ Location:
4066
+ - http://localhost:3000/annotations
4067
+ Cache-Control:
4068
+ - no-cache
4069
+ X-Request-Id:
4070
+ - a6725083-cc4b-4d8e-a011-ac01436273e8
4071
+ X-Runtime:
4072
+ - '0.136989'
4073
+ Server:
4074
+ - WEBrick/1.3.1 (Ruby/2.1.5/2014-11-13)
4075
+ Date:
4076
+ - Tue, 05 May 2015 19:18:19 GMT
4077
+ Connection:
4078
+ - Keep-Alive
4079
+ Set-Cookie:
4080
+ - _internal_session=cy92dGdWT2UzSmtoV1lZemJ1VklJQlpvOWI3bkdTck04QVNET1RwQlFFNnU0Y2Y1ZWRwcHRIdjhrd1NUNTBWbTh6NzdVU1BxSnhnZi9Sai94Q1dnV1h5eXU5VlMvcDZBbkFTUHFJNUNXRmNBUmQvQ0NBaTRGR0hQM1ZUK0UzT3VCR0dNdkpQd25QMzBhb0NmWGxWbElsdXovcUVaM0JJSUlSa1lLa0JEem5lQlpPbEhFMW5lMkM1RFJUekVhOHpkLS1YaGRzYy9tN2ZUSXJ1bWN5WGlHdDlBPT0%3D--abde334931a246b9e7e397bce62e25dead791ea5;
4081
+ path=/; HttpOnly
4082
+ - request_method=DELETE; path=/
4083
+ body:
4084
+ encoding: UTF-8
4085
+ string: ''
4086
+ http_version:
4087
+ recorded_at: Tue, 05 May 2015 19:18:19 GMT
4088
+ recorded_with: VCR 2.9.3