Class: Moab::StorageRepository
- Inherits:
-
Object
- Object
- Moab::StorageRepository
- Defined in:
- lib/moab/storage_repository.rb
Overview
Copyright © 2012 by The Board of Trustees of the Leland Stanford Junior University. All rights reserved. See LICENSE for details.
A class to represent the SDR repository store
Data Model
-
StorageRepository = represents the digital object repository storage areas
-
StorageServices = supports application layer access to the repository’s objects, data, and metadata
-
StorageObject = represents a digital object’s repository storage location and ingest/dissemination methods
-
StorageObjectVersion [1..*] = represents a version subdirectory within an object’s home directory
-
Bagger [1] = utility for creating bagit packages for ingest or dissemination
-
-
-
Direct Known Subclasses
Instance Method Summary collapse
-
#deposit_branch(object_id) ⇒ String
The branch segment of the object deposit path.
-
#deposit_trunk ⇒ String
The trunk segment of the object deposit path.
-
#find_storage_object(object_id, include_deposit = false) ⇒ StorageObject
The representation of a digitial object’s storage directory, which might not exist yet.
-
#find_storage_root(object_id, include_deposit = false) ⇒ Pathname
The location of the desired object’s home directory (default=pairtree).
-
#object_size(object_id, include_deposit = false) ⇒ Integer
The size occupied on disk by the storage object, in bytes.
-
#storage_branch(object_id) ⇒ String
The branch segment of the object storage path.
-
#storage_object(object_id, create = false) ⇒ StorageObject
The representation of a digitial object’s storage directory, which must exist.
-
#storage_roots ⇒ Array<Pathname>
The list of filesystem root paths in which objects are stored.
-
#storage_trunk ⇒ String
The trunk segment of the object storage path.
-
#store_new_object_version(druid, bag_pathname) ⇒ void
Transfer the object to the preservation repository.
Instance Method Details
#deposit_branch(object_id) ⇒ String
Override this method in a subclass
Returns The branch segment of the object deposit path.
68 69 70 |
# File 'lib/moab/storage_repository.rb', line 68 def deposit_branch(object_id) object_id end |
#deposit_trunk ⇒ String
Returns The trunk segment of the object deposit path.
56 57 58 59 60 61 62 63 |
# File 'lib/moab/storage_repository.rb', line 56 def deposit_trunk unless defined?(@deposit_trunk) # do not raise error. this parameter will be ignored if missing # raise "Moab::Config.deposit_trunk not found in config file" if Moab::Config.deposit_trunk.nil? @deposit_trunk = Moab::Config.deposit_trunk end @deposit_trunk end |
#find_storage_object(object_id, include_deposit = false) ⇒ StorageObject
Returns The representation of a digitial object’s storage directory, which might not exist yet.
103 104 105 106 |
# File 'lib/moab/storage_repository.rb', line 103 def find_storage_object(object_id, include_deposit = false) root = find_storage_root(object_id, include_deposit) create_storage_object(object_id, root) end |
#find_storage_root(object_id, include_deposit = false) ⇒ Pathname
Returns The location of the desired object’s home directory (default=pairtree).
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/moab/storage_repository.rb', line 75 def find_storage_root(object_id, include_deposit = false) # Search for the object's home directory in the storage areas branch = storage_branch(object_id) storage_roots.each do |root| root_trunk = root.join(storage_trunk) raise(MoabRuntimeError, "Storage area not found at #{root_trunk}") unless root_trunk.exist? root_trunk_branch = root_trunk.join(branch) return root if root_trunk_branch.exist? end # Search for the object's directory in the deposit areas if include_deposit && deposit_trunk branch = deposit_branch(object_id) storage_roots.each do |root| root_trunk = root.join(deposit_trunk) raise(MoabRuntimeError, "Deposit area not found at #{root_trunk}") unless root_trunk.exist? root_trunk_branch = root_trunk.join(branch) return root if root_trunk_branch.exist? end end # object not found, will store new objects in the newest (most empty) filesystem storage_roots.last end |
#object_size(object_id, include_deposit = false) ⇒ Integer
Returns the size occupied on disk by the storage object, in bytes. this is the entire moab (all versions).
111 112 113 114 115 116 117 118 |
# File 'lib/moab/storage_repository.rb', line 111 def object_size(object_id, include_deposit = false) storage_pathname = find_storage_object(object_id, include_deposit).object_pathname size = 0 Find.find(storage_pathname) do |path| size += FileTest.size(path) unless FileTest.directory?(path) end size end |
#storage_branch(object_id) ⇒ String
Returns The branch segment of the object storage path.
47 48 49 50 51 52 53 |
# File 'lib/moab/storage_repository.rb', line 47 def storage_branch(object_id) # TODO: This method should be customized, or overridden in a subclass # split a object ID into 2-character segments, followed by a copy of the object ID # for a more sophisticated pairtree implementation see https://github.com/microservices/pairtree path_segments = object_id.scan(/..?/) << object_id path_segments.join(File::SEPARATOR).tr(':', '_') end |
#storage_object(object_id, create = false) ⇒ StorageObject
Returns The representation of a digitial object’s storage directory, which must exist.
123 124 125 126 127 128 129 130 131 |
# File 'lib/moab/storage_repository.rb', line 123 def storage_object(object_id, create = false) storage_object = find_storage_object(object_id) unless storage_object.object_pathname.exist? raise ObjectNotFoundException, "No storage object found for #{object_id}" unless create storage_object.object_pathname.mkpath end storage_object end |
#storage_roots ⇒ Array<Pathname>
Returns The list of filesystem root paths in which objects are stored.
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/moab/storage_repository.rb', line 23 def storage_roots unless defined?(@storage_roots) raise(MoabRuntimeError, 'Moab::Config.storage_roots not found in config file') if Moab::Config.storage_roots.nil? @storage_roots = [Moab::Config.storage_roots].flatten.collect { |filesystem| Pathname(filesystem) } raise(MoabRuntimeError, 'Moab::Config.storage_roots empty') if @storage_roots.empty? @storage_roots.each { |root| raise(MoabRuntimeError, "Storage root #{root} not found on system") unless root.exist? } end @storage_roots end |
#storage_trunk ⇒ String
Returns The trunk segment of the object storage path.
36 37 38 39 40 41 42 43 |
# File 'lib/moab/storage_repository.rb', line 36 def storage_trunk unless defined?(@storage_trunk) raise(MoabRuntimeError, 'Moab::Config.storage_trunk not found in config file') if Moab::Config.storage_trunk.nil? @storage_trunk = Moab::Config.storage_trunk end @storage_trunk end |
#store_new_object_version(druid, bag_pathname) ⇒ void
This method returns an undefined value.
Returns transfer the object to the preservation repository.
136 137 138 |
# File 'lib/moab/storage_repository.rb', line 136 def store_new_object_version(druid, bag_pathname) storage_object(druid, true).ingest_bag(bag_pathname) end |