Aucune description

AkkaStreamComponents.scala 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package fr.natan.akkastreamfileprocessingapi.service
  2. import akka.actor.ActorSystem
  3. import akka.stream.javadsl.Framing
  4. import akka.stream.scaladsl.{Compression, FileIO, Flow, Sink, Source}
  5. import akka.util.ByteString
  6. import akka.{Done, NotUsed}
  7. import com.typesafe.scalalogging.slf4j.Logger
  8. import fr.natan.akkastreamfileprocessingapi.businessexceptions.FileNotFoundException
  9. import fr.natan.akkastreamfileprocessingapi.models.Movie
  10. import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists
  11. import java.io.File
  12. import java.nio.file.Paths
  13. import scala.concurrent.Future
  14. object AkkaStreamComponents {
  15. implicit val actor: ActorSystem = ActorSystem("AkkaStreamActor")
  16. private def convertToClassMovie(array: Array[String]): Movie = {
  17. val movie: Movie = Movie(array(0), array(1), array(2), array(3), array(4).toShort, array(5).toInt, array(6), array(7), array(8))
  18. movie
  19. }
  20. //flows
  21. def buildMovieFlow(movieID: String): Flow[String, Movie, NotUsed] = {
  22. val flow: Flow[String, Movie, NotUsed] =
  23. Flow[String].filter(rows => !rows.contains(movieID))
  24. .map(row => {
  25. val movie: Array[String] = row.split("\t")
  26. convertToClassMovie(movie)
  27. })
  28. flow
  29. }
  30. def filterByMoviePrimaryTitleFlow(moviePrimaryTitle: String): Flow[String, Movie, NotUsed] = {
  31. val filterFlow: Flow[String, Movie, NotUsed] =
  32. Flow[String]
  33. .filter((rows: String) => {
  34. rows.contains(moviePrimaryTitle)
  35. })
  36. .map(row => {
  37. val movie: Array[String] = row.split("\t")
  38. convertToClassMovie(movie)
  39. })
  40. filterFlow
  41. }
  42. //source
  43. def buildSource(inputFile: File): Source[String, NotUsed] = {
  44. var source: Source[String, NotUsed] = null
  45. if (!fileExists(inputFile.getPath)) {
  46. return null
  47. }
  48. source = Source
  49. .single(inputFile)
  50. .flatMapConcat(
  51. (file: File) =>
  52. FileIO.fromPath(Paths.get(inputFile.getPath)
  53. )
  54. )
  55. .via(Compression.gunzip())
  56. .via(
  57. Framing.delimiter(ByteString("\n"), 4096)
  58. .map(byteString => byteString.utf8String)
  59. )
  60. source
  61. }
  62. def buildAndValidateSource(inputFile: File): Source[String, NotUsed] = {
  63. val source: Source[String, NotUsed] = buildSource(inputFile = inputFile)
  64. if (source == null) {
  65. throw new FileNotFoundException(filename = inputFile.getPath)
  66. }
  67. source
  68. }
  69. //sink
  70. def buildSink(logger: Logger): Sink[Movie, Future[Done]] = {
  71. val sink = Sink.foreach[Movie](
  72. (movie: Movie) => logger.info(s"${movie.toString}")
  73. )
  74. sink
  75. }
  76. }

Powered by TurnKey Linux.