diff --git a/src/main/java/io/zold/api/WalletsIn.java b/src/main/java/io/zold/api/WalletsIn.java index def2558..43ec47d 100644 --- a/src/main/java/io/zold/api/WalletsIn.java +++ b/src/main/java/io/zold/api/WalletsIn.java @@ -23,9 +23,15 @@ */ package io.zold.api; +import java.io.IOException; +import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.Iterator; import org.cactoos.Scalar; +import org.cactoos.func.IoCheckedFunc; +import org.cactoos.io.Directory; +import org.cactoos.iterable.Filtered; +import org.cactoos.iterable.Mapped; import org.cactoos.scalar.IoCheckedScalar; import org.cactoos.scalar.StickyScalar; import org.cactoos.scalar.SyncScalar; @@ -36,8 +42,8 @@ * @author Tolegen Izbassar (t.izbassar@gmail.com) * @version $Id$ * @since 0.1 + * @checkstyle ClassDataAbstractionCoupling (2 lines) */ -@SuppressWarnings({"PMD.SingularField", "PMD.UnusedPrivateField"}) public final class WalletsIn implements Wallets { /** @@ -45,26 +51,39 @@ public final class WalletsIn implements Wallets { */ private final IoCheckedScalar path; + /** + * Filter for matching file extensions. + */ + private final IoCheckedFunc filter; + /** * Ctor. * @param pth Path with wallets */ public WalletsIn(final Path pth) { this( - () -> pth + () -> pth, + "z" ); } /** * Ctor. * @param pth Path with wallets + * @param ext File extension to match */ - public WalletsIn(final Scalar pth) { + public WalletsIn(final Scalar pth, final String ext) { this.path = new IoCheckedScalar<>( new SyncScalar<>( new StickyScalar<>(pth) ) ); + this.filter = new IoCheckedFunc( + (file) -> file.toFile().isFile() + && FileSystems.getDefault() + .getPathMatcher(String.format("glob:**.%s", ext)) + .matches(file) + ); } // @todo #4:30min Return the new instance of the Wallet, that will @@ -76,12 +95,16 @@ public Wallet create() { throw new UnsupportedOperationException("create() not yet supported"); } - // @todo #4:30min Read instance of the Wallet from file and put it - // to the result. Should be taken care of after Wallet interface will have - // necessary implementations. Cover with tests and remove irrelevant test - // case. @Override + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") public Iterator iterator() { - throw new UnsupportedOperationException("iterator() not yet supported"); + try { + return new Mapped( + (pth) -> new Wallet.File(pth), + new Filtered<>(this.filter, new Directory(this.path.value())) + ).iterator(); + } catch (final IOException ex) { + throw new IllegalStateException(ex); + } } } diff --git a/src/test/java/io/zold/api/WalletsInTest.java b/src/test/java/io/zold/api/WalletsInTest.java index 30f0f36..654a8b0 100644 --- a/src/test/java/io/zold/api/WalletsInTest.java +++ b/src/test/java/io/zold/api/WalletsInTest.java @@ -24,6 +24,8 @@ package io.zold.api; import java.io.IOException; +import java.nio.file.Paths; +import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.Rule; import org.junit.Test; @@ -48,16 +50,12 @@ public final class WalletsInTest { public final TemporaryFolder folder = new TemporaryFolder(); @Test - public void iteratorIsNotYetImplemented() throws IOException { - this.thrown.expect(UnsupportedOperationException.class); - this.thrown.expectMessage( - Matchers.is( - "iterator() not yet supported" - ) + public void iteratesWallets() { + MatcherAssert.assertThat( + new WalletsIn(Paths.get("src/test/resources/walletsIn")), + // @checkstyle MagicNumber (1 line) + Matchers.iterableWithSize(5) ); - new WalletsIn( - this.folder.newFolder().toPath() - ).iterator(); } @Test diff --git a/src/test/resources/walletsIn/1.z b/src/test/resources/walletsIn/1.z new file mode 100644 index 0000000..c8c82ca --- /dev/null +++ b/src/test/resources/walletsIn/1.z @@ -0,0 +1,7 @@ +zold +1 +1 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file diff --git a/src/test/resources/walletsIn/2.z b/src/test/resources/walletsIn/2.z new file mode 100644 index 0000000..ccd935b --- /dev/null +++ b/src/test/resources/walletsIn/2.z @@ -0,0 +1,7 @@ +zold +1 +2 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file diff --git a/src/test/resources/walletsIn/3.z b/src/test/resources/walletsIn/3.z new file mode 100644 index 0000000..51e77d5 --- /dev/null +++ b/src/test/resources/walletsIn/3.z @@ -0,0 +1,7 @@ +zold +1 +3 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file diff --git a/src/test/resources/walletsIn/4.z b/src/test/resources/walletsIn/4.z new file mode 100644 index 0000000..8ab861b --- /dev/null +++ b/src/test/resources/walletsIn/4.z @@ -0,0 +1,7 @@ +zold +1 +4 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file diff --git a/src/test/resources/walletsIn/5.z b/src/test/resources/walletsIn/5.z new file mode 100644 index 0000000..63d6701 --- /dev/null +++ b/src/test/resources/walletsIn/5.z @@ -0,0 +1,7 @@ +zold +1 +5 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file diff --git a/src/test/resources/walletsIn/6 b/src/test/resources/walletsIn/6 new file mode 100644 index 0000000..50d3dde --- /dev/null +++ b/src/test/resources/walletsIn/6 @@ -0,0 +1,7 @@ +zold +1 +6 +MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGZCr/9hBChqsChd4sRAIpKNRinjhSW+J+S7PU5malVMiRHVoKjeooLDpWpij0A6vkzOvjrMldAZT0Fzgp0cJ15TOVwiQanQ5WuQDgRkLoxrdh/qyBApoDvk4OUEozOQPNwfpZOFfaUALPsPnv9995TlY9WcdSKW5dj041p1tJmlAgMBAAE= + +003a;2017-07-19T21:24:51Z;ffffffff9c0ccccd;Ui0wpLu7;98bb82c81735c4ee;For services;SKMPrVj... +003b;2017-07-19T21:25:07Z;ffffffffffa72367;xksQuJa9;98bb82c81735c4ee;For food;QCuLuVr4... \ No newline at end of file