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) ⇒ Pathname
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) ⇒ Pathname
Returns The branch segment of the object deposit path.
62 63 64 65 |
# File 'lib/moab/storage_repository.rb', line 62 def deposit_branch(object_id) #todo This method should be customized, or overridden in a subclass object_id end |
#deposit_trunk ⇒ String
Returns The trunk segment of the object deposit path.
51 52 53 54 55 56 57 58 |
# File 'lib/moab/storage_repository.rb', line 51 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.
96 97 98 99 100 101 102 |
# File 'lib/moab/storage_repository.rb', line 96 def find_storage_object(object_id, include_deposit = false) root = find_storage_root(object_id, include_deposit) storage_pathname = root.join(storage_trunk, storage_branch(object_id)) storage_object = StorageObject.new(object_id, storage_pathname) storage_object.storage_root = root storage_object end |
#find_storage_root(object_id, include_deposit = false) ⇒ Pathname
Returns The location of the desired object’s home directory (default=pairtree).
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/moab/storage_repository.rb', line 70 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 "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 and deposit_trunk branch = deposit_branch(object_id) storage_roots.each do |root| root_trunk = root.join(deposit_trunk) raise "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).
107 108 109 110 111 112 113 114 |
# File 'lib/moab/storage_repository.rb', line 107 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.
42 43 44 45 46 47 48 |
# File 'lib/moab/storage_repository.rb', line 42 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.
119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/moab/storage_repository.rb', line 119 def storage_object(object_id, create = false) storage_object = find_storage_object(object_id) unless storage_object.object_pathname.exist? if create storage_object.object_pathname.mkpath else raise Moab::ObjectNotFoundException, "No storage object found for #{object_id}" end end storage_object end |
#storage_roots ⇒ Array<Pathname>
Returns The list of filesystem root paths in which objects are stored.
21 22 23 24 25 26 27 28 29 |
# File 'lib/moab/storage_repository.rb', line 21 def storage_roots unless defined?(@storage_roots) raise "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 "Moab::Config.storage_roots empty" if @storage_roots.empty? @storage_roots.each { |root| raise "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.
32 33 34 35 36 37 38 |
# File 'lib/moab/storage_repository.rb', line 32 def storage_trunk unless defined?(@storage_trunk) raise "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.
134 135 136 137 138 |
# File 'lib/moab/storage_repository.rb', line 134 def store_new_object_version(druid, bag_pathname) storage_object = self.storage_object(druid, create = true) new_version = storage_object.ingest_bag(bag_pathname) new_version end |