Skip to content
This repository was archived by the owner on Dec 7, 2019. It is now read-only.

Commit fb591af

Browse files
committed
Add safeReadAll() and return the result wrapped in a ReadResult object
1 parent c39d84d commit fb591af

File tree

9 files changed

+130
-283
lines changed

9 files changed

+130
-283
lines changed

filesystem/src/main/java/com/nytimes/android/external/fs3/FSAllReader.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
import com.nytimes.android.external.fs3.filesystem.FileSystem;
44
import com.nytimes.android.external.store3.base.DiskAllRead;
55

6+
import com.nytimes.android.external.store3.base.ReadResult;
7+
import com.nytimes.android.external.store3.base.ReadResultFactory;
68
import java.io.FileNotFoundException;
79

810
import javax.annotation.Nonnull;
911

1012
import io.reactivex.Observable;
1113
import io.reactivex.exceptions.Exceptions;
1214
import okio.BufferedSource;
13-
import okio.Okio;
1415

1516
/**
1617
* FSReader is used when persisting from file system
@@ -24,6 +25,25 @@ public FSAllReader(FileSystem fileSystem) {
2425
this.fileSystem = fileSystem;
2526
}
2627

28+
@Nonnull
29+
@Override
30+
public Observable<ReadResult<BufferedSource>> safeReadAll(@Nonnull final String path) {
31+
return Observable.defer(() -> {
32+
Observable<ReadResult<BufferedSource>> bufferedSourceObservable = null;
33+
try {
34+
bufferedSourceObservable = Observable
35+
.fromIterable(fileSystem.list(path))
36+
.flatMap(s ->
37+
Observable.defer(() -> Observable.just(fileSystem.read(s)))
38+
.map(ReadResultFactory::createSuccessResult)
39+
.onErrorReturn(ReadResultFactory::createFailureResult));
40+
} catch (FileNotFoundException e) {
41+
throw Exceptions.propagate(e);
42+
}
43+
return bufferedSourceObservable;
44+
});
45+
}
46+
2747
@Nonnull
2848
@Override
2949
public Observable<BufferedSource> readAll(@Nonnull final String path) throws FileNotFoundException {
@@ -32,10 +52,13 @@ public Observable<BufferedSource> readAll(@Nonnull final String path) throws Fil
3252
try {
3353
bufferedSourceObservable = Observable
3454
.fromIterable(fileSystem.list(path))
35-
.flatMap(s ->
36-
Observable.defer(() -> Observable.just(fileSystem.read(s)))
37-
.onErrorReturn(throwable -> Okio.buffer(
38-
ReadResultBufferedSourceFactory.createFailureResult(throwable))));
55+
.map(s -> {
56+
try {
57+
return fileSystem.read(s);
58+
} catch (FileNotFoundException e) {
59+
throw Exceptions.propagate(e);
60+
}
61+
});
3962
} catch (FileNotFoundException e) {
4063
throw Exceptions.propagate(e);
4164
}

filesystem/src/main/java/com/nytimes/android/external/fs3/ReadResultBufferedSource.java

Lines changed: 0 additions & 258 deletions
This file was deleted.

filesystem/src/main/java/com/nytimes/android/external/fs3/ReadResultBufferedSourceFactory.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

filesystem/src/main/java/com/nytimes/android/external/fs3/SourceAllPersister.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.nytimes.android.external.fs3.filesystem.FileSystem;
55
import com.nytimes.android.external.store3.base.AllPersister;
6+
import com.nytimes.android.external.store3.base.ReadResult;
67
import com.nytimes.android.external.store3.base.impl.BarCode;
78

89
import java.io.FileNotFoundException;
@@ -35,6 +36,12 @@ public SourceAllPersister(FileSystem fileSystem) {
3536
sourceFileWriter = new FSWriter<>(fileSystem, new BarCodeReadAllPathResolver());
3637
}
3738

39+
@Nonnull
40+
@Override
41+
public Observable<ReadResult<BufferedSource>> safeReadAll(@Nonnull String path) {
42+
return sourceFileAllReader.safeReadAll(path);
43+
}
44+
3845
@Nonnull
3946
@Override
4047
public Observable<BufferedSource> readAll(@Nonnull final String path) throws FileNotFoundException {

filesystem/src/test/java/com/nytimes/android/external/fs3/FSAllOperationTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.nytimes.android.external.fs3.filesystem.FileSystem;
66
import com.nytimes.android.external.fs3.filesystem.FileSystemFactory;
77

8+
import com.nytimes.android.external.store3.base.ReadResult;
89
import org.junit.Test;
910

1011
import java.io.ByteArrayInputStream;
@@ -47,6 +48,26 @@ public void readAll() throws IOException {
4748
}
4849

4950
@Test
51+
public void safeReadAllWithCrash() throws IOException {
52+
File tempDir = createTempDir();
53+
FileSystem fileSystem = new CrashOnReadFileSystem(tempDir);
54+
55+
//write different data to File System for each barcode
56+
fileSystem.write(FOLDER + "/key.txt", source(CHALLAH));
57+
fileSystem.write(FOLDER + "/key_crash.txt", source(CHALLAH));
58+
fileSystem.write(FOLDER + "/" + INNER_FOLDER + "/key2.txt", source(CHALLAH_CHALLAH));
59+
FSAllReader reader = new FSAllReader(fileSystem);
60+
//read back all values for the FOLDER
61+
Observable<ReadResult<BufferedSource>> observable = reader.safeReadAll(FOLDER);
62+
observable.test()
63+
.assertValueAt(0, bufferedSourceReadResult ->
64+
bufferedSourceReadResult.getResult().readUtf8().equals(CHALLAH))
65+
.assertValueAt(1, bufferedSourceReadResult -> !bufferedSourceReadResult.isSuccess())
66+
.assertValueAt(2, bufferedSourceReadResult ->
67+
bufferedSourceReadResult.getResult().readUtf8().equals(CHALLAH_CHALLAH));
68+
}
69+
70+
@Test(expected = RuntimeException.class)
5071
public void readAllWithCrash() throws IOException {
5172
File tempDir = createTempDir();
5273
FileSystem fileSystem = new CrashOnReadFileSystem(tempDir);

0 commit comments

Comments
 (0)