cul_hydra 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/cul_hydra/crystal/binary.png +0 -0
  3. data/app/assets/images/cul_hydra/crystal/document.png +0 -0
  4. data/app/assets/images/cul_hydra/crystal/file.png +0 -0
  5. data/app/assets/images/cul_hydra/crystal/file_broken.png +0 -0
  6. data/app/assets/images/cul_hydra/crystal/folder_documents.png +0 -0
  7. data/app/assets/images/cul_hydra/crystal/folder_images.png +0 -0
  8. data/app/assets/images/cul_hydra/crystal/folder_music.png +0 -0
  9. data/app/assets/images/cul_hydra/crystal/folder_sound.png +0 -0
  10. data/app/assets/images/cul_hydra/crystal/folder_video.png +0 -0
  11. data/app/assets/images/cul_hydra/crystal/kmultiple.png +0 -0
  12. data/app/assets/images/cul_hydra/crystal/knotify.png +0 -0
  13. data/app/assets/images/cul_hydra/crystal/mp3.png +0 -0
  14. data/app/assets/images/cul_hydra/crystal/multimedia2.png +0 -0
  15. data/app/assets/images/cul_hydra/crystal/video.png +0 -0
  16. data/app/assets/images/cul_hydra/filesystem/application.png +0 -0
  17. data/app/assets/images/cul_hydra/filesystem/code.png +0 -0
  18. data/app/assets/images/cul_hydra/filesystem/css.png +0 -0
  19. data/app/assets/images/cul_hydra/filesystem/db.png +0 -0
  20. data/app/assets/images/cul_hydra/filesystem/directory.png +0 -0
  21. data/app/assets/images/cul_hydra/filesystem/doc.png +0 -0
  22. data/app/assets/images/cul_hydra/filesystem/file.png +0 -0
  23. data/app/assets/images/cul_hydra/filesystem/film.png +0 -0
  24. data/app/assets/images/cul_hydra/filesystem/flash.png +0 -0
  25. data/app/assets/images/cul_hydra/filesystem/folder_open.png +0 -0
  26. data/app/assets/images/cul_hydra/filesystem/html.png +0 -0
  27. data/app/assets/images/cul_hydra/filesystem/java.png +0 -0
  28. data/app/assets/images/cul_hydra/filesystem/linux.png +0 -0
  29. data/app/assets/images/cul_hydra/filesystem/music.png +0 -0
  30. data/app/assets/images/cul_hydra/filesystem/pdf.png +0 -0
  31. data/app/assets/images/cul_hydra/filesystem/php.png +0 -0
  32. data/app/assets/images/cul_hydra/filesystem/picture.png +0 -0
  33. data/app/assets/images/cul_hydra/filesystem/ppt.png +0 -0
  34. data/app/assets/images/cul_hydra/filesystem/psd.png +0 -0
  35. data/app/assets/images/cul_hydra/filesystem/ruby.png +0 -0
  36. data/app/assets/images/cul_hydra/filesystem/script.png +0 -0
  37. data/app/assets/images/cul_hydra/filesystem/spinner.gif +0 -0
  38. data/app/assets/images/cul_hydra/filesystem/txt.png +0 -0
  39. data/app/assets/images/cul_hydra/filesystem/xls.png +0 -0
  40. data/app/assets/images/cul_hydra/filesystem/zip.png +0 -0
  41. data/app/controllers/concerns/cul/hydra/application_id_behavior.rb +43 -0
  42. data/app/controllers/concerns/cul/hydra/controller.rb +22 -0
  43. data/app/controllers/concerns/cul/hydra/resolver.rb +69 -0
  44. data/app/controllers/concerns/cul/hydra/thumbnails.rb +62 -0
  45. data/app/helpers/cul/hydra/ore_proxies_helper_behavior.rb +119 -0
  46. data/app/helpers/cul/hydra/struct_metadata_helper_behavior.rb +89 -0
  47. data/app/models/bag_aggregator.rb +7 -0
  48. data/app/models/concept.rb +23 -0
  49. data/app/models/concerns/cul/hydra/models.rb +24 -0
  50. data/app/models/concerns/cul/hydra/models/aggregator.rb +121 -0
  51. data/app/models/concerns/cul/hydra/models/common.rb +220 -0
  52. data/app/models/concerns/cul/hydra/models/image_resource.rb +106 -0
  53. data/app/models/concerns/cul/hydra/models/linkable_resources.rb +108 -0
  54. data/app/models/concerns/cul/hydra/models/resource.rb +87 -0
  55. data/app/models/concerns/nfo/common.rb +17 -0
  56. data/app/models/concerns/nfo/file_data_object.rb +10 -0
  57. data/app/models/concerns/nfo/folder.rb +10 -0
  58. data/app/models/concerns/nie/information_element.rb +10 -0
  59. data/app/models/concerns/ore/proxy.rb +124 -0
  60. data/app/models/concerns/rdf/cul.rb +77 -0
  61. data/app/models/concerns/rdf/fcrepo3.rb +360 -0
  62. data/app/models/concerns/rdf/nfo.rb +807 -0
  63. data/app/models/concerns/rdf/nie.rb +338 -0
  64. data/app/models/concerns/rdf/olo.rb +100 -0
  65. data/app/models/concerns/rdf/ore.rb +101 -0
  66. data/app/models/concerns/rdf/pimo.rb +605 -0
  67. data/app/models/concerns/rdf/sc.rb +47 -0
  68. data/app/models/concerns/sc/canvas.rb +12 -0
  69. data/app/models/concerns/sc/sequence.rb +21 -0
  70. data/app/models/content_aggregator.rb +3 -0
  71. data/app/models/cul/hydra/datastreams/dc_metadata.rb +107 -0
  72. data/app/models/cul/hydra/datastreams/mods_document.rb +195 -0
  73. data/app/models/cul/hydra/datastreams/struct_metadata.rb +176 -0
  74. data/app/models/dc_document.rb +39 -0
  75. data/app/models/generic_aggregator.rb +68 -0
  76. data/app/models/generic_object.rb +18 -0
  77. data/app/models/generic_resource.rb +210 -0
  78. data/app/models/jp2_image_aggregator.rb +34 -0
  79. data/app/models/mets_structured_aggregator.rb +18 -0
  80. data/app/models/resource.rb +78 -0
  81. data/app/models/resource_aggregator.rb +22 -0
  82. data/app/models/static_audio_aggregator.rb +12 -0
  83. data/app/models/static_image_aggregator.rb +32 -0
  84. data/bin/rails +12 -0
  85. data/config/fedora.yml +17 -0
  86. data/config/jetty.yml +6 -0
  87. data/config/locales/ldpd_hydra.en.yml +125 -0
  88. data/config/predicate_mappings.yml +79 -0
  89. data/config/solr.yml +8 -0
  90. data/config/solr_mappings.yml +26 -0
  91. data/config/solr_value_maps.yml +41 -0
  92. data/config/subs.yml +17 -0
  93. data/fixtures/cmodels/ldpd_ADLMetadata.xml +56 -0
  94. data/fixtures/cmodels/ldpd_AESMetadata.xml +56 -0
  95. data/fixtures/cmodels/ldpd_BagAggregator.xml +70 -0
  96. data/fixtures/cmodels/ldpd_Concept.xml +69 -0
  97. data/fixtures/cmodels/ldpd_ContentAggregator.xml +70 -0
  98. data/fixtures/cmodels/ldpd_DynamicAggregator.xml +56 -0
  99. data/fixtures/cmodels/ldpd_JP2ImageAggregator.xml +60 -0
  100. data/fixtures/cmodels/ldpd_METSMetadata.xml +56 -0
  101. data/fixtures/cmodels/ldpd_METSStructuredAggregator.xml +53 -0
  102. data/fixtures/cmodels/ldpd_MODSMetadata.xml +73 -0
  103. data/fixtures/cmodels/ldpd_MostRecent.xml +46 -0
  104. data/fixtures/cmodels/ldpd_PTIFImageAggregator.xml +63 -0
  105. data/fixtures/cmodels/ldpd_Resource.xml +72 -0
  106. data/fixtures/cmodels/ldpd_RestrictedResource.xml +54 -0
  107. data/fixtures/cmodels/ldpd_Since.xml +62 -0
  108. data/fixtures/cmodels/ldpd_StaticAudioAggregator.xml +54 -0
  109. data/fixtures/cmodels/ldpd_StaticImageAggregator.xml +71 -0
  110. data/fixtures/cmodels/ldpd_htest.xml +54 -0
  111. data/fixtures/cmodels/ldpd_nullbind.xml +63 -0
  112. data/fixtures/cmodels/ldpd_sdef.Aggregator.xml +71 -0
  113. data/fixtures/cmodels/ldpd_sdef.Core.xml +48 -0
  114. data/fixtures/cmodels/ldpd_sdef.Image.xml +47 -0
  115. data/fixtures/cmodels/ldpd_sdef.Metadata.xml +62 -0
  116. data/fixtures/cmodels/ldpd_sdef.Resource.xml +76 -0
  117. data/fixtures/cmodels/ldpd_sdef.ZoomingImage.xml +46 -0
  118. data/fixtures/cmodels/ldpd_sdep.BagAggregator.xml +160 -0
  119. data/fixtures/cmodels/ldpd_sdep.BagAggregatorCore.xml +221 -0
  120. data/fixtures/cmodels/ldpd_sdep.ContentAggregatorCore.xml +221 -0
  121. data/fixtures/cmodels/ldpd_sdep.DynamicAggregator.xml +171 -0
  122. data/fixtures/cmodels/ldpd_sdep.DynamicAggregatorCore.xml +215 -0
  123. data/fixtures/cmodels/ldpd_sdep.JP2Image.xml +220 -0
  124. data/fixtures/cmodels/ldpd_sdep.JP2ImageAggregator.xml +167 -0
  125. data/fixtures/cmodels/ldpd_sdep.JP2ImageCore.xml +229 -0
  126. data/fixtures/cmodels/ldpd_sdep.MODSMetadata.xml +158 -0
  127. data/fixtures/cmodels/ldpd_sdep.MODSMetadataCore.xml +227 -0
  128. data/fixtures/cmodels/ldpd_sdep.PTIFImage.xml +222 -0
  129. data/fixtures/cmodels/ldpd_sdep.PTIFImageAggregator.xml +167 -0
  130. data/fixtures/cmodels/ldpd_sdep.PTIFImageCore.xml +215 -0
  131. data/fixtures/cmodels/ldpd_sdep.StaticImage.xml +210 -0
  132. data/fixtures/cmodels/ldpd_sdep.StaticImageAggregator.xml +186 -0
  133. data/fixtures/cmodels/ldpd_sdep.StaticImageCore.xml +220 -0
  134. data/fixtures/cmodels/ore_Proxy.xml +50 -0
  135. data/fixtures/spec/BLOB/test001.jpg +0 -0
  136. data/fixtures/spec/CUL_DC/dc.xml +5 -0
  137. data/fixtures/spec/CUL_MODS/mods-001.xml +25 -0
  138. data/fixtures/spec/CUL_MODS/mods-all.xml +65 -0
  139. data/fixtures/spec/CUL_MODS/mods-bad-repo.xml +7 -0
  140. data/fixtures/spec/CUL_MODS/mods-date-created-range.xml +7 -0
  141. data/fixtures/spec/CUL_MODS/mods-date-created-single.xml +6 -0
  142. data/fixtures/spec/CUL_MODS/mods-date-end-with-all-u-characters.xml +7 -0
  143. data/fixtures/spec/CUL_MODS/mods-date-issued-range.xml +7 -0
  144. data/fixtures/spec/CUL_MODS/mods-date-issued-single.xml +6 -0
  145. data/fixtures/spec/CUL_MODS/mods-date-other-range.xml +7 -0
  146. data/fixtures/spec/CUL_MODS/mods-date-other-single.xml +6 -0
  147. data/fixtures/spec/CUL_MODS/mods-date-range-short-years.xml +7 -0
  148. data/fixtures/spec/CUL_MODS/mods-date-start-with-all-u-characters.xml +7 -0
  149. data/fixtures/spec/CUL_MODS/mods-dates-with-all-u-characters.xml +7 -0
  150. data/fixtures/spec/CUL_MODS/mods-dates-with-some-u-characters.xml +7 -0
  151. data/fixtures/spec/CUL_MODS/mods-item.xml +31 -0
  152. data/fixtures/spec/CUL_MODS/mods-names.xml +35 -0
  153. data/fixtures/spec/CUL_MODS/mods-notes.xml +8 -0
  154. data/fixtures/spec/CUL_MODS/mods-ns.xml +2 -0
  155. data/fixtures/spec/CUL_MODS/mods-origin-info.xml +9 -0
  156. data/fixtures/spec/CUL_MODS/mods-part.xml +22 -0
  157. data/fixtures/spec/CUL_MODS/mods-physical-description.xml +12 -0
  158. data/fixtures/spec/CUL_MODS/mods-physical-location.xml +9 -0
  159. data/fixtures/spec/CUL_MODS/mods-record-info.xml +4 -0
  160. data/fixtures/spec/CUL_MODS/mods-relateditem-project.xml +8 -0
  161. data/fixtures/spec/CUL_MODS/mods-subjects.xml +73 -0
  162. data/fixtures/spec/CUL_MODS/mods-textual-date.xml +8 -0
  163. data/fixtures/spec/CUL_MODS/mods-titles.xml +33 -0
  164. data/fixtures/spec/CUL_MODS/mods-top-level-location-vs-relateditem-location.xml +21 -0
  165. data/fixtures/spec/CUL_MODS/mods-unmapped-project.xml +7 -0
  166. data/fixtures/spec/CUL_SOLR/mods-001.xml +1 -0
  167. data/fixtures/spec/CUL_SOLR/mods-001.yml +30 -0
  168. data/fixtures/spec/FOXML/content-aggregator.xml +64 -0
  169. data/fixtures/spec/FOXML/content-cmodel.xml +48 -0
  170. data/fixtures/spec/FOXML/image-cmodel.xml +48 -0
  171. data/fixtures/spec/FOXML/resource-max.xml +83 -0
  172. data/fixtures/spec/FOXML/resource-screen.xml +273 -0
  173. data/fixtures/spec/FOXML/resource-thumb.xml +86 -0
  174. data/fixtures/spec/FOXML/static-image-aggregator.xml +31 -0
  175. data/fixtures/spec/STRUCTMAP/structmap-examples.xml +21 -0
  176. data/fixtures/spec/STRUCTMAP/structmap-nested.xml +10 -0
  177. data/fixtures/spec/STRUCTMAP/structmap-recto.xml +4 -0
  178. data/fixtures/spec/STRUCTMAP/structmap-seq.xml +5 -0
  179. data/fixtures/spec/STRUCTMAP/structmap-unordered-seq.xml +5 -0
  180. data/lib/cul_hydra.rb +20 -0
  181. data/lib/cul_hydra/access_controls_enforcement.rb +53 -0
  182. data/lib/cul_hydra/controllers.rb +13 -0
  183. data/lib/cul_hydra/controllers/aggregates.rb +93 -0
  184. data/lib/cul_hydra/controllers/aggregator_controller_helper.rb +27 -0
  185. data/lib/cul_hydra/controllers/catalog.rb +12 -0
  186. data/lib/cul_hydra/controllers/content_aggregators.rb +81 -0
  187. data/lib/cul_hydra/controllers/datastreams.rb +145 -0
  188. data/lib/cul_hydra/controllers/helpers.rb +10 -0
  189. data/lib/cul_hydra/controllers/helpers/active_fedora_helper_behavior.rb +9 -0
  190. data/lib/cul_hydra/controllers/helpers/application_helper_behavior.rb +16 -0
  191. data/lib/cul_hydra/controllers/helpers/dc_metadata_helper_behavior.rb +9 -0
  192. data/lib/cul_hydra/controllers/helpers/hydra_assets_helper_behavior.rb +46 -0
  193. data/lib/cul_hydra/controllers/helpers/hydra_autocomplete_helper_behavior.rb +35 -0
  194. data/lib/cul_hydra/controllers/helpers/hydra_uploader_helper_behavior.rb +34 -0
  195. data/lib/cul_hydra/controllers/helpers/resources_helper_behavior.rb +159 -0
  196. data/lib/cul_hydra/controllers/resources.rb +161 -0
  197. data/lib/cul_hydra/controllers/static_image_aggregators.rb +105 -0
  198. data/lib/cul_hydra/controllers/suggestions.rb +126 -0
  199. data/lib/cul_hydra/controllers/terms.rb +205 -0
  200. data/lib/cul_hydra/engine.rb +31 -0
  201. data/lib/cul_hydra/fedora.rb +41 -0
  202. data/lib/cul_hydra/fedora/dummy_object.rb +37 -0
  203. data/lib/cul_hydra/fedora/rubydora_patch.rb +16 -0
  204. data/lib/cul_hydra/fedora/url_helper_behavior.rb +32 -0
  205. data/lib/cul_hydra/indexer.rb +102 -0
  206. data/lib/cul_hydra/om.rb +7 -0
  207. data/lib/cul_hydra/om/standard_mods.rb +115 -0
  208. data/lib/cul_hydra/risearch_members.rb +92 -0
  209. data/lib/cul_hydra/solrizer.rb +10 -0
  210. data/lib/cul_hydra/solrizer/extractor.rb +27 -0
  211. data/lib/cul_hydra/solrizer/mods_fieldable.rb +473 -0
  212. data/lib/cul_hydra/solrizer/terminology_based_solrizer.rb +35 -0
  213. data/lib/cul_hydra/solrizer/value_mapper.rb +46 -0
  214. data/lib/cul_hydra/solrizer_patch.rb +172 -0
  215. data/lib/cul_hydra/version.rb +8 -0
  216. data/lib/cul_hydra/version.rb~ +8 -0
  217. data/lib/tasks/cmodel.rake +122 -0
  218. data/lib/tasks/cul_hydra_dev.rake +54 -0
  219. data/lib/tasks/index.rake +73 -0
  220. data/lib/tasks/transform.rake +23 -0
  221. metadata +503 -0
@@ -0,0 +1,7 @@
1
+ class BagAggregator < GenericAggregator
2
+
3
+ def route_as
4
+ "collection"
5
+ end
6
+
7
+ end
@@ -0,0 +1,23 @@
1
+ require "active-fedora"
2
+ require "active_fedora_finders"
3
+ class Concept < GenericAggregator
4
+ include ::ActiveFedora::FinderMethods::RepositoryMethods
5
+ include ::ActiveFedora::DatastreamCollections
6
+ include ::Hydra::ModelMethods
7
+ include Cul::Hydra::Models::Common
8
+
9
+ has_and_belongs_to_many :containers, :property=>:cul_member_of, :class_name=>'ActiveFedora::Base'
10
+
11
+ def route_as
12
+ "concept"
13
+ end
14
+
15
+ def index_type_label
16
+ "CONCEPT"
17
+ end
18
+
19
+ def to_solr(solr_doc = Hash.new, opts={})
20
+ solr_doc = super(solr_doc, opts)
21
+ solr_doc
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require "active-fedora"
2
+ require "cul_hydra/om"
3
+ require 'uri'
4
+ require 'rdf'
5
+ module Cul
6
+ module Hydra
7
+ module Models
8
+ AGGREGATOR_TYPE = RDF::CUL.Aggregator
9
+ RESOURCE_TYPE = RDF::CUL.Resource
10
+ MEMBER_OF = RDF::CUL.memberOf
11
+ MEMBER_SPARQL = <<-SPARQL
12
+ SELECT ?pid WHERE { ?pid <http://purl.oclc.org/NET/CUL/memberOf> <info:fedora/%PID%> }
13
+ SPARQL
14
+ MEMBER_ITQL = <<-ITQL
15
+ select $pid from <#ri> where $pid <http://purl.oclc.org/NET/CUL/memberOf> <info:fedora/%PID%>
16
+ ITQL
17
+ autoload :Aggregator, 'cul/hydra/models/aggregator'
18
+ autoload :Common, 'cul/hydra/models/common'
19
+ autoload :ImageResource, 'cul/hydra/models/image_resource'
20
+ autoload :LinkableResources, 'cul/hydra/models/linkable_resources'
21
+ autoload :Resource, 'cul/hydra/models/resource'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,121 @@
1
+ module Cul::Hydra::Models::Aggregator
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_and_belongs_to_many :containers, :property=>:cul_member_of, :class_name=>'ActiveFedora::Base'
6
+ has_metadata :name => "structMetadata", :type=>Cul::Hydra::Datastreams::StructMetadata, :versionable => true, :controlGroup => 'M'
7
+ after_create :aggregator!
8
+ end
9
+
10
+ def aggregator!
11
+ add_relationship(:rdf_type, Cul::Hydra::Models::AGGREGATOR_TYPE.to_s)
12
+ @metadata_is_dirty = true
13
+ self.save
14
+ end
15
+
16
+ def add_member(member, container=self)
17
+ member.add_relationship(:cul_member_of, to_uri(container))
18
+ member.datastreams["RELS-EXT"].content_will_change!
19
+ member.save
20
+ end
21
+
22
+ def remove_member(member, container=self)
23
+ rel = ActiveFedora::Relationship.new()
24
+ rel.subject_pid= :self
25
+ rel.object = to_uri(container)
26
+ rel.predicate = :cul_member_of
27
+ member.remove_relationship(rel)
28
+ member.datastreams["RELS-EXT"].content_will_change!
29
+ member.save
30
+ end
31
+
32
+ def has_struct_metadata?
33
+ return (!datastreams['structMetadata'].nil?) && datastreams['structMetadata'].has_content?
34
+ end
35
+
36
+ def solr_members(opts={})
37
+ opts = {:rows=>25,:response_format=>:solr}.merge(opts)
38
+ r = self.parts(opts)
39
+ members = []
40
+ r.collect {|hit| members << SolrDocument.new(hit) } unless r.blank?
41
+ members
42
+ end
43
+
44
+ def members(opts={})
45
+ parts({:response_format=>:solr}.merge(opts))
46
+ end
47
+
48
+ def member_ids(opts={})
49
+ solr_members(opts).collect {|hit| hit.id}
50
+ end
51
+
52
+ def thumbnail_info
53
+ members = solr_members
54
+ if members.length == 0
55
+ thumb = {:asset=>"cul_hydra/crystal/file.png",:mime=>'image/png'}
56
+ else
57
+ thumb = nil
58
+ unless datastreams['structMetadata'].new?
59
+ thumb = thumb_from_struct(members)
60
+ else
61
+ thumb = thumb_from_members(members)
62
+ end
63
+ end
64
+ return thumb || {:asset=>"cul_hydra/crystal/file.png",:mime=>'image/png'}
65
+ end
66
+
67
+ private
68
+ def thumb_from_struct(members)
69
+ puts "thumb thumb_from_struct"
70
+ sm = datastreams['structMetadata']
71
+ first = sm.divs_with_attribute(false,'ORDER','1').first
72
+ if first
73
+ members.each do |member|
74
+ puts "looking for #{first["CONTENTIDS"]} in #{member["identifier_ssim"].inspect}"
75
+ if member["identifier_ssim"].include? first["CONTENTIDS"]
76
+ return thumb_from_solr_doc(member)
77
+ end
78
+ end
79
+ return thumb_from_solr_doc(members.first) if members.first
80
+ else
81
+ return nil
82
+ end
83
+ end
84
+
85
+ def thumb_from_members(members)
86
+ sorted = members.sort do |a,b|
87
+ c = a['title_si'] <=> b['title_si']
88
+ if c == 0 && a['identifier_ssim']
89
+ if b['identifier_ssim']
90
+ a['identifier_ssim'].delete(a.id) unless a['identifier_ssim'].length == 1
91
+ b['identifier_ssim'].delete(a.id) unless b['identifier_ssim'].length == 1
92
+ a['identifier_ssim'][0] <=> b['identifier_ssim'][0]
93
+ else
94
+ -1
95
+ end
96
+ else
97
+ c
98
+ end
99
+ end
100
+ thumb_from_solr_doc(sorted[0])
101
+ end
102
+
103
+ def thumb_from_solr_doc(solr_doc)
104
+ if solr_doc and (member = ActiveFedora::Base.find(solr_doc.id, :cast=>true)).respond_to? :thumbnail_info
105
+ member.thumbnail_info
106
+ else
107
+ return nil
108
+ end
109
+ end
110
+
111
+ def to_uri(obj)
112
+ if obj.respond_to? :internal_uri
113
+ return obj.internal_uri
114
+ end
115
+ obj = obj.pid unless obj.is_a? String
116
+ if obj.is_a? String and obj =~ /\A[\w\-]+:[\w\-]+\Z/
117
+ obj = "info:fedora/#{obj}"
118
+ end
119
+ return obj
120
+ end
121
+ end
@@ -0,0 +1,220 @@
1
+ require 'active-fedora'
2
+ require 'uri'
3
+ module Cul::Hydra::Models::Common
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ extend ActiveModel::Callbacks
8
+ define_model_callbacks :create
9
+ has_metadata :name => "DC", :type=>Cul::Hydra::Datastreams::DCMetadata, :versionable => true
10
+ has_metadata :name => "descMetadata", :type=>Cul::Hydra::Datastreams::ModsDocument, :versionable => true
11
+ has_metadata :name => "rightsMetadata", :type=>::Hydra::Datastream::RightsMetadata, :versionable => true
12
+ has_many :publishers, :property => :publisher, :class_name=>'ActiveFedora::Base'
13
+ end
14
+
15
+ module ClassMethods
16
+ def pid_namespace
17
+ 'ldpd'
18
+ end
19
+
20
+ end
21
+
22
+ # A Fedora object label can only contain a string value of up to 255 characters. If we try to
23
+ # set a longer value, it causes errors upon object save. Truncate labels to 255 characters.
24
+ # Note: this method maps to a method_missing hanlder that converts input into a String, so
25
+ # we use the super method first, and then post-process the output of that super method call.
26
+ def label=(new_label)
27
+ super(new_label)
28
+ super(self.label[0,255])
29
+ end
30
+
31
+ def rdf_type
32
+ relationships[:rdf_type]
33
+ end
34
+
35
+ def initialize(attrs = nil)
36
+ attrs = {} if attrs.nil?
37
+ attrs[:namespace] = self.class.pid_namespace unless attrs[:namespace]
38
+ super
39
+ end
40
+
41
+ def cmodel_pid(klass)
42
+ klass.pid_namespace + ":" + klass.name.split("::")[-1]
43
+ end
44
+
45
+ def datastreams_in_fedora
46
+ mds = {}
47
+ self.datastreams_xml['datastream'].each do |ds|
48
+ dsid = ds["dsid"]
49
+ ds.merge!({:pid => self.pid, :dsID => dsid, :dsLabel => ds["label"]})
50
+ if dsid == "RELS-EXT"
51
+ mds.merge!({dsid => ActiveFedora::RelsExtDatastream.new(ds)})
52
+ else
53
+ if self.class.ds_specs.has_key? dsid
54
+ mds.merge!({dsid => self.class.ds_specs[dsid][0].new(ds)})
55
+ else
56
+ mds.merge!({dsid => ActiveFedora::Datastream.new(ds)})
57
+ end
58
+ end
59
+ mds[dsid].new_object = false
60
+ end
61
+ mds
62
+ end
63
+
64
+ def route_as
65
+ "default"
66
+ end
67
+
68
+ def has_desc?
69
+ has_desc = false
70
+ begin
71
+ has_desc = self.datastreams.include? "descMetadata"
72
+ has_desc = has_desc and self.inner_object.datastreams["descMetadata"].content.length > 0
73
+ has_desc = has_desc and self.datastreams["descMetadata"].term_values(:identifier).length > 0
74
+ rescue
75
+ has_desc = false
76
+ end
77
+ has_desc
78
+ end
79
+
80
+ # set the index type label and any RI-based fields
81
+ def set_size_labels(solr_doc={})
82
+ solr_doc["index_type_label_ssi"] = [self.index_type_label]
83
+ end
84
+
85
+ def to_solr(solr_doc = Hash.new, opts={})
86
+ solr_doc = super(solr_doc, opts)
87
+
88
+ if has_desc?
89
+ solr_doc["descriptor_ssi"] = ["mods"]
90
+ else
91
+ solr_doc["descriptor_ssi"] = ["dublin core"]
92
+ end
93
+ # if no mods, pull some values from DC
94
+ if (solr_doc["title_display_ssm"].nil? or solr_doc["title_display_ssm"].length == 0)
95
+ if self.datastreams["DC"].term_values(:dc_title).first
96
+ solr_doc["title_display_ssm"] = self.datastreams["DC"].term_values(:dc_title)
97
+ else
98
+ solr_doc["title_display_ssm"] = self.datastreams["DC"].term_values(:dc_identifier).reject {|dcid| dcid.eql? self.id}
99
+ end
100
+ solr_doc["title_si"] = self.datastreams["DC"].term_values(:dc_title).first
101
+ if self.datastreams["DC"].term_values(:dc_relation).first
102
+ self.datastreams["DC"].term_values(:dc_relation).each {|val|
103
+ if val =~ /clio:/
104
+ solr_doc["clio_ssim"] ||= []
105
+ solr_doc["clio_ssim"] << val.split(':')[-1]
106
+ end
107
+ }
108
+ end
109
+ end
110
+ if (solr_doc["identifier_ssim"].nil? or solr_doc["identifier_ssim"].length == 0)
111
+ solr_doc["identifier_ssim"] = self.datastreams["DC"].term_values(:dc_identifier).reject {|dcid| dcid.eql? self.id}
112
+ end
113
+ if (solr_doc["title_display_ssm"].length > 1)
114
+ solr_doc["title_display_ssm"].uniq!
115
+ end
116
+
117
+ if solr_doc["contributor_ssim"].present?
118
+ if solr_doc["contributor_ssim"].is_a?(Array)
119
+ solr_doc["contributor_first_si"] = solr_doc["contributor_ssim"].first
120
+ else
121
+ solr_doc["contributor_first_si"] = solr_doc["contributor_ssim"]
122
+ end
123
+ end
124
+
125
+
126
+ solr_doc["format_ssi"] = [self.route_as]
127
+
128
+ set_size_labels(solr_doc)
129
+
130
+ solr_doc.each_pair {|key, value|
131
+ if value.is_a? Array
132
+ value.each {|v| v.strip! unless v.nil? }
133
+ elsif value.is_a? String
134
+ value.strip!
135
+ end
136
+ }
137
+ solr_doc[:structured_bsi] = 'false' unless solr_doc.has_key? :structured_bsi
138
+
139
+ solr_doc
140
+ end
141
+
142
+ def update_datastream_attributes(params={}, opts={})
143
+ logger.debug "Common.update_datastream_attributes"
144
+ result = params.dup
145
+ params.each_pair do |dsid, ds_params|
146
+ if datastreams.include?(dsid)
147
+ verify_params = ds_params.dup
148
+ changed = false
149
+ verify_params.each { |pointer, values|
150
+ changed ||= value_changed?(datastreams[dsid],pointer,values)
151
+ }
152
+ if changed
153
+ logger.debug "Common.update_datastream_attributes calling update_indexed_attributes"
154
+ result[dsid] = datastreams[dsid].update_indexed_attributes(ds_params)
155
+ else
156
+ result[dsid] = no_update(ds_params)
157
+ end
158
+ logger.debug "change detected? #{changed} digital_object? #{datastreams[dsid].changed?}"
159
+ else
160
+ result.delete(dsid)
161
+ end
162
+ end
163
+ return result
164
+ end
165
+
166
+ def thumbnail_info
167
+ {:asset=>("cul_hydra/crystal/kmultiple.png"),:mime_type=>"image/png"}
168
+ end
169
+
170
+ private
171
+ def value_changed?(ds,pointer,values)
172
+ if values.is_a? Hash
173
+ values = values.dup
174
+ else
175
+ values = {"0"=>values}
176
+ end
177
+ logger.debug "submitted values for #{pointer.inspect} : #{values.inspect}"
178
+ return true if values["-1"]
179
+ changed = false
180
+ old_values = ds.get_values(pointer)
181
+ indexed_values = {}
182
+ old_values.each_index {|ix| indexed_values[ix.to_s] = old_values[ix] }
183
+ indexed_values.each {|k,v|
184
+ new_val = values.delete(k)
185
+ logger.debug "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
186
+ changed ||= !(v.eql? new_val)
187
+ }
188
+ logger.debug "remaining values! #{values.inspect}" if values.length > 0
189
+ changed || (values.length > 0)
190
+ end
191
+
192
+ def no_update(ds_params)
193
+ response = {}
194
+ ds_params.each{|pointer, values|
195
+ returned = []
196
+ if values.is_a? Hash
197
+ keys = values.keys.sort {|x,y| x.to_i <=> y.to_i}
198
+ keys.each {|key| returned << values[key]}
199
+ else
200
+ returned << values
201
+ end
202
+ response[OM::XML::Terminology.term_hierarchical_name(pointer)] = returned
203
+ }
204
+ end
205
+
206
+ def legacy_content_path(ds, ds_root=ActiveFedora.config.credentials[:datastreams_root])
207
+ unless ds.controlGroup == 'M'
208
+ return ds.dsLocation
209
+ end
210
+ cd = ds.dsCreateDate
211
+ tz = ActiveFedora.config.credentials[:time_zone]
212
+ tzi = ActiveSupport::TimeZone.find_tzinfo(tz)
213
+ ld = tzi.utc_to_local(cd)
214
+ month = (ld.month < 10) ? "0#{ld.month}" : ld.month.to_s
215
+ day = (ld.day < 10) ? "0#{ld.day}" : ld.day.to_s
216
+ hour = (ld.hour < 10) ? "0#{ld.hour}" : ld.hour.to_s
217
+ min = (ld.min < 10) ? "0#{ld.min}" : ld.min.to_s
218
+ return File.join(ds_root,"#{ld.year}/#{month}#{day}/#{hour}/#{min}", ds.dsLocation.sub(':','_'))
219
+ end
220
+ end
@@ -0,0 +1,106 @@
1
+ module Cul::Hydra::Models::ImageResource
2
+ IMAGE_EXT = {"image/bmp" => 'bmp', "image/gif" => 'gif', "image/jpeg" => 'jpg', "image/png" => 'png', "image/tiff" => 'tif', "image/x-windows-bmp" => 'bmp', 'image/jp2' => 'jp2'}
3
+ WIDTH = RDF::URI(ActiveFedora::Predicates.find_graph_predicate(:image_width))
4
+ LENGTH = RDF::URI(ActiveFedora::Predicates.find_graph_predicate(:image_length))
5
+ WIDTH_PREDICATE = ActiveFedora::Predicates.short_predicate("http://www.w3.org/2003/12/exif/ns#imageWidth").to_s
6
+ LENGTH_PREDICATE = ActiveFedora::Predicates.short_predicate("http://www.w3.org/2003/12/exif/ns#imageLength").to_s
7
+ EXTENT_PREDICATE = ActiveFedora::Predicates.short_predicate("http://purl.org/dc/terms/extent").to_s
8
+ FORMAT_OF_PREDICATE = ActiveFedora::Predicates.short_predicate("http://purl.org/dc/terms/isFormatOf").to_s
9
+ FORMAT_URI = RDF::URI("http://purl.org/dc/terms/format")
10
+
11
+ DJATOKA_THUMBNAIL_PARMS = {
12
+ "url_ver" => "Z39.88-2004",
13
+ "svc_id" => "info:lanl-repo/svc/getRegion",
14
+ "svc_val_fmt" => "info:ofi/fmt:kev:mtx:jpeg2000",
15
+ "svc.format" => "image/jpeg",
16
+ "svc.level" => "",
17
+ "svc.rotate" => "0",
18
+ "svc.scale" => "200",
19
+ "svc.clayers" => ""
20
+ }
21
+
22
+ DJATOKA_BASE_URL = "http://iris.cul.columbia.edu:8888/resolve"
23
+
24
+ EXIF_ORIENTATION_TO_DEGREES = {
25
+ 'top-left' => 0,
26
+ 'left-bottom' => 90,
27
+ 'bottom-right' => 180,
28
+ 'right-top' => 270
29
+ }
30
+ DEGREES_TO_EXIF_ORIENTATIONS = EXIF_ORIENTATION_TO_DEGREES.invert
31
+
32
+ def long
33
+ @long_side ||= max(width(), length())
34
+ end
35
+
36
+ def width
37
+ @width ||= begin
38
+ ds = datastreams["content"]
39
+ width = 0
40
+ unless ds.nil? or rels_int.relationships(ds,:exif_image_width).blank?
41
+ width = rels_int.relationships(ds,:exif_image_width).first.object.to_s.to_i
42
+ end
43
+ width = relationships(:image_width).first.to_s.to_i if width == 0
44
+ width
45
+ end
46
+ end
47
+
48
+ def length
49
+ @length ||= begin
50
+ ds = datastreams["content"]
51
+ length = 0
52
+ unless ds.nil? or rels_int.relationships(ds,:exif_image_length).blank?
53
+ length = rels_int.relationships(ds,:exif_image_length).first.object.to_s.to_i
54
+ end
55
+ length = relationships(:image_length).first.to_s.to_i if length == 0
56
+ length
57
+ end
58
+ end
59
+
60
+ def zooming?
61
+ zoom = rels_int.relationships(datastreams['content'],:foaf_zooming).first
62
+ return zoom.object.to_s if zoom
63
+ datastreams.each do |k,v|
64
+ if v.mimeType =~ /image\/jp2$/i
65
+ zoom = "info:fedora/#{k.dsid}"
66
+ end
67
+ end
68
+ return zoom
69
+ end
70
+
71
+ def thumbnail_info
72
+ thumb = rels_int.relationships(datastreams['content'],:foaf_thumbnail).first
73
+ if thumb
74
+ t_dsid = thumb.object.to_s.split('/')[-1]
75
+ t_url = "#{ActiveFedora.fedora_config.credentials[:url]}/objects/#{pid}/datastreams/#{t_dsid}/content"
76
+ return {:url=>t_url,:mime=>datastreams[t_dsid].mimeType}
77
+ elsif (zoom = self.zooming?)
78
+ t_dsid = zoom.split('/')[-1]
79
+ t_parms = DJATOKA_THUMBNAIL_PARMS.merge({"rft_id" => datastreams[t_dsid].dsLocation})
80
+ url = "#{DJATOKA_BASE_URL}?#{options.map { |key, value| "#{CGI::escape(key.to_s)}=#{CGI::escape(value.to_s)}"}.join("&") }"
81
+ {:url => url, :mime => t_parms["svc.format"]}
82
+ else
83
+ return {:asset=>"cul_hydra/crystal/file.png",:mime=>'image/png'}
84
+ end
85
+ end
86
+
87
+ # The number of rotational degrees required to display this image as upright
88
+ def required_rotation_for_upright_display
89
+ required_rotation_orientation_in_degrees = (360 - self.orientation) % 360
90
+ return required_rotation_orientation_in_degrees
91
+ end
92
+
93
+ # Allowed degrees arg values: 0, 90, 180, 270
94
+ def orientation=(degrees)
95
+ degrees = degrees % 360
96
+ raise "Invalid value for degrees. Must be a right angle (0, 90, 180, etc.)" unless (degrees % 90 == 0)
97
+ self.clear_relationship(:orientation)
98
+ self.add_relationship(:orientation, DEGREES_TO_EXIF_ORIENTATIONS[degrees], true)
99
+ return degrees # Hide RDF backing structure and make this look like a simple setter method
100
+ end
101
+
102
+ def orientation
103
+ self.relationships(:orientation).present? ? EXIF_ORIENTATION_TO_DEGREES[self.relationships(:orientation).first.to_s] : 0
104
+ end
105
+
106
+ end