From 34ae0447d144f3fb788df11cc5f98163d76c893d Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Mon, 21 Sep 2020 15:02:13 +1200 Subject: [PATCH] Rename Java support Controller to Action --- .../io/cloudstate/javasupport/CloudState.java | 53 +++--- .../Controller.java => action/Action.java} | 6 +- .../ActionContext.java} | 6 +- .../ActionHandler.java} | 30 ++-- .../ActionReply.java} | 20 +-- .../{controller => action}/CallHandler.java | 10 +- .../{controller => action}/Effect.java | 4 +- .../{controller => action}/ForwardReply.java | 4 +- .../MessageEnvelope.java | 4 +- .../{controller => action}/MessageReply.java | 4 +- .../javasupport/CloudStateRunner.scala | 10 +- .../ActionImpl.scala} | 53 +++--- .../AnnotationBasedActionSupport.scala} | 164 +++++++++--------- ...{controllerspec.proto => actionspec.proto} | 4 +- .../ActionServiceSpec.scala} | 50 +++--- .../AnnotationBasedActionSupportSpec.scala} | 62 ++++--- 16 files changed, 237 insertions(+), 247 deletions(-) rename java-support/src/main/java/io/cloudstate/javasupport/{controller/Controller.java => action/Action.java} (90%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller/ControllerContext.java => action/ActionContext.java} (88%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller/ControllerHandler.java => action/ActionHandler.java} (68%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller/ControllerReply.java => action/ActionReply.java} (80%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller => action}/CallHandler.java (90%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller => action}/Effect.java (93%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller => action}/ForwardReply.java (88%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller => action}/MessageEnvelope.java (92%) rename java-support/src/main/java/io/cloudstate/javasupport/{controller => action}/MessageReply.java (89%) rename java-support/src/main/scala/io/cloudstate/javasupport/impl/{controller/ControllerImpl.scala => action/ActionImpl.scala} (88%) rename java-support/src/main/scala/io/cloudstate/javasupport/impl/{controller/AnnotationBasedControllerSupport.scala => action/AnnotationBasedActionSupport.scala} (73%) rename java-support/src/test/proto/cloudstate/javasupport/{controllerspec.proto => actionspec.proto} (97%) rename java-support/src/test/scala/io/cloudstate/javasupport/impl/{controller/ControllerServiceSpec.scala => action/ActionServiceSpec.scala} (77%) rename java-support/src/test/scala/io/cloudstate/javasupport/impl/{controller/AnnotationBasedControllerSupportSpec.scala => action/AnnotationBasedActionSupportSpec.scala} (85%) diff --git a/java-support/src/main/java/io/cloudstate/javasupport/CloudState.java b/java-support/src/main/java/io/cloudstate/javasupport/CloudState.java index bb1f6dd86..edb6a5501 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/CloudState.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/CloudState.java @@ -20,15 +20,15 @@ import akka.stream.Materializer; import com.typesafe.config.Config; import com.google.protobuf.Descriptors; -import io.cloudstate.javasupport.controller.Controller; -import io.cloudstate.javasupport.controller.ControllerHandler; +import io.cloudstate.javasupport.action.Action; +import io.cloudstate.javasupport.action.ActionHandler; import io.cloudstate.javasupport.crdt.CrdtEntity; import io.cloudstate.javasupport.crdt.CrdtEntityFactory; import io.cloudstate.javasupport.eventsourced.EventSourcedEntity; import io.cloudstate.javasupport.eventsourced.EventSourcedEntityFactory; import io.cloudstate.javasupport.impl.AnySupport; -import io.cloudstate.javasupport.impl.controller.AnnotationBasedControllerSupport; -import io.cloudstate.javasupport.impl.controller.ControllerService; +import io.cloudstate.javasupport.impl.action.AnnotationBasedActionSupport; +import io.cloudstate.javasupport.impl.action.ActionService; import io.cloudstate.javasupport.impl.crdt.AnnotationBasedCrdtSupport; import io.cloudstate.javasupport.impl.crdt.CrdtStatefulService; import io.cloudstate.javasupport.impl.eventsourced.AnnotationBasedEventSourcedSupport; @@ -239,26 +239,25 @@ public CloudState registerCrdtEntity( } /** - * Register an annotated Controller service. + * Register an annotated Action service. * - *

The controller class must be annotated with {@link - * io.cloudstate.javasupport.controller.Controller}. + *

The action class must be annotated with {@link Action}. * - * @param controller The controller object. - * @param descriptor The descriptor for the service that this controller implements. + * @param action The action object. + * @param descriptor The descriptor for the service that this action implements. * @param additionalDescriptors Any additional descriptors that should be used to look up protobuf * types when needed. * @return This Cloudstate builder. */ - public CloudState registerController( - Object controller, + public CloudState registerAction( + Object action, Descriptors.ServiceDescriptor descriptor, Descriptors.FileDescriptor... additionalDescriptors) { - Controller controllerAnnotation = controller.getClass().getAnnotation(Controller.class); - if (controllerAnnotation == null) { + Action actionAnnotation = action.getClass().getAnnotation(Action.class); + if (actionAnnotation == null) { throw new IllegalArgumentException( - controller.getClass() + " does not declare an " + Controller.class + " annotation!"); + action.getClass() + " does not declare an " + Action.class + " annotation!"); } final AnySupport anySupport = newAnySupport(additionalDescriptors); @@ -266,9 +265,9 @@ public CloudState registerController( services.put( descriptor.getFullName(), system -> - new ControllerService( - new AnnotationBasedControllerSupport( - controller, anySupport, descriptor, Materializer.createMaterializer(system)), + new ActionService( + new AnnotationBasedActionSupport( + action, anySupport, descriptor, Materializer.createMaterializer(system)), descriptor, anySupport)); @@ -276,31 +275,31 @@ public CloudState registerController( } /** - * Register a Controller handler. + * Register an Action handler. * *

This is a low level API intended for custom (eg, non reflection based) mechanisms for - * implementing the controller. + * implementing the action. * - * @param controller The controller handler. - * @param descriptor The descriptor for the service that this controller implements. + * @param action The action handler. + * @param descriptor The descriptor for the service that this action implements. * @param additionalDescriptors Any additional descriptors that should be used to look up protobuf * types when needed. * @return This Cloudstate builder. */ - public CloudState registerController( - ControllerHandler controller, + public CloudState registerAction( + ActionHandler action, Descriptors.ServiceDescriptor descriptor, Descriptors.FileDescriptor... additionalDescriptors) { - Controller controllerAnnotation = controller.getClass().getAnnotation(Controller.class); - if (controllerAnnotation == null) { + Action actionAnnotation = action.getClass().getAnnotation(Action.class); + if (actionAnnotation == null) { throw new IllegalArgumentException( - controller.getClass() + " does not declare an " + Controller.class + " annotation!"); + action.getClass() + " does not declare an " + Action.class + " annotation!"); } final AnySupport anySupport = newAnySupport(additionalDescriptors); - ControllerService service = new ControllerService(controller, descriptor, anySupport); + ActionService service = new ActionService(action, descriptor, anySupport); services.put(descriptor.getFullName(), system -> service); diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/Controller.java b/java-support/src/main/java/io/cloudstate/javasupport/action/Action.java similarity index 90% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/Controller.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/Action.java index 42f547d31..16f4fd57a 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/Controller.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/Action.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.impl.CloudStateAnnotation; @@ -23,8 +23,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -/** A controller. */ +/** An action. */ @CloudStateAnnotation @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -public @interface Controller {} +public @interface Action {} diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerContext.java b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionContext.java similarity index 88% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerContext.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/ActionContext.java index 89c77db1a..8eec40dd4 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerContext.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionContext.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.Metadata; import io.cloudstate.javasupport.MetadataContext; -/** Context for controller calls. */ -public interface ControllerContext extends MetadataContext { +/** Context for action calls. */ +public interface ActionContext extends MetadataContext { /** * Get the metadata associated with this call. * diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerHandler.java b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionHandler.java similarity index 68% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerHandler.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/ActionHandler.java index 9f96eac2d..75bf9ae04 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerHandler.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionHandler.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import akka.NotUsed; import akka.stream.javadsl.Source; @@ -22,50 +22,50 @@ import java.util.concurrent.CompletionStage; -/** Low level interface for handling for controller calls. */ -public interface ControllerHandler { +/** Low level interface for handling for action calls. */ +public interface ActionHandler { /** * Handle a unary call. * * @param commandName The name of the command this call is for. * @param message The message envelope of the message. - * @param context The controller context. + * @param context The action context. * @return A future of the message to return. */ - CompletionStage> handleUnary( - String commandName, MessageEnvelope message, ControllerContext context); + CompletionStage> handleUnary( + String commandName, MessageEnvelope message, ActionContext context); /** * Handle a streamed out call call. * * @param commandName The name of the command this call is for. * @param message The message envelope of the message. - * @param context The controller context. + * @param context The action context. * @return The stream of messages to return. */ - Source, NotUsed> handleStreamedOut( - String commandName, MessageEnvelope message, ControllerContext context); + Source, NotUsed> handleStreamedOut( + String commandName, MessageEnvelope message, ActionContext context); /** * Handle a streamed in call. * * @param commandName The name of the command this call is for. * @param stream The stream of messages to handle. - * @param context The controller context. + * @param context The action context. * @return A future of the message to return. */ - CompletionStage> handleStreamedIn( - String commandName, Source, NotUsed> stream, ControllerContext context); + CompletionStage> handleStreamedIn( + String commandName, Source, NotUsed> stream, ActionContext context); /** * Handle a full duplex streamed in call. * * @param commandName The name of the command this call is for. * @param stream The stream of messages to handle. - * @param context The controller context. + * @param context The action context. * @return The stream of messages to return. */ - Source, NotUsed> handleStreamed( - String commandName, Source, NotUsed> stream, ControllerContext context); + Source, NotUsed> handleStreamed( + String commandName, Source, NotUsed> stream, ActionContext context); } diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerReply.java b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionReply.java similarity index 80% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerReply.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/ActionReply.java index b37644576..30c06eb76 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/ControllerReply.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/ActionReply.java @@ -14,24 +14,24 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.Metadata; import io.cloudstate.javasupport.ServiceCall; -import io.cloudstate.javasupport.impl.controller.ForwardReplyImpl; -import io.cloudstate.javasupport.impl.controller.MessageReplyImpl; -import io.cloudstate.javasupport.impl.controller.NoReply; +import io.cloudstate.javasupport.impl.action.ForwardReplyImpl; +import io.cloudstate.javasupport.impl.action.MessageReplyImpl; +import io.cloudstate.javasupport.impl.action.NoReply; import java.util.Collection; /** - * A controller reply. + * An action reply. * - *

Controller replies allow returning forwards and attaching effects to messages. + *

Action replies allow returning forwards and attaching effects to messages. * - * @param The type of the message that must be returned by this controller call. + * @param The type of the message that must be returned by this action call. */ -public interface ControllerReply { +public interface ActionReply { /** * The effects attached to this reply. * @@ -45,7 +45,7 @@ public interface ControllerReply { * @param effects The effects to attach. * @return A new reply with the attached effects. */ - ControllerReply withEffects(Effect... effects); + ActionReply withEffects(Effect... effects); /** * Create a message reply. @@ -85,7 +85,7 @@ static ForwardReply forward(ServiceCall serviceCall) { * * @return The reply. */ - static ControllerReply noReply() { + static ActionReply noReply() { return NoReply.apply(); } } diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/CallHandler.java b/java-support/src/main/java/io/cloudstate/javasupport/action/CallHandler.java similarity index 90% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/CallHandler.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/CallHandler.java index fd9463731..13d86339f 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/CallHandler.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/CallHandler.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.impl.CloudStateAnnotation; @@ -24,9 +24,9 @@ import java.lang.annotation.Target; /** - * A controller call handler. + * An action call handler. * - *

This annotation should be placed on methods that handle Controller service calls. + *

This annotation should be placed on methods that handle Action service calls. * *

The types of the input and output parameters for these methods depend on whether the call is a * unary or streamed call. @@ -41,12 +41,12 @@ * *

Calls with a unary out argument may either return synchronously, or return a {@link * java.util.concurrent.CompletionStage}. The argument return type may either be the raw protobuf - * output type of the call, or wrapped in {@link MessageEnvelope} or {@link ControllerReply}. + * output type of the call, or wrapped in {@link MessageEnvelope} or {@link ActionReply}. * *

Calls with a streamed out argument may either return a {@link akka.stream.javadsl.Source}, * {@link org.reactivestreams.Publisher} or a {@link java.util.concurrent.Flow.Publisher}. The * element type of these may either be the raw protobuf output type of the call, or wrapped in - * {@link MessageEnvelope} or {@link ControllerReply}. + * {@link MessageEnvelope} or {@link ActionReply}. */ @CloudStateAnnotation @Target(ElementType.METHOD) diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/Effect.java b/java-support/src/main/java/io/cloudstate/javasupport/action/Effect.java similarity index 93% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/Effect.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/Effect.java index 9f0a2befb..ee00b9720 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/Effect.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/Effect.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.ServiceCall; -import io.cloudstate.javasupport.impl.controller.EffectImpl; +import io.cloudstate.javasupport.impl.action.EffectImpl; /** An effect. */ public interface Effect { diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/ForwardReply.java b/java-support/src/main/java/io/cloudstate/javasupport/action/ForwardReply.java similarity index 88% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/ForwardReply.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/ForwardReply.java index 903e9ee2b..2aea4deca 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/ForwardReply.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/ForwardReply.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.ServiceCall; /** A forward reply. */ -public interface ForwardReply extends ControllerReply { +public interface ForwardReply extends ActionReply { /** * The service call that is being forwarded to. diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/MessageEnvelope.java b/java-support/src/main/java/io/cloudstate/javasupport/action/MessageEnvelope.java similarity index 92% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/MessageEnvelope.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/MessageEnvelope.java index c3506de45..7229f10ac 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/MessageEnvelope.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/MessageEnvelope.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.Metadata; -import io.cloudstate.javasupport.impl.controller.MessageEnvelopeImpl; +import io.cloudstate.javasupport.impl.action.MessageEnvelopeImpl; /** A message envelope. */ public interface MessageEnvelope { diff --git a/java-support/src/main/java/io/cloudstate/javasupport/controller/MessageReply.java b/java-support/src/main/java/io/cloudstate/javasupport/action/MessageReply.java similarity index 89% rename from java-support/src/main/java/io/cloudstate/javasupport/controller/MessageReply.java rename to java-support/src/main/java/io/cloudstate/javasupport/action/MessageReply.java index b22655410..04a23163d 100644 --- a/java-support/src/main/java/io/cloudstate/javasupport/controller/MessageReply.java +++ b/java-support/src/main/java/io/cloudstate/javasupport/action/MessageReply.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package io.cloudstate.javasupport.controller; +package io.cloudstate.javasupport.action; import io.cloudstate.javasupport.Metadata; /** A message reply. */ -public interface MessageReply extends ControllerReply { +public interface MessageReply extends ActionReply { /** * The payload of the message reply. diff --git a/java-support/src/main/scala/io/cloudstate/javasupport/CloudStateRunner.scala b/java-support/src/main/scala/io/cloudstate/javasupport/CloudStateRunner.scala index d3a343dee..3ceb3fb2d 100644 --- a/java-support/src/main/scala/io/cloudstate/javasupport/CloudStateRunner.scala +++ b/java-support/src/main/scala/io/cloudstate/javasupport/CloudStateRunner.scala @@ -25,7 +25,7 @@ import akka.http.scaladsl._ import akka.http.scaladsl.model._ import akka.stream.{ActorMaterializer, Materializer} import com.google.protobuf.Descriptors -import io.cloudstate.javasupport.impl.controller.{ControllerService, StatelessFunctionImpl} +import io.cloudstate.javasupport.impl.action.{ActionService, StatelessFunctionImpl} import io.cloudstate.javasupport.impl.eventsourced.{EventSourcedImpl, EventSourcedStatefulService} import io.cloudstate.javasupport.impl.{EntityDiscoveryImpl, ResolvedServiceCallFactory, ResolvedServiceMethod} import io.cloudstate.javasupport.impl.crdt.{CrdtImpl, CrdtStatefulService} @@ -109,10 +109,10 @@ final class CloudStateRunner private[this] ( val crdtImpl = new CrdtImpl(system, crdtServices, rootContext) route orElse CrdtHandler.partial(crdtImpl) - case (route, (serviceClass, controllerServices: Map[String, ControllerService] @unchecked)) - if serviceClass == classOf[ControllerService] => - val controllerImpl = new StatelessFunctionImpl(system, controllerServices, rootContext) - route orElse StatelessFunctionHandler.partial(controllerImpl) + case (route, (serviceClass, actionServices: Map[String, ActionService] @unchecked)) + if serviceClass == classOf[ActionService] => + val actionImpl = new StatelessFunctionImpl(system, actionServices, rootContext) + route orElse StatelessFunctionHandler.partial(actionImpl) case (_, (serviceClass, _)) => sys.error(s"Unknown StatefulService: $serviceClass") diff --git a/java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/ControllerImpl.scala b/java-support/src/main/scala/io/cloudstate/javasupport/impl/action/ActionImpl.scala similarity index 88% rename from java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/ControllerImpl.scala rename to java-support/src/main/scala/io/cloudstate/javasupport/impl/action/ActionImpl.scala index 25275029e..3e0b51465 100644 --- a/java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/ControllerImpl.scala +++ b/java-support/src/main/scala/io/cloudstate/javasupport/impl/action/ActionImpl.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.impl.controller +package io.cloudstate.javasupport.impl.action import java.util @@ -23,8 +23,7 @@ import akka.actor.ActorSystem import akka.stream.scaladsl.{Sink, Source} import com.google.protobuf.any.{Any => ScalaPbAny} import com.google.protobuf.{Descriptors, Any => JavaPbAny} -import io.cloudstate.javasupport.CloudStateRunner.Configuration -import io.cloudstate.javasupport.controller._ +import io.cloudstate.javasupport.action._ import io.cloudstate.javasupport.impl._ import io.cloudstate.javasupport.{Context, Metadata, Service, ServiceCall, ServiceCallFactory} import io.cloudstate.protocol.entity.{Failure, Forward, Reply, SideEffect, Metadata => PbMetadata} @@ -34,13 +33,13 @@ import scala.concurrent.Future import scala.compat.java8.FutureConverters._ import scala.collection.JavaConverters._ -final class ControllerService(val controllerHandler: ControllerHandler, - override val descriptor: Descriptors.ServiceDescriptor, - val anySupport: AnySupport) +final class ActionService(val actionHandler: ActionHandler, + override val descriptor: Descriptors.ServiceDescriptor, + val anySupport: AnySupport) extends Service { override def resolvedMethods: Option[Map[String, ResolvedServiceMethod[_, _]]] = - controllerHandler match { + actionHandler match { case resolved: ResolvedEntityFactory => Some(resolved.resolvedMethods) case _ => None } @@ -48,7 +47,7 @@ final class ControllerService(val controllerHandler: ControllerHandler, override final val entityType = StatelessFunction.name } -final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, ControllerService], rootContext: Context) +final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, ActionService], rootContext: Context) extends StatelessFunction { import _system.dispatcher @@ -65,7 +64,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co case other => throw new RuntimeException(s"Unknown metadata implementation: ${other.getClass}, cannot send") } - private def controllerMessageToReply(msg: ControllerReply[JavaPbAny]) = { + private def actionMessageToReply(msg: ActionReply[JavaPbAny]) = { val response = msg match { case message: MessageReply[JavaPbAny] => FunctionReply.Response.Reply( @@ -88,7 +87,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co } val effects = msg match { - case impl: ControllerReplyImpl[_] => + case impl: ActionReplyImpl[_] => impl._effects case other => other.effects().asScala.toList @@ -116,10 +115,10 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co services.get(in.serviceName) match { case Some(service) => val context = createContext(in) - service.controllerHandler + service.actionHandler .handleUnary(in.name, MessageEnvelope.of(toJavaPbAny(in.payload), context.metadata()), context) .toScala - .map(controllerMessageToReply) + .map(actionMessageToReply) case None => Future.successful( FunctionReply(FunctionReply.Response.Failure(Failure(0, "Unknown service: " + in.serviceName))) @@ -158,7 +157,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co case (Seq(call), messages) => services.get(call.serviceName) match { case Some(service) => - service.controllerHandler + service.actionHandler .handleStreamedIn( call.name, messages.map { message => @@ -168,7 +167,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co createContext(call) ) .toScala - .map(controllerMessageToReply) + .map(actionMessageToReply) case None => Future.successful( FunctionReply(FunctionReply.Response.Failure(Failure(0, "Unknown service: " + call.serviceName))) @@ -189,10 +188,10 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co services.get(in.serviceName) match { case Some(service) => val context = createContext(in) - service.controllerHandler + service.actionHandler .handleStreamedOut(in.name, MessageEnvelope.of(toJavaPbAny(in.payload), context.metadata()), context) .asScala - .map(controllerMessageToReply) + .map(actionMessageToReply) case None => Source.single(FunctionReply(FunctionReply.Response.Failure(Failure(0, "Unknown service: " + in.serviceName)))) } @@ -231,7 +230,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co case (Seq(call), messages) => services.get(call.serviceName) match { case Some(service) => - service.controllerHandler + service.actionHandler .handleStreamed( call.name, messages.map { message => @@ -241,7 +240,7 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co createContext(call) ) .asScala - .map(controllerMessageToReply) + .map(actionMessageToReply) case None => Source.single( FunctionReply(FunctionReply.Response.Failure(Failure(0, "Unknown service: " + call.serviceName))) @@ -249,38 +248,38 @@ final class StatelessFunctionImpl(_system: ActorSystem, services: Map[String, Co } } - private def createContext(in: FunctionCommand): ControllerContext = { + private def createContext(in: FunctionCommand): ActionContext = { val metadata = new MetadataImpl(in.metadata.map(_.entries.toVector).getOrElse(Nil)) - new ControllerContextImpl(metadata) + new ActionContextImpl(metadata) } - class ControllerContextImpl(override val metadata: Metadata) extends ControllerContext { + class ActionContextImpl(override val metadata: Metadata) extends ActionContext { override val serviceCallFactory: ServiceCallFactory = rootContext.serviceCallFactory() } } -trait ControllerReplyImpl[T] extends ControllerReply[T] { +trait ActionReplyImpl[T] extends ActionReply[T] { def _effects: List[Effect] override def effects(): util.Collection[Effect] = _effects.asJava } case class MessageEnvelopeImpl[T](payload: T, metadata: Metadata) extends MessageEnvelope[T] case class MessageReplyImpl[T](payload: T, metadata: Metadata, _effects: List[Effect]) extends MessageReply[T] - with ControllerReplyImpl[T] { + with ActionReplyImpl[T] { def this(payload: T, metadata: Metadata) = this(payload, metadata, Nil) override def withEffects(effect: Effect*): MessageReply[T] = MessageReplyImpl(payload, metadata, _effects ++ effect) } case class ForwardReplyImpl[T](serviceCall: ServiceCall, _effects: List[Effect]) extends ForwardReply[T] - with ControllerReplyImpl[T] { + with ActionReplyImpl[T] { def this(serviceCall: ServiceCall) = this(serviceCall, Nil) override def withEffects(effect: Effect*): ForwardReply[T] = ForwardReplyImpl(serviceCall, _effects ++ effect) } -case class NoReply[T](_effects: List[Effect]) extends ControllerReplyImpl[T] { - override def withEffects(effect: Effect*): ControllerReply[T] = NoReply(_effects ++ effect) +case class NoReply[T](_effects: List[Effect]) extends ActionReplyImpl[T] { + override def withEffects(effect: Effect*): ActionReply[T] = NoReply(_effects ++ effect) } object NoReply { private val instance = NoReply[Any](Nil) - def apply[T]: ControllerReply[T] = instance.asInstanceOf[NoReply[T]] + def apply[T]: ActionReply[T] = instance.asInstanceOf[NoReply[T]] } case class EffectImpl(serviceCall: ServiceCall, synchronous: Boolean) extends Effect diff --git a/java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupport.scala b/java-support/src/main/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupport.scala similarity index 73% rename from java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupport.scala rename to java-support/src/main/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupport.scala index 82b527a75..cad8b6352 100644 --- a/java-support/src/main/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupport.scala +++ b/java-support/src/main/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupport.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.impl.controller +package io.cloudstate.javasupport.impl.action import java.lang.reflect.{InvocationTargetException, Method, Type} import java.util.concurrent.{CompletableFuture, CompletionStage} @@ -24,7 +24,7 @@ import akka.stream.{javadsl, Materializer} import akka.stream.javadsl.{AsPublisher, Source} import akka.stream.scaladsl.{JavaFlowSupport, Sink} import com.google.protobuf.{Descriptors, Any => JavaPbAny} -import io.cloudstate.javasupport.controller._ +import io.cloudstate.javasupport.action._ import io.cloudstate.javasupport.impl.ReflectionHelper.{InvocationContext, ParameterHandler} import io.cloudstate.javasupport.impl.{ AnySupport, @@ -36,70 +36,70 @@ import io.cloudstate.javasupport.impl.{ import io.cloudstate.javasupport.Metadata /** - * Annotation based implementation of the [[ControllerHandler]]. + * Annotation based implementation of the [[ActionHandler]]. */ -private[impl] class AnnotationBasedControllerSupport( - controller: AnyRef, +private[impl] class AnnotationBasedActionSupport( + action: AnyRef, anySupport: AnySupport, override val resolvedMethods: Map[String, ResolvedServiceMethod[_, _]] )(implicit mat: Materializer) - extends ControllerHandler + extends ActionHandler with ResolvedEntityFactory { - def this(controller: AnyRef, anySupport: AnySupport, serviceDescriptor: Descriptors.ServiceDescriptor)( + def this(action: AnyRef, anySupport: AnySupport, serviceDescriptor: Descriptors.ServiceDescriptor)( implicit mat: Materializer ) = - this(controller, anySupport, anySupport.resolveServiceDescriptor(serviceDescriptor)) + this(action, anySupport, anySupport.resolveServiceDescriptor(serviceDescriptor)) - private val behavior = ControllerReflection(controller.getClass, resolvedMethods) + private val behavior = ActionReflection(action.getClass, resolvedMethods) override def handleUnary(commandName: String, message: MessageEnvelope[JavaPbAny], - context: ControllerContext): CompletionStage[ControllerReply[JavaPbAny]] = unwrap { + context: ActionContext): CompletionStage[ActionReply[JavaPbAny]] = unwrap { behavior.unaryHandlers.get(commandName) match { case Some(handler) => - handler.invoke(controller, message, context) + handler.invoke(action, message, context) case None => throw new RuntimeException( - s"No call handler found for call $commandName on ${controller.getClass.getName}" + s"No call handler found for call $commandName on ${action.getClass.getName}" ) } } override def handleStreamedOut(commandName: String, message: MessageEnvelope[JavaPbAny], - context: ControllerContext): Source[ControllerReply[JavaPbAny], NotUsed] = unwrap { + context: ActionContext): Source[ActionReply[JavaPbAny], NotUsed] = unwrap { behavior.serverStreamedHandlers.get(commandName) match { case Some(handler) => - handler.invoke(controller, message, context) + handler.invoke(action, message, context) case None => throw new RuntimeException( - s"No call handler found for call $commandName on ${controller.getClass.getName}" + s"No call handler found for call $commandName on ${action.getClass.getName}" ) } } override def handleStreamedIn(commandName: String, stream: Source[MessageEnvelope[JavaPbAny], NotUsed], - context: ControllerContext): CompletionStage[ControllerReply[JavaPbAny]] = + context: ActionContext): CompletionStage[ActionReply[JavaPbAny]] = behavior.clientStreamedHandlers.get(commandName) match { case Some(handler) => - handler.invoke(controller, stream, context) + handler.invoke(action, stream, context) case None => throw new RuntimeException( - s"No call handler found for call $commandName on ${controller.getClass.getName}" + s"No call handler found for call $commandName on ${action.getClass.getName}" ) } override def handleStreamed(commandName: String, stream: Source[MessageEnvelope[JavaPbAny], NotUsed], - context: ControllerContext): Source[ControllerReply[JavaPbAny], NotUsed] = + context: ActionContext): Source[ActionReply[JavaPbAny], NotUsed] = behavior.streamedHandlers.get(commandName) match { case Some(handler) => - handler.invoke(controller, stream, context) + handler.invoke(action, stream, context) case None => throw new RuntimeException( - s"No call handler found for call $commandName on ${controller.getClass.getName}" + s"No call handler found for call $commandName on ${action.getClass.getName}" ) } @@ -112,17 +112,17 @@ private[impl] class AnnotationBasedControllerSupport( } } -private class ControllerReflection( +private class ActionReflection( val unaryHandlers: Map[String, UnaryCallInvoker], val serverStreamedHandlers: Map[String, ServerStreamedCallInvoker], val clientStreamedHandlers: Map[String, ClientStreamedCallInvoker], val streamedHandlers: Map[String, StreamedCallInvoker] ) -private object ControllerReflection { +private object ActionReflection { def apply(behaviorClass: Class[_], serviceMethods: Map[String, ResolvedServiceMethod[_, _]])( implicit mat: Materializer - ): ControllerReflection = { + ): ActionReflection = { val allMethods = ReflectionHelper.getAllDeclaredMethods(behaviorClass) @@ -179,49 +179,49 @@ private object ControllerReflection { ReflectionHelper.validateNoBadMethods( allMethods, - classOf[Controller], + classOf[Action], Set(classOf[CallHandler]) ) - new ControllerReflection(unaryCallHandlers, - serverStreamedCallHandlers, - clientStreamedCallHandlers, - streamedCallHandlers) + new ActionReflection(unaryCallHandlers, + serverStreamedCallHandlers, + clientStreamedCallHandlers, + streamedCallHandlers) } def getOutputParameterMapper[T](method: String, resolvedType: ResolvedType[T], - returnType: Type): Any => ControllerReply[JavaPbAny] = { + returnType: Type): Any => ActionReply[JavaPbAny] = { val (payloadClass, mapper) = ReflectionHelper.getRawType(returnType) match { case envelope if envelope == classOf[MessageEnvelope[_]] => val payload = ReflectionHelper.getFirstParameter(returnType) (payload, { any: Any => val envelope = any.asInstanceOf[MessageEnvelope[T]] - ControllerReply.message(JavaPbAny - .newBuilder() - .setValue(resolvedType.toByteString(envelope.payload)) - .setTypeUrl(resolvedType.typeUrl) - .build(), - envelope.metadata) + ActionReply.message(JavaPbAny + .newBuilder() + .setValue(resolvedType.toByteString(envelope.payload)) + .setTypeUrl(resolvedType.typeUrl) + .build(), + envelope.metadata) }) - case message if message == classOf[ControllerReply[_]] => + case message if message == classOf[ActionReply[_]] => val payload = ReflectionHelper.getFirstParameter(returnType) (payload, { any: Any => - val message = any.asInstanceOf[ControllerReply[T]] + val message = any.asInstanceOf[ActionReply[T]] message match { case envelope: MessageReply[T] => - ControllerReply.message(JavaPbAny - .newBuilder() - .setValue(resolvedType.toByteString(envelope.payload)) - .setTypeUrl(resolvedType.typeUrl) - .build(), - envelope.metadata) - case other => other.asInstanceOf[ControllerReply[JavaPbAny]] + ActionReply.message(JavaPbAny + .newBuilder() + .setValue(resolvedType.toByteString(envelope.payload)) + .setTypeUrl(resolvedType.typeUrl) + .build(), + envelope.metadata) + case other => other.asInstanceOf[ActionReply[JavaPbAny]] } }) case payload => (payload, { any: Any => - ControllerReply.message( + ActionReply.message( JavaPbAny .newBuilder() .setValue(resolvedType.toByteString(any.asInstanceOf[T])) @@ -267,15 +267,15 @@ private object ControllerReflection { } private class PayloadParameterHandler(mapper: MessageEnvelope[JavaPbAny] => AnyRef) - extends ParameterHandler[MessageEnvelope[JavaPbAny], ControllerContext] { - override def apply(ctx: InvocationContext[MessageEnvelope[JavaPbAny], ControllerContext]): AnyRef = + extends ParameterHandler[MessageEnvelope[JavaPbAny], ActionContext] { + override def apply(ctx: InvocationContext[MessageEnvelope[JavaPbAny], ActionContext]): AnyRef = mapper(ctx.mainArgument) } private class StreamedPayloadParameterHandler(mapper: javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed] => AnyRef) - extends ParameterHandler[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ControllerContext] { + extends ParameterHandler[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ActionContext] { override def apply( - ctx: InvocationContext[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ControllerContext] + ctx: InvocationContext[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ActionContext] ): AnyRef = mapper(ctx.mainArgument) } @@ -284,11 +284,11 @@ private trait UnaryInSupport { protected val method: Method protected val serviceMethod: ResolvedServiceMethod[_, _] - protected val parameters: Array[ParameterHandler[MessageEnvelope[JavaPbAny], ControllerContext]] = - ReflectionHelper.getParameterHandlers[MessageEnvelope[JavaPbAny], ControllerContext](method) { + protected val parameters: Array[ParameterHandler[MessageEnvelope[JavaPbAny], ActionContext]] = + ReflectionHelper.getParameterHandlers[MessageEnvelope[JavaPbAny], ActionContext](method) { case payload => new PayloadParameterHandler( - ControllerReflection + ActionReflection .getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, payload.genericParameterType) ) } @@ -298,17 +298,17 @@ private trait UnaryOutSupport { protected val method: Method protected val serviceMethod: ResolvedServiceMethod[_, _] - protected val outputMapper: Any => CompletionStage[ControllerReply[JavaPbAny]] = method.getReturnType match { + protected val outputMapper: Any => CompletionStage[ActionReply[JavaPbAny]] = method.getReturnType match { case cstage if cstage == classOf[CompletionStage[_]] => val cstageType = ReflectionHelper.getGenericFirstParameter(method.getGenericReturnType) val mapper = - ControllerReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, cstageType) + ActionReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, cstageType) any: Any => any.asInstanceOf[CompletionStage[Any]].thenApply(mapper.apply) case _ => - val mapper = ControllerReflection.getOutputParameterMapper(serviceMethod.name, - serviceMethod.outputType, - method.getGenericReturnType) + val mapper = ActionReflection.getOutputParameterMapper(serviceMethod.name, + serviceMethod.outputType, + method.getGenericReturnType) any: Any => CompletableFuture.completedFuture(mapper(any)) } @@ -320,21 +320,21 @@ private trait StreamedInSupport { implicit protected val materializer: Materializer protected val parameters - : Array[ParameterHandler[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ControllerContext]] = - ReflectionHelper.getParameterHandlers[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ControllerContext]( + : Array[ParameterHandler[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ActionContext]] = + ReflectionHelper.getParameterHandlers[javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], ActionContext]( method ) { case source if source.parameterType == classOf[javadsl.Source[_, _]] => val sourceType = ReflectionHelper.getGenericFirstParameter(source.genericParameterType) val mapper = - ControllerReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, sourceType) + ActionReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, sourceType) new StreamedPayloadParameterHandler(source => source.map(mapper.apply)) case rsPublisher if rsPublisher.parameterType == classOf[org.reactivestreams.Publisher[_]] => val publisherType = ReflectionHelper.getGenericFirstParameter(rsPublisher.genericParameterType) val mapper = - ControllerReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, publisherType) + ActionReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, publisherType) new StreamedPayloadParameterHandler( source => @@ -346,7 +346,7 @@ private trait StreamedInSupport { case jdkPublisher if jdkPublisher.parameterType == classOf[java.util.concurrent.Flow.Publisher[_]] => val publisherType = ReflectionHelper.getGenericFirstParameter(jdkPublisher.genericParameterType) val mapper = - ControllerReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, publisherType) + ActionReflection.getInputParameterMapper(serviceMethod.name, serviceMethod.inputType, publisherType) new StreamedPayloadParameterHandler( source => @@ -374,11 +374,11 @@ private trait StreamedOutSupport { protected val method: Method protected val serviceMethod: ResolvedServiceMethod[_, _] - protected val outputMapper: Any => javadsl.Source[ControllerReply[JavaPbAny], NotUsed] = method.getReturnType match { + protected val outputMapper: Any => javadsl.Source[ActionReply[JavaPbAny], NotUsed] = method.getReturnType match { case source if source == classOf[javadsl.Source[_, _]] => val sourceType = ReflectionHelper.getGenericFirstParameter(method.getGenericReturnType) - val mapper: Any => ControllerReply[JavaPbAny] = - ControllerReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) + val mapper: Any => ActionReply[JavaPbAny] = + ActionReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) any: Any => any @@ -388,8 +388,8 @@ private trait StreamedOutSupport { case rsPublisher if rsPublisher == classOf[org.reactivestreams.Publisher[_]] => val sourceType = ReflectionHelper.getGenericFirstParameter(method.getGenericReturnType) - val mapper: Any => ControllerReply[JavaPbAny] = - ControllerReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) + val mapper: Any => ActionReply[JavaPbAny] = + ActionReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) any: Any => { javadsl.Source @@ -399,8 +399,8 @@ private trait StreamedOutSupport { case jdkPublisher if jdkPublisher == classOf[java.util.concurrent.Flow.Publisher[_]] => val sourceType = ReflectionHelper.getGenericFirstParameter(method.getGenericReturnType) - val mapper: Any => ControllerReply[JavaPbAny] = - ControllerReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) + val mapper: Any => ActionReply[JavaPbAny] = + ActionReflection.getOutputParameterMapper(serviceMethod.name, serviceMethod.outputType, sourceType) any: Any => { JavaFlowSupport.Source @@ -420,11 +420,11 @@ private class UnaryCallInvoker(protected val method: Method, protected val servi extends UnaryInSupport with UnaryOutSupport { - def invoke(controller: AnyRef, + def invoke(action: AnyRef, message: MessageEnvelope[JavaPbAny], - context: ControllerContext): CompletionStage[ControllerReply[JavaPbAny]] = { + context: ActionContext): CompletionStage[ActionReply[JavaPbAny]] = { val ctx = InvocationContext(message, context) - val result = method.invoke(controller, parameters.map(_.apply(ctx)): _*) + val result = method.invoke(action, parameters.map(_.apply(ctx)): _*) outputMapper(result) } @@ -435,11 +435,11 @@ private class ServerStreamedCallInvoker(protected val method: Method, extends UnaryInSupport with StreamedOutSupport { - def invoke(controller: AnyRef, + def invoke(action: AnyRef, message: MessageEnvelope[JavaPbAny], - context: ControllerContext): javadsl.Source[ControllerReply[JavaPbAny], NotUsed] = { + context: ActionContext): javadsl.Source[ActionReply[JavaPbAny], NotUsed] = { val ctx = InvocationContext(message, context) - val result = method.invoke(controller, parameters.map(_.apply(ctx)): _*) + val result = method.invoke(action, parameters.map(_.apply(ctx)): _*) outputMapper(result) } @@ -451,11 +451,11 @@ private class ClientStreamedCallInvoker(protected val method: Method, extends UnaryOutSupport with StreamedInSupport { - def invoke(controller: AnyRef, + def invoke(action: AnyRef, stream: javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], - context: ControllerContext): CompletionStage[ControllerReply[JavaPbAny]] = { + context: ActionContext): CompletionStage[ActionReply[JavaPbAny]] = { val ctx = InvocationContext(stream, context) - val result = method.invoke(controller, parameters.map(_.apply(ctx)): _*) + val result = method.invoke(action, parameters.map(_.apply(ctx)): _*) outputMapper(result) } @@ -467,11 +467,11 @@ private class StreamedCallInvoker(protected val method: Method, extends StreamedOutSupport with StreamedInSupport { - def invoke(controller: AnyRef, + def invoke(action: AnyRef, stream: javadsl.Source[MessageEnvelope[JavaPbAny], NotUsed], - context: ControllerContext): javadsl.Source[ControllerReply[JavaPbAny], NotUsed] = { + context: ActionContext): javadsl.Source[ActionReply[JavaPbAny], NotUsed] = { val ctx = InvocationContext(stream, context) - val result = method.invoke(controller, parameters.map(_.apply(ctx)): _*) + val result = method.invoke(action, parameters.map(_.apply(ctx)): _*) outputMapper(result) } diff --git a/java-support/src/test/proto/cloudstate/javasupport/controllerspec.proto b/java-support/src/test/proto/cloudstate/javasupport/actionspec.proto similarity index 97% rename from java-support/src/test/proto/cloudstate/javasupport/controllerspec.proto rename to java-support/src/test/proto/cloudstate/javasupport/actionspec.proto index 11ba1b448..82ddb9c6e 100644 --- a/java-support/src/test/proto/cloudstate/javasupport/controllerspec.proto +++ b/java-support/src/test/proto/cloudstate/javasupport/actionspec.proto @@ -24,9 +24,9 @@ message Out { string field = 1; } -service ControllerSpec { +service ActionSpec { rpc Unary(In) returns (Out); rpc StreamedIn(stream In) returns (Out); rpc StreamedOut(In) returns (stream Out); rpc Streamed(stream In) returns (stream Out); -} \ No newline at end of file +} diff --git a/java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/ControllerServiceSpec.scala b/java-support/src/test/scala/io/cloudstate/javasupport/impl/action/ActionServiceSpec.scala similarity index 77% rename from java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/ControllerServiceSpec.scala rename to java-support/src/test/scala/io/cloudstate/javasupport/impl/action/ActionServiceSpec.scala index 8358a7aac..f1cc7c6ea 100644 --- a/java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/ControllerServiceSpec.scala +++ b/java-support/src/test/scala/io/cloudstate/javasupport/impl/action/ActionServiceSpec.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.impl.controller +package io.cloudstate.javasupport.impl.action import java.util.concurrent.{CompletableFuture, CompletionStage} @@ -22,18 +22,12 @@ import akka.NotUsed import akka.actor.ActorSystem import akka.stream.javadsl.Source import akka.stream.scaladsl.Sink -import cloudstate.javasupport.Controllerspec -import cloudstate.javasupport.Controllerspec.{In, Out} +import cloudstate.javasupport.Actionspec +import cloudstate.javasupport.Actionspec.{In, Out} import com.google.protobuf import com.google.protobuf.any.{Any => ScalaPbAny} import io.cloudstate.javasupport.{Context, ServiceCallFactory} -import io.cloudstate.javasupport.controller.{ - ControllerContext, - ControllerHandler, - ControllerReply, - Effect, - MessageEnvelope -} +import io.cloudstate.javasupport.action.{ActionContext, ActionHandler, ActionReply, Effect, MessageEnvelope} import io.cloudstate.javasupport.impl.{AnySupport, ResolvedServiceCallFactory} import io.cloudstate.protocol.entity.{Forward, Reply} import io.cloudstate.protocol.function.{FunctionCommand, FunctionReply, StatelessFunction} @@ -43,14 +37,14 @@ import scala.concurrent.Await import scala.concurrent.duration._ import scala.compat.java8.FutureConverters._ -class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAll with Inside with OptionValues { +class ActionServiceSpec extends WordSpec with Matchers with BeforeAndAfterAll with Inside with OptionValues { - private implicit val system = ActorSystem("ControllerServiceSpec") + private implicit val system = ActorSystem("ActionServiceSpec") import system.dispatcher private val serviceDescriptor = - cloudstate.javasupport.Controllerspec.getDescriptor.findServiceByName("ControllerSpec") + cloudstate.javasupport.Actionspec.getDescriptor.findServiceByName("ActionSpec") private val serviceName = serviceDescriptor.getFullName override protected def afterAll(): Unit = { @@ -58,11 +52,11 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl system.terminate() } - def create(handler: ControllerHandler): StatelessFunction = { - val service = new ControllerService( + def create(handler: ActionHandler): StatelessFunction = { + val service = new ActionService( handler, serviceDescriptor, - new AnySupport(Array(Controllerspec.getDescriptor), this.getClass.getClassLoader) + new AnySupport(Array(Actionspec.getDescriptor), this.getClass.getClassLoader) ) val services = Map(serviceName -> service) @@ -73,12 +67,12 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl }) } - "The controller service" should { + "The action service" should { "invoke unary commands" in { val service = create(new AbstractHandler { override def handleUnary(commandName: String, message: MessageEnvelope[protobuf.Any], - context: ControllerContext): CompletionStage[ControllerReply[protobuf.Any]] = + context: ActionContext): CompletionStage[ActionReply[protobuf.Any]] = CompletableFuture.completedFuture(createOutReply("out: " + extractInField(message))) }) @@ -97,7 +91,7 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl val service = create(new AbstractHandler { override def handleStreamedIn(commandName: String, stream: Source[MessageEnvelope[protobuf.Any], NotUsed], - context: ControllerContext): CompletionStage[ControllerReply[protobuf.Any]] = + context: ActionContext): CompletionStage[ActionReply[protobuf.Any]] = stream.asScala .map(extractInField) .runWith(Sink.seq) @@ -126,7 +120,7 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl val service = create(new AbstractHandler { override def handleStreamedOut(commandName: String, message: MessageEnvelope[protobuf.Any], - context: ControllerContext): Source[ControllerReply[protobuf.Any], NotUsed] = { + context: ActionContext): Source[ActionReply[protobuf.Any], NotUsed] = { val in = extractInField(message) akka.stream.scaladsl.Source(1 to 3).map(idx => createOutReply(s"out $idx: $in")).asJava } @@ -152,7 +146,7 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl val service = create(new AbstractHandler { override def handleStreamed(commandName: String, stream: Source[MessageEnvelope[protobuf.Any], NotUsed], - context: ControllerContext): Source[ControllerReply[protobuf.Any], NotUsed] = + context: ActionContext): Source[ActionReply[protobuf.Any], NotUsed] = stream.asScala .map(extractInField) .map(in => createOutReply(s"out: $in")) @@ -186,8 +180,8 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl private def createOutAny(field: String) = protobuf.Any.pack(Out.newBuilder().setField(field).build()) - private def createOutReply(field: String): ControllerReply[protobuf.Any] = - ControllerReply.message(createOutAny(field)) + private def createOutReply(field: String): ActionReply[protobuf.Any] = + ActionReply.message(createOutAny(field)) private def extractInField(message: MessageEnvelope[protobuf.Any]) = message.payload().unpack(classOf[In]).getField @@ -198,22 +192,22 @@ class ControllerServiceSpec extends WordSpec with Matchers with BeforeAndAfterAl private def extractOutField(payload: Option[ScalaPbAny]) = ScalaPbAny.toJavaProto(payload.value).unpack(classOf[Out]).getField - private trait AbstractHandler extends ControllerHandler { + private trait AbstractHandler extends ActionHandler { override def handleUnary(commandName: String, message: MessageEnvelope[protobuf.Any], - context: ControllerContext): CompletionStage[ControllerReply[protobuf.Any]] = ??? + context: ActionContext): CompletionStage[ActionReply[protobuf.Any]] = ??? override def handleStreamedOut(commandName: String, message: MessageEnvelope[protobuf.Any], - context: ControllerContext): Source[ControllerReply[protobuf.Any], NotUsed] = ??? + context: ActionContext): Source[ActionReply[protobuf.Any], NotUsed] = ??? override def handleStreamedIn(commandName: String, stream: Source[MessageEnvelope[protobuf.Any], NotUsed], - context: ControllerContext): CompletionStage[ControllerReply[protobuf.Any]] = ??? + context: ActionContext): CompletionStage[ActionReply[protobuf.Any]] = ??? override def handleStreamed(commandName: String, stream: Source[MessageEnvelope[protobuf.Any], NotUsed], - context: ControllerContext): Source[ControllerReply[protobuf.Any], NotUsed] = ??? + context: ActionContext): Source[ActionReply[protobuf.Any], NotUsed] = ??? } } diff --git a/java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupportSpec.scala b/java-support/src/test/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupportSpec.scala similarity index 85% rename from java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupportSpec.scala rename to java-support/src/test/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupportSpec.scala index 6199ee2d5..37f0886b6 100644 --- a/java-support/src/test/scala/io/cloudstate/javasupport/impl/controller/AnnotationBasedControllerSupportSpec.scala +++ b/java-support/src/test/scala/io/cloudstate/javasupport/impl/action/AnnotationBasedActionSupportSpec.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.cloudstate.javasupport.impl.controller +package io.cloudstate.javasupport.impl.action import java.util.Optional import java.util.concurrent.{CompletableFuture, CompletionStage, TimeUnit} @@ -23,16 +23,16 @@ import akka.NotUsed import akka.actor.ActorSystem import akka.stream.javadsl.Source import akka.stream.scaladsl.{JavaFlowSupport, Sink} -import cloudstate.javasupport.Controllerspec -import cloudstate.javasupport.Controllerspec.{In, Out} +import cloudstate.javasupport.Actionspec +import cloudstate.javasupport.Actionspec.{In, Out} import com.google.protobuf import io.cloudstate.javasupport.{Metadata, ServiceCallFactory} -import io.cloudstate.javasupport.controller.{ +import io.cloudstate.javasupport.action.{ + Action, + ActionContext, + ActionHandler, + ActionReply, CallHandler, - Controller, - ControllerContext, - ControllerHandler, - ControllerReply, MessageEnvelope, MessageReply } @@ -43,9 +43,9 @@ import scala.concurrent.{Await, Future} import scala.concurrent.duration._ import scala.compat.java8.FutureConverters._ -class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with BeforeAndAfterAll { +class AnnotationBasedActionSupportSpec extends WordSpec with Matchers with BeforeAndAfterAll { - private implicit val sys = ActorSystem("AnnotationBasedControllerSupportSpec") + private implicit val sys = ActorSystem("AnnotationBasedActionSupportSpec") import sys.dispatcher @@ -54,20 +54,18 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B sys.terminate() } - private val anySupport = new AnySupport(Array(Controllerspec.getDescriptor), this.getClass.getClassLoader) + private val anySupport = new AnySupport(Array(Actionspec.getDescriptor), this.getClass.getClassLoader) - private object ctx extends ControllerContext { + private object ctx extends ActionContext { override def metadata(): Metadata = Metadata.EMPTY.add("scope", "call") override def serviceCallFactory(): ServiceCallFactory = ??? } - private def create(handler: AnyRef): ControllerHandler = - new AnnotationBasedControllerSupport(handler, - anySupport, - Controllerspec.getDescriptor.findServiceByName("ControllerSpec")) + private def create(handler: AnyRef): ActionHandler = + new AnnotationBasedActionSupport(handler, anySupport, Actionspec.getDescriptor.findServiceByName("ActionSpec")) - "Annotation based controller support" should { + "Annotation based action support" should { "support invoking unary commands" when { def test(handler: AnyRef) = { @@ -112,13 +110,13 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "synchronous out wrapped in reply" in test(new { @CallHandler - def unary(in: In): ControllerReply[Out] = ControllerReply.message(inToOut(in)) + def unary(in: In): ActionReply[Out] = ActionReply.message(inToOut(in)) }) "asynchronous out wrapped in reply" in test(new { @CallHandler - def unary(in: In): CompletionStage[ControllerReply[Out]] = - CompletableFuture.completedFuture(ControllerReply.message(inToOut(in))) + def unary(in: In): CompletionStage[ActionReply[Out]] = + CompletableFuture.completedFuture(ActionReply.message(inToOut(in))) }) "with metadata parameter" in test(new { @@ -131,7 +129,7 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "with context parameter" in test(new { @CallHandler - def unary(in: In, context: ControllerContext): Out = inToOut(in) + def unary(in: In, context: ActionContext): Out = inToOut(in) }) } @@ -189,8 +187,8 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "source wrapped in reply" in test(new { @CallHandler - def streamedOut(in: In): Source[ControllerReply[Out], NotUsed] = - inToOut(in).map[ControllerReply[Out]](ControllerReply.message(_)).asJava + def streamedOut(in: In): Source[ActionReply[Out], NotUsed] = + inToOut(in).map[ActionReply[Out]](ActionReply.message(_)).asJava }) "with metadata parameter" in test(new { @@ -261,8 +259,8 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "returns reply" in test(new { @CallHandler - def streamedIn(in: Source[In, NotUsed]): CompletionStage[ControllerReply[Out]] = - inToOut(in.asScala).map[ControllerReply[Out]](ControllerReply.message(_)).toJava + def streamedIn(in: Source[In, NotUsed]): CompletionStage[ActionReply[Out]] = + inToOut(in.asScala).map[ActionReply[Out]](ActionReply.message(_)).toJava }) "with metadata parameter" in test(new { @@ -275,7 +273,7 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "with context parameter" in test(new { @CallHandler - def streamedIn(in: Source[In, NotUsed], context: ControllerContext): CompletionStage[Out] = + def streamedIn(in: Source[In, NotUsed], context: ActionContext): CompletionStage[Out] = inToOut(in.asScala).toJava }) @@ -371,14 +369,14 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "out wrapped in reply" in test(new { @CallHandler - def streamed(in: Source[In, NotUsed]): Source[ControllerReply[Out], NotUsed] = - inToOut(in.asScala).map[ControllerReply[Out]](ControllerReply.message(_)).asJava + def streamed(in: Source[In, NotUsed]): Source[ActionReply[Out], NotUsed] = + inToOut(in.asScala).map[ActionReply[Out]](ActionReply.message(_)).asJava }) "in wrapped in envelope out wrapped in reply" in test(new { @CallHandler - def streamed(in: Source[MessageEnvelope[In], NotUsed]): Source[ControllerReply[Out], NotUsed] = - inToOut(in.asScala.map(_.payload())).map[ControllerReply[Out]](ControllerReply.message(_)).asJava + def streamed(in: Source[MessageEnvelope[In], NotUsed]): Source[ActionReply[Out], NotUsed] = + inToOut(in.asScala.map(_.payload())).map[ActionReply[Out]](ActionReply.message(_)).asJava }) "with metadata parameter" in test(new { @@ -391,7 +389,7 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B "with context parameter" in test(new { @CallHandler - def streamed(in: Source[In, NotUsed], context: ControllerContext): Source[Out, NotUsed] = + def streamed(in: Source[In, NotUsed], context: ActionContext): Source[Out, NotUsed] = inToOut(in.asScala).asJava }) @@ -405,7 +403,7 @@ class AnnotationBasedControllerSupportSpec extends WordSpec with Matchers with B Metadata.EMPTY.add("scope", "message") ) - private def assertIsOutReplyWithField(reply: ControllerReply[protobuf.Any], field: String) = + private def assertIsOutReplyWithField(reply: ActionReply[protobuf.Any], field: String) = reply match { case message: MessageReply[protobuf.Any] => val out = message.payload().unpack(classOf[Out])