| 
				
			 | 
			
			
				@@ -7,7 +7,8 @@ import akka.util.ByteString 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				7
			 | 
			
			
				 import akka.{Done, NotUsed} 
			 | 
		
	
		
			
			| 
				8
			 | 
			
				8
			 | 
			
			
				 import com.typesafe.scalalogging.slf4j.Logger 
			 | 
		
	
		
			
			| 
				9
			 | 
			
				9
			 | 
			
			
				 import fr.natan.akkastreamfileprocessingapi.businessexceptions.FileNotFoundException 
			 | 
		
	
		
			
			| 
				10
			 | 
			
				
			 | 
			
			
				-import fr.natan.akkastreamfileprocessingapi.models.TvSeries 
			 | 
		
	
		
			
			| 
				
			 | 
			
				10
			 | 
			
			
				+import fr.natan.akkastreamfileprocessingapi.datasource.Datasource.separator 
			 | 
		
	
		
			
			| 
				
			 | 
			
				11
			 | 
			
			
				+import fr.natan.akkastreamfileprocessingapi.models.{Person, TvSeries} 
			 | 
		
	
		
			
			| 
				11
			 | 
			
				12
			 | 
			
			
				 import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists 
			 | 
		
	
		
			
			| 
				12
			 | 
			
				13
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				13
			 | 
			
				14
			 | 
			
			
				 import java.io.File 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -18,7 +19,7 @@ object AkkaStreamComponents { 
			 | 
		
	
		
			
			| 
				18
			 | 
			
				19
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				19
			 | 
			
				20
			 | 
			
			
				   implicit val actor: ActorSystem = ActorSystem("AkkaStreamActor") 
			 | 
		
	
		
			
			| 
				20
			 | 
			
				21
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				21
			 | 
			
				
			 | 
			
			
				-  private def convertToClassMovie(array: Array[String]): TvSeries = { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				22
			 | 
			
			
				+  private def convertToTvSerie(array: Array[String]): TvSeries = { 
			 | 
		
	
		
			
			| 
				22
			 | 
			
				23
			 | 
			
			
				     val tvSerie: TvSeries = TvSeries( 
			 | 
		
	
		
			
			| 
				23
			 | 
			
				24
			 | 
			
			
				       array(0), 
			 | 
		
	
		
			
			| 
				24
			 | 
			
				25
			 | 
			
			
				       array(1), 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -33,19 +34,42 @@ object AkkaStreamComponents { 
			 | 
		
	
		
			
			| 
				33
			 | 
			
				34
			 | 
			
			
				     tvSerie 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				35
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				35
			 | 
			
				36
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				37
			 | 
			
			
				+  private def convertToPerson(array: Array[String]): Person ={ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				38
			 | 
			
			
				+    Person( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				39
			 | 
			
			
				+      array(0), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				40
			 | 
			
			
				+      array(1), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				41
			 | 
			
			
				+      array(2), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				+      array(3), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				+      array(4).split(",").toList, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				+      array(5).split(",").toList, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				+    ) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				+  } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				36
			 | 
			
				48
			 | 
			
			
				   //flows 
			 | 
		
	
		
			
			| 
				37
			 | 
			
				49
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				38
			 | 
			
				
			 | 
			
			
				-  def buildMovieFlow(movieID: String): Flow[String, TvSeries, NotUsed] = { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				+  def buildTvSerieFlow(movieID: String): Flow[String, TvSeries, NotUsed] = { 
			 | 
		
	
		
			
			| 
				39
			 | 
			
				51
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				40
			 | 
			
				
			 | 
			
			
				-    val flow: Flow[String, TvSeries, NotUsed] = 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+    val tvFlow: Flow[String, TvSeries, NotUsed] = 
			 | 
		
	
		
			
			| 
				41
			 | 
			
				53
			 | 
			
			
				       Flow[String].filter(rows => !rows.contains(movieID)) 
			 | 
		
	
		
			
			| 
				42
			 | 
			
				54
			 | 
			
			
				         .map(row => { 
			 | 
		
	
		
			
			| 
				43
			 | 
			
				
			 | 
			
			
				-          val movie: Array[String] = row.split("\t") 
			 | 
		
	
		
			
			| 
				44
			 | 
			
				
			 | 
			
			
				-          convertToClassMovie(movie) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				+          val movie: Array[String] = row.split(separator) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+          convertToTvSerie(movie) 
			 | 
		
	
		
			
			| 
				45
			 | 
			
				57
			 | 
			
			
				         }) 
			 | 
		
	
		
			
			| 
				46
			 | 
			
				
			 | 
			
			
				-    flow 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+    tvFlow 
			 | 
		
	
		
			
			| 
				47
			 | 
			
				59
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				48
			 | 
			
				60
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+  def buildPersonFlow(personID: String): Flow[String, Person, NotUsed]={ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+    val personFlow: Flow[String, Person, NotUsed] = 
			 | 
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				+      Flow[String] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				64
			 | 
			
			
				+        .filterNot((rows: String)=>{ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+          rows.contains(personID) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+        }) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+        .map((row: String)=>{ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+          convertToPerson(row.split(separator)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+        }) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				70
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				71
			 | 
			
			
				+    personFlow 
			 | 
		
	
		
			
			| 
				
			 | 
			
				72
			 | 
			
			
				+  } 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				73
			 | 
			
			
				   def buildfilterByMoviePrimaryTitleFlow(moviePrimaryTitle: String): Flow[String, TvSeries, NotUsed] = { 
			 | 
		
	
		
			
			| 
				50
			 | 
			
				74
			 | 
			
			
				     val filterFlow: Flow[String, TvSeries, NotUsed] = 
			 | 
		
	
		
			
			| 
				51
			 | 
			
				75
			 | 
			
			
				       Flow[String] 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -54,7 +78,7 @@ object AkkaStreamComponents { 
			 | 
		
	
		
			
			| 
				54
			 | 
			
				78
			 | 
			
			
				         }) 
			 | 
		
	
		
			
			| 
				55
			 | 
			
				79
			 | 
			
			
				         .map(row => { 
			 | 
		
	
		
			
			| 
				56
			 | 
			
				80
			 | 
			
			
				           val movie: Array[String] = row.split("\t") 
			 | 
		
	
		
			
			| 
				57
			 | 
			
				
			 | 
			
			
				-          convertToClassMovie(movie) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				+          convertToTvSerie(movie) 
			 | 
		
	
		
			
			| 
				58
			 | 
			
				82
			 | 
			
			
				         }) 
			 | 
		
	
		
			
			| 
				59
			 | 
			
				83
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				60
			 | 
			
				84
			 | 
			
			
				     filterFlow 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -93,12 +117,21 @@ object AkkaStreamComponents { 
			 | 
		
	
		
			
			| 
				93
			 | 
			
				117
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				94
			 | 
			
				118
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				95
			 | 
			
				119
			 | 
			
			
				   //sink 
			 | 
		
	
		
			
			| 
				96
			 | 
			
				
			 | 
			
			
				-  def buildSink(logger: Logger): Sink[TvSeries, Future[Done]] = { 
			 | 
		
	
		
			
			| 
				97
			 | 
			
				
			 | 
			
			
				-    val sink = Sink.foreach[TvSeries]( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				120
			 | 
			
			
				+  def buildTvSeriesSink(logger: Logger): Sink[TvSeries, Future[Done]] = { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				121
			 | 
			
			
				+    val tvSeriesSink : Sink[TvSeries, Future[Done]]= Sink.foreach[TvSeries]( 
			 | 
		
	
		
			
			| 
				98
			 | 
			
				122
			 | 
			
			
				       (movie: TvSeries) => { 
			 | 
		
	
		
			
			| 
				99
			 | 
			
				123
			 | 
			
			
				         logger.info(s"${movie.toString}") 
			 | 
		
	
		
			
			| 
				100
			 | 
			
				124
			 | 
			
			
				       } 
			 | 
		
	
		
			
			| 
				101
			 | 
			
				125
			 | 
			
			
				     ) 
			 | 
		
	
		
			
			| 
				102
			 | 
			
				
			 | 
			
			
				-    sink 
			 | 
		
	
		
			
			| 
				
			 | 
			
				126
			 | 
			
			
				+    tvSeriesSink 
			 | 
		
	
		
			
			| 
				
			 | 
			
				127
			 | 
			
			
				+  } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				128
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				129
			 | 
			
			
				+  def buildPersonSink(logger: Logger): Sink[Person, Future[Done]] ={ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				130
			 | 
			
			
				+    val personSink :Sink[Person, Future[Done]] = Sink 
			 | 
		
	
		
			
			| 
				
			 | 
			
				131
			 | 
			
			
				+      .foreach[Person]((person: Person)=>{ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				132
			 | 
			
			
				+        logger.info(s"${person.toString}") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				133
			 | 
			
			
				+      }) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				134
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				135
			 | 
			
			
				+    personSink 
			 | 
		
	
		
			
			| 
				103
			 | 
			
				136
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				104
			 | 
			
				137
			 | 
			
			
				 } 
			 |