Skip to content

Commit 65f7fe8

Browse files
committed
refs #99 - don't write payload file to data directory if that file is in the fetch list
1 parent df4de4f commit 65f7fe8

File tree

3 files changed

+52
-13
lines changed

3 files changed

+52
-13
lines changed

src/main/java/gov/loc/repository/bagit/writer/PayloadWriter.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
import java.nio.file.Files;
55
import java.nio.file.Path;
66
import java.nio.file.StandardCopyOption;
7+
import java.util.HashSet;
8+
import java.util.List;
79
import java.util.ResourceBundle;
810
import java.util.Set;
911

1012
import org.slf4j.Logger;
1113
import org.slf4j.LoggerFactory;
1214

1315
import gov.loc.repository.bagit.domain.Bag;
16+
import gov.loc.repository.bagit.domain.FetchItem;
1417
import gov.loc.repository.bagit.domain.Manifest;
1518
import gov.loc.repository.bagit.domain.Version;
1619

@@ -35,12 +38,12 @@ static Path writeVersionDependentPayloadFiles(final Bag bag, final Path outputDi
3538
if(bag.getVersion().isSameOrNewer(VERSION_2_0)){
3639
bagitDir = outputDir.resolve(".bagit");
3740
Files.createDirectories(bagitDir);
38-
writePayloadFiles(bag.getPayLoadManifests(), outputDir, bag.getRootDir());
41+
writePayloadFiles(bag.getPayLoadManifests(), bag.getItemsToFetch(), outputDir, bag.getRootDir());
3942
}
4043
else{
4144
final Path dataDir = outputDir.resolve("data");
4245
Files.createDirectories(dataDir);
43-
writePayloadFiles(bag.getPayLoadManifests(), dataDir, bag.getRootDir().resolve("data"));
46+
writePayloadFiles(bag.getPayLoadManifests(), bag.getItemsToFetch(), dataDir, bag.getRootDir().resolve("data"));
4447
}
4548

4649
return bagitDir;
@@ -50,25 +53,41 @@ static Path writeVersionDependentPayloadFiles(final Bag bag, final Path outputDi
5053
* Write the payload <b>file(s)</b> to the output directory
5154
*
5255
* @param payloadManifests the set of objects representing the payload manifests
56+
* @param fetchItems the list of items to exclude from writing in the output directory because they will be fetched
5357
* @param outputDir the data directory of the bag
5458
* @param bagDataDir the data directory of the bag
5559
*
5660
* @throws IOException if there was a problem writing a file
5761
*/
58-
public static void writePayloadFiles(final Set<Manifest> payloadManifests, final Path outputDir, final Path bagDataDir) throws IOException{
62+
public static void writePayloadFiles(final Set<Manifest> payloadManifests, final List<FetchItem> fetchItems, final Path outputDir, final Path bagDataDir) throws IOException{
5963
logger.info(messages.getString("writing_payload_files"));
64+
final Set<Path> fetchPaths = getFetchPaths(fetchItems);
65+
6066
for(final Manifest payloadManifest : payloadManifests){
6167
for(final Path payloadFile : payloadManifest.getFileToChecksumMap().keySet()){
62-
final Path relativePayloadPath = bagDataDir.relativize(payloadFile);
63-
64-
final Path writeToPath = outputDir.resolve(relativePayloadPath);
65-
logger.debug(messages.getString("writing_payload_file_to_path"), payloadFile, writeToPath);
66-
final Path parent = writeToPath.getParent();
67-
if(parent != null){
68-
Files.createDirectories(parent);
68+
final Path relativePayloadPath = bagDataDir.relativize(payloadFile);
69+
70+
if(fetchPaths.contains(relativePayloadPath.normalize())) {
71+
logger.info(messages.getString("skip_fetch_item_when_writing_payload"), payloadFile);
72+
}
73+
else {
74+
final Path writeToPath = outputDir.resolve(relativePayloadPath);
75+
logger.debug(messages.getString("writing_payload_file_to_path"), payloadFile, writeToPath);
76+
final Path parent = writeToPath.getParent();
77+
if(parent != null){
78+
Files.createDirectories(parent);
79+
}
80+
Files.copy(payloadFile, writeToPath, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
6981
}
70-
Files.copy(payloadFile, writeToPath, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
7182
}
7283
}
7384
}
85+
86+
private static Set<Path> getFetchPaths(final List<FetchItem> fetchItems){
87+
final Set<Path> fetchPaths = new HashSet<>();
88+
for(final FetchItem fetchItem : fetchItems) {
89+
fetchPaths.add(fetchItem.getPath());
90+
}
91+
return fetchPaths;
92+
}
7493
}

src/main/resources/MessageBundle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,5 @@ writing_manifest_to_path=Writing manifest to [{}].
217217
writing_metadata_to_path=Writing bag metadata file [{}] to [{}].
218218

219219
#for PayloadWriter.java
220-
writing_payload_file_to_path=Writing payload file [{}] to [{}].
220+
writing_payload_file_to_path=Writing payload file [{}] to [{}].
221+
skip_fetch_item_when_writing_payload=Skipping payload file {} because it is in the fetch list.

src/test/java/gov/loc/repository/bagit/writer/PayloadWriterTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.net.URISyntaxException;
77
import java.nio.file.Path;
88
import java.nio.file.Paths;
9+
import java.util.ArrayList;
10+
import java.util.Arrays;
911
import java.util.HashSet;
1012
import java.util.Set;
1113

@@ -14,6 +16,7 @@
1416
import org.junit.rules.TemporaryFolder;
1517

1618
import gov.loc.repository.bagit.PrivateConstructorTest;
19+
import gov.loc.repository.bagit.domain.FetchItem;
1720
import gov.loc.repository.bagit.domain.Manifest;
1821
import gov.loc.repository.bagit.hash.StandardSupportedAlgorithms;
1922

@@ -39,7 +42,23 @@ public void testWritePayloadFiles() throws IOException, URISyntaxException{
3942
File copiedFile = new File(outputDir, "data/dir1/test3.txt");
4043

4144
assertFalse(copiedFile.exists() || copiedFile.getParentFile().exists());
42-
PayloadWriter.writePayloadFiles(payloadManifests, Paths.get(outputDir.toURI()), rootDir);
45+
PayloadWriter.writePayloadFiles(payloadManifests, new ArrayList<>(),Paths.get(outputDir.toURI()), rootDir);
4346
assertTrue(copiedFile.exists() && copiedFile.getParentFile().exists());
4447
}
48+
49+
@Test
50+
public void testWritePayloadFilesMinusFetchFiles() throws IOException, URISyntaxException{
51+
Path rootDir = Paths.get(getClass().getClassLoader().getResource("bags/v0_97/bag").toURI());
52+
Path testFile = Paths.get(getClass().getClassLoader().getResource("bags/v0_97/bag/data/dir1/test3.txt").toURI());
53+
Manifest manifest = new Manifest(StandardSupportedAlgorithms.MD5);
54+
manifest.getFileToChecksumMap().put(testFile, "someHashValue");
55+
Set<Manifest> payloadManifests = new HashSet<>();
56+
payloadManifests.add(manifest);
57+
File outputDir = folder.newFolder();
58+
File copiedFile = new File(outputDir, "data/dir1/test3.txt");
59+
60+
assertFalse(copiedFile.exists() || copiedFile.getParentFile().exists());
61+
PayloadWriter.writePayloadFiles(payloadManifests, Arrays.asList(new FetchItem(null, null, Paths.get("data/dir1/test3.txt"))),Paths.get(outputDir.toURI()), rootDir);
62+
assertFalse(copiedFile.exists() && copiedFile.getParentFile().exists());
63+
}
4564
}

0 commit comments

Comments
 (0)