The classes in reader take a path to a file on disk, read that file and then parse the contents. For example:
publicfinalclassKeyValueReader {
/** * Generic method to read key value pairs from the bagit files, like bagit.txt or bag-info.txt * * @param file the file to read * @param splitRegex how to split the key from the value * @param charset the encoding of the file * * @return a list of key value pairs */publicstaticList<SimpleImmutableEntry<String, String>> readKeyValuesFromFile(finalPathfile, finalStringsplitRegex, finalCharsetcharset) throwsIOException, InvalidBagMetadataException{
finalList<SimpleImmutableEntry<String, String>> keyValues = newArrayList<>();
try(finalBufferedReaderreader = Files.newBufferedReader(file, charset)){
...
}
returnkeyValues;
}
}For the Wellcome storage service (https://github.com/wellcometrust/storage-service), we aren’t keeping bags on the local disk, but in S3. If we want to read a file, we make a GetObject call to the S3 SDK, which returns an InputStream.
We could download the bag files to disk, and read them from there, but that seems a bit icky – would you be open to some pull requests that add allow parsing files even if they aren’t local files? Something like:
publicfinalclassKeyValueReader {
publicstaticList<SimpleImmutableEntry<String, String>> readKeyValuesFromReader(
finalBufferedReaderreader,
finalStringsplitRegex) throwsIOException, InvalidBagMetadataException{
finalList<SimpleImmutableEntry<String, String>> keyValues = newArrayList<>();
... returnkeyValues;
}
publicstaticList<SimpleImmutableEntry<String, String>> readKeyValuesFromFile(
finalPathfile,
finalStringsplitRegex,
finalCharsetcharset) throwsIOException, InvalidBagMetadataException{
try(finalBufferedReaderreader = Files.newBufferedReader(file, charset)){
returnreadKeyValuesFromReader(reader, splitRegex)
}
}
}So the existing API is preserved, and calls into the new method that takes any BufferedReader – and now we can call that rather than round-tripping to the filesystem first.
Thoughts?
The classes in
readertake a path to a file on disk, read that file and then parse the contents. For example:For the Wellcome storage service (https://github.com/wellcometrust/storage-service), we aren’t keeping bags on the local disk, but in S3. If we want to read a file, we make a GetObject call to the S3 SDK, which returns an
InputStream.We could download the bag files to disk, and read them from there, but that seems a bit icky – would you be open to some pull requests that add allow parsing files even if they aren’t local files? Something like:
So the existing API is preserved, and calls into the new method that takes any BufferedReader – and now we can call that rather than round-tripping to the filesystem first.
Thoughts?