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,160 @@
|
|
1
|
+
require 'hydra'
|
2
|
+
require 'net/http'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'uri'
|
6
|
+
module Cul::Scv::Hydra::Controllers::Helpers
|
7
|
+
module ResourcesHelperBehavior
|
8
|
+
IMAGE_MIME_TYPES = [
|
9
|
+
'image/bmp',
|
10
|
+
'image/gif',
|
11
|
+
'image/jpeg',
|
12
|
+
'image/png',
|
13
|
+
'image/tiff'
|
14
|
+
]
|
15
|
+
|
16
|
+
# Creates a Resource, adding the posted blob to the Resource's datastreams and saves the Resource
|
17
|
+
#
|
18
|
+
# @return [Resource] the Resource
|
19
|
+
def create_and_save_resources_from_params
|
20
|
+
if params.has_key?(:Fileurl)
|
21
|
+
# parse url for file name, default to index.html
|
22
|
+
file_url = params[:Fileurl]
|
23
|
+
file_url = URI.parse(file_url) unless file_url.nil?
|
24
|
+
file_name = 'index.html'
|
25
|
+
if file_url.scheme
|
26
|
+
file_name = file_url.path[1...file_url.path.length]
|
27
|
+
end
|
28
|
+
# download resource; override file name with header value if present
|
29
|
+
blob = Tempfile.new('temp')
|
30
|
+
blob.binmode
|
31
|
+
# download header? buffered writing?
|
32
|
+
response = Net::HTTP.get_response(file_url)
|
33
|
+
blob.write response.body
|
34
|
+
if response['Content-Disposition']
|
35
|
+
header = response['Content-Disposition']
|
36
|
+
if header =~ /filename=\"?(\w+)\"?/
|
37
|
+
file_name = $1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
# add filename and resource to params
|
41
|
+
params[:Filedata] = [ActionDispatch::Http::UploadedFile.new(:tempfile=>blob,:filename=>file_name,:type=>mime_type(file_name))]
|
42
|
+
end
|
43
|
+
if params.has_key?(:Filedata)
|
44
|
+
@resources = []
|
45
|
+
params[:Filedata].each do |file|
|
46
|
+
file.content_type = mime_type(file.original_filename) unless file.content_type
|
47
|
+
@resource = create_resource_from_file(file)
|
48
|
+
@resource.save
|
49
|
+
@resources << @resource
|
50
|
+
@resource.refresh
|
51
|
+
add_posted_blob_to_resource(file, @resource)
|
52
|
+
@resource.save
|
53
|
+
end
|
54
|
+
else
|
55
|
+
render :text => "400 Bad Request", :status => 400
|
56
|
+
end
|
57
|
+
@resources
|
58
|
+
end
|
59
|
+
|
60
|
+
def update_resource_from_params
|
61
|
+
if params.has_key?(:Fileurl)
|
62
|
+
# parse url for file name, default to index.html
|
63
|
+
file_url = params[:Fileurl]
|
64
|
+
file_url = URI.parse(file_url) unless file_url.nil?
|
65
|
+
file_name = 'index.html'
|
66
|
+
if file_url.scheme
|
67
|
+
file_name = file_url.path[1...file_url.path.length]
|
68
|
+
end
|
69
|
+
# download resource; override file name with header value if present
|
70
|
+
blob = Tempfile.new('temp')
|
71
|
+
blob.binmode
|
72
|
+
# download header? buffered writing?
|
73
|
+
response = Net::HTTP.get_response(file_url)
|
74
|
+
blob.write response.body
|
75
|
+
if response['Content-Disposition']
|
76
|
+
header = response['Content-Disposition']
|
77
|
+
if header =~ /filename=\"?(\w+)\"?/
|
78
|
+
file_name = $1
|
79
|
+
end
|
80
|
+
end
|
81
|
+
# add filename and resource to params
|
82
|
+
params[:Filedata] = ActionDispatch::Http::UploadedFile.new(:tempfile=>blob,:filename=>file_name,:type=>mime_type(file_name))
|
83
|
+
end
|
84
|
+
if params.has_key?(:Filedata)
|
85
|
+
file = params[:Filedata]
|
86
|
+
file.content_type = mime_type(file.original_filename) unless file.content_type
|
87
|
+
update_resource_from_file(@document_fedora,file)
|
88
|
+
add_posted_blob_to_resource(file, @document_fedora)
|
89
|
+
@document_fedora.save
|
90
|
+
else
|
91
|
+
render :text => "400 Bad Request", :status => 400
|
92
|
+
end
|
93
|
+
@document_fedora
|
94
|
+
end
|
95
|
+
def update_resource_from_file(resource,file)
|
96
|
+
file_name = filename_for(file)
|
97
|
+
resource.label = file_name
|
98
|
+
resource.datastreams["DC"].update_values([:source=>0]=>[file_name])
|
99
|
+
resource
|
100
|
+
end
|
101
|
+
def create_resource_from_file(file)
|
102
|
+
resource = Resource.new
|
103
|
+
resource.datastreams["rightsMetadata"].ng_xml = Hydra::RightsMetadata.xml_template
|
104
|
+
update_resource_from_file(resource,file)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Puts the contents of params[:Filedata] (posted blob) into a datastream within the given @resource
|
108
|
+
# Sets resource label and title to filename if they're empty
|
109
|
+
#
|
110
|
+
# @param [Resource] the Resource to add the blob to
|
111
|
+
# @return [Resource] the Resource
|
112
|
+
def add_posted_blob_to_resource(file, resource=@resource)
|
113
|
+
resource.add_content_blob(file.tempfile, :file_name=>file.original_filename, :mime_type=>file.content_type)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Associate the new file resource with its container
|
117
|
+
def associate_resource_with_container(resource=@resource, container_id=nil)
|
118
|
+
if container_id.nil?
|
119
|
+
container_id = params[:container_id]
|
120
|
+
end
|
121
|
+
container_id = "info:fedora/#{container_id}" unless container_id =~ /info:fedora\/.+/
|
122
|
+
resource.containers_append(container_id)
|
123
|
+
resource.datastreams["RELS-EXT"].dirty = true
|
124
|
+
end
|
125
|
+
|
126
|
+
def remove_resource_from_container(resource=nil, container_id=nil)
|
127
|
+
if container_id.nil?
|
128
|
+
container_id = params[:container_id]
|
129
|
+
end
|
130
|
+
if resource.nil?
|
131
|
+
resource = @resource
|
132
|
+
end
|
133
|
+
resource.containers_remove(container_id)
|
134
|
+
#resource.remove_relationship(:cul_member_of, container_id)
|
135
|
+
resource.datastreams["RELS-EXT"].dirty = true
|
136
|
+
end
|
137
|
+
|
138
|
+
# Apply any posted file metadata to the file asset
|
139
|
+
def apply_posted_file_metadata(resource=@resource)
|
140
|
+
@metadata_update_response = update_document(resource, @sanitized_params)
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
# A best-guess filename
|
145
|
+
# If Filename was submitted, it uses that. Otherwise, it calls +original_filename+ on the posted file
|
146
|
+
def filename_for(file)
|
147
|
+
file.instance_variable_get(:@original_filename) || file.original_filename
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
# Return the mimeType for a given file name
|
152
|
+
# @param [String] file_name The filename to use to get the mimeType
|
153
|
+
# @return [String] mimeType for filename passed in. Default: application/octet-stream if mimeType cannot be determined
|
154
|
+
def mime_type file_name
|
155
|
+
mime_types = MIME::Types.of(file_name)
|
156
|
+
mime_type = mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module Cul::Scv::Hydra::Controllers
|
2
|
+
module Resources
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include Hydra::AssetsControllerHelper
|
7
|
+
include Cul::Scv::Hydra::Controllers::Helpers::ResourcesHelperBehavior
|
8
|
+
include Hydra::Controller
|
9
|
+
include Hydra::RepositoryController
|
10
|
+
include MediaShelf::ActiveFedoraHelper
|
11
|
+
include Blacklight::SolrHelper
|
12
|
+
before_filter :require_solr, :only=>[:index, :create, :show, :destroy]
|
13
|
+
before_filter :load_fedora_document, :only=>[:update]
|
14
|
+
prepend_before_filter :sanitize_update_params
|
15
|
+
end
|
16
|
+
|
17
|
+
def index
|
18
|
+
if params[:layout] == "false"
|
19
|
+
# action = "index_embedded"
|
20
|
+
layout = false
|
21
|
+
end
|
22
|
+
if !params[:container_id].nil?
|
23
|
+
container_uri = "info:fedora/#{params[:container_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[:container_id])
|
30
|
+
|
31
|
+
# Including these lines for backwards compatibility (until we can use Rails3 callbacks)
|
32
|
+
@container = ActiveFedora::Base.load_instance(params[:container_id])
|
33
|
+
@solr_result = @container.file_objects(:response_format=>:solr)
|
34
|
+
else
|
35
|
+
# @solr_result = ActiveFedora::SolrService.instance.conn.query('has_model_field:info\:fedora/ldpd\:Resource', @search_params)
|
36
|
+
@solr_result = Resource.find_by_solr(:all)
|
37
|
+
end
|
38
|
+
render :action=>params[:action], :layout=>layout
|
39
|
+
end
|
40
|
+
|
41
|
+
def new
|
42
|
+
render :partial=>"new", :layout=>false
|
43
|
+
end
|
44
|
+
|
45
|
+
# Creates and Saves a File Asset to contain the the Uploaded file
|
46
|
+
# If container_id is provided:
|
47
|
+
# * the File Asset will use RELS-EXT to assert that it's a part of the specified container
|
48
|
+
# * the method will redirect to the container object's edit view after saving
|
49
|
+
def create
|
50
|
+
if params.has_key?(:Filedata) or params.has_key?(:Fileurl)
|
51
|
+
flash[:notice] = process_files # "The file #{params[:Filename]} has been saved in <a href=\"#{asset_url(@resource.pid)}\">#{@resource.pid}</a>."
|
52
|
+
else
|
53
|
+
flash[:notice] = "You must specify a file to upload."
|
54
|
+
end
|
55
|
+
|
56
|
+
if !params[:container_id].nil?
|
57
|
+
redirect_params = {:controller=>"catalog", :id=>params[:container_id], :action=>:edit}
|
58
|
+
end
|
59
|
+
|
60
|
+
redirect_params ||= {:action=>:index}
|
61
|
+
|
62
|
+
redirect_to redirect_params
|
63
|
+
end
|
64
|
+
|
65
|
+
def update
|
66
|
+
if params.has_key?(:Filedata) or params.has_key?(:Fileurl)
|
67
|
+
flash[:notice] = update_file # "The file #{params[:Filename]} has been saved in <a href=\"#{asset_url(@resource.pid)}\">#{@resource.pid}</a>."
|
68
|
+
else
|
69
|
+
flash[:notice] = "You must specify a file to upload."
|
70
|
+
end
|
71
|
+
if !params[:id].nil?
|
72
|
+
redirect_params = {:controller=>"catalog", :id=>params[:id], :action=>:edit}
|
73
|
+
end
|
74
|
+
|
75
|
+
redirect_params ||= {:action=>:index}
|
76
|
+
|
77
|
+
redirect_to redirect_params
|
78
|
+
end
|
79
|
+
|
80
|
+
def process_files
|
81
|
+
@resources = create_and_save_resources_from_params
|
82
|
+
notice = []
|
83
|
+
@resources.each do |resource|
|
84
|
+
apply_depositor_metadata(resource)
|
85
|
+
notice << "The file #{resource.label} has been saved in <a href=\"#{asset_url(resource.pid)}\">#{resource.pid}</a>."
|
86
|
+
if !params[:container_id].nil?
|
87
|
+
associate_resource_with_container(resource,params[:container_id])
|
88
|
+
end
|
89
|
+
## Apply any posted file metadata
|
90
|
+
unless params[:asset].nil?
|
91
|
+
logger.debug("applying submitted file metadata: #{@sanitized_params.inspect}")
|
92
|
+
apply_posted_file_metadata(resource)
|
93
|
+
end
|
94
|
+
resource.save
|
95
|
+
logger.debug("Created #{resource.pid}.")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def update_file
|
100
|
+
update_resource_from_params
|
101
|
+
apply_depositor_metadata(@document_fedora)
|
102
|
+
notice << "The file #{@document_fedora.label} has been saved in <a href=\"#{asset_url(@document_fedora.pid)}\">#{@document_fedora.pid}</a>."
|
103
|
+
unless params[:asset].nil?
|
104
|
+
logger.debug("applying submitted file metadata: #{@sanitized_params.inspect}")
|
105
|
+
apply_posted_file_metadata(@document_fedora)
|
106
|
+
end
|
107
|
+
@document_fedora.save
|
108
|
+
logger.debug("Created #{@document_fedora.pid}.")
|
109
|
+
end
|
110
|
+
# Common destroy method for all AssetsControllers
|
111
|
+
def destroy
|
112
|
+
# The correct implementation, with garbage collection:
|
113
|
+
# if params.has_key?(:container_id)
|
114
|
+
# container = ActiveFedora::Base.load_instance(params[:container_id])
|
115
|
+
# container.file_objects_remove(params[:id])
|
116
|
+
# FileAsset.garbage_collect(params[:id])
|
117
|
+
# else
|
118
|
+
|
119
|
+
# The dirty implementation (leaves relationship in container object, deletes regardless of whether the file object has other containers)
|
120
|
+
ActiveFedora::Base.load_instance(params[:id]).delete
|
121
|
+
flash[:notice] = "Deleted #{params[:id]}."
|
122
|
+
if !params[:container_id].nil?
|
123
|
+
redirect_params = {:controller=>"catalog", :id=>params[:container_id], :action=>:edit}
|
124
|
+
end
|
125
|
+
|
126
|
+
redirect_params ||= {:action=>:index}
|
127
|
+
|
128
|
+
redirect_to redirect_params
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
def show
|
133
|
+
@file_asset = Resource.find(params[:id])
|
134
|
+
if (@file_asset.nil?)
|
135
|
+
logger.warn("No such resource: " + params[:id])
|
136
|
+
flash[:notice]= "No such resource."
|
137
|
+
redirect_to(:action => 'index', :q => nil , :f => nil)
|
138
|
+
else
|
139
|
+
# get array of parent (container) objects for this FileAsset
|
140
|
+
@id_array = @file_asset.containers(:response_format => :id_array)
|
141
|
+
@downloadable = false
|
142
|
+
# A FileAsset is downloadable iff the user has read or higher access to a parent
|
143
|
+
@id_array.each do |pid|
|
144
|
+
@response, @document = get_solr_response_for_doc_id(pid)
|
145
|
+
if reader?
|
146
|
+
@downloadable = true
|
147
|
+
break
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
if @downloadable
|
152
|
+
if @file_asset.datastreams_in_memory.include?("CONTENT")
|
153
|
+
send_datastream @file_asset.datastreams_in_memory["CONTENT"]
|
154
|
+
end
|
155
|
+
else
|
156
|
+
flash[:notice]= "You do not have sufficient access privileges to download this document, which has been marked private."
|
157
|
+
redirect_to(:action => 'index', :q => nil , :f => nil)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'cul_scv_hydra/controllers/helpers/resources_helper_behavior'
|
2
|
+
module Cul::Scv::Hydra::Controllers
|
3
|
+
module StaticImageAggregators
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
include Hydra::AssetsControllerHelper
|
8
|
+
include Cul::Scv::Hydra::Controllers::Helpers::ResourcesHelperBehavior
|
9
|
+
include Hydra::RepositoryController
|
10
|
+
include MediaShelf::ActiveFedoraHelper
|
11
|
+
include Blacklight::SolrHelper
|
12
|
+
before_filter :require_fedora
|
13
|
+
before_filter :require_solr, :only=>[:index, :new, :create, :edit, :show, :destroy]
|
14
|
+
prepend_before_filter :sanitize_update_params
|
15
|
+
end
|
16
|
+
|
17
|
+
def index
|
18
|
+
if params[:layout] == "false"
|
19
|
+
# action = "index_embedded"
|
20
|
+
layout = false
|
21
|
+
end
|
22
|
+
if !params[:container_id].nil?
|
23
|
+
container_uri = "info:fedora/#{params[:container_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[:container_id])
|
30
|
+
|
31
|
+
# Including these lines for backwards compatibility (until we can use Rails3 callbacks)
|
32
|
+
@container = ActiveFedora::Base.load_instance(params[:container_id])
|
33
|
+
@solr_result = @container.file_objects(:response_format=>:solr)
|
34
|
+
else
|
35
|
+
# @solr_result = ActiveFedora::SolrService.instance.conn.query('has_model_field:info\:fedora/ldpd\:Resource', @search_params)
|
36
|
+
@solr_result = Resource.find_by_solr(:all)
|
37
|
+
end
|
38
|
+
render :action=>params[:action], :layout=>layout
|
39
|
+
end
|
40
|
+
|
41
|
+
def new
|
42
|
+
@asset = StaticImageAggregator.new
|
43
|
+
apply_depositor_metadata(@asset)
|
44
|
+
set_collection_type(@asset, params[:content_type])
|
45
|
+
if !params[:container_id].nil?
|
46
|
+
associate_resource_with_container(@asset, params[:container_id])
|
47
|
+
end
|
48
|
+
@asset.save
|
49
|
+
@asset.refresh
|
50
|
+
msg = "Created a Static Image Aggregator with pid #{@asset.pid}. Now it's ready to be edited."
|
51
|
+
flash[:notice]= msg
|
52
|
+
|
53
|
+
if params.has_key?(:Filedata)
|
54
|
+
@file_asset = create_and_save_resource_from_params
|
55
|
+
apply_depositor_metadata(@file_asset)
|
56
|
+
|
57
|
+
flash[:notice] += " The file #{params[:Filename]} has been saved in <a href=\"#{asset_url(@file_asset.pid)}\">#{@file_asset.pid}</a>."
|
58
|
+
|
59
|
+
if !params[:container_id].nil?
|
60
|
+
associate_resource_with_container(@file_asset, @asset.pid)
|
61
|
+
end
|
62
|
+
|
63
|
+
## Apply any posted file metadata
|
64
|
+
unless params[:asset].nil?
|
65
|
+
logger.debug("applying submitted file metadata: #{@sanitized_params.inspect}")
|
66
|
+
@metadata_update_response = update_document(@file_asset, @sanitized_params)
|
67
|
+
end
|
68
|
+
@file_asset.save
|
69
|
+
# If redirect_params has not been set, use {:action=>:index}
|
70
|
+
logger.debug "Created #{@file_asset.pid}."
|
71
|
+
end
|
72
|
+
@asset.save
|
73
|
+
|
74
|
+
session[:scripts] = params[:combined] == "true"
|
75
|
+
redirect_to url_for(:action=>"edit", :id=>@asset.pid, :new_asset=>true, :controller=>'catalog')
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
# Common destroy method for all AssetsControllers
|
80
|
+
def destroy
|
81
|
+
# The correct implementation, with garbage collection:
|
82
|
+
# if params.has_key?(:container_id)
|
83
|
+
# container = ActiveFedora::Base.load_instance(params[:container_id])
|
84
|
+
# container.file_objects_remove(params[:id])
|
85
|
+
# FileAsset.garbage_collect(params[:id])
|
86
|
+
# else
|
87
|
+
|
88
|
+
# The dirty implementation (leaves relationship in container object, deletes regardless of whether the file object has other containers)
|
89
|
+
ActiveFedora::Base.load_instance(params[:id]).delete
|
90
|
+
render :text => "Deleted #{params[:id]} from #{params[:container_id]}."
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
def show
|
95
|
+
@image_agg = StaticImageAggregator.find(params[:id])
|
96
|
+
if (@image_agg.nil?)
|
97
|
+
logger.warn("No such object: " + params[:id])
|
98
|
+
flash[:notice]= "No such object."
|
99
|
+
redirect_to(:action => 'index', :q => nil , :f => nil)
|
100
|
+
else
|
101
|
+
@id_array = @image_agg.containers(:response_format => :id_array)
|
102
|
+
end
|
103
|
+
render :action=>params[:action], :layout=>(params[:layout]=="false")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'cul_scv_hydra'
|
2
|
+
require 'json'
|
3
|
+
module Cul::Scv::Hydra::Controllers
|
4
|
+
module Suggestions
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
included do
|
7
|
+
include Blacklight::SolrHelper
|
8
|
+
include MediaShelf::ActiveFedoraHelper
|
9
|
+
before_filter :require_solr, :only=>[:index]
|
10
|
+
end
|
11
|
+
|
12
|
+
def index
|
13
|
+
stub = params[:term] || ""
|
14
|
+
if params[:term_id].nil?
|
15
|
+
raise "Cannot provide suggestions without a term name"
|
16
|
+
end
|
17
|
+
field_name = params[:term_id]
|
18
|
+
field_key = field_key_from(field_name, Cul::Scv::Hydra::Om::ModsDocument.terminology)
|
19
|
+
solr_name = get_solr_name(field_key, Cul::Scv::Hydra::Om::ModsDocument)
|
20
|
+
solr_params = {}
|
21
|
+
solr_params['wt'] = 'json'
|
22
|
+
solr_params['terms'] = 'true'
|
23
|
+
solr_params['terms.fl'] = solr_name
|
24
|
+
solr_params['terms.lower'] = stub
|
25
|
+
solr_params['terms.lower.incl'] = false
|
26
|
+
solr_params['terms.prefix'] = stub
|
27
|
+
solr_params['terms.sort'] = 'index'
|
28
|
+
solr_response = Blacklight.solr.get 'terms', {:params => solr_params}
|
29
|
+
result = []
|
30
|
+
hash = {}
|
31
|
+
(1...solr_response['terms'].length).step(2) { |ix|
|
32
|
+
solr_response['terms'][ix].each { |val|
|
33
|
+
result << val if val.is_a? String
|
34
|
+
}
|
35
|
+
}
|
36
|
+
send_data result.to_json, :disposition => 'inline', :type => 'text/plain'
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
## field_key_from(field_name) to reverse this method from HydraFedoraMetadataHelper
|
41
|
+
# def field_name_for(field_key)
|
42
|
+
# if field_key.kind_of?(Array)
|
43
|
+
# return OM::XML::Terminology.term_hierarchical_name(*field_key)
|
44
|
+
# else
|
45
|
+
# field_key.to_s
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
|
49
|
+
def field_key_from(field_name, terminology)
|
50
|
+
# this is a hack, but necessary until/unless OM generates names differently
|
51
|
+
candidates = field_name.split('__')
|
52
|
+
field_key = []
|
53
|
+
candidates.each_with_index { |candidate, ix|
|
54
|
+
if (candidates[ix + 1] and candidates[ix + 1].match(/\d+/))
|
55
|
+
field_key << {OM.destringify(candidate) => Integer(candidates.delete_at(ix + 1))}
|
56
|
+
else
|
57
|
+
field_key << OM.destringify(candidate)
|
58
|
+
end
|
59
|
+
}
|
60
|
+
logger.debug field_key.inspect
|
61
|
+
field_key
|
62
|
+
end
|
63
|
+
|
64
|
+
# ** largely copied from ActiveFedora::NokogiriDatastream.get_values **
|
65
|
+
def get_solr_name(term_pointer, dsClass)
|
66
|
+
term = dsClass.terminology.retrieve_term(*OM.pointers_to_flat_array(term_pointer, false))
|
67
|
+
names = []
|
68
|
+
if is_hierarchical_term_pointer?(*term_pointer)
|
69
|
+
bases = []
|
70
|
+
#add first item in term_pointer as start of bases
|
71
|
+
# then iterate through possible nodes that might exist
|
72
|
+
term_pointer.first.kind_of?(Hash) ? bases << term_pointer.first.keys.first : bases << term_pointer.first
|
73
|
+
for i in 1..(term_pointer.length-1)
|
74
|
+
#iterate in reverse so that we can modify the bases array while iterating
|
75
|
+
(bases.length-1).downto(0) do |j|
|
76
|
+
current_last = (term_pointer[i].kind_of?(Hash) ? term_pointer[i].keys.first : term_pointer[i])
|
77
|
+
if (term_pointer[i-1].kind_of?(Hash))
|
78
|
+
#just use index supplied instead of trying possibilities
|
79
|
+
index = term_pointer[i-1].values.first
|
80
|
+
solr_name_base = OM::XML::Terminology.term_hierarchical_name({bases[j]=>index},current_last)
|
81
|
+
solr_name = generate_solr_symbol(solr_name_base, term.data_type)
|
82
|
+
bases.delete_at(j)
|
83
|
+
#insert the new solr name base if found
|
84
|
+
bases.insert(j,solr_name_base) if has_solr_name?(solr_name,solr_doc)
|
85
|
+
else
|
86
|
+
#detect how many nodes exist
|
87
|
+
index = 0
|
88
|
+
current_base = bases[j]
|
89
|
+
bases.delete_at(j)
|
90
|
+
solr_name_base = OM::XML::Terminology.term_hierarchical_name({current_base=>index},current_last)
|
91
|
+
solr_name = generate_solr_symbol(solr_name_base, term.data_type)
|
92
|
+
bases.insert(j,solr_name_base)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
bases.each do |base|
|
97
|
+
names << generate_solr_symbol(base.to_sym, term.data_type)
|
98
|
+
end
|
99
|
+
else
|
100
|
+
#this is not hierarchical and we can simply look for the solr name created using the terms without any indexes
|
101
|
+
generic_field_name_base = OM::XML::Terminology.term_generic_name(*term_pointer)
|
102
|
+
names << generate_solr_symbol(generic_field_name_base, term.data_type)
|
103
|
+
end
|
104
|
+
names
|
105
|
+
end
|
106
|
+
|
107
|
+
# ** copied from ActiveFedora::NokogiriDatastream **
|
108
|
+
#@return true if the term_pointer contains an index
|
109
|
+
# ====Example:
|
110
|
+
# [:image, {:title_set=>1}, :title] return true
|
111
|
+
# [:image, :title_set, :title] return false
|
112
|
+
def is_hierarchical_term_pointer?(*term_pointer)
|
113
|
+
if term_pointer.length>1
|
114
|
+
term_pointer.each do |pointer|
|
115
|
+
if pointer.kind_of?(Hash)
|
116
|
+
return true
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
return false
|
121
|
+
end
|
122
|
+
# ** copied from ActiveFedora::NokogiriDatastream **
|
123
|
+
def generate_solr_symbol(base, data_type)
|
124
|
+
Solrizer::XML::TerminologyBasedSolrizer.default_field_mapper.solr_name(base.to_sym, data_type)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|