Class: Dor::DigitalStacksService
- Inherits:
-
Object
- Object
- Dor::DigitalStacksService
- Defined in:
- lib/dor/services/digital_stacks_service.rb
Class Method Summary collapse
-
.copy_file(workspace_pathname, stacks_pathname, moab_signature) ⇒ Boolean
Copy a file to stacks, but only if it does not yet exist with the expected signature.
-
.delete_file(file_pathname, moab_signature) ⇒ Boolean
Delete a file, but only if it exists and matches the expected signature.
- .prune_purl_dir(id) ⇒ Object
-
.prune_stacks_dir(id) ⇒ Object
Assumes the digital stacks storage root is mounted to the local file system TODO: since this is delegating to the Druid, this method may not be necessary.
-
.remove_from_stacks(stacks_object_pathname, content_diff) ⇒ Object
Delete files from stacks that have change type ‘deleted’, ‘copydeleted’, or ‘modified’.
-
.rename_file(old_pathname, new_pathname, moab_signature) ⇒ Boolean
Rename a file, but only if it exists and has the expected signature.
-
.rename_in_stacks(stacks_object_pathname, content_diff) ⇒ Object
Rename files from stacks that have change type ‘renamed’ using an intermediate temp filename.
-
.shelve_to_stacks(workspace_content_pathname, stacks_object_pathname, content_diff) ⇒ Object
Add files to stacks that have change type ‘added’, ‘copyadded’ or ‘modified’.
-
.transfer_to_document_store(id, content, filename) ⇒ void
Create a file inside the content directory under the stacks.local_document_cache_root.
Class Method Details
.copy_file(workspace_pathname, stacks_pathname, moab_signature) ⇒ Boolean
Copy a file to stacks, but only if it does not yet exist with the expected signature
103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/dor/services/digital_stacks_service.rb', line 103 def self.copy_file(workspace_pathname, stacks_pathname, moab_signature) if stacks_pathname.exist? file_signature = Moab::FileSignature.new.signature_from_file(stacks_pathname) stacks_pathname.delete if file_signature != moab_signature end unless stacks_pathname.exist? stacks_pathname.parent.mkpath FileUtils.cp workspace_pathname.to_s, stacks_pathname.to_s # Change permissions FileUtils.chmod 'u=rw,go=r', stacks_pathname.to_s return true end false end |
.delete_file(file_pathname, moab_signature) ⇒ Boolean
Delete a file, but only if it exists and matches the expected signature
26 27 28 29 30 31 32 33 34 35 |
# File 'lib/dor/services/digital_stacks_service.rb', line 26 def self.delete_file(file_pathname, moab_signature) if file_pathname.exist? && (file_pathname.size == moab_signature.size) file_signature = Moab::FileSignature.new.signature_from_file(file_pathname) if file_signature == moab_signature file_pathname.delete return true end end false end |
.prune_purl_dir(id) ⇒ Object
138 139 140 141 |
# File 'lib/dor/services/digital_stacks_service.rb', line 138 def self.prune_purl_dir(id) druid = DruidTools::PurlDruid.new(id, Dor::Config.stacks.local_document_cache_root) druid.prune! end |
.prune_stacks_dir(id) ⇒ Object
Assumes the digital stacks storage root is mounted to the local file system TODO: since this is delegating to the Druid, this method may not be necessary
133 134 135 136 |
# File 'lib/dor/services/digital_stacks_service.rb', line 133 def self.prune_stacks_dir(id) stacks_druid_tree = DruidTools::StacksDruid.new(id, Config.stacks.local_stacks_root) stacks_druid_tree.prune! end |
.remove_from_stacks(stacks_object_pathname, content_diff) ⇒ Object
Delete files from stacks that have change type ‘deleted’, ‘copydeleted’, or ‘modified’
11 12 13 14 15 16 17 18 19 20 |
# File 'lib/dor/services/digital_stacks_service.rb', line 11 def self.remove_from_stacks(stacks_object_pathname, content_diff) [:deleted, :copydeleted, :modified].each do |change_type| subset = content_diff.subset(change_type) # {Moab::FileGroupDifferenceSubset} subset.files.each do |moab_file| # {Moab::FileInstanceDifference} moab_signature = moab_file.signatures.first # {Moab::FileSignature} file_pathname = stacks_object_pathname.join(moab_file.basis_path) delete_file(file_pathname, moab_signature) end end end |
.rename_file(old_pathname, new_pathname, moab_signature) ⇒ Boolean
Rename a file, but only if it exists and has the expected signature
66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/dor/services/digital_stacks_service.rb', line 66 def self.rename_file(old_pathname, new_pathname, moab_signature) if old_pathname.exist? && (old_pathname.size == moab_signature.size) file_signature = Moab::FileSignature.new.signature_from_file(old_pathname) if file_signature == moab_signature new_pathname.parent.mkpath old_pathname.rename(new_pathname) return true end end false end |
.rename_in_stacks(stacks_object_pathname, content_diff) ⇒ Object
Rename files from stacks that have change type ‘renamed’ using an intermediate temp filename. The 2-step renaming allows chained or cyclic renames to occur without file collisions.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/dor/services/digital_stacks_service.rb', line 41 def self.rename_in_stacks(stacks_object_pathname, content_diff) subset = content_diff.subset(:renamed) # {Moab::FileGroupDifferenceSubset # 1st Pass - rename files from original name to checksum-based name subset.files.each do |moab_file| # {Moab::FileInstanceDifference} moab_signature = moab_file.signatures.first # {Moab::FileSignature} original_pathname = stacks_object_pathname.join(moab_file.basis_path) temp_pathname = stacks_object_pathname.join(moab_signature.checksums.values.last) rename_file(original_pathname, temp_pathname, moab_signature) end # 2nd Pass - rename files from checksum-based name to new name subset.files.each do |moab_file| # {Moab::FileInstanceDifference} moab_signature = moab_file.signatures.first # {Moab::FileSignature} temp_pathname = stacks_object_pathname.join(moab_signature.checksums.values.last) new_pathname = stacks_object_pathname.join(moab_file.other_path) rename_file(temp_pathname, new_pathname, moab_signature) end end |
.shelve_to_stacks(workspace_content_pathname, stacks_object_pathname, content_diff) ⇒ Object
Add files to stacks that have change type ‘added’, ‘copyadded’ or ‘modified’.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/dor/services/digital_stacks_service.rb', line 82 def self.shelve_to_stacks(workspace_content_pathname, stacks_object_pathname, content_diff) return false if workspace_content_pathname.nil? [:added, :copyadded, :modified].each do |change_type| subset = content_diff.subset(change_type) # {Moab::FileGroupDifferenceSubset subset.files.each do |moab_file| # {Moab::FileInstanceDifference} moab_signature = moab_file.signatures.last # {Moab::FileSignature} filename = (change_type == :modified) ? moab_file.basis_path : moab_file.other_path workspace_pathname = workspace_content_pathname.join(filename) stacks_pathname = stacks_object_pathname.join(filename) copy_file(workspace_pathname, stacks_pathname, moab_signature) end end true end |
.transfer_to_document_store(id, content, filename) ⇒ void
This method returns an undefined value.
Create a file inside the content directory under the stacks.local_document_cache_root
125 126 127 128 129 |
# File 'lib/dor/services/digital_stacks_service.rb', line 125 def self.transfer_to_document_store(id, content, filename) druid = DruidTools::PurlDruid.new id, Config.stacks.local_document_cache_root druid.content_dir # create the druid tree if it doesn't exist yet File.open(File.join(druid.content_dir, filename), 'w') { |f| f.write content } end |