Class: Moab::StorageServices

Inherits:
Object
  • Object
show all
Defined in:
lib/moab/storage_services.rb

Overview

Note:

Copyright © 2012 by The Board of Trustees of the Leland Stanford Junior University. All rights reserved. See LICENSE for details.

An interface class to support access to SDR storage via a RESTful server

Data Model

  • StorageRepository = represents a digital object repository storage node

    • 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

Stanford::StorageServices

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.

Moab::StorageRepository.new

Class Method Summary collapse

Class Method Details

.current_version(object_id) ⇒ Integer

Returns The version number of the currently highest version.

Parameters:

  • object_id (String)

    The digital object identifier

Returns:

  • (Integer)

    The version number of the currently highest version



84
85
86
# File 'lib/moab/storage_services.rb', line 84

def self.current_version(object_id)
  repository.storage_object(object_id).current_version_id
end

.deposit_branch(object_id) ⇒ Pathname

Returns The branch segment of the object deposit path.

Parameters:

  • object_id (String)

    The identifier of the digital object

Returns:

  • (Pathname)

    The branch segment of the object deposit path



44
45
46
# File 'lib/moab/storage_services.rb', line 44

def self.deposit_branch(object_id)
  repository.deposit_branch(object_id)
end

.deposit_trunkString

Returns The trunk segment of the object deposit path.

Returns:

  • (String)

    The trunk segment of the object deposit path



38
39
40
# File 'lib/moab/storage_services.rb', line 38

def self.deposit_trunk
  repository.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.

Parameters:

  • object_id (String)

    The identifier of the digital object

  • include_deposit (Object) (defaults to: false)

Returns:

  • (StorageObject)

    The representation of a digitial object’s storage directory, which might not exist yet.



51
52
53
# File 'lib/moab/storage_services.rb', line 51

def self.find_storage_object(object_id, include_deposit = false)
  repository.find_storage_object(object_id, include_deposit)
end

.object_path(object_id) ⇒ String

Returns the location of the storage object.

Parameters:

  • object_id (String)

    The digital object identifier of the object

Returns:

  • (String)

    the location of the storage object



71
72
73
# File 'lib/moab/storage_services.rb', line 71

def self.object_path(object_id)
  repository.storage_object(object_id).object_pathname.to_s
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).

Parameters:

  • object_id (String)

    The identifier of the digital object whose size is desired

  • include_deposit (Boolean) (defaults to: false)

    specifies whether to look in deposit areas for objects in process of initial ingest

Returns:

  • (Integer)

    the size occupied on disk by the storage object, in bytes. this is the entire moab (all versions).



58
59
60
# File 'lib/moab/storage_services.rb', line 58

def self.object_size(object_id, include_deposit = false)
  repository.object_size(object_id, include_deposit)
end

.object_version_path(object_id, version_id = nil) ⇒ String

Returns the location of the storage object version.

Parameters:

  • object_id (String)

    The digital object identifier of the object

  • version_id (Integer) (defaults to: nil)

    The ID of the version, if nil use latest version

Returns:

  • (String)

    the location of the storage object version



78
79
80
# File 'lib/moab/storage_services.rb', line 78

def self.object_version_path(object_id, version_id = nil)
  repository.storage_object(object_id).find_object_version(version_id).version_pathname.to_s
end

.repositoryStorageRepository

Returns an instance of the interface to SDR storage.

Returns:



28
29
30
# File 'lib/moab/storage_services.rb', line 28

def self.repository
  @@repository
end

.retrieve_file(file_category, file_id, object_id, version_id = nil) ⇒ Pathname

Returns Pathname object containing the full path for the specified file.

Parameters:

  • file_category (String)

    The category of file (‘content’, ‘metdata’, or ‘manifest’)

  • file_id (String)

    The name of the file (path relative to base directory)

  • object_id (String)

    The digital object identifier of the object

  • version_id (Integer) (defaults to: nil)

    The ID of the version, if nil use latest version

Returns:

  • (Pathname)

    Pathname object containing the full path for the specified file



107
108
109
110
# File 'lib/moab/storage_services.rb', line 107

def self.retrieve_file(file_category, file_id, object_id, version_id = nil)
  storage_object_version = repository.storage_object(object_id).find_object_version(version_id)
  storage_object_version.find_filepath(file_category, file_id)
end

.retrieve_file_group(file_category, object_id, version_id = nil) ⇒ FileInventory

Returns the file inventory for the specified object version.

Parameters:

  • object_id (String)

    The digital object identifier of the object

  • version_id (Integer) (defaults to: nil)

    The ID of the version, if nil use latest version

Returns:

  • (FileInventory)

    the file inventory for the specified object version



91
92
93
94
95
96
97
98
99
100
# File 'lib/moab/storage_services.rb', line 91

def self.retrieve_file_group(file_category, object_id, version_id = nil)
  storage_object_version = repository.storage_object(object_id).find_object_version(version_id)
  inventory_type = if file_category =~ /manifest/
                     file_category = 'manifests'
                   else
                     'version'
                   end
  inventory = storage_object_version.file_inventory(inventory_type)
  inventory.group(file_category)
end

.retrieve_file_signature(file_category, file_id, object_id, version_id = nil) ⇒ FileSignature

Returns The signature of the file.

Parameters:

  • file_category (String)

    The category of file (‘content’, ‘metdata’, or ‘manifest’)

  • file_id (String)

    The name of the file (path relative to base directory)

  • object_id (String)

    The digital object identifier of the object

  • version_id (Integer) (defaults to: nil)

    The ID of the version, if nil use latest version

Returns:



127
128
129
130
# File 'lib/moab/storage_services.rb', line 127

def self.retrieve_file_signature(file_category, file_id, object_id, version_id = nil)
  storage_object_version = repository.storage_object(object_id).find_object_version(version_id)
  storage_object_version.find_signature(file_category, file_id)
end

.retrieve_file_using_signature(file_category, file_signature, object_id, version_id = nil) ⇒ Pathname

Returns Pathname object containing the full path for the specified file.

Parameters:

  • file_category (String)

    The category of file (‘content’, ‘metdata’, or ‘manifest’)

  • file_signature (FileSignature)

    The signature of the file

  • object_id (String)

    The digital object identifier of the object

  • version_id (Integer) (defaults to: nil)

    The ID of the version, if nil use latest version

Returns:

  • (Pathname)

    Pathname object containing the full path for the specified file



117
118
119
120
# File 'lib/moab/storage_services.rb', line 117

def self.retrieve_file_using_signature(file_category, file_signature, object_id, version_id = nil)
  storage_object_version = repository.storage_object(object_id).find_object_version(version_id)
  storage_object_version.find_filepath_using_signature(file_category, file_signature)
end

.storage_object(object_id, create = false) ⇒ StorageObject

Returns The representation of a digitial object’s storage directory, which must exist.

Parameters:

  • object_id (String)

    The identifier of the digital object whose version is desired

  • create (Boolean) (defaults to: false)

    If true, the object home directory should be created if it does not exist

Returns:

  • (StorageObject)

    The representation of a digitial object’s storage directory, which must exist.



65
66
67
# File 'lib/moab/storage_services.rb', line 65

def self.storage_object(object_id, create = false)
  repository.storage_object(object_id, create)
end

.storage_rootsArray<Pathname>

Returns A list of the filesystems currently used for storage.

Returns:

  • (Array<Pathname>)

    A list of the filesystems currently used for storage



33
34
35
# File 'lib/moab/storage_services.rb', line 33

def self.storage_roots
  repository.storage_roots
end

.version_differences(object_id, base_version_id, compare_version_id) ⇒ FileInventoryDifference

Returns The report of the version differences.

Parameters:

  • object_id (String)

    The digital object identifier of the object

  • base_version_id (Object)

    The identifier of the base version to be compared

  • compare_version_id (Object)

    The identifier of the version to be compared to the base version

Returns:



136
137
138
139
140
141
142
# File 'lib/moab/storage_services.rb', line 136

def self.version_differences(object_id, base_version_id, compare_version_id)
  base_version = repository.storage_object(object_id).storage_object_version(base_version_id)
  compare_version = repository.storage_object(object_id).storage_object_version(compare_version_id)
  base_inventory = base_version.file_inventory('version')
  compare_inventory = compare_version.file_inventory('version')
  FileInventoryDifference.new.compare(base_inventory, compare_inventory)
end