Class: Stanford::StorageServices
- Inherits:
-
Moab::StorageServices
- Object
- Moab::StorageServices
- Stanford::StorageServices
- Defined in:
- lib/stanford/storage_services.rb
Overview
An interface class to support access to SDR storage via a RESTful server
Constant Summary collapse
- @@repository =
Note:
After some discussion, consensus was that this is a thread safe use of a
class variable, as 1) it’s never mutated after the class is initialized, and 2) the value of the StorageRepository instance is determined from configuration that rarely changes and is loaded once at app start time (at least in Stanford’s consumers; see Moab::Config.configure calls in preservation_robots, preservation_catalog, and technical-metadata-service). Sidekiq requires thread safe code, so please preserve thread safety for multiple concurrent callers of this service if refactoring, so Sidekiq remains an option for ActiveJob backend for moab-versioning consumers.
Stanford::StorageRepository.new
Class Method Summary collapse
-
.cm_remediate(object_id, version_id = nil) ⇒ String
Returns a remediated copy of the contentMetadata with fixity data filled in.
-
.cm_version_additions(new_content_metadata, object_id, version_id = nil) ⇒ FileInventory
The versionAddtions report showing which files are new or modified in the content metadata.
-
.compare_cm_to_version(new_content_metadata, object_id, subset, base_version = nil) ⇒ FileInventoryDifference
NOTE: ‘ShelvingService.content_diff` in dor-services-app implements similar logic, but in a way that uses XML retrieved via preservation-client instead of reading the XML from disk.
-
.repository ⇒ StorageRepository
An instance of the interface to SDR storage.
Methods inherited from Moab::StorageServices
current_version, deposit_branch, deposit_trunk, find_storage_object, object_path, object_size, object_version_path, retrieve_file, retrieve_file_group, retrieve_file_signature, retrieve_file_using_signature, storage_object, storage_roots, version_differences
Class Method Details
.cm_remediate(object_id, version_id = nil) ⇒ String
Returns a remediated copy of the contentMetadata with fixity data filled in
75 76 77 78 79 |
# File 'lib/stanford/storage_services.rb', line 75 def self.cm_remediate(object_id, version_id = nil) cm = retrieve_file('metadata', 'contentMetadata.xml', object_id, version_id) group = retrieve_file_group('content', object_id, version_id) Stanford::ContentInventory.new.(cm, group) end |
.cm_version_additions(new_content_metadata, object_id, version_id = nil) ⇒ FileInventory
Returns The versionAddtions report showing which files are new or modified in the content metadata.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/stanford/storage_services.rb', line 57 def self.cm_version_additions(, object_id, version_id = nil) new_inventory = Stanford::ContentInventory.new.inventory_from_cm(, object_id, 'preserve') begin # ObjectNotFoundException is raised if the object does not exist in storage version_id ||= current_version(object_id) storage_object_version = repository.storage_object(object_id).find_object_version(version_id) signature_catalog = storage_object_version.signature_catalog rescue Moab::ObjectNotFoundException storage_object = Moab::StorageObject.new(object_id, 'dummy') base_version = Moab::StorageObjectVersion.new(storage_object, 0) signature_catalog = base_version.signature_catalog end signature_catalog.version_additions(new_inventory) end |
.compare_cm_to_version(new_content_metadata, object_id, subset, base_version = nil) ⇒ FileInventoryDifference
NOTE: ‘ShelvingService.content_diff` in dor-services-app implements similar logic, but in a way that uses XML retrieved via preservation-client instead of reading the XML from disk. This allows DSA to perform the potentially time expensive diff without requiring access to preservation disk mounts. See github.com/sul-dlss/dor-services-app/pull/4492 and github.com/sul-dlss/dor-services-app/issues/4359
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/stanford/storage_services.rb', line 33 def self.compare_cm_to_version(, object_id, subset, base_version = nil) new_inventory = Stanford::ContentInventory.new.inventory_from_cm(, object_id, subset) begin # ObjectNotFoundException is raised if the object does not exist in storage base_version ||= current_version(object_id) # FileNotFoundException is raised if object exists but has no contentMetadata file base_cm_pathname = retrieve_file('metadata', 'contentMetadata.xml', object_id, base_version) base_inventory = Stanford::ContentInventory.new.inventory_from_cm(base_cm_pathname.read, object_id, subset, base_version) rescue Moab::ObjectNotFoundException, Moab::FileNotFoundException # Create a skeletal FileInventory object, containing no file entries storage_object = Moab::StorageObject.new(object_id, 'dummy') base_version = Moab::StorageObjectVersion.new(storage_object, 0) base_inventory = base_version.file_inventory('version') end diff = Moab::FileInventoryDifference.new.compare(base_inventory, new_inventory) = diff.group_difference('metadata') diff.group_differences.delete() if diff end |
.repository ⇒ StorageRepository
Returns an instance of the interface to SDR storage.
18 19 20 |
# File 'lib/stanford/storage_services.rb', line 18 def self.repository @@repository end |