Module: Rubydora::RestApiClient

Includes:
ActiveSupport::Benchmarkable, FedoraUrlHelpers
Included in:
Repository
Defined in:
lib/rubydora/rest_api_client.rb,
lib/rubydora/rest_api_client/v33.rb

Overview

Provide low-level access to the Fedora Commons REST API

Defined Under Namespace

Modules: V33

Constant Summary collapse

VALID_CLIENT_OPTIONS =
[:user, :password, :timeout, :open_timeout, :ssl_client_cert, :ssl_client_key]

Constants included from FedoraUrlHelpers

FedoraUrlHelpers::API_DOCUMENTATION

Instance Method Summary collapse

Methods included from FedoraUrlHelpers

#datastream_content_url, #datastream_history_url, #datastream_url, #dissemination_url, #export_object_url, #find_objects_url, #new_object_relationship_url, #next_pid_url, #object_relationship_url, #object_url, #object_versions_url, #object_xml_url, #url_for, #validate_object_url

Instance Method Details

#add_datastream(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)


293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'lib/rubydora/rest_api_client.rb', line 293

def add_datastream options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  file = options.delete(:content)
  content_type = options.delete(:content_type) || options[:mimeType] || (MIME::Types.type_for(file.path).first if file.respond_to? :path) || 'application/octet-stream'
  begin
    return client[datastream_url(pid, dsid, options)].post file, :content_type => content_type.to_s, :multipart => true
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error adding datastream #{dsid} for object #{pid}. See logger for details"
  end
end

#add_relationship(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


371
372
373
374
375
376
377
378
379
380
# File 'lib/rubydora/rest_api_client.rb', line 371

def add_relationship options = {}
  pid = options.delete(:pid) || options[:subject]
  begin
    return client[new_object_relationship_url(pid, options)].post nil
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error adding relationship for #{pid}. See logger for details"
  end
end

#client(config = {}) ⇒ Object

TODO trap for these errors specifically: RestClient::Request::Unauthorized, Errno::ECONNREFUSED



21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/rubydora/rest_api_client.rb', line 21

def client config = {}
  client_config = self.config.merge(config)
  client_config.symbolize_keys!
  if config.empty? or @config_hash.nil? or (client_config.hash == @config_hash)
    @config_hash = client_config.hash
    url = client_config[:url]
    client_config.delete_if { |k,v| not VALID_CLIENT_OPTIONS.include?(k) }
    client_config[:open_timeout] ||= client_config[:timeout]
    @client ||= RestClient::Resource.new(url, client_config)
  else
    raise ArgumentError, "Attemping to re-initialize #{self.class}#client with different configuration parameters"
  end
end

#datastream(options = {}) ⇒ String Also known as: datastreams

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)
  • :asOfDateTime (String)
  • :validateChecksum (String)

Returns:

  • (String)


193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/rubydora/rest_api_client.rb', line 193

def datastream options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  options[:format] ||= 'xml'
  begin
    val = nil
    message = dsid.nil? ? "Loaded datastream list for #{pid}" : "Loaded datastream #{pid}/#{dsid}"
    benchmark message, :level=>:debug do
      val = client[datastream_url(pid, dsid, options)].get
    end
    return val
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH => e
    logger.error "Unable to connect to Fedora at #{@client.url}"
    raise e
  rescue RestClient::ResourceNotFound => e
    raise e
  rescue RestClient::Unauthorized => e
    logger.error "Unauthorized at #{client.url}/#{datastream_url(pid, dsid, options)}"
    raise e
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting datastream '#{dsid}' for object #{pid}. See logger for details"
  end
end

#datastream_dissemination(options = {}, &block_response) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)


267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/rubydora/rest_api_client.rb', line 267

def datastream_dissemination options = {}, &block_response
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  method = options.delete(:method)
  method ||= :get
  raise self.class.name + "#datastream_dissemination requires a DSID" unless dsid
  begin
    resource = client[datastream_content_url(pid, dsid, options)]
    if block_given?
      resource.options[:block_response] = block_response
    end
    return resource.send(method)
  rescue RestClient::ResourceNotFound => e
    raise e
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting dissemination for datastream #{dsid} for object #{pid}. See logger for details"
  end
end

#datastream_versions(options = {}) ⇒ String Also known as: datastream_history

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)

Raises:

  • (ArgumentError)


243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/rubydora/rest_api_client.rb', line 243

def datastream_versions options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  raise ArgumentError, "Must supply dsid" unless dsid
  options[:format] ||= 'xml'
  begin
    return client[datastream_history_url(pid, dsid, options)].get
  rescue RestClient::ResourceNotFound => e
    #404 Resource Not Found: No datastream history could be found. There is no datastream history for the digital object "changeme:1" with datastream ID of "descMetadata
    return nil
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting versions for datastream #{dsid} for object #{pid}. See logger for details"
  end
end

#dissemination(options = {}, &block_response) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :sdef (String)
  • :method (String)

Returns:

  • (String)


403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'lib/rubydora/rest_api_client.rb', line 403

def dissemination options = {}, &block_response
  pid = options.delete(:pid)
  sdef = options.delete(:sdef)
  method = options.delete(:method)
  options[:format] ||= 'xml' unless pid and sdef and method
  begin
    resource = client[dissemination_url(pid,sdef,method,options)]
    if block_given?
      resource.options[:block_response] = block_response
    end
    return resource.get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting dissemination for #{pid}. See logger for details"
  end
end

#export(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


110
111
112
113
114
115
116
117
118
# File 'lib/rubydora/rest_api_client.rb', line 110

def export options = {}
  pid = options.delete(:pid)
  begin
    return client[export_object_url(pid, options)].get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    raise FedoraInvalidRequest, "Error exporting object #{pid}. See logger for details"
  end
end

#find_objects(options = {}, &block_response) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Returns:

  • (String)

Raises:

  • (ArgumentError)


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rubydora/rest_api_client.rb', line 52

def find_objects options = {}, &block_response
  raise ArgumentError,"Cannot have both :terms and :query parameters" if options[:terms] and options[:query]
  options[:resultFormat] ||= 'xml'

  begin
    resource = client[find_objects_url(options)]
    if block_given?
      resource.options[:block_response] = block_response
    end 
    return resource.get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error finding objects. See logger for details"
  end
end

#ingest(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rubydora/rest_api_client.rb', line 91

def ingest options = {}
  pid = options.delete(:pid) || 'new'
  file = options.delete(:file)
  begin
    return client[object_url(pid, options)].post file, :content_type => 'text/xml'
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH => e
    logger.error "Unable to connect to Fedora at #{@client.url}"
    raise e
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error ingesting object #{pid}. See logger for details"
  end
end

#modify_datastream(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)


312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# File 'lib/rubydora/rest_api_client.rb', line 312

def modify_datastream options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  file = options.delete(:content)
  content_type = options.delete(:content_type) || options[:mimeType] || (MIME::Types.type_for(file.path).first if file.respond_to? :path) || 'application/octet-stream'

  rest_client_options = {}
  if file
    rest_client_options[:multipart] = true
    rest_client_options[:content_type] = content_type
  end

  begin
    return client[datastream_url(pid, dsid, options)].put(file, rest_client_options)
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error modifying datastream #{dsid} for #{pid}. See logger for details"
  end
end

#modify_object(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


124
125
126
127
128
129
130
131
132
133
# File 'lib/rubydora/rest_api_client.rb', line 124

def modify_object options = {}
  pid = options.delete(:pid)
  begin
    return client[object_url(pid, options)].put nil
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error modifying object #{pid}. See logger for details"
  end
end

#next_pid(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Returns:

  • (String)


38
39
40
41
42
43
44
45
46
47
# File 'lib/rubydora/rest_api_client.rb', line 38

def next_pid options = {}
  options[:format] ||= 'xml'
  begin
    return client[next_pid_url(options)].post nil
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting nextPID. See logger for details"
  end
end

#object(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/rubydora/rest_api_client.rb', line 73

def object options = {}
  pid = options.delete(:pid)
  options[:format] ||= 'xml'
  begin
    return client[object_url(pid, options)].get
  rescue RestClient::ResourceNotFound => e
    raise e
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting object #{pid}. See logger for details"
  end
end

#object_versions(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)

Raises:

  • (ArgumentError)


156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/rubydora/rest_api_client.rb', line 156

def object_versions options = {}
  pid = options.delete(:pid)
  options[:format] ||= 'xml'
  raise ArgumentError, "Must have a pid" unless pid
  begin
    return client[object_versions_url(pid, options)].get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting versions for object #{pid}. See logger for details"
  end
end

#object_xml(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)

Raises:

  • (ArgumentError)


173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/rubydora/rest_api_client.rb', line 173

def object_xml options = {}
  pid = options.delete(:pid)
  raise ArgumentError, "Missing required parameter :pid" unless pid
  options[:format] ||= 'xml'
  begin
    return client[object_xml_url(pid, options)].get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting objectXML for object #{pid}. See logger for details"
  end
end

#purge_datastream(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)


338
339
340
341
342
343
344
345
346
347
348
# File 'lib/rubydora/rest_api_client.rb', line 338

def purge_datastream options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  begin
    client[datastream_url(pid, dsid, options)].delete
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error purging datastream #{dsid} for #{pid}. See logger for details"
  end
end

#purge_object(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/rubydora/rest_api_client.rb', line 139

def purge_object options = {}
  pid = options.delete(:pid)
  begin
    return client[object_url(pid, options)].delete
  rescue RestClient::ResourceNotFound => e
    raise e
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error purging object #{pid}. See logger for details"
  end
end

#purge_relationship(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)


386
387
388
389
390
391
392
393
394
395
# File 'lib/rubydora/rest_api_client.rb', line 386

def purge_relationship options = {}
  pid = options.delete(:pid) || options[:subject]
  begin
    return client[object_relationship_url(pid, options)].delete
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error purging relationships for #{pid}. See logger for details"
  end
end

#relationships(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)

Returns:

  • (String)

Raises:

  • (ArgumentError)


354
355
356
357
358
359
360
361
362
363
364
365
# File 'lib/rubydora/rest_api_client.rb', line 354

def relationships options = {}
  pid = options.delete(:pid) || options[:subject]
  raise ArgumentError, "Missing required parameter :pid" unless pid
  options[:format] ||= 'xml'
  begin
    return client[object_relationship_url(pid, options)].get
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error getting relationships for #{pid}. See logger for details"
  end
end

#set_datastream_options(options = {}) ⇒ String

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :pid (String)
  • :dsid (String)

Returns:

  • (String)


226
227
228
229
230
231
232
233
234
235
236
# File 'lib/rubydora/rest_api_client.rb', line 226

def set_datastream_options options = {}
  pid = options.delete(:pid)
  dsid = options.delete(:dsid)
  begin
    return client[datastream_url(pid, dsid, options)].put nil
  rescue RestClient::InternalServerError => e
    logger.error e.response
    logger.flush if logger.respond_to? :flush
    raise FedoraInvalidRequest, "Error setting datastream options on #{dsid} for object #{pid}. See logger for details"
  end
end