active-fedora 3.0.7 → 3.1.0.pre1
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/.rvmrc +1 -1
- data/Gemfile.lock +39 -10
- data/History.txt +0 -4
- data/active-fedora.gemspec +4 -3
- data/lib/active_fedora.rb +9 -9
- data/lib/active_fedora/base.rb +92 -163
- data/lib/active_fedora/datastream.rb +59 -60
- data/lib/active_fedora/datastream_hash.rb +18 -0
- data/lib/active_fedora/metadata_datastream.rb +3 -2
- data/lib/active_fedora/metadata_datastream_helper.rb +3 -15
- data/lib/active_fedora/model.rb +3 -3
- data/lib/active_fedora/nokogiri_datastream.rb +305 -302
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +24 -19
- data/lib/active_fedora/rels_ext_datastream.rb +39 -37
- data/lib/active_fedora/rubydora_connection.rb +40 -0
- data/lib/active_fedora/semantic_node.rb +1 -1
- data/lib/active_fedora/solr_service.rb +1 -1
- data/lib/active_fedora/version.rb +1 -1
- data/lib/ruby-fedora.rb +0 -8
- data/lib/tasks/active_fedora.rake +14 -9
- data/lib/tasks/active_fedora_dev.rake +23 -40
- data/spec/integration/base_loader_spec.rb +4 -21
- data/spec/integration/base_spec.rb +300 -310
- data/spec/integration/bug_spec.rb +9 -10
- data/spec/integration/datastream_spec.rb +12 -12
- data/spec/integration/metadata_datastream_helper_spec.rb +7 -10
- data/spec/integration/model_spec.rb +3 -2
- data/spec/integration/rels_ext_datastream_spec.rb +9 -15
- data/spec/spec_helper.rb +2 -29
- data/spec/unit/active_fedora_spec.rb +5 -5
- data/spec/unit/base_cma_spec.rb +0 -7
- data/spec/unit/base_datastream_management_spec.rb +8 -67
- data/spec/unit/base_delegate_spec.rb +26 -9
- data/spec/unit/base_extra_spec.rb +5 -3
- data/spec/unit/base_file_management_spec.rb +10 -17
- data/spec/unit/base_named_datastream_spec.rb +76 -199
- data/spec/unit/base_spec.rb +152 -69
- data/spec/unit/content_model_spec.rb +1 -1
- data/spec/unit/datastream_concurrency_spec.rb +5 -4
- data/spec/unit/datastream_spec.rb +28 -48
- data/spec/unit/has_many_collection_spec.rb +2 -0
- data/spec/unit/inheritance_spec.rb +6 -6
- data/spec/unit/metadata_datastream_spec.rb +12 -28
- data/spec/unit/model_spec.rb +10 -10
- data/spec/unit/nokogiri_datastream_spec.rb +31 -33
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +15 -15
- data/spec/unit/rels_ext_datastream_spec.rb +35 -29
- data/spec/unit/rubydora_connection_spec.rb +26 -0
- data/spec/unit/semantic_node_spec.rb +12 -17
- data/spec/unit/solr_config_options_spec.rb +13 -14
- data/spec/unit/solr_service_spec.rb +14 -17
- metadata +59 -55
- data/lib/fedora/base.rb +0 -38
- data/lib/fedora/connection.rb +0 -218
- data/lib/fedora/datastream.rb +0 -67
- data/lib/fedora/fedora_object.rb +0 -161
- data/lib/fedora/formats.rb +0 -30
- data/lib/fedora/generic_search.rb +0 -71
- data/lib/fedora/repository.rb +0 -298
- data/spec/integration/datastreams_crud_spec.rb +0 -208
- data/spec/integration/fedora_object_spec.rb +0 -77
- data/spec/integration/repository_spec.rb +0 -301
- data/spec/integration/rf_fedora_object_spec.rb +0 -95
- data/spec/unit/connection_spec.rb +0 -25
- data/spec/unit/fedora_object_spec.rb +0 -74
- data/spec/unit/repository_spec.rb +0 -143
- data/spec/unit/rf_datastream_spec.rb +0 -63
data/lib/fedora/formats.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Fedora
|
2
|
-
module XmlFormat
|
3
|
-
extend self
|
4
|
-
|
5
|
-
def extension
|
6
|
-
"xml"
|
7
|
-
end
|
8
|
-
|
9
|
-
def mime_type
|
10
|
-
"text/xml"
|
11
|
-
end
|
12
|
-
|
13
|
-
def encode(hash)
|
14
|
-
hash.to_xml
|
15
|
-
end
|
16
|
-
|
17
|
-
def decode(xml)
|
18
|
-
from_xml_data(Hash.from_xml(xml))
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
def from_xml_data(data)
|
23
|
-
if data.is_a?(Hash) && data.keys.size == 1
|
24
|
-
data.values.first
|
25
|
-
else
|
26
|
-
data
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# @Creator Matt Zumwalt, MediaShelf LLC
|
3
|
-
# @Copyright Matt Zumwalt, 2007. All Rights Reserved.
|
4
|
-
#
|
5
|
-
|
6
|
-
module Fedora
|
7
|
-
class GenericSearch
|
8
|
-
|
9
|
-
def initialize(uri, service_name)
|
10
|
-
@uri = "#{uri}/#{service_name}"
|
11
|
-
@client = HTTPClient.new(@uri)
|
12
|
-
@extheader = {'User-Agent'=>"RubyFedora"}
|
13
|
-
end
|
14
|
-
|
15
|
-
def call_resource
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
# TODO: Handle ruby-tyle params, camel-casing them before passing to call_resource...
|
20
|
-
def update_index(params)
|
21
|
-
query = {:action=>action,:value=>value,:repositoryName=>repository_name,:indexName=>indexname,:restXslt=>"copyXML"}.merge(params)
|
22
|
-
query.merge {:operation> "updateIndex"}
|
23
|
-
|
24
|
-
@client.get(@uri, query, @extheader)
|
25
|
-
return "update_index Not Implemented."
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
def browse_index(params)
|
30
|
-
# Sample: /fedoragsearch/rest?operation=browseIndex&startTerm=&fieldName=PID&termPageSize=20&indexName=FedoraIndex&restXslt=copyXml&resultPageXslt=browseIndexToResultPage
|
31
|
-
query = {:startTerm=>URLEncoder.encode(start_term, "UTF-8"),:fieldName=>"",:indexName=>"",:termPageSize=>"", :restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
32
|
-
query.merge {:operation> "browseIndex"}
|
33
|
-
@client.get(@uri, query, @extheader)
|
34
|
-
return "browse_index Not Implemented."
|
35
|
-
end
|
36
|
-
|
37
|
-
def gfind_objects(params)
|
38
|
-
# Sample: /fedoragsearch/rest?operation=gfindObjects&query=test&hitPageSize=10&restXslt=copyXml
|
39
|
-
# fieldMaxLength limits the number of characters returned from the value of each object field.
|
40
|
-
# Snippets will highlight matched words within the search results. To keep the xml as simple as possible, set snippetsMax to 0.
|
41
|
-
query = {:query=>URLEncoder.encode(query, "UTF-8"),:value=>value,:indexName=>indexname,:hitPageStart=>"",:hitPageSize=>"",:snippetsMax=>"0",:fieldMaxLength=>"",:restXslt=>"copyXML",:resultPageXslt=>""}.merge(params)
|
42
|
-
query.merge {:operation> "gfindObjects"}
|
43
|
-
@client.get(@uri, query, @extheader)
|
44
|
-
return "gfind_objects Not Implemented."
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_index_info(params)
|
48
|
-
# Sample: /fedoragsearch/rest?operation=getIndexInfo&restXslt=copyXml
|
49
|
-
query = {:indexName=>"",:restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
50
|
-
query.merge {:operation> "getIndexInfo"}
|
51
|
-
@client.get(@uri, query, @extheader)
|
52
|
-
return "get_index_info Not Implemented."
|
53
|
-
end
|
54
|
-
|
55
|
-
def get_repository_info(params)
|
56
|
-
# Sample: /fedoragsearch/rest?operation=getRepositoryInfo&restXslt=copyXml
|
57
|
-
query = {:repositoryName=>"",:restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
58
|
-
query.merge {:operation> "getRepositoryInfo"}
|
59
|
-
@client.get(@uri, query, @extheader)
|
60
|
-
return "get_repository_info Not Implemented."
|
61
|
-
end
|
62
|
-
|
63
|
-
def configure(params)
|
64
|
-
query = {:configName=>""}.merge(params)
|
65
|
-
query.merge {:operation> "configure"}
|
66
|
-
@client.get(@uri, query, @extheader)
|
67
|
-
return "configure Not Implemented."
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
data/lib/fedora/repository.rb
DELETED
@@ -1,298 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'fedora/base'
|
3
|
-
require 'fedora/connection'
|
4
|
-
require 'fedora/formats'
|
5
|
-
require 'fedora/fedora_object'
|
6
|
-
require 'fedora/datastream'
|
7
|
-
require "nokogiri"
|
8
|
-
|
9
|
-
module Fedora
|
10
|
-
NAMESPACE = "fedora:info/"
|
11
|
-
ALL_FIELDS = [
|
12
|
-
:pid, :label, :fType, :cModel, :state, :ownerId, :cDate, :mDate, :dcmDate,
|
13
|
-
:bMech, :title, :creator, :subject, :description, :contributor,
|
14
|
-
:date, :type, :format, :identifier, :source, :language, :relation, :coverage, :rights
|
15
|
-
]
|
16
|
-
|
17
|
-
class Repository
|
18
|
-
|
19
|
-
attr_accessor :repository_name, :base_url, :fedora_version, :pid_namespace, :pid_delimiter
|
20
|
-
|
21
|
-
def self.flush
|
22
|
-
Thread.current[:repo]=nil
|
23
|
-
end
|
24
|
-
def self.register(url, surrogate=nil)
|
25
|
-
url = url.to_s.chop if url.to_s =~ /\/\Z/
|
26
|
-
Thread.current[:repo]= Fedora::Repository.new(url, surrogate)
|
27
|
-
begin
|
28
|
-
repo = Thread.current[:repo]
|
29
|
-
attributes = repo.describe_repository
|
30
|
-
repo.repository_name = attributes["repositoryName"].first
|
31
|
-
repo.base_url = attributes["repositoryBaseURL"].first
|
32
|
-
repo.fedora_version = attributes["repositoryVersion"].first
|
33
|
-
repo.pid_namespace = attributes["repositoryPID"].first["PID-namespaceIdentifier"].first
|
34
|
-
repo.pid_delimiter = attributes["repositoryPID"].first["PID-delimiter"].first
|
35
|
-
rescue
|
36
|
-
end
|
37
|
-
Thread.current[:repo]
|
38
|
-
end
|
39
|
-
def self.instance
|
40
|
-
raise "did you register a repo?" unless Thread.current[:repo]
|
41
|
-
Thread.current[:repo]
|
42
|
-
end
|
43
|
-
class StringResponse < String
|
44
|
-
attr_reader :content_type
|
45
|
-
|
46
|
-
def initialize(s, content_type)
|
47
|
-
super(s)
|
48
|
-
@content_type = content_type
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
attr_accessor :fedora_url
|
53
|
-
|
54
|
-
def initialize(fedora_url, surrogate=nil)
|
55
|
-
@fedora_url = fedora_url.is_a?(URI) ? fedora_url : URI.parse(fedora_url)
|
56
|
-
@surrogate = surrogate
|
57
|
-
@connection = nil
|
58
|
-
end
|
59
|
-
|
60
|
-
# Fetch the raw content of either a fedora object or datastream
|
61
|
-
def fetch_content(object_uri)
|
62
|
-
response = connection.raw_get("#{url_for(object_uri)}?format=xml")
|
63
|
-
StringResponse.new(response.body, response.content_type)
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# Find fedora objects with http://www.fedora.info/wiki/index.php/API-A-Lite_findObjects
|
69
|
-
#
|
70
|
-
# == Parameters
|
71
|
-
# query<String>:: the query string to be sent to Fedora.
|
72
|
-
# options<Hash>:: see below
|
73
|
-
#
|
74
|
-
# == Options<Hash> keys
|
75
|
-
# limit<String|Number>:: set the maxResults parameter in fedora
|
76
|
-
# select<Symbol|Array>:: the fields to returned. To include all fields, pass :all as the value.
|
77
|
-
# The field "pid" is always included.
|
78
|
-
#
|
79
|
-
# == Examples
|
80
|
-
# find_objects("label=Image1")
|
81
|
-
# find_objects("pid~demo:*", "label=test")
|
82
|
-
# find_objects("label=Image1", :include => :all)
|
83
|
-
# find_objects("label=Image1", :include => [:label])
|
84
|
-
#-
|
85
|
-
def find_objects(*args)
|
86
|
-
raise ArgumentError, "Missing query string" unless args.length >= 1
|
87
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
88
|
-
|
89
|
-
fields = options[:select]
|
90
|
-
fields = (fields.nil? || (fields == :all)) ? ALL_FIELDS : ([:pid] + ([fields].flatten! - [:pid]))
|
91
|
-
|
92
|
-
query = args.join(' ')
|
93
|
-
params = { :resultFormat => 'xml', :query => query }
|
94
|
-
params[:maxResults] = options[:limit] if options[:limit]
|
95
|
-
params[:sessionToken] = options[:sessionToken] if options[:sessionToken]
|
96
|
-
includes = fields.inject("") { |s, f| s += "&#{f}=true"; s }
|
97
|
-
|
98
|
-
convert_xml(connection.get("#{fedora_url.path}/objects?#{params.to_fedora_query}#{includes}"))
|
99
|
-
end
|
100
|
-
|
101
|
-
# Retrieve an object from fedora and load it as an instance of the given model/class
|
102
|
-
#
|
103
|
-
# @param pid of the Fedora object to retrieve and deserialize
|
104
|
-
# @param klazz the Model whose deserialize method the object's FOXML will be passed into
|
105
|
-
def find_model(pid, klazz)
|
106
|
-
obj = self.find_objects("pid=#{pid}").first
|
107
|
-
if obj.nil?
|
108
|
-
raise ActiveFedora::ObjectNotFoundError, "The repository does not have an object with pid #{pid}. The repository URL is #{self.base_url}"
|
109
|
-
end
|
110
|
-
doc = Nokogiri::XML::Document.parse(obj.object_xml)
|
111
|
-
klazz.deserialize(doc)
|
112
|
-
end
|
113
|
-
|
114
|
-
# Create the given object if it's new (not obtained from a find method). Otherwise update the object.
|
115
|
-
#
|
116
|
-
# == Return
|
117
|
-
# boolean:: whether the operation is successful
|
118
|
-
#-
|
119
|
-
def save(object)
|
120
|
-
object.new_object? ? create(object) : update(object)
|
121
|
-
end
|
122
|
-
|
123
|
-
def nextid(attrs={})
|
124
|
-
request_url = fedora_url.path+"/management/getNextPID?xml=true"
|
125
|
-
request_url += "&namespace=#{attrs[:namespace]}" if attrs[:namespace]
|
126
|
-
d = REXML::Document.new(connection.post(request_url).body)
|
127
|
-
d.elements['//pid'].text
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
def create(object)
|
132
|
-
case object
|
133
|
-
when Fedora::FedoraObject
|
134
|
-
pid = (object.pid ? object : 'new')
|
135
|
-
response = connection.post("#{url_for(pid)}?" + object.attributes.to_fedora_query, object.blob)
|
136
|
-
if response.code == '201'
|
137
|
-
object.pid = extract_pid(response)
|
138
|
-
object.new_object = false
|
139
|
-
true
|
140
|
-
else
|
141
|
-
false
|
142
|
-
end
|
143
|
-
when Fedora::Datastream
|
144
|
-
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
145
|
-
extra_headers = {}
|
146
|
-
extra_headers['Content-Type'] = object.attributes[:mimeType] if object.attributes[:mimeType]
|
147
|
-
response = connection.post("#{url_for(object)}?" + object.attributes.to_fedora_query,
|
148
|
-
object.blob, extra_headers)
|
149
|
-
if response.code == '201'
|
150
|
-
object.new_object = false
|
151
|
-
true
|
152
|
-
else
|
153
|
-
false
|
154
|
-
end
|
155
|
-
else
|
156
|
-
raise ArgumentError, "Unknown object type"
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
|
-
# Update the given object
|
162
|
-
# == Return
|
163
|
-
# boolean:: whether the operation is successful
|
164
|
-
#-
|
165
|
-
def update(object)
|
166
|
-
raise ArgumentError, "Missing pid attribute" if object.nil? || object.pid.nil?
|
167
|
-
case object
|
168
|
-
when Fedora::FedoraObject
|
169
|
-
response = connection.put("#{url_for(object)}?" + object.attributes.to_fedora_query)
|
170
|
-
response.code == '200' || '307'
|
171
|
-
when Fedora::Datastream
|
172
|
-
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
173
|
-
response = connection.put("#{url_for(object)}?" + object.attributes.to_fedora_query, object.blob)
|
174
|
-
response.code == '200' || '201'
|
175
|
-
return response.code
|
176
|
-
else
|
177
|
-
raise ArgumentError, "Unknown object type"
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
# Delete the given pid
|
182
|
-
# == Parameters
|
183
|
-
# object<Object|String>:: The object to delete.
|
184
|
-
# This can be a uri String ("demo:1", "fedora:info/demo:1") or any object that responds uri method.
|
185
|
-
#
|
186
|
-
# == Return
|
187
|
-
# boolean:: whether the operation is successful
|
188
|
-
#-
|
189
|
-
def delete(object)
|
190
|
-
raise ArgumentError, "Object must not be nil" if object.nil?
|
191
|
-
response = connection.delete("#{url_for(object)}")
|
192
|
-
response.code == '200' or response.code == '204' # Temporary hack around error in Fedora 3.0 Final's REST API
|
193
|
-
end
|
194
|
-
|
195
|
-
# Export the given object
|
196
|
-
# == Parameters
|
197
|
-
# object<String|Object>:: a fedora uri, pid, FedoraObject instance
|
198
|
-
# method<Symbol>:: the method to fetch such as :export, :history, :versions, etc
|
199
|
-
# extra_params<Hash>:: any other extra parameters to pass to fedora
|
200
|
-
#
|
201
|
-
def export(object, extra_params={})
|
202
|
-
extra_params = {:format=>:foxml, :context=>:archive}.merge!(extra_params)
|
203
|
-
if extra_params[:format].kind_of?(String)
|
204
|
-
format = extra_params[:format]
|
205
|
-
else
|
206
|
-
format = case extra_params[:format]
|
207
|
-
when :atom then "info:fedora/fedora-system:ATOM-1.1"
|
208
|
-
when :atom_zip then "info:fedora/fedora-system:ATOMZip-1.1"
|
209
|
-
when :mets then "info:fedora/fedora-system:METSFedoraExt-1.1"
|
210
|
-
when :foxml then "info:fedora/fedora-system:FOXML-1.1"
|
211
|
-
else "info:fedora/fedora-system:FOXML-1.1"
|
212
|
-
end
|
213
|
-
end
|
214
|
-
fetch_custom(object, "export", :format=>format, :context=>extra_params[:context].to_s)
|
215
|
-
end
|
216
|
-
|
217
|
-
def ingest(content_to_ingest, extra_params={})
|
218
|
-
if extra_params[:pid]
|
219
|
-
url = url_for(extra_params[:pid])
|
220
|
-
else
|
221
|
-
url = url_for("new")
|
222
|
-
end
|
223
|
-
|
224
|
-
if content_to_ingest.kind_of?(File)
|
225
|
-
content_to_ingest = content_to_ingest.read
|
226
|
-
end
|
227
|
-
|
228
|
-
connection.post(url,content_to_ingest)
|
229
|
-
end
|
230
|
-
|
231
|
-
# Fetch the given object using custom method. This is used to fetch other aspects of a fedora object,
|
232
|
-
# such as profile, versions, etc...
|
233
|
-
# == Parameters
|
234
|
-
# object<String|Object>:: a fedora uri, pid, FedoraObject instance
|
235
|
-
# method<Symbol>:: the method to fetch such as :export, :history, :versions, etc
|
236
|
-
# extra_params<Hash>:: any other extra parameters to pass to fedora
|
237
|
-
#
|
238
|
-
# == Returns
|
239
|
-
# This method returns raw xml response from the server
|
240
|
-
#-
|
241
|
-
def fetch_custom(object, method, extra_params = { :format => 'xml' })
|
242
|
-
path = case method
|
243
|
-
when :profile then ""
|
244
|
-
else "/#{method}"
|
245
|
-
end
|
246
|
-
|
247
|
-
extra_params.delete(:format) if method == :export
|
248
|
-
connection.raw_get("#{url_for(object)}#{path}?#{extra_params.to_fedora_query}").body
|
249
|
-
end
|
250
|
-
|
251
|
-
def describe_repository
|
252
|
-
result_body = connection.raw_get("#{fedora_url.path}/describe?xml=true").body
|
253
|
-
XmlSimple.xml_in(result_body)
|
254
|
-
end
|
255
|
-
|
256
|
-
private
|
257
|
-
def convert_xml(response)
|
258
|
-
results = FedoraObjects.new
|
259
|
-
return results unless response && response['resultList']
|
260
|
-
|
261
|
-
results.session_token = response['listSession']['token'] if response['listSession']
|
262
|
-
objectFields = response['resultList']['objectFields']
|
263
|
-
case objectFields
|
264
|
-
when Array
|
265
|
-
objectFields.each { |attrs| results << FedoraObject.new(attrs.rekey!) }
|
266
|
-
when Hash
|
267
|
-
results << FedoraObject.new(objectFields.rekey!)
|
268
|
-
end
|
269
|
-
results.each {|result| result.new_object = false}
|
270
|
-
results
|
271
|
-
end
|
272
|
-
|
273
|
-
def url_for(object)
|
274
|
-
uri = object.respond_to?(:uri) ? object.uri : object.to_s
|
275
|
-
uri = (uri[0..NAMESPACE.length-1] == NAMESPACE ? uri[NAMESPACE.length..-1] : uri) # strip of fedora:info namespace
|
276
|
-
"#{fedora_url.path}/objects/#{uri}"
|
277
|
-
end
|
278
|
-
|
279
|
-
# Low level access to the remote fedora server
|
280
|
-
# The +refresh+ parameter toggles whether or not the connection is refreshed at every request
|
281
|
-
# or not (defaults to +false+).
|
282
|
-
def connection(refresh = false)
|
283
|
-
if refresh || @connection.nil?
|
284
|
-
@connection = Fedora::Connection.new(@fedora_url, Fedora::XmlFormat, @surrogate)
|
285
|
-
end
|
286
|
-
@connection
|
287
|
-
end
|
288
|
-
|
289
|
-
def extract_pid(response)
|
290
|
-
CGI.unescape(response['Location'].split('/').last)
|
291
|
-
end
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
class FedoraObjects < Array
|
296
|
-
attr_accessor :session_token
|
297
|
-
end
|
298
|
-
|
@@ -1,208 +0,0 @@
|
|
1
|
-
require File.join( File.dirname(__FILE__), "../spec_helper" )
|
2
|
-
# Datastream API:
|
3
|
-
# - To list datastream
|
4
|
-
# curl -i http://localhost:8080/fedora/objects/test:02/datastreams
|
5
|
-
# curl -i http://localhost:8080/fedora/objects/test:02/datastreams?format=xml
|
6
|
-
#
|
7
|
-
# invalid: curl -i http://localhost:8080/fedora/objects/test:02/datastreams.xml
|
8
|
-
#
|
9
|
-
# - To obtain a datastream
|
10
|
-
# curl -i http://localhost:8080/fedora/objects/test:02/datastreams/DC
|
11
|
-
# curl -i http://localhost:8080/fedora/objects/test:02/datastreams/DS1
|
12
|
-
#
|
13
|
-
# - To create create a new datastream
|
14
|
-
#
|
15
|
-
# regular post (always creates inline (I) datastream. Will fail if not valid XML):
|
16
|
-
# curl -i -H "Content-type: text/xml" -XPOST --data-binary @build.xml -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:02/datastreams/DS1?dsLabel=A%20Test%20Datastream&altIDs=3333"
|
17
|
-
#
|
18
|
-
# "E" and "R" datastreams
|
19
|
-
# curl -i -H "Content-type: text/html" -XPOST "http://localhost:8080/fedora/objects/test:02/datastreams/REDIRECT?dsLabel=A%20Redirect%20Datastream&altIDs=3333&controlGroup=R&dsLocation=http://www.yourmediashelf.com" -u fedoraAdmin:fedoraAdmin
|
20
|
-
# curl -i -H "Content-type: text/html" -XPOST "http://localhost:8080/fedora/objects/test:02/datastreams/EXT?dsLabel=A%20Ext%20Datastream&altIDs=3333&controlGroup=E&dsLocation=http://www.yahoo.com" -u fedoraAdmin:fedoraAdmin
|
21
|
-
#
|
22
|
-
# multipart/form-data (always creates managed content (M) datastream):
|
23
|
-
# curl -i -H -XPOST -F file=@build.xml -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:02/datastreams/DS3?dsLabel=hello&altIDs=3333"
|
24
|
-
# curl -i -H -XPOST -F file=@dino.jpg -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:02/datastreams/JPEG?dsLabel=hello&altIDs=3333"
|
25
|
-
# MIME Type is set according to Content Type Header:
|
26
|
-
# curl -i -H -XPOST -F "file=@01 Float On.m4a;type=audio/mp4a-latm" -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:02/datastreams/Float_On.m4a?dsLabel=hello&altIDs=3333"
|
27
|
-
# curl -i -H -XPOST -F "file=@educause2004Fedora.ppt;type=application/vnd.ms-powerpoint" -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:02/datastreams/PPT.ppt?dsLabel=hello&altIDs=3333"
|
28
|
-
#
|
29
|
-
# mutipart/related is also supported but can only be tested with xform clients.
|
30
|
-
#
|
31
|
-
# - To update a datastream
|
32
|
-
# curl -i -H "Content-type: text/xml" -XPUT "http://localhost:8080/fedora/objects/test:02/datastreams/DS1?dsLabel=hello&altIDs=3333" --data-binary @build.xml -u fedoraAdmin:fedoraAdmin
|
33
|
-
# curl -i -H "Content-type: text/xml" -XPOST "http://localhost:8080/fedora/objects/test:02/datastreams/DS1?dsLabel=hello&altIDs=3333" --data-binary @build.xml -u fedoraAdmin:fedoraAdmin
|
34
|
-
#
|
35
|
-
# - To delete a datastream
|
36
|
-
# curl -i -XDELETE "http://localhost:8080/fedora/objects/test:02/datastreams/DS1" -u fedoraAdmin:fedoraAdmin
|
37
|
-
#
|
38
|
-
# curl -i -H -XPOST -F file=@test/fixtures/minivan-in-minneapolis.jpg -u fedoraAdmin:fedoraAdmin "http://localhost:8080/fedora/objects/test:test_xml_post/datastreams/FOO"
|
39
|
-
#
|
40
|
-
# curl -i -XDELETE -u admin:muradora "http://localhost:9090/fedora/objects/test:test:test_object_1"
|
41
|
-
#
|
42
|
-
# curl -i -H "Content-type: text/xml" -XPOST --data-binary @test/fixtures/mods-mskcc-filledsample.xml -u fedoraAdmin:fedoraAdmin "http://localhost:9090/fedora/objects/test:02/datastreams/DS1?dsLabel=A%20Test%20Datastream"
|
43
|
-
#
|
44
|
-
# curl -i -H "Content-type: image/jpeg" -XPOST -F file=@test/fixtures/dino.jpg -u admin:muradora "http://localhost:9090/fedora/objects/test:02/datastreams/DINO?dsLabel=A%20Test%20Datastream"
|
45
|
-
describe Fedora::Repository do
|
46
|
-
def sample_mods
|
47
|
-
xml = <<-EOS
|
48
|
-
<mods:mods xmlns:xlink="http://www.w3.org/1999/xlink" version="3.2"
|
49
|
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mods="http://www.loc.gov/mods/v3"
|
50
|
-
xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd"
|
51
|
-
xmlns="http://www.w3.org/1999/xhtml">
|
52
|
-
<mods:identifier>mskcc:2045</mods:identifier>
|
53
|
-
<mods:titleInfo authority="" displayLabel="">
|
54
|
-
<mods:title>Sample Title</mods:title>
|
55
|
-
<mods:subTitle>Sample SubTitle</mods:subTitle>
|
56
|
-
</mods:titleInfo>
|
57
|
-
<mods:name type="personal" authority="" ID="owner">
|
58
|
-
<mods:namePart type="family">Smith</mods:namePart>
|
59
|
-
<mods:namePart type="given">John</mods:namePart>
|
60
|
-
<mods:namePart type="termsOfAddress">Mr.</mods:namePart>
|
61
|
-
<mods:affiliation>Surgery</mods:affiliation>
|
62
|
-
<mods:role>
|
63
|
-
<mods:roleTerm type="text" authority="">Owner</mods:roleTerm>
|
64
|
-
</mods:role>
|
65
|
-
</mods:name>
|
66
|
-
<mods:name type="personal" authority="non-owner">
|
67
|
-
<mods:namePart type="family">Rushdie</mods:namePart>
|
68
|
-
<mods:namePart type="given">Salman</mods:namePart>
|
69
|
-
<mods:namePart type="termsOfAddress">Mr.</mods:namePart>
|
70
|
-
<mods:affiliation>Surgery</mods:affiliation>
|
71
|
-
<mods:role>
|
72
|
-
<mods:roleTerm type="text" authority="">Contributor</mods:roleTerm>
|
73
|
-
</mods:role>
|
74
|
-
</mods:name>
|
75
|
-
<mods:originInfo>
|
76
|
-
<mods:place>
|
77
|
-
<mods:placeTerm type="text">Sample Place of Creation</mods:placeTerm>
|
78
|
-
</mods:place>
|
79
|
-
<mods:publisher>MSKCC</mods:publisher>
|
80
|
-
<mods:dateIssued encoding="" keydate="" qualifier="" point=""/>
|
81
|
-
<mods:dateCreated encoding="" keydate="" qualifier="" point=""/>
|
82
|
-
<mods:dateModified encoding="" keydate="" qualifier="" point=""/>
|
83
|
-
<mods:copyrightDate encoding="" keydate="" qualifier="" point=""/>
|
84
|
-
<mods:dateOther encoding="" keydate="" qualifier="" point=""/>
|
85
|
-
</mods:originInfo>
|
86
|
-
<mods:abstract displayLabel="" type=""></mods:abstract>
|
87
|
-
<mods:note type=""/>
|
88
|
-
<mods:subject authority="lcsh">
|
89
|
-
<mods:topic>carcinoma</mods:topic>
|
90
|
-
<mods:topic>adinoma</mods:topic>
|
91
|
-
</mods:subject>
|
92
|
-
<!-- part, extension -->
|
93
|
-
</mods:mods>
|
94
|
-
EOS
|
95
|
-
end
|
96
|
-
|
97
|
-
before(:all) do
|
98
|
-
Fedora::Repository.register(ActiveFedora.fedora_config[:url])
|
99
|
-
@fedora = Fedora::Repository.instance
|
100
|
-
end
|
101
|
-
|
102
|
-
before(:each) do
|
103
|
-
@test_object = Fedora::FedoraObject.new(:label => 'test',
|
104
|
-
:contentModel => 'Image',
|
105
|
-
:state => 'A',
|
106
|
-
:ownerID => 'fedoraAdmin')
|
107
|
-
|
108
|
-
@fedora.save(@test_object).should be_true
|
109
|
-
end
|
110
|
-
|
111
|
-
after(:each) do
|
112
|
-
@fedora.delete(@test_object).should be_true
|
113
|
-
end
|
114
|
-
|
115
|
-
def fetch_content(pid, dsID)
|
116
|
-
content = @fedora.fetch_content("#{pid}/datastreams/#{dsID}/content")
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should create/update xml datastream" do
|
120
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo', :altIDs => '3333',
|
121
|
-
:blob => sample_mods)
|
122
|
-
@fedora.save(ds).should be_true
|
123
|
-
|
124
|
-
ds.attributes[:dsLabel] = 'bar'
|
125
|
-
@fedora.save(ds).should be_true
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should be able to save file objects" do
|
129
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'hello', :altIDs => '3333',
|
130
|
-
:controlGroup => 'M', :blob => fixture('dino.jpg'))
|
131
|
-
|
132
|
-
ds.control_group.should == 'M'
|
133
|
-
@fedora.save(ds).should be_true
|
134
|
-
end
|
135
|
-
|
136
|
-
it "should be able to save StringIO objects" do
|
137
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'hello', :altIDs => '3333', :controlGroup => 'M', :blob => StringIO.new("hi there"))
|
138
|
-
|
139
|
-
@fedora.save(ds).should be_true
|
140
|
-
end
|
141
|
-
|
142
|
-
it "should create/update image/file datastream" do
|
143
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'hello', :altIDs => '3333',
|
144
|
-
:controlGroup => 'M', :blob => fixture('dino.jpg').read, :mimeType=>'image/jpeg')
|
145
|
-
|
146
|
-
@fedora.save(ds).should be_true
|
147
|
-
|
148
|
-
content = fetch_content(@test_object.pid, 'DS1')
|
149
|
-
content.content_type.should == 'image/jpeg'
|
150
|
-
|
151
|
-
ds.blob = fixture('minivan.jpg')
|
152
|
-
@fedora.save(ds).should be_true
|
153
|
-
end
|
154
|
-
|
155
|
-
it "should set controlGroup to 'M' if mimeType is specified" do
|
156
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo',
|
157
|
-
:mimeType => 'text/plain', :blob => "This is plain text")
|
158
|
-
end
|
159
|
-
|
160
|
-
it "should create datastream with custom mimeType for text blob" do
|
161
|
-
blob = "This is plain text"
|
162
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo',
|
163
|
-
:mimeType => 'text/plain', :blob => blob)
|
164
|
-
@fedora.save(ds).should be_true
|
165
|
-
|
166
|
-
content = @fedora.fetch_content("#{@test_object.pid}/datastreams/DS1/content")
|
167
|
-
content.should == blob
|
168
|
-
content.content_type.should == 'text/plain'
|
169
|
-
end
|
170
|
-
|
171
|
-
it "should create datastream with custom mimeType for file blob" do
|
172
|
-
blob = "This is plain text"
|
173
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo',
|
174
|
-
:mimeType => 'image/jpeg', :blob => fixture('dino.jpg'))
|
175
|
-
@fedora.save(ds).should be_true
|
176
|
-
|
177
|
-
content = fetch_content(@test_object.pid, "DS1")
|
178
|
-
content.content_type.should == 'image/jpeg'
|
179
|
-
end
|
180
|
-
|
181
|
-
it "should delete datastream by ref" do
|
182
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo', :altIDs => '3333', :blob => sample_mods)
|
183
|
-
@fedora.save(ds).should be_true
|
184
|
-
@fedora.delete(ds).should be_true
|
185
|
-
end
|
186
|
-
|
187
|
-
it "should delete datastream by uri" do
|
188
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DS1', :dsLabel => 'foo', :altIDs => '3333', :blob => sample_mods)
|
189
|
-
@fedora.save(ds).should be_true
|
190
|
-
@fedora.delete(ds.uri).should be_true
|
191
|
-
end
|
192
|
-
|
193
|
-
it "should fetch thumbnail jpg for Image of Coliseum in Rome" do
|
194
|
-
# Have to check for two possible sizes because the image size changed between Fedora 3.0 and Fedora 3.1
|
195
|
-
fetch_content("demo:26", "TEI_SOURCE").length.should satisfy{ |l| l == 1098 || 1086}
|
196
|
-
end
|
197
|
-
|
198
|
-
describe ".label" do
|
199
|
-
it "should apply to the dsLabel when you save the datastream" do
|
200
|
-
ds = Fedora::Datastream.new(:pid => @test_object.pid, :dsID => 'DSLabelTest', :blob => sample_mods)
|
201
|
-
ds.label = "My Test dsLabel"
|
202
|
-
@fedora.save(ds)
|
203
|
-
object_rexml = REXML::Document.new(@test_object.object_xml)
|
204
|
-
#puts object_rexml.root.elements["foxml:datastream[@ID='DSLabelTest']/foxml:datastreamVersion"].inspect
|
205
|
-
object_rexml.root.elements["foxml:datastream[@ID='DSLabelTest']/foxml:datastreamVersion[last()]"].attributes["LABEL"].should == ds.label
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|