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.
63 64 65 66 |
# File 'lib/moab/storage_repository.rb', line 63 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.
52 53 54 55 56 57 58 59 |
# File 'lib/moab/storage_repository.rb', line 52 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.
97 98 99 100 101 102 103 |
# File 'lib/moab/storage_repository.rb', line 97 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).
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/moab/storage_repository.rb', line 71 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).
108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/moab/storage_repository.rb', line 108 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| if FileTest.directory?(path) Find.prune if File.basename(path)[0] == '.' else size += FileTest.size(path) end end size end |
#storage_branch(object_id) ⇒ String
Returns The branch segment of the object storage path.
43 44 45 46 47 48 49 |
# File 'lib/moab/storage_repository.rb', line 43 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).gsub(/:/,'_') end |
#storage_object(object_id, create = false) ⇒ StorageObject
Returns The representation of a digitial object’s storage directory, which must exist.
124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/moab/storage_repository.rb', line 124 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.
22 23 24 25 26 27 28 29 30 |
# File 'lib/moab/storage_repository.rb', line 22 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.
33 34 35 36 37 38 39 |
# File 'lib/moab/storage_repository.rb', line 33 def storage_trunk unless defined?(@storage_trunk) raise "oab::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.
139 140 141 142 143 |
# File 'lib/moab/storage_repository.rb', line 139 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 |