cul_hydra 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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