forked from akka/alpakka
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e72e9ca
commit 7b1296a
Showing
8 changed files
with
247 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
26 changes: 26 additions & 0 deletions
26
file/src/main/java/akka/stream/alpakka/file/javadsl/Directory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* | ||
* Copyright (C) 2016-2017 Lightbend Inc. <http://www.lightbend.com> | ||
*/ | ||
package akka.stream.alpakka.file.javadsl; | ||
|
||
import akka.NotUsed; | ||
import akka.stream.javadsl.Source; | ||
|
||
import java.nio.file.Path; | ||
|
||
public final class Directory { | ||
|
||
/** | ||
* List all files in the given directory | ||
*/ | ||
public static Source<Path, NotUsed> ls(Path directory) { | ||
return akka.stream.alpakka.file.scaladsl.Directory.ls(directory).asJava(); | ||
} | ||
|
||
/** | ||
* Recursively list files and directories in the given directory, depth first. | ||
*/ | ||
public static Source<Path, NotUsed> walk(Path directory) { | ||
return akka.stream.alpakka.file.scaladsl.Directory.walk(directory).asJava(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
36 changes: 36 additions & 0 deletions
36
file/src/main/scala/akka/stream/alpakka/file/scaladsl/Directory.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* Copyright (C) 2016-2017 Lightbend Inc. <http://www.lightbend.com> | ||
*/ | ||
package akka.stream.alpakka.file.scaladsl | ||
|
||
import java.nio.file.attribute.BasicFileAttributes | ||
import java.nio.file.{Files, Path} | ||
import java.util.function.BiPredicate | ||
|
||
import akka.NotUsed | ||
import akka.stream.scaladsl.{Source, StreamConverters} | ||
|
||
object Directory { | ||
|
||
/** | ||
* List all files in the given directory | ||
*/ | ||
def ls(directory: Path): Source[Path, NotUsed] = { | ||
require(Files.isDirectory(directory), s"Path must be a directory, $directory isn't") | ||
StreamConverters.fromJavaStream(() => Files.list(directory)) | ||
} | ||
|
||
/** | ||
* Recursively list files in the given directory and its subdirectories. Listing is done | ||
* depth first. | ||
*/ | ||
def walk(directory: Path): Source[Path, NotUsed] = { | ||
require(Files.isDirectory(directory), s"Path must be a directory, $directory isn't") | ||
StreamConverters.fromJavaStream(() => Files.walk(directory)) | ||
} | ||
|
||
private def allFilesFilter = new BiPredicate[Path, BasicFileAttributes] { | ||
override def test(t: Path, u: BasicFileAttributes): Boolean = true | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
92 changes: 92 additions & 0 deletions
92
file/src/test/java/akka/stream/alpakka/file/javadsl/DirectoryTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* | ||
* Copyright (C) 2016-2017 Lightbend Inc. <http://www.lightbend.com> | ||
*/ | ||
package akka.stream.alpakka.file.javadsl; | ||
|
||
import akka.NotUsed; | ||
import akka.actor.ActorSystem; | ||
import akka.stream.ActorMaterializer; | ||
import akka.stream.Materializer; | ||
import akka.stream.javadsl.Sink; | ||
import akka.stream.javadsl.Source; | ||
import akka.testkit.TestKit; | ||
import com.google.common.jimfs.Configuration; | ||
import com.google.common.jimfs.Jimfs; | ||
import org.junit.After; | ||
import org.junit.Before; | ||
import org.junit.Test; | ||
import org.scalatest.junit.JUnitSuite; | ||
import scala.concurrent.duration.FiniteDuration; | ||
|
||
import java.nio.file.FileSystem; | ||
import java.nio.file.Files; | ||
import java.nio.file.Path; | ||
import java.util.Arrays; | ||
import java.util.List; | ||
import java.util.concurrent.TimeUnit; | ||
|
||
import static org.junit.Assert.assertEquals; | ||
|
||
public class DirectoryTest { | ||
|
||
private FileSystem fs; | ||
private ActorSystem system; | ||
private Materializer materializer; | ||
|
||
@Before | ||
public void setup() { | ||
fs = Jimfs.newFileSystem(Configuration.unix()); | ||
system = ActorSystem.create(); | ||
materializer = ActorMaterializer.create(system); | ||
} | ||
|
||
|
||
@Test | ||
public void listFiles() throws Exception { | ||
final Path dir = fs.getPath("listfiles"); | ||
Files.createDirectories(dir); | ||
final Path file1 = Files.createFile(dir.resolve("file1")); | ||
final Path file2 = Files.createFile(dir.resolve("file2")); | ||
|
||
// #ls | ||
final Source<Path, NotUsed> source = Directory.ls(dir); | ||
// #ls | ||
|
||
final List<Path> result = source.runWith(Sink.seq(), materializer) | ||
.toCompletableFuture().get(3, TimeUnit.SECONDS); | ||
assertEquals(result.size(), 2); | ||
assertEquals(result.get(0), file1); | ||
assertEquals(result.get(1), file2); | ||
} | ||
|
||
@Test | ||
public void walkAFileTree() throws Exception { | ||
final Path root = fs.getPath("walk"); | ||
Files.createDirectories(root); | ||
final Path subdir1 = root.resolve("subdir1"); | ||
Files.createDirectories(subdir1); | ||
final Path file1 = subdir1.resolve("file1"); | ||
Files.createFile(file1); | ||
final Path subdir2 = root.resolve("subdir2"); | ||
Files.createDirectories(subdir2); | ||
final Path file2 = subdir2.resolve("file2"); | ||
Files.createFile(file2); | ||
|
||
// #walk | ||
final Source<Path, NotUsed> source = Directory.walk(root); | ||
// #walk | ||
|
||
final List<Path> result = source.runWith(Sink.seq(), materializer) | ||
.toCompletableFuture().get(3, TimeUnit.SECONDS); | ||
assertEquals(result, Arrays.asList(root, subdir1, file1, subdir2, file2)); | ||
} | ||
|
||
@After | ||
public void tearDown() throws Exception { | ||
fs.close(); | ||
fs = null; | ||
TestKit.shutdownActorSystem(system, FiniteDuration.create(10, TimeUnit.SECONDS), true); | ||
system = null; | ||
materializer = null; | ||
} | ||
} |
67 changes: 67 additions & 0 deletions
67
file/src/test/scala/akka/stream/alpakka/file/scaladsl/DirectorySpec.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
* Copyright (C) 2016-2017 Lightbend Inc. <http://www.lightbend.com> | ||
*/ | ||
package akka.stream.alpakka.file.scaladsl | ||
|
||
import java.nio.file.{Files, Path} | ||
|
||
import akka.NotUsed | ||
import akka.actor.ActorSystem | ||
import akka.stream.ActorMaterializer | ||
import akka.stream.scaladsl.{Sink, Source} | ||
import akka.testkit.TestKit | ||
import com.google.common.jimfs.{Configuration, Jimfs} | ||
import org.scalatest.concurrent.ScalaFutures | ||
import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} | ||
|
||
class DirectorySpec | ||
extends TestKit(ActorSystem("directoryspec")) | ||
with WordSpecLike | ||
with Matchers | ||
with BeforeAndAfterAll | ||
with ScalaFutures { | ||
|
||
private val fs = Jimfs.newFileSystem(Configuration.forCurrentPlatform.toBuilder.build) | ||
private implicit val mat = ActorMaterializer() | ||
|
||
"The directory source factory" should { | ||
"list files" in { | ||
val dir = fs.getPath("listfiles") | ||
Files.createDirectories(dir) | ||
val paths = (0 to 100).map { n => | ||
val name = s"file$n" | ||
Files.createFile(dir.resolve(name)) | ||
} | ||
|
||
// #ls | ||
val source: Source[Path, NotUsed] = Directory.ls(dir) | ||
// #ls | ||
|
||
val result = source.runWith(Sink.seq).futureValue | ||
result.toSet shouldEqual paths.toSet | ||
} | ||
|
||
"walk a file tree" in { | ||
val root = fs.getPath("walk") | ||
Files.createDirectories(root) | ||
val subdir1 = root.resolve("subdir1") | ||
Files.createDirectories(subdir1) | ||
val file1 = subdir1.resolve("file1") | ||
Files.createFile(file1) | ||
val subdir2 = root.resolve("subdir2") | ||
Files.createDirectories(subdir2) | ||
val file2 = subdir2.resolve("file2") | ||
Files.createFile(file2) | ||
|
||
// #walk | ||
val files: Source[Path, NotUsed] = Directory.walk(root) | ||
// #walk | ||
|
||
val result = files.runWith(Sink.seq).futureValue | ||
result shouldEqual List(root, subdir1, file1, subdir2, file2) | ||
} | ||
} | ||
|
||
override protected def afterAll(): Unit = | ||
fs.close() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters