Class: Stanford::StorageServices

Inherits:
Moab::StorageServices show all
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

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

Parameters:

  • object_id (String)

    The digital object identifier of the object whose contentMetadata is to be remediated

  • version_id (Integer) (defaults to: nil)

    The ID of the version whose file data is to be used, if nil use latest version

Returns:

  • (String)

    Returns a remediated copy of the contentMetadata with fixity data filled in



71
72
73
74
75
# File 'lib/stanford/storage_services.rb', line 71

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.

Parameters:

  • new_content_metadata (String)

    The content metadata to be compared to the current signtature catalog

  • object_id (String)

    The digital object identifier of the object whose signature catalog is to be used

  • version_id (Integer) (defaults to: nil)

    The ID of the version whose signature catalog is to be used, if nil use latest version

Returns:

  • (FileInventory)

    The versionAddtions report showing which files are new or modified in the content metadata



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/stanford/storage_services.rb', line 53

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

Returns The report of differences between the content metadata and the specified version.

Parameters:

  • new_content_metadata (String)

    The content metadata to be compared to the base

  • object_id (String)

    The digital object identifier of the object whose version inventory is the basis of the comparison

  • subset (String)

    Speciifes which subset of files to list in the inventories extracted from the contentMetadata (all|preserve|publish|shelve)

  • base_version (Integer) (defaults to: nil)

    The ID of the version whose inventory is the basis of, if nil use latest version

Returns:

  • (FileInventoryDifference)

    The report of differences between the content metadata and the specified version



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/stanford/storage_services.rb', line 29

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

.repositoryStorageRepository

Returns an instance of the interface to SDR storage.

Returns:



18
19
20
# File 'lib/stanford/storage_services.rb', line 18

def self.repository
  @@repository
end