Class: Rubydora::Repository

Inherits:
Object
  • Object
show all
Includes:
ResourceIndex
Defined in:
lib/rubydora/repository.rb

Overview

Fedora Repository object that provides API access

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ResourceIndex

#find_by_sparql, #find_by_sparql_relationship, #risearch, #sparql

Constructor Details

#initialize(options = {}, api = nil) ⇒ Repository

Returns a new instance of Repository.

Parameters:

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

Options Hash (options):

  • :url (String)
  • :user (String)
  • :password (String)
  • :validateChecksum (Boolean)


34
35
36
37
38
# File 'lib/rubydora/repository.rb', line 34

def initialize(options = {}, api = nil)
  @config = options.symbolize_keys
  @api = api if api
  check_repository_version!
end

Instance Attribute Details

#apiObject



10
11
12
# File 'lib/rubydora/repository.rb', line 10

def api
  @api ||= driver.new(config)
end

#configObject (readonly)

repository configuration (see #initialize)



27
28
29
# File 'lib/rubydora/repository.rb', line 27

def config
  @config
end

Instance Method Details

#create(pid, options = {}) ⇒ Object

create a new fedora object (see also DigitalObject#save)



82
83
84
# File 'lib/rubydora/repository.rb', line 82

def create(pid, options = {})
  DigitalObject.create(pid, options = {}, self)
end

#driverObject

Eventually driver can decide between Fc3Service and Fc4Service



15
16
17
# File 'lib/rubydora/repository.rb', line 15

def driver
  Fc3Service
end

#find(pid) ⇒ Object

Find an existing Fedora object



41
42
43
# File 'lib/rubydora/repository.rb', line 41

def find(pid)
  DigitalObject.find(pid, self)
end

#find_or_initialize(pid) ⇒ Object



45
46
47
# File 'lib/rubydora/repository.rb', line 45

def find_or_initialize(pid)
  DigitalObject.find_or_initialize(pid, self)
end

#pingObject

Raise an error if unable to connect to the API endpoint



98
99
100
101
# File 'lib/rubydora/repository.rb', line 98

def ping
  raise "Unable to establish connection to Fedora Repository" unless profile
  true
end

#profileHash

repository profile (from API-A-LITE data)

Returns:

  • (Hash)


88
89
90
# File 'lib/rubydora/repository.rb', line 88

def profile
  @profile ||= repository_profile
end

#search(query, options = {}) {|DigitalObject| ... } ⇒ Object

High-level access to the Fedora find_objects API

Yields:

  • (DigitalObject)

    Yield a DigitalObject for each search result, skipping forbidden objects



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rubydora/repository.rb', line 54

def search(query, options = {}, &block)
  return to_enum(:search, query, options).to_a unless block_given?

  sessionToken = nil
  doc = nil

  begin
    sessionOptions = {}
    sessionOptions[:sessionToken] = sessionToken unless sessionToken.nil? || sessionToken.blank?

    response = self.find_objects(options.merge(:query => query, :resultFormat => 'xml', :pid => true).merge(sessionOptions))

    doc = Nokogiri::XML(response)
    doc.xpath('//xmlns:objectFields/xmlns:pid', doc.namespaces).each do |pid|
      begin
        obj = self.find(pid.text)
      rescue RestClient::Unauthorized
        next
      end
      block.call(obj)
    end

    sessionToken = doc.xpath('//xmlns:listSession/xmlns:token', doc.namespaces).text
  end until sessionToken.nil? || sessionToken.empty? || doc.xpath('//xmlns:resultList/xmlns:objectFields', doc.namespaces).empty?

end

#versionFloat

Returns repository version.

Returns:

  • (Float)

    repository version



93
94
95
# File 'lib/rubydora/repository.rb', line 93

def version
  @version ||= repository_profile['repositoryVersion'].to_f rescue nil
end