From 9b91809b505ffc70cc7d2c22183bf1858433e285 Mon Sep 17 00:00:00 2001 From: Jan Machacek Date: Mon, 15 Apr 2013 20:59:32 +0100 Subject: [PATCH] First cut of the recog API for #40 --- .gitignore | 1 + .../org/eigengo/akkapatterns/api/recog.scala | 36 ++++++++++++ .../akkapatterns/core/recog/coordinator.scala | 55 +++++++++++++++++++ .../akkapatterns/core/recog/data.scala | 8 +++ .../akkapatterns/core/recog/instance.scala | 10 ++++ 5 files changed, 110 insertions(+) create mode 100644 server/api/src/main/scala/org/eigengo/akkapatterns/api/recog.scala create mode 100644 server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/coordinator.scala create mode 100644 server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/data.scala create mode 100644 server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/instance.scala diff --git a/.gitignore b/.gitignore index ff5c6bb..697e938 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ provisioning/*/*.known log/ tmp/ build/ +akka-patterns-store/ diff --git a/server/api/src/main/scala/org/eigengo/akkapatterns/api/recog.scala b/server/api/src/main/scala/org/eigengo/akkapatterns/api/recog.scala new file mode 100644 index 0000000..46ebab3 --- /dev/null +++ b/server/api/src/main/scala/org/eigengo/akkapatterns/api/recog.scala @@ -0,0 +1,36 @@ +package org.eigengo.akkapatterns.api + +import akka.util.Timeout +import spray.routing.{RequestContext, HttpService} +import org.eigengo.akkapatterns.domain.RecogSessionId +import scala.reflect.ClassTag +import spray.json.RootJsonFormat +import akka.actor.ActorRef + +trait RecogService extends HttpService { + this: EndpointMarshalling => + + implicit val timeout: Timeout + + def recogCoordinator: ActorRef + + def image[A : ClassTag : RootJsonFormat](sessionId: RecogSessionId)(ctx: RequestContext) { + // coordinatorActor + /* + (coordinator ? ProcessImage(transactionId, Base64.decodeBase64(ctx.request.entity.buffer))).mapTo[A] onSuccess { + case r: A => ctx.complete[A](StatusCodes.OK, RawHeader("Access-Control-Allow-Origin", origin) :: Nil, r) + case x => ctx.complete(StatusCodes.InternalServerError) + } + */ + } + + val recogRoute = + path("recog") { + post { + ctx: RequestContext => { + ctx.complete("{}") + } + } + } + +} diff --git a/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/coordinator.scala b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/coordinator.scala new file mode 100644 index 0000000..c55cbdc --- /dev/null +++ b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/coordinator.scala @@ -0,0 +1,55 @@ +package org.eigengo.akkapatterns.core.recog + +import akka.actor.{Kill, Props, ActorRef, Actor} +import org.eigengo.akkapatterns.domain._ +import akka.util.Timeout +import java.util.UUID + +/** + * Submits the ``image`` to the session identified by ``recogSessionId`` + * @param recogSessionId the recognition session + * @param image the image to be submitted + */ +case class ProcessImage(recogSessionId: RecogSessionId, image: Image) + +/** + * Begins the recognition session + */ +case object Begin + +/** + * Kills active session identified by id + * + * @param id the session identity + */ +case class KillActiveSession(id: RecogSessionId) + +/** + * Finds all active recognition sessions + */ +case object FindActiveSessions + +/** + * @author janmachacek + */ +class RecogCoordinatorActor(connectionActor: ActorRef) extends Actor { + + private def findInstanceActor(id: RecogSessionId): ActorRef = { + context.actorFor(id.toString) + } + + implicit val executionContext = context.dispatcher + + def receive = { + case Begin => + val id = UUID.randomUUID() + val instanceActor = context.actorOf(Props(new InstanceActor(connectionActor)), id.toString) + instanceActor.tell(Begin, sender) + case ProcessImage(id, image) => + findInstanceActor(id).tell(image, sender) + case KillActiveSession(id) => + findInstanceActor(id) ! Kill + case FindActiveSessions => + sender ! context.children.map(c => UUID.fromString(c.path.name)).toList + } +} diff --git a/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/data.scala b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/data.scala new file mode 100644 index 0000000..f44dc06 --- /dev/null +++ b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/data.scala @@ -0,0 +1,8 @@ +package org.eigengo.akkapatterns.core.recog + +/** + * @author janmachacek + */ +class data { + +} diff --git a/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/instance.scala b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/instance.scala new file mode 100644 index 0000000..f91beea --- /dev/null +++ b/server/core/src/main/scala/org/eigengo/akkapatterns/core/recog/instance.scala @@ -0,0 +1,10 @@ +package org.eigengo.akkapatterns.core.recog + +import akka.actor.{Actor, ActorRef} + +/** + * @author janmachacek + */ +class InstanceActor(connectionActor: ActorRef) extends Actor { + def receive = ??? +}