cul_scv_hydra 0.3.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.
- data/app/models/bag_aggregator.rb +16 -0
- data/app/models/content_aggregator.rb +16 -0
- data/app/models/dcdocument.rb +9 -0
- data/app/models/generic_aggregator.rb +16 -0
- data/app/models/generic_object.rb +16 -0
- data/app/models/jp2_image_aggregator.rb +38 -0
- data/app/models/mets_structured_aggregator.rb +16 -0
- data/app/models/resource.rb +59 -0
- data/app/models/static_audio_aggregator.rb +21 -0
- data/app/models/static_image_aggregator.rb +21 -0
- data/config/fedora.yml +6 -0
- data/config/predicate_mappings.yml +56 -0
- data/config/solr.yml +15 -0
- data/config/solr_mappings.yml +26 -0
- data/config/solr_value_maps.yml +29 -0
- data/lib/cul_scv_hydra.rb +14 -0
- data/lib/cul_scv_hydra/access_controls_enforcement.rb +53 -0
- data/lib/cul_scv_hydra/active_fedora.rb +18 -0
- data/lib/cul_scv_hydra/active_fedora/model.rb +8 -0
- data/lib/cul_scv_hydra/active_fedora/model/aggregator.rb +45 -0
- data/lib/cul_scv_hydra/active_fedora/model/common.rb +221 -0
- data/lib/cul_scv_hydra/active_fedora/model/dcdocument.rb +43 -0
- data/lib/cul_scv_hydra/active_fedora/model/resource.rb +79 -0
- data/lib/cul_scv_hydra/controllers.rb +13 -0
- data/lib/cul_scv_hydra/controllers/aggregates.rb +95 -0
- data/lib/cul_scv_hydra/controllers/aggregator_controller_helper.rb +27 -0
- data/lib/cul_scv_hydra/controllers/catalog.rb +13 -0
- data/lib/cul_scv_hydra/controllers/content_aggregators.rb +83 -0
- data/lib/cul_scv_hydra/controllers/datastreams.rb +146 -0
- data/lib/cul_scv_hydra/controllers/helpers.rb +11 -0
- data/lib/cul_scv_hydra/controllers/helpers/active_fedora_helper_behavior.rb +9 -0
- data/lib/cul_scv_hydra/controllers/helpers/application_helper_behavior.rb +17 -0
- data/lib/cul_scv_hydra/controllers/helpers/dc_metadata_helper_behavior.rb +9 -0
- data/lib/cul_scv_hydra/controllers/helpers/hydra_assets_helper_behavior.rb +46 -0
- data/lib/cul_scv_hydra/controllers/helpers/hydra_autocomplete_helper_behavior.rb +35 -0
- data/lib/cul_scv_hydra/controllers/helpers/hydra_uploader_helper_behavior.rb +34 -0
- data/lib/cul_scv_hydra/controllers/helpers/resources_helper_behavior.rb +160 -0
- data/lib/cul_scv_hydra/controllers/resources.rb +162 -0
- data/lib/cul_scv_hydra/controllers/static_image_aggregators.rb +106 -0
- data/lib/cul_scv_hydra/controllers/suggestions.rb +127 -0
- data/lib/cul_scv_hydra/controllers/terms.rb +152 -0
- data/lib/cul_scv_hydra/engine.rb +9 -0
- data/lib/cul_scv_hydra/om.rb +11 -0
- data/lib/cul_scv_hydra/om/dc_metadata.rb +70 -0
- data/lib/cul_scv_hydra/om/scv_mods_document.rb +132 -0
- data/lib/cul_scv_hydra/om/standard_mods.rb +111 -0
- data/lib/cul_scv_hydra/solrizer.rb +12 -0
- data/lib/cul_scv_hydra/solrizer/extractor.rb +27 -0
- data/lib/cul_scv_hydra/solrizer/field_mapper.rb +30 -0
- data/lib/cul_scv_hydra/solrizer/terminology_based_solrizer.rb +112 -0
- data/lib/cul_scv_hydra/solrizer/value_mapper.rb +35 -0
- data/lib/cul_scv_hydra/version.rb +10 -0
- metadata +333 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
require "active-fedora"
|
2
|
+
require "cul_scv_hydra/om"
|
3
|
+
require 'uri'
|
4
|
+
require 'rdf'
|
5
|
+
module Cul
|
6
|
+
module Scv
|
7
|
+
module Hydra
|
8
|
+
module ActiveFedora
|
9
|
+
AGGREGATOR_TYPE = (URI.parse("http://purl.oclc.org/NET/CUL/Aggregator"))
|
10
|
+
RESOURCE_TYPE = (URI.parse("http://purl.oclc.org/NET/CUL/Resource"))
|
11
|
+
MEMBER_QUERY = <<-SPARQL
|
12
|
+
SELECT ?pid WHERE { ?pid <http://purl.oclc.org/NET/CUL/memberOf> <info:fedora/%PID%> }
|
13
|
+
SPARQL
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
require 'cul_scv_hydra/active_fedora/model.rb'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module Cul::Scv::Hydra::ActiveFedora
|
2
|
+
module Model
|
3
|
+
end
|
4
|
+
end
|
5
|
+
require 'cul_scv_hydra/active_fedora/model/aggregator'
|
6
|
+
require 'cul_scv_hydra/active_fedora/model/common'
|
7
|
+
require 'cul_scv_hydra/active_fedora/model/dcdocument'
|
8
|
+
require 'cul_scv_hydra/active_fedora/model/resource'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Cul::Scv::Hydra::ActiveFedora::Model
|
2
|
+
module Aggregator
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
has_relationship "parts", :cul_member_of, :inbound => true
|
7
|
+
after_create :aggregator!
|
8
|
+
end
|
9
|
+
module InstanceMethods
|
10
|
+
def aggregator!
|
11
|
+
add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::AGGREGATOR_TYPE.to_s)
|
12
|
+
@metadata_is_dirty = true
|
13
|
+
update
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_member(member, container=self)
|
17
|
+
if container.respond_to?:internal_uri
|
18
|
+
container = container.internal_uri
|
19
|
+
end
|
20
|
+
if container =~ /\A[\w\-]+:[\w\-]+\Z/
|
21
|
+
container = "info:fedora/#{container}"
|
22
|
+
end
|
23
|
+
member.add_relationship(:cul_member_of, container)
|
24
|
+
member.datastreams["RELS-EXT"].dirty = true
|
25
|
+
member.save
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove_member(member, container=self)
|
29
|
+
if container.respond_to?:internal_uri
|
30
|
+
container = container.internal_uri
|
31
|
+
end
|
32
|
+
if container =~ /\A[\w\-]+:[\w\-]+\Z/
|
33
|
+
container = "info:fedora/#{container}"
|
34
|
+
end
|
35
|
+
rel = ActiveFedora::Relationship.new()
|
36
|
+
rel.subject_pid= :self
|
37
|
+
rel.object = container
|
38
|
+
rel.predicate = :cul_member_of
|
39
|
+
member.remove_relationship(rel)
|
40
|
+
member.datastreams["RELS-EXT"].dirty = true
|
41
|
+
member.save
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,221 @@
|
|
1
|
+
require "active-fedora"
|
2
|
+
require 'uri'
|
3
|
+
module Cul::Scv::Hydra::ActiveFedora::Model
|
4
|
+
module Common
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
define_model_callbacks :create
|
9
|
+
|
10
|
+
has_relationship "containers", :cul_member_of
|
11
|
+
has_relationship "rdf_type", :rdf_type
|
12
|
+
has_metadata :name => "DC", :type=>Cul::Scv::Hydra::Om::DCMetadata, :versionable => true
|
13
|
+
has_metadata :name => "descMetadata", :type=>Cul::Scv::Hydra::Om::ModsDocument, :versionable => true
|
14
|
+
has_metadata :name => "rightsMetadata", :type=>::Hydra::RightsMetadata, :versionable => true
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def pid_namespace
|
19
|
+
"ldpd"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
def initialize(attrs = nil)
|
25
|
+
attrs = {} if attrs.nil?
|
26
|
+
attrs[:namespace] = self.class.pid_namespace unless attrs[:namespace]
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def create
|
31
|
+
run_callbacks :create do
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def resources(opts={})
|
37
|
+
if self.respond_to? :parts # aggregator
|
38
|
+
opts = {:rows=>25,:response_format=>:solr}.merge(opts)
|
39
|
+
self.parts(opts)
|
40
|
+
#opts = {:rows=>25,:response_format=>:solr}.merge(opts)
|
41
|
+
#query = self.class.inbound_relationship_query(self.pid, "parts")
|
42
|
+
#solr_result = ::ActiveFedora::SolrService.instance.conn.query(query, :rows=>opts[:rows])
|
43
|
+
#if opts[:response_format] == :solr
|
44
|
+
# return solr_result
|
45
|
+
#else
|
46
|
+
# if opts[:response_format] == :id_array
|
47
|
+
# id_array = []
|
48
|
+
# solr_result.hits.each do |hit|
|
49
|
+
# id_array << hit[SOLR_DOCUMENT_ID]
|
50
|
+
# end
|
51
|
+
# return id_array
|
52
|
+
# elsif opts[:response_format] == :load_from_solr || self.load_from_solr
|
53
|
+
# return ::ActiveFedora::SolrService.reify_solr_results(solr_result,{:load_from_solr=>true})
|
54
|
+
# else
|
55
|
+
# return ::ActiveFedora::SolrService.reify_solr_results(solr_result)
|
56
|
+
# end
|
57
|
+
#end
|
58
|
+
else
|
59
|
+
logger.warn "parts not defined; was this an Aggregator?"
|
60
|
+
[]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def members(opts={})
|
65
|
+
resources(opts)
|
66
|
+
end
|
67
|
+
|
68
|
+
def members_ids(opts={})
|
69
|
+
opts = opts.merge({:response_format=>:id_array})
|
70
|
+
resources(opts)
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def cmodel_pid(klass)
|
75
|
+
klass.pid_namespace + ":" + klass.name.split("::")[-1]
|
76
|
+
end
|
77
|
+
|
78
|
+
def datastreams_in_fedora
|
79
|
+
mds = {}
|
80
|
+
self.datastreams_xml['datastream'].each do |ds|
|
81
|
+
dsid = ds["dsid"]
|
82
|
+
ds.merge!({:pid => self.pid, :dsID => dsid, :dsLabel => ds["label"]})
|
83
|
+
if dsid == "RELS-EXT"
|
84
|
+
mds.merge!({dsid => ActiveFedora::RelsExtDatastream.new(ds)})
|
85
|
+
else
|
86
|
+
if self.class.ds_specs.has_key? dsid
|
87
|
+
mds.merge!({dsid => self.class.ds_specs[dsid][0].new(ds)})
|
88
|
+
else
|
89
|
+
mds.merge!({dsid => ActiveFedora::Datastream.new(ds)})
|
90
|
+
end
|
91
|
+
end
|
92
|
+
mds[dsid].new_object = false
|
93
|
+
end
|
94
|
+
mds
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def route_as
|
99
|
+
"default"
|
100
|
+
end
|
101
|
+
|
102
|
+
def index_type_label
|
103
|
+
riquery = Cul::Scv::Hydra::ActiveFedora::MEMBER_QUERY.gsub(/%PID%/, self.pid)
|
104
|
+
begin
|
105
|
+
docs = ::ActiveFedora::RubydoraConnection.instance.connection.find_by_sparql riquery
|
106
|
+
rescue
|
107
|
+
docs = self.parts
|
108
|
+
end
|
109
|
+
if docs.length == 0
|
110
|
+
label = "EMPTY"
|
111
|
+
elsif docs.length == 1
|
112
|
+
label = "SINGLE PART"
|
113
|
+
else
|
114
|
+
label = "MULTIPART"
|
115
|
+
end
|
116
|
+
label
|
117
|
+
end
|
118
|
+
|
119
|
+
def has_desc?
|
120
|
+
has_desc = false
|
121
|
+
begin
|
122
|
+
has_desc = self.datastreams.include? "descMetadata"
|
123
|
+
has_desc = has_desc and self.inner_object.datastreams["descMetadata"].content.length > 0
|
124
|
+
has_desc = self.datastreams["descMetadata"].term_values(:identifier).length > 0
|
125
|
+
rescue
|
126
|
+
has_desc = false
|
127
|
+
end
|
128
|
+
has_desc
|
129
|
+
end
|
130
|
+
|
131
|
+
def to_solr(solr_doc = Hash.new, opts={})
|
132
|
+
super
|
133
|
+
if has_desc?
|
134
|
+
solr_doc["descriptor_s"] = ["mods"]
|
135
|
+
else
|
136
|
+
solr_doc["descriptor_s"] = ["dublin core"]
|
137
|
+
end
|
138
|
+
# if no mods, pull some values from DC
|
139
|
+
if not (solr_doc["title_display"] and solr_doc["title_display"].length > 0)
|
140
|
+
if self.dc.term_values(:title).first
|
141
|
+
solr_doc["title_display"] = [self.dc.term_values(:title).first]
|
142
|
+
else
|
143
|
+
solr_doc["title_display"] = [self.dc.term_values(:identifier).first]
|
144
|
+
end
|
145
|
+
if self.dc.term_values(:relation).first
|
146
|
+
self.dc.term_values(:relation).each {|val|
|
147
|
+
if val =~ /clio:/
|
148
|
+
solr_doc["clio_s"] ||= []
|
149
|
+
solr_doc["clio_s"] << val.split(':')[-1]
|
150
|
+
end
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
solr_doc["format"] = [self.route_as]
|
155
|
+
solr_doc["index_type_label_s"] = [self.index_type_label]
|
156
|
+
solr_doc
|
157
|
+
end
|
158
|
+
|
159
|
+
def update_datastream_attributes(params={}, opts={})
|
160
|
+
logger.debug "Common.update_datastream_attributes"
|
161
|
+
result = params.dup
|
162
|
+
params.each_pair do |dsid, ds_params|
|
163
|
+
if datastreams.include?(dsid)
|
164
|
+
verify_params = ds_params.dup
|
165
|
+
current_indexed_attributes = {}
|
166
|
+
changed = false
|
167
|
+
verify_params.each { |pointer, values|
|
168
|
+
changed ||= value_changed?(datastreams[dsid],pointer,values)
|
169
|
+
}
|
170
|
+
if changed
|
171
|
+
logger.debug "Common.update_datastream_attributes calling update_indexed_attributes"
|
172
|
+
result[dsid] = datastreams[dsid].update_indexed_attributes(ds_params)
|
173
|
+
else
|
174
|
+
result[dsid] = no_update(ds_params)
|
175
|
+
end
|
176
|
+
logger.debug "change detected? #{changed} digital_object? #{datastreams[dsid].changed?}"
|
177
|
+
else
|
178
|
+
result.delete(dsid)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
return result
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
def value_changed?(ds,pointer,values)
|
186
|
+
if values.is_a? Hash
|
187
|
+
values = values.dup
|
188
|
+
else
|
189
|
+
values = {"0"=>values}
|
190
|
+
end
|
191
|
+
logger.debug "submitted values for #{pointer.inspect} : #{values.inspect}"
|
192
|
+
return true if values["-1"]
|
193
|
+
changed = false
|
194
|
+
old_values = ds.get_values(pointer)
|
195
|
+
indexed_values = {}
|
196
|
+
old_values.each_index {|ix| indexed_values[ix.to_s] = old_values[ix] }
|
197
|
+
indexed_values.each {|k,v|
|
198
|
+
new_val = values.delete(k)
|
199
|
+
puts "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
|
200
|
+
logger.debug "old: #{v} new: #{new_val} changed? #{!(v.eql? new_val)}"
|
201
|
+
changed ||= !(v.eql? new_val)
|
202
|
+
}
|
203
|
+
puts "remaining values! #{values.inspect}" if values.length > 0
|
204
|
+
changed || (values.length > 0)
|
205
|
+
end
|
206
|
+
|
207
|
+
def no_update(ds_params)
|
208
|
+
response = {}
|
209
|
+
ds_params.each{|pointer, values|
|
210
|
+
returned = []
|
211
|
+
if values.is_a? Hash
|
212
|
+
keys = values.keys.sort {|x,y| x.to_i <=> y.to_i}
|
213
|
+
keys.each {|key| returned << values[key]}
|
214
|
+
else
|
215
|
+
returned << values
|
216
|
+
end
|
217
|
+
response[OM::XML::Terminology.term_hierarchical_name(pointer)] = returned
|
218
|
+
}
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "active-fedora"
|
2
|
+
require "cul_scv_hydra/active_fedora"
|
3
|
+
require "hydra"
|
4
|
+
module Cul::Scv::Hydra::ActiveFedora::Model
|
5
|
+
class DcDocument < ::ActiveFedora::Base
|
6
|
+
include ::ActiveFedora::Relationships
|
7
|
+
include ::Hydra::ModelMethods
|
8
|
+
include Cul::Scv::Hydra::ActiveFedora::Model::Common
|
9
|
+
alias :file_objects :resources
|
10
|
+
|
11
|
+
# relationships #
|
12
|
+
has_relationship "containers", :cul_member_of
|
13
|
+
has_relationship "parts", :cul_member_of, :inbound => true
|
14
|
+
|
15
|
+
def self.load_instance_from_solr(pid,solr_doc=nil)
|
16
|
+
if solr_doc.nil?
|
17
|
+
result = find_by_solr(pid)
|
18
|
+
raise "Object #{pid} not found in solr" if result.nil?
|
19
|
+
solr_doc = result.hits.first
|
20
|
+
#double check pid and id in record match
|
21
|
+
raise "Object #{pid} not found in Solr" unless !result.nil? && !solr_doc.nil? && pid == solr_doc[SOLR_DOCUMENT_ID]
|
22
|
+
else
|
23
|
+
raise "Solr document record id and pid do not match" unless pid == solr_doc[SOLR_DOCUMENT_ID]
|
24
|
+
end
|
25
|
+
|
26
|
+
create_date = solr_doc[::ActiveFedora::SolrService.solr_name(:system_create, :date)].nil? ? solr_doc[::ActiveFedora::SolrService.solr_name(:system_create, :date).to_s] : solr_doc[::ActiveFedora::SolrService.solr_name(:system_create, :date)]
|
27
|
+
modified_date = solr_doc[::ActiveFedora::SolrService.solr_name(:system_create, :date)].nil? ? solr_doc[::ActiveFedora::SolrService.solr_name(:system_modified, :date).to_s] : solr_doc[::ActiveFedora::SolrService.solr_name(:system_modified, :date)]
|
28
|
+
obj = DcDocument.new({:pid=>solr_doc[SOLR_DOCUMENT_ID],:create_date=>create_date,:modified_date=>modified_date})
|
29
|
+
obj.new_object = false
|
30
|
+
#set by default to load any dependent relationship objects from solr as well
|
31
|
+
obj.load_from_solr = true
|
32
|
+
#need to call rels_ext once so it exists when iterating over datastreams
|
33
|
+
obj.rels_ext
|
34
|
+
obj.datastreams.each_value do |ds|
|
35
|
+
if ds.respond_to?(:from_solr)
|
36
|
+
ds.from_solr(solr_doc) if ds.kind_of?(::ActiveFedora::MetadataDatastream) || ds.kind_of?(::ActiveFedora::NokogiriDatastream) || ( ds.kind_of?(::ActiveFedora::RelsExtDatastream))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
obj
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Cul::Scv::Hydra::ActiveFedora::Model
|
2
|
+
module Resource
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
# constants #
|
5
|
+
IMAGE_MIME_TYPES = [
|
6
|
+
'image/bmp',
|
7
|
+
'image/gif',
|
8
|
+
'image/jpeg',
|
9
|
+
'image/png',
|
10
|
+
'image/tiff'
|
11
|
+
]
|
12
|
+
|
13
|
+
included do
|
14
|
+
if self.respond_to? :has_relationship
|
15
|
+
has_relationship "image_width", :image_width
|
16
|
+
has_relationship "image_length", :image_length
|
17
|
+
has_relationship "x_sampling", :x_sampling
|
18
|
+
has_relationship "y_sampling", :y_sampling
|
19
|
+
has_relationship "sampling_unit", :sampling_unit
|
20
|
+
has_relationship "extent", :extent
|
21
|
+
|
22
|
+
after_create :resource!
|
23
|
+
end
|
24
|
+
if self.respond_to? :has_datastream
|
25
|
+
has_datastream :name => "CONTENT", :type=>::ActiveFedora::Datastream, :versionable => true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
module InstanceMethods
|
29
|
+
def resource!
|
30
|
+
add_relationship(:rdf_type, Cul::Scv::Hydra::ActiveFedora::RESOURCE_TYPE.to_s)
|
31
|
+
@metadata_is_dirty = true
|
32
|
+
update
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_content_blob(blob, opts)
|
36
|
+
file_name = opts[:file_name]
|
37
|
+
mime = opts[:mime_type].nil? ? mime_type(file_name) : opts[:mime_type]
|
38
|
+
add_file_datastream(blob, :label=>file_name, :mimeType=>mime, :dsid => 'CONTENT')
|
39
|
+
set_title_and_label( file_name, :only_if_blank=>true )
|
40
|
+
if IMAGE_MIME_TYPES.include? mime
|
41
|
+
blob.rewind
|
42
|
+
# retrieve Nokogiri of image property RDF
|
43
|
+
image_prop_nodes = Cul::Image::Properties.identify(blob).nodeset
|
44
|
+
relsext = datastreams['RELS-EXT']
|
45
|
+
image_prop_nodes.each { |node|
|
46
|
+
if node["resource"]
|
47
|
+
is_literal = false
|
48
|
+
object = RDF::URI.new(node["resource"])
|
49
|
+
else
|
50
|
+
is_literal = true
|
51
|
+
object = RDF::Literal(node.text)
|
52
|
+
end
|
53
|
+
subject = RDF::URI(internal_uri)
|
54
|
+
predicate = RDF::URI("#{node.namespace.href}#{node.name}")
|
55
|
+
query = RDF::Query.new({ :subject => {predicate => :object}})
|
56
|
+
relationships(predicate).dup.each { |stmt|
|
57
|
+
relationships.delete(stmt)
|
58
|
+
}
|
59
|
+
add_relationship(predicate,object, is_literal)
|
60
|
+
relationships_are_dirty=true
|
61
|
+
}
|
62
|
+
# add mimetype to DC:format values
|
63
|
+
self.datastreams['DC'].update_values({[:format] => mime})
|
64
|
+
end
|
65
|
+
blob.rewind
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Return the mimeType for a given file name
|
71
|
+
# @param [String] file_name The filename to use to get the mimeType
|
72
|
+
# @return [String] mimeType for filename passed in. Default: application/octet-stream if mimeType cannot be determined
|
73
|
+
def mime_type file_name
|
74
|
+
mime_types = MIME::Types.of(file_name)
|
75
|
+
mime_type = mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Cul::Scv::Hydra
|
2
|
+
module Controllers
|
3
|
+
end
|
4
|
+
end
|
5
|
+
require 'cul_scv_hydra/controllers/aggregates'
|
6
|
+
require 'cul_scv_hydra/controllers/catalog'
|
7
|
+
require 'cul_scv_hydra/controllers/content_aggregators'
|
8
|
+
require 'cul_scv_hydra/controllers/datastreams'
|
9
|
+
require 'cul_scv_hydra/controllers/helpers'
|
10
|
+
require 'cul_scv_hydra/controllers/resources'
|
11
|
+
require 'cul_scv_hydra/controllers/static_image_aggregators'
|
12
|
+
require 'cul_scv_hydra/controllers/suggestions'
|
13
|
+
require 'cul_scv_hydra/controllers/terms'
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'cul_scv_hydra/controllers/aggregator_controller_helper'
|
2
|
+
require 'cul_scv_hydra/controllers/helpers/resources_helper_behavior'
|
3
|
+
module Cul::Scv::Hydra::Controllers
|
4
|
+
module Aggregates
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
included do
|
7
|
+
include Hydra::AssetsControllerHelper
|
8
|
+
include Cul::Scv::Hydra::Controllers::AggregatorControllerHelper
|
9
|
+
include Cul::Scv::Hydra::Controllers::Helpers::ResourcesHelperBehavior
|
10
|
+
include Hydra::RepositoryController
|
11
|
+
include MediaShelf::ActiveFedoraHelper
|
12
|
+
include Blacklight::SolrHelper
|
13
|
+
before_filter :require_solr, :only=>[:index, :create, :show, :destroy]
|
14
|
+
before_filter :load_resources, :only=>[:index]
|
15
|
+
prepend_before_filter :sanitize_update_params
|
16
|
+
end
|
17
|
+
module InstanceMethods
|
18
|
+
def index
|
19
|
+
|
20
|
+
if params[:layout] == "false"
|
21
|
+
layout = false
|
22
|
+
end
|
23
|
+
container_uri = "info:fedora/#{params[:asset_id]}"
|
24
|
+
escaped_uri = container_uri.gsub(/(:)/, '\\:')
|
25
|
+
extra_controller_params = {:q=>"cul_member_of_s:#{escaped_uri}"}
|
26
|
+
@response, @document_list = get_search_results( extra_controller_params )
|
27
|
+
|
28
|
+
# Including this line so permissions tests can be run against the container
|
29
|
+
@container_response, @document = get_solr_response_for_doc_id(params[:asset_id])
|
30
|
+
|
31
|
+
render :action=>params[:action], :layout=>layout
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_aggregate
|
35
|
+
if params.has_key? :aggregate_id
|
36
|
+
af_base = ActiveFedora::Base.load_instance(params[:aggregate_id])
|
37
|
+
else
|
38
|
+
af_base = ActiveFedora::Base.load_instance(params[:id])
|
39
|
+
end
|
40
|
+
the_model = ActiveFedora::ContentModel.known_models_for( af_base ).first
|
41
|
+
if the_model.nil? or the_model == ActiveFedora::Base
|
42
|
+
the_model = DcDocument
|
43
|
+
end
|
44
|
+
|
45
|
+
@resource = the_model.load_instance(af_base.pid)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Creates and Saves a Parent - Child relationship in the Child's RELS-EXT
|
49
|
+
# If container_id is provided:
|
50
|
+
# * the File Asset will use RELS-EXT to assert that it's a part of the specified container
|
51
|
+
# * the method will redirect to the container object's edit view after saving
|
52
|
+
def create
|
53
|
+
if params.has_key?(:aggregate_id)
|
54
|
+
@resource = load_aggregate
|
55
|
+
logger.debug @resource.class
|
56
|
+
logger.debug @resource.datastreams["RELS-EXT"].content
|
57
|
+
logger.debug @resource.to_rels_ext(@resource.pid)
|
58
|
+
if !params[:asset_id].nil?
|
59
|
+
associate_resource_with_container(@resource, params[:asset_id])
|
60
|
+
@resource.save
|
61
|
+
flash[:notice] = "Aggregated #{@resource.pid} under #{params[:asset_id]}."
|
62
|
+
else
|
63
|
+
flash[:notice] = "You must specify a container for the aggregate."
|
64
|
+
end
|
65
|
+
else
|
66
|
+
flash[:notice] = "You must specify a resource to aggregate."
|
67
|
+
end
|
68
|
+
|
69
|
+
if !params[:asset_id].nil?
|
70
|
+
redirect_params = {:controller=>"aggregates", :id=>params[:asset_id], :action=>:index}
|
71
|
+
end
|
72
|
+
|
73
|
+
redirect_params ||= {:action=>:index}
|
74
|
+
|
75
|
+
redirect_to redirect_params
|
76
|
+
end
|
77
|
+
|
78
|
+
# Common destroy method for all AssetsControllers
|
79
|
+
def destroy
|
80
|
+
@resource = load_aggregate
|
81
|
+
remove_resource_from_container(@resource, params[:asset_id])
|
82
|
+
@resource.save
|
83
|
+
|
84
|
+
flash[:notice] = "Deleted #{params[:id]} from #{params[:asset_id]}."
|
85
|
+
if !params[:asset_id].nil?
|
86
|
+
redirect_params = {:controller=>"aggregates", :id=>params[:asset_id], :action=>:index}
|
87
|
+
end
|
88
|
+
|
89
|
+
redirect_params ||= {:action=>:index}
|
90
|
+
|
91
|
+
redirect_to redirect_params
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|