2014-04-23 10:05:09 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2014 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
package akka.stream.javadsl
|
|
|
|
|
|
2014-08-22 11:42:05 +02:00
|
|
|
import akka.stream._
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
import java.util
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
import akka.japi.Util
|
|
|
|
|
import akka.japi.Pair
|
|
|
|
|
import akka.stream.javadsl.japi.Function
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
import scala.annotation.unchecked.uncheckedVariance
|
|
|
|
|
import scala.concurrent.Future
|
|
|
|
|
import scala.concurrent.duration.FiniteDuration
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
object Flow {
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/** Create a `Flow` which can process elements of type `T`. */
|
|
|
|
|
def of[T](): javadsl.Flow[T, T] = new javadsl.FlowAdapter[T, T](scaladsl2.Pipe.empty[T])
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/** Create a `Flow` which can process elements of type `T`. */
|
|
|
|
|
def of[T](clazz: Class[T]): javadsl.Flow[T, T] = of[T]()
|
2014-05-22 20:58:38 +02:00
|
|
|
|
2014-04-23 10:05:09 +02:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/** Java API */
|
|
|
|
|
abstract class Flow[-In, +Out] extends FlowOps[In, Out] {
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-05-16 14:21:15 +02:00
|
|
|
/**
|
2014-10-03 17:33:14 +02:00
|
|
|
* Transform this flow by appending the given processing steps.
|
2014-05-16 14:21:15 +02:00
|
|
|
*/
|
2014-10-03 17:33:14 +02:00
|
|
|
def connect[T](flow: javadsl.Flow[Out, T]): javadsl.Flow[In, T]
|
2014-05-16 14:21:15 +02:00
|
|
|
|
2014-04-23 10:05:09 +02:00
|
|
|
/**
|
2014-10-03 17:33:14 +02:00
|
|
|
* Connect this flow to a sink, concatenating the processing steps of both.
|
2014-04-23 10:05:09 +02:00
|
|
|
*/
|
2014-10-03 17:33:14 +02:00
|
|
|
def connect(sink: javadsl.Sink[Out]): javadsl.Sink[In]
|
|
|
|
|
}
|
2014-05-15 09:35:42 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/**
|
|
|
|
|
* INTERNAL API
|
|
|
|
|
*/
|
|
|
|
|
private[akka] class FlowAdapter[-In, +Out](delegate: scaladsl2.Flow[In, Out]) extends javadsl.Flow[In, Out] {
|
2014-05-16 14:21:15 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
import scala.collection.JavaConverters._
|
|
|
|
|
import akka.stream.scaladsl2.JavaConverters._
|
2014-05-20 16:02:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/** Converts this Flow to it's Scala DSL counterpart */
|
|
|
|
|
def asScala: scaladsl2.Flow[In, Out] = delegate
|
2014-05-20 16:02:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
// FLOW //
|
2014-09-01 13:30:15 +02:00
|
|
|
|
2014-04-23 10:05:09 +02:00
|
|
|
/**
|
2014-10-03 17:33:14 +02:00
|
|
|
* Transform this flow by appending the given processing steps.
|
2014-04-23 10:05:09 +02:00
|
|
|
*/
|
2014-10-03 17:33:14 +02:00
|
|
|
override def connect[T](flow: javadsl.Flow[Out, T]): javadsl.Flow[In, T] =
|
|
|
|
|
new FlowAdapter(delegate.connect(flow.asScala))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
|
|
|
|
/**
|
2014-10-03 17:33:14 +02:00
|
|
|
* Connect this flow to a sink, concatenating the processing steps of both.
|
2014-04-23 10:05:09 +02:00
|
|
|
*/
|
2014-10-03 17:33:14 +02:00
|
|
|
override def connect(sink: javadsl.Sink[Out]): javadsl.Sink[In] =
|
|
|
|
|
SinkAdapter(delegate.connect(sink.asScala))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
// RUN WITH //
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-17 14:05:50 +02:00
|
|
|
def runWith[T, D](source: javadsl.KeyedSource[In, T], sink: javadsl.KeyedSink[Out, D], materializer: scaladsl2.FlowMaterializer): akka.japi.Pair[T, D] = {
|
|
|
|
|
val p = delegate.runWith(source.asScala, sink.asScala)(materializer)
|
2014-10-03 17:33:14 +02:00
|
|
|
akka.japi.Pair(p._1.asInstanceOf[T], p._2.asInstanceOf[D])
|
|
|
|
|
}
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-17 14:05:50 +02:00
|
|
|
def runWith[D](source: javadsl.SimpleSource[In], sink: javadsl.KeyedSink[Out, D], materializer: scaladsl2.FlowMaterializer): D =
|
|
|
|
|
delegate.runWith(source.asScala, sink.asScala)(materializer).asInstanceOf[D]
|
2014-05-15 09:35:42 +02:00
|
|
|
|
2014-10-17 14:05:50 +02:00
|
|
|
def runWith[T](source: javadsl.KeyedSource[In, T], sink: javadsl.SimpleSink[Out], materializer: scaladsl2.FlowMaterializer): T =
|
|
|
|
|
delegate.runWith(source.asScala, sink.asScala)(materializer).asInstanceOf[T]
|
2014-08-15 15:37:09 +02:00
|
|
|
|
2014-10-17 14:05:50 +02:00
|
|
|
def runWith(source: javadsl.SimpleSource[In], sink: javadsl.SimpleSink[Out], materializer: scaladsl2.FlowMaterializer): Unit =
|
|
|
|
|
delegate.runWith(source.asScala, sink.asScala)(materializer)
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
// COMMON OPS //
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def map[T](f: Function[Out, T]): javadsl.Flow[In, T] =
|
|
|
|
|
new FlowAdapter(delegate.map(f.apply))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def mapConcat[U](f: Function[Out, java.util.List[U]]): javadsl.Flow[In, U] =
|
|
|
|
|
new FlowAdapter(delegate.mapConcat(elem ⇒ Util.immutableSeq(f.apply(elem))))
|
2014-05-23 13:52:39 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def mapAsync[U](f: Function[Out, Future[U]]): javadsl.Flow[In, U] =
|
|
|
|
|
new FlowAdapter(delegate.mapAsync(f.apply))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def mapAsyncUnordered[T](f: Function[Out, Future[T]]): javadsl.Flow[In, T] =
|
|
|
|
|
new FlowAdapter(delegate.mapAsyncUnordered(f.apply))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def filter(p: japi.Predicate[Out]): javadsl.Flow[In, Out] =
|
|
|
|
|
new FlowAdapter(delegate.filter(p.test))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def collect[U](pf: PartialFunction[Out, U]): javadsl.Flow[In, U] =
|
|
|
|
|
new FlowAdapter(delegate.collect(pf))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def grouped(n: Int): javadsl.Flow[In, java.util.List[Out @uncheckedVariance]] =
|
|
|
|
|
new FlowAdapter(delegate.grouped(n).map(_.asJava)).asInstanceOf[javadsl.Flow[In, java.util.List[Out @uncheckedVariance]]] // FIXME optimize to one step
|
2014-05-20 13:46:35 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def groupedWithin(n: Int, d: FiniteDuration): javadsl.Flow[In, util.List[Out @uncheckedVariance]] =
|
|
|
|
|
new FlowAdapter(delegate.groupedWithin(n, d).map(_.asJava)) // FIXME optimize to one step
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def drop(n: Int): javadsl.Flow[In, Out] =
|
|
|
|
|
new FlowAdapter(delegate.drop(n))
|
2014-05-20 13:46:35 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def dropWithin(d: FiniteDuration): javadsl.Flow[In, Out] =
|
|
|
|
|
new FlowAdapter(delegate.dropWithin(d))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def take(n: Int): Flow[In, Out] =
|
|
|
|
|
new FlowAdapter(delegate.take(n))
|
2014-05-20 13:46:35 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def takeWithin(d: FiniteDuration): Flow[In, Out] =
|
|
|
|
|
new FlowAdapter(delegate.takeWithin(d))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def transform[U](name: String, transformer: japi.Creator[Transformer[Out, U]]): javadsl.Flow[In, U] =
|
2014-08-22 11:42:05 +02:00
|
|
|
new FlowAdapter(delegate.transform(name, () ⇒ transformer.create()))
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def timerTransform[U](name: String, transformer: japi.Creator[TimerTransformer[Out, U]]): javadsl.Flow[In, U] =
|
2014-08-22 11:42:05 +02:00
|
|
|
new FlowAdapter(delegate.timerTransform(name, () ⇒ transformer.create()))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def prefixAndTail(n: Int): javadsl.Flow[In, akka.japi.Pair[java.util.List[Out @uncheckedVariance], javadsl.Source[Out @uncheckedVariance]]] =
|
|
|
|
|
new FlowAdapter(delegate.prefixAndTail(n).map { case (taken, tail) ⇒ akka.japi.Pair(taken.asJava, tail.asJava) })
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def groupBy[K](f: Function[Out, K]): javadsl.Flow[In, akka.japi.Pair[K, javadsl.Source[Out @uncheckedVariance]]] =
|
|
|
|
|
new FlowAdapter(delegate.groupBy(f.apply).map { case (k, p) ⇒ akka.japi.Pair(k, p.asJava) }) // FIXME optimize to one step
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def splitWhen(p: japi.Predicate[Out]): javadsl.Flow[In, javadsl.Source[Out]] =
|
|
|
|
|
new FlowAdapter(delegate.splitWhen(p.test).map(_.asJava))
|
2014-04-23 10:05:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def flatten[U](strategy: akka.stream.FlattenStrategy[Out, U]): javadsl.Flow[In, U] =
|
2014-05-16 14:21:15 +02:00
|
|
|
new FlowAdapter(delegate.flatten(strategy))
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def buffer(size: Int, overflowStrategy: OverflowStrategy): javadsl.Flow[In, Out] =
|
2014-05-20 16:02:09 +02:00
|
|
|
new FlowAdapter(delegate.buffer(size, overflowStrategy))
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def expand[S, U](seed: japi.Function[Out, S], extrapolate: japi.Function[S, akka.japi.Pair[U, S]]): javadsl.Flow[In, U] =
|
2014-05-20 16:02:09 +02:00
|
|
|
new FlowAdapter(delegate.expand(seed.apply, (s: S) ⇒ {
|
|
|
|
|
val p = extrapolate.apply(s)
|
|
|
|
|
(p.first, p.second)
|
|
|
|
|
}))
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
override def conflate[S](seed: Function[Out, S], aggregate: japi.Function2[S, Out, S]): javadsl.Flow[In, S] =
|
2014-05-20 16:02:09 +02:00
|
|
|
new FlowAdapter(delegate.conflate(seed.apply, aggregate.apply))
|
|
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
}
|
2014-05-15 09:35:42 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/**
|
|
|
|
|
* Java API
|
|
|
|
|
*
|
|
|
|
|
* Flow with attached input and output, can be executed.
|
|
|
|
|
*/
|
|
|
|
|
trait RunnableFlow {
|
|
|
|
|
def run(materializer: scaladsl2.FlowMaterializer): javadsl.MaterializedMap
|
|
|
|
|
}
|
2014-08-15 15:37:09 +02:00
|
|
|
|
2014-10-03 17:33:14 +02:00
|
|
|
/** INTERNAL API */
|
|
|
|
|
private[akka] class RunnableFlowAdapter(runnable: scaladsl2.RunnableFlow) extends RunnableFlow {
|
|
|
|
|
override def run(materializer: scaladsl2.FlowMaterializer): MaterializedMap = new MaterializedMapAdapter(runnable.run()(materializer))
|
|
|
|
|
}
|