scala.compat.java8.FutureConverters Scala Examples
The following examples show how to use scala.compat.java8.FutureConverters.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: AuthorizationInterceptor.scala From daml with Apache License 2.0 | 5 votes |
// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.daml.ledger.api.auth.interceptor import com.daml.ledger.api.auth.{AuthService, Claims} import com.daml.platform.server.api.validation.ErrorFactories.unauthenticated import io.grpc.{ Context, Contexts, Metadata, ServerCall, ServerCallHandler, ServerInterceptor, Status } import org.slf4j.{Logger, LoggerFactory} import scala.compat.java8.FutureConverters import scala.concurrent.ExecutionContext import scala.util.{Failure, Success, Try} final class AuthorizationInterceptor(protected val authService: AuthService, ec: ExecutionContext) extends ServerInterceptor { private val logger: Logger = LoggerFactory.getLogger(AuthorizationInterceptor.getClass) private val internalAuthenticationError = Status.INTERNAL.withDescription("Failed to get claims from request metadata") import AuthorizationInterceptor.contextKeyClaim override def interceptCall[ReqT, RespT]( call: ServerCall[ReqT, RespT], headers: Metadata, nextListener: ServerCallHandler[ReqT, RespT]): ServerCall.Listener[ReqT] = { // Note: Context uses ThreadLocal storage, we need to capture it outside of the async block below. // Contexts are immutable and safe to pass around. val prevCtx = Context.current // The method interceptCall() must return a Listener. // The target listener is created by calling `Contexts.interceptCall()`. // However, this is only done after we have asynchronously received the claims. // Therefore, we need to return a listener that buffers all messages until the target listener is available. new AsyncForwardingListener[ReqT] { FutureConverters .toScala(authService.decodeMetadata(headers)) .onComplete { case Failure(exception) => logger.warn(s"Failed to get claims from request metadata: ${exception.getMessage}") call.close(internalAuthenticationError, new Metadata()) new ServerCall.Listener[Nothing]() {} case Success(Claims.empty) => logger.debug(s"Auth metadata decoded into empty claims, returning UNAUTHENTICATED") call.close(Status.UNAUTHENTICATED, new Metadata()) new ServerCall.Listener[Nothing]() {} case Success(claims) => val nextCtx = prevCtx.withValue(contextKeyClaim, claims) // Contexts.interceptCall() creates a listener that wraps all methods of `nextListener` // such that `Context.current` returns `nextCtx`. val nextListenerWithContext = Contexts.interceptCall(nextCtx, call, headers, nextListener) setNextListener(nextListenerWithContext) nextListenerWithContext }(ec) } } } object AuthorizationInterceptor { private val contextKeyClaim = Context.key[Claims]("AuthServiceDecodedClaim") def extractClaimsFromContext(): Try[Claims] = Option(contextKeyClaim.get()).fold[Try[Claims]](Failure(unauthenticated()))(Success(_)) def apply(authService: AuthService, ec: ExecutionContext): AuthorizationInterceptor = new AuthorizationInterceptor(authService, ec) }
Example 2
Source File: KeyValueParticipantStateWriter.scala From daml with Apache License 2.0 | 5 votes |
// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.daml.ledger.participant.state.kvutils.api import java.util.UUID import java.util.concurrent.CompletionStage import com.daml.daml_lf_dev.DamlLf import com.daml.ledger.api.health.HealthStatus import com.daml.ledger.participant.state.kvutils.DamlKvutils.DamlSubmission import com.daml.ledger.participant.state.kvutils.{Envelope, KeyValueSubmission} import com.daml.ledger.participant.state.v1._ import com.daml.lf.data.{Ref, Time} import com.daml.metrics.Metrics import scala.compat.java8.FutureConverters class KeyValueParticipantStateWriter(writer: LedgerWriter, metrics: Metrics) extends WriteService { private val keyValueSubmission = new KeyValueSubmission(metrics) override def submitTransaction( submitterInfo: SubmitterInfo, transactionMeta: TransactionMeta, transaction: SubmittedTransaction, estimatedInterpretationCost: Long, ): CompletionStage[SubmissionResult] = { val submission = keyValueSubmission.transactionToSubmission( submitterInfo, transactionMeta, transaction, ) val metadata = SimpleCommitMetadata( estimatedInterpretationCost = Some(estimatedInterpretationCost)) commit(correlationId = submitterInfo.commandId, submission = submission, metadata = metadata) } override def uploadPackages( submissionId: SubmissionId, archives: List[DamlLf.Archive], sourceDescription: Option[String]): CompletionStage[SubmissionResult] = { val submission = keyValueSubmission .archivesToSubmission( submissionId, archives, sourceDescription.getOrElse(""), writer.participantId) commit(submissionId, submission) } override def submitConfiguration( maxRecordTime: Time.Timestamp, submissionId: SubmissionId, config: Configuration): CompletionStage[SubmissionResult] = { val submission = keyValueSubmission .configurationToSubmission(maxRecordTime, submissionId, writer.participantId, config) commit(submissionId, submission) } override def allocateParty( hint: Option[Party], displayName: Option[String], submissionId: SubmissionId): CompletionStage[SubmissionResult] = { val party = hint.getOrElse(generateRandomParty()) val submission = keyValueSubmission.partyToSubmission( submissionId, Some(party), displayName, writer.participantId) commit(submissionId, submission) } override def currentHealth(): HealthStatus = writer.currentHealth() private def generateRandomParty(): Ref.Party = Ref.Party.assertFromString(s"party-${UUID.randomUUID().toString.take(8)}") private def commit( correlationId: String, submission: DamlSubmission, metadata: CommitMetadata = CommitMetadata.Empty, ): CompletionStage[SubmissionResult] = FutureConverters.toJava(writer.commit(correlationId, Envelope.enclose(submission), metadata)) }
Example 3
Source File: ProjectionRegistryModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.projection import java.util.concurrent.CompletionStage import akka.actor.ActorSystem import akka.annotation.ApiMayChange import akka.annotation.InternalApi import com.lightbend.lagom.internal.projection.ProjectionRegistry import com.lightbend.lagom.internal.projection.ProjectionRegistryActor.WorkerCoordinates import com.lightbend.lagom.projection.State import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import play.api.Configuration import play.api.Environment import play.api.inject.Binding import play.api.inject.Module import scala.compat.java8.FutureConverters import scala.concurrent.ExecutionContext private class ProjectionsImpl @Inject() (registry: ProjectionRegistry)( implicit executionContext: ExecutionContext ) extends Projections { import FutureConverters._ override def getStatus(): CompletionStage[State] = registry.getState().toJava override def stopAllWorkers(projectionName: String): Unit = registry.stopAllWorkers(projectionName) override def stopWorker(projectionName: String, tagName: String): Unit = registry.stopWorker(WorkerCoordinates(projectionName, tagName)) override def startAllWorkers(projectionName: String): Unit = registry.startAllWorkers(projectionName) override def startWorker(projectionName: String, tagName: String): Unit = registry.startWorker(WorkerCoordinates(projectionName, tagName)) }
Example 4
Source File: RequestRunner.scala From aws-spi-akka-http with Apache License 2.0 | 5 votes |
package com.github.matsluni.akkahttpspi import java.util.concurrent.CompletableFuture import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.HttpRequest import akka.http.scaladsl.settings.ConnectionPoolSettings import akka.stream.Materializer import akka.stream.scaladsl.{Keep, Sink} import org.slf4j.LoggerFactory import software.amazon.awssdk.http.SdkHttpFullResponse import software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler import scala.compat.java8.FutureConverters import scala.concurrent.ExecutionContext import scala.collection.JavaConverters._ class RequestRunner(connectionPoolSettings: ConnectionPoolSettings)(implicit sys: ActorSystem, ec: ExecutionContext, mat: Materializer) { val logger = LoggerFactory.getLogger(this.getClass) def run(httpRequest: HttpRequest, handler: SdkAsyncHttpResponseHandler): CompletableFuture[Void] = { val result = Http() .singleRequest(httpRequest, settings = connectionPoolSettings) .flatMap { response => val sdkResponse = SdkHttpFullResponse.builder() .headers(response.headers.groupBy(_.name()).map{ case (k, v) => k -> v.map(_.value()).asJava }.asJava) .statusCode(response.status.intValue()) .statusText(response.status.reason) .build handler.onHeaders(sdkResponse) val (complete, publisher) = response .entity .dataBytes .map(_.asByteBuffer) .alsoToMat(Sink.ignore)(Keep.right) .toMat(Sink.asPublisher(fanout = false))(Keep.both) .run() handler.onStream(publisher) complete } result.failed.foreach(handler.onError) FutureConverters.toJava(result.map(_ => null: Void)).toCompletableFuture } }
Example 5
Source File: ChatControllerSpec.scala From Scala-Reactive-Programming with MIT License | 5 votes |
package controllers import org.scalatest.concurrent.PatienceConfiguration.Timeout import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures} import org.scalatestplus.play._ import play.api.inject.guice.GuiceApplicationBuilder import play.api.test._ import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient import play.shaded.ahc.org.asynchttpclient.ws.WebSocket import scala.compat.java8.FutureConverters import scala.concurrent.Await import scala.concurrent.duration._ class ChatControllerSpec extends PlaySpec with ScalaFutures with IntegrationPatience { "ChatController" should { "reject a websocket flow if the origin is set incorrectly" in WsTestClient.withClient { client => // Pick a non standard port that will fail the (somewhat contrived) origin check... lazy val port: Int = 31337 val app = new GuiceApplicationBuilder().build() Helpers.running(TestServer(port, app)) { val myPublicAddress = s"localhost:$port" val serverURL = s"ws://$myPublicAddress/chat" val asyncHttpClient: AsyncHttpClient = client.underlying[AsyncHttpClient] val webSocketClient = new WebSocketClient(asyncHttpClient) try { val origin = "ws://example.com/ws/chat" val listener = new WebSocketClient.LoggingListener val completionStage = webSocketClient.call(serverURL, origin, listener) val f = FutureConverters.toScala(completionStage) val result = Await.result(f, atMost = 1000 millis) listener.getThrowable mustBe a[IllegalStateException] } catch { case e: IllegalStateException => e mustBe an [IllegalStateException] case e: java.util.concurrent.ExecutionException => val foo = e.getCause foo mustBe an [IllegalStateException] } } } "accept a websocket flow if the origin is set correctly" in WsTestClient.withClient { client => lazy val port: Int = Helpers.testServerPort val app = new GuiceApplicationBuilder().build() Helpers.running(TestServer(port, app)) { val myPublicAddress = s"localhost:$port" val serverURL = s"ws://$myPublicAddress/chat" val asyncHttpClient: AsyncHttpClient = client.underlying[AsyncHttpClient] val webSocketClient = new WebSocketClient(asyncHttpClient) val origin = serverURL val listener = new WebSocketClient.LoggingListener val completionStage = webSocketClient.call(serverURL, origin, listener) val f = FutureConverters.toScala(completionStage) whenReady(f, timeout = Timeout(1 second)) { webSocket => webSocket mustBe a [WebSocket] } } } } }
Example 6
Source File: RouteUtils.scala From akka-grpc with Apache License 2.0 | 5 votes |
package akka.grpc.javadsl import scala.concurrent.ExecutionContext import java.util.concurrent.CompletionStage import akka.actor.ClassicActorSystemProvider import akka.annotation.ApiMayChange import akka.http.scaladsl import akka.http.javadsl.model.{ HttpRequest, HttpResponse } import akka.http.javadsl.server.Route import akka.http.javadsl.server.directives.RouteAdapter import akka.http.scaladsl.server.RouteResult import akka.japi.Function import scala.compat.java8.FutureConverters def toFunction( route: Route, system: ClassicActorSystemProvider): Function[HttpRequest, CompletionStage[HttpResponse]] = { implicit val sys = system.classicSystem implicit val ec: ExecutionContext = sys.dispatcher val handler = scaladsl.server.Route.asyncHandler(route.asScala) (request: HttpRequest) => { import FutureConverters._ handler(request.asInstanceOf[scaladsl.model.HttpRequest]).map(_.asInstanceOf[HttpResponse]).toJava } } }
Example 7
Source File: MonixAsyncHandler.scala From pulsar4s with Apache License 2.0 | 5 votes |
package com.sksamuel.pulsar4s.monixs import java.util.concurrent.CompletableFuture import com.sksamuel.pulsar4s.{AsyncHandler, ConsumerMessage, DefaultProducer, MessageId, Producer} import monix.eval.Task import org.apache.pulsar.client.api import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.{ProducerBuilder, Reader, TypedMessageBuilder} import scala.compat.java8.FutureConverters import scala.concurrent.Future import scala.language.implicitConversions import scala.util.{Failure, Success, Try} class MonixAsyncHandler extends AsyncHandler[Task] { implicit def completableTToFuture[T](f: => CompletableFuture[T]): Future[T] = FutureConverters.toScala(f) implicit def completableVoidToTask(f: => CompletableFuture[Void]): Task[Unit] = Task.deferFuture(FutureConverters.toScala(f)).map(_ => ()) override def failed(e: Throwable): Task[Nothing] = Task.raiseError(e) override def createProducer[T](builder: ProducerBuilder[T]): Task[Producer[T]] = Task.deferFuture(FutureConverters.toScala(builder.createAsync())).map(new DefaultProducer(_)) override def send[T](t: T, producer: api.Producer[T]): Task[MessageId] = { Task.deferFuture { val future = producer.sendAsync(t) FutureConverters.toScala(future) }.map { id => MessageId.fromJava(id) } } override def receive[T](consumer: api.Consumer[T]): Task[ConsumerMessage[T]] = { Task.deferFuture { val future = consumer.receiveAsync() FutureConverters.toScala(future) }.map(ConsumerMessage.fromJava) } override def getLastMessageId[T](consumer: api.Consumer[T]): Task[MessageId] = { Task.deferFuture { val future = consumer.getLastMessageIdAsync() FutureConverters.toScala(future) }.map(MessageId.fromJava) } def unsubscribeAsync(consumer: api.Consumer[_]): Task[Unit] = consumer.unsubscribeAsync() override def close(producer: api.Producer[_]): Task[Unit] = producer.closeAsync() override def close(consumer: api.Consumer[_]): Task[Unit] = consumer.closeAsync() override def seekAsync(consumer: api.Consumer[_], messageId: MessageId): Task[Unit] = consumer.seekAsync(messageId) override def seekAsync(reader: api.Reader[_], messageId: MessageId): Task[Unit] = reader.seekAsync(messageId) override def seekAsync(reader: api.Reader[_], timestamp: Long): Task[Unit] = reader.seekAsync(timestamp) override def transform[A, B](t: Task[A])(fn: A => Try[B]): Task[B] = t.flatMap { a => fn(a) match { case Success(b) => Task.now(b) case Failure(e) => Task.raiseError(e) } } override def acknowledgeAsync[T](consumer: api.Consumer[T], messageId: MessageId): Task[Unit] = consumer.acknowledgeAsync(messageId) override def acknowledgeCumulativeAsync[T](consumer: api.Consumer[T], messageId: MessageId): Task[Unit] = consumer.acknowledgeCumulativeAsync(messageId) override def negativeAcknowledgeAsync[T](consumer: Consumer[T], messageId: MessageId): Task[Unit] = Task { consumer.negativeAcknowledge(messageId) } override def close(reader: Reader[_]): Task[Unit] = reader.closeAsync() override def flush(producer: api.Producer[_]): Task[Unit] = producer.flushAsync() override def nextAsync[T](reader: Reader[T]): Task[ConsumerMessage[T]] = Task.deferFuture(reader.readNextAsync()).map(ConsumerMessage.fromJava) override def send[T](builder: TypedMessageBuilder[T]): Task[MessageId] = Task.deferFuture(builder.sendAsync()).map(MessageId.fromJava) } object MonixAsyncHandler { implicit def handler: AsyncHandler[Task] = new MonixAsyncHandler }
Example 8
Source File: FutureAsyncHandler.scala From pulsar4s with Apache License 2.0 | 5 votes |
package com.sksamuel.pulsar4s import java.util.concurrent.CompletableFuture import org.apache.pulsar.client.api import org.apache.pulsar.client.api.TypedMessageBuilder import scala.compat.java8.FutureConverters import scala.compat.java8.FutureConverters.CompletionStageOps import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.util.Failure import scala.util.Success import scala.util.Try class FutureAsyncHandler(implicit ec: ExecutionContext) extends AsyncHandler[Future] { implicit class VoidCompletableFutureOps(val completableFuture: CompletableFuture[Void]) { def toScala: Future[Unit] = new CompletionStageOps(completableFuture).toScala.map(_ => ()) } override def failed(e: Throwable): Future[Nothing] = Future.failed(e) override def createProducer[T](builder: api.ProducerBuilder[T]): Future[Producer[T]] = { builder.createAsync().thenApply[Producer[T]](new DefaultProducer(_)).toScala } override def send[T](t: T, producer: api.Producer[T]): Future[MessageId] = { val future = producer.sendAsync(t) FutureConverters.toScala(future).map(MessageId.fromJava) } override def receive[T](consumer: api.Consumer[T]): Future[ConsumerMessage[T]] = { val future = consumer.receiveAsync() FutureConverters.toScala(future).map(ConsumerMessage.fromJava) } override def unsubscribeAsync(consumer: api.Consumer[_]): Future[Unit] = consumer.unsubscribeAsync().toScala override def getLastMessageId[T](consumer: api.Consumer[T]): Future[MessageId] = { val future = consumer.getLastMessageIdAsync() FutureConverters.toScala(future).map(MessageId.fromJava) } override def close(producer: api.Producer[_]): Future[Unit] = producer.closeAsync().toScala override def close(consumer: api.Consumer[_]): Future[Unit] = consumer.closeAsync().toScala override def seekAsync(consumer: api.Consumer[_], messageId: MessageId): Future[Unit] = consumer.seekAsync(messageId).toScala override def seekAsync(reader: api.Reader[_], messageId: MessageId): Future[Unit] = reader.seekAsync(messageId).toScala override def seekAsync(reader: api.Reader[_], timestamp: Long): Future[Unit] = reader.seekAsync(timestamp).toScala override def transform[A, B](f: Future[A])(fn: A => Try[B]): Future[B] = f.flatMap { a => fn(a) match { case Success(b) => Future.successful(b) case Failure(e) => Future.failed(e) } } override def acknowledgeAsync[T](consumer: api.Consumer[T], messageId: MessageId): Future[Unit] = consumer.acknowledgeAsync(messageId).toScala override def negativeAcknowledgeAsync[T](consumer: JConsumer[T], messageId: MessageId): Future[Unit] = Future.successful(consumer.negativeAcknowledge(messageId)) override def acknowledgeCumulativeAsync[T](consumer: api.Consumer[T], messageId: MessageId): Future[Unit] = consumer.acknowledgeCumulativeAsync(messageId).toScala override def close(reader: api.Reader[_]): Future[Unit] = reader.closeAsync().toScala override def flush(producer: api.Producer[_]): Future[Unit] = producer.flushAsync().toScala override def nextAsync[T](reader: api.Reader[T]): Future[ConsumerMessage[T]] = reader.readNextAsync().toScala.map(ConsumerMessage.fromJava) override def send[T](builder: TypedMessageBuilder[T]): Future[MessageId] = builder.sendAsync().toScala.map(MessageId.fromJava) }