Skip to content

Commit

Permalink
refactor: Replace IIIFServiceManager (DEV-1799) (#2502)
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Mar 6, 2023
1 parent 843d31d commit 22e456b
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 108 deletions.
7 changes: 4 additions & 3 deletions webapi/src/it/scala/org/knora/webapi/core/LayersTest.scala
Expand Up @@ -24,7 +24,6 @@ import org.knora.webapi.slice.resourceinfo.domain.IriConverter
import org.knora.webapi.slice.resourceinfo.domain.ResourceInfoRepo
import org.knora.webapi.store.cache.api.CacheService
import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl
import org.knora.webapi.store.iiif.IIIFServiceManager
import org.knora.webapi.store.iiif.api.IIIFService
import org.knora.webapi.store.iiif.impl.IIIFServiceMockImpl
import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl
Expand Down Expand Up @@ -73,6 +72,8 @@ import org.knora.webapi.responders.v2.ResourceUtilV2
import org.knora.webapi.responders.v2.ResourceUtilV2Live
import org.knora.webapi.store.cache.CacheServiceRequestMessageHandler
import org.knora.webapi.store.cache.CacheServiceRequestMessageHandlerLive
import org.knora.webapi.store.iiif.IIIFRequestMessageHandler
import org.knora.webapi.store.iiif.IIIFRequestMessageHandlerLive

import org.knora.webapi.store.triplestore.TriplestoreRequestMessageHandler
import org.knora.webapi.store.triplestore.TriplestoreRequestMessageHandlerLive
Expand Down Expand Up @@ -101,7 +102,7 @@ object LayersTest {
with CkanResponderV1
with GroupsResponderADM
with HttpServer
with IIIFServiceManager
with IIIFRequestMessageHandler
with IriConverter
with IriService
with ListsResponderV2
Expand Down Expand Up @@ -148,7 +149,7 @@ object LayersTest {
CkanResponderV1Live.layer,
GroupsResponderADMLive.layer,
HttpServer.layer,
IIIFServiceManager.layer,
IIIFRequestMessageHandlerLive.layer,
IriConverter.layer,
IriService.layer,
ListsResponderV2Live.layer,
Expand Down
Expand Up @@ -23,7 +23,7 @@ case class IIIFServiceMockImpl() extends IIIFService {
*/
private val FAILURE_FILENAME: String = "failure.jp2"

def getFileMetadata(getFileMetadataRequestV2: GetFileMetadataRequest): UIO[GetFileMetadataResponse] =
def getFileMetadata(getFileMetadataRequestV2: GetFileMetadataRequest): Task[GetFileMetadataResponse] =
ZIO.succeed(
GetFileMetadataResponse(
originalFilename = Some("test2.tiff"),
Expand All @@ -39,23 +39,23 @@ case class IIIFServiceMockImpl() extends IIIFService {

def moveTemporaryFileToPermanentStorage(
moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest
): UIO[SuccessResponseV2] =
): Task[SuccessResponseV2] =
if (moveTemporaryFileToPermanentStorageRequestV2.internalFilename == FAILURE_FILENAME) {
ZIO.die(SipiException("Sipi failed to move file to permanent storage"))
ZIO.fail(SipiException("Sipi failed to move file to permanent storage"))
} else {
ZIO.succeed(SuccessResponseV2("Moved file to permanent storage"))
}

def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): UIO[SuccessResponseV2] =
def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Task[SuccessResponseV2] =
if (deleteTemporaryFileRequestV2.internalFilename == FAILURE_FILENAME) {
ZIO.die(SipiException("Sipi failed to delete temporary file"))
ZIO.fail(SipiException("Sipi failed to delete temporary file"))
} else {
ZIO.succeed(SuccessResponseV2("Deleted temporary file"))
}

override def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): UIO[SipiGetTextFileResponse] = ???
override def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): Task[SipiGetTextFileResponse] = ???

override def getStatus(): UIO[IIIFServiceStatusResponse] = ZIO.succeed(IIIFServiceStatusOK)
override def getStatus(): Task[IIIFServiceStatusResponse] = ZIO.succeed(IIIFServiceStatusOK)
}

object IIIFServiceMockImpl {
Expand Down
10 changes: 3 additions & 7 deletions webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala
Expand Up @@ -26,7 +26,6 @@ import org.knora.webapi.responders.v2.ontology.CardinalityHandler
import org.knora.webapi.responders.v2.ontology.OntologyHelpers
import org.knora.webapi.settings._
import org.knora.webapi.slice.ontology.domain.service.CardinalityService
import org.knora.webapi.store.iiif.IIIFServiceManager

@accessible
trait AppRouter {
Expand All @@ -41,7 +40,6 @@ object AppRouter {
with AppConfig
with CardinalityHandler
with CardinalityService
with IIIFServiceManager
with MessageRelay
with OntologyHelpers
with PermissionUtilADM
Expand All @@ -53,10 +51,9 @@ object AppRouter {
] =
ZLayer {
for {
as <- ZIO.service[core.ActorSystem]
iiifServiceManager <- ZIO.service[IIIFServiceManager]
appConfig <- ZIO.service[AppConfig]
messageRelay <- ZIO.service[MessageRelay]
as <- ZIO.service[core.ActorSystem]
appConfig <- ZIO.service[AppConfig]
messageRelay <- ZIO.service[MessageRelay]
runtime <-
ZIO.runtime[
CardinalityHandler
Expand All @@ -73,7 +70,6 @@ object AppRouter {
val ref: ActorRef = system.actorOf(
Props(
core.actors.RoutingActor(
iiifServiceManager,
appConfig,
messageRelay,
runtime
Expand Down
Expand Up @@ -104,6 +104,7 @@ final case class AppServer(
ZIO.logError("IIIF service not running") *> ZIO.die(new Exception("IIIF service not running"))
}
.when(requiresIIIFService)
.orDie
_ <- state.set(AppState.IIIFServiceReady)
} yield ()

Expand Down
7 changes: 4 additions & 3 deletions webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala
Expand Up @@ -77,7 +77,8 @@ import org.knora.webapi.store.cache.CacheServiceRequestMessageHandler
import org.knora.webapi.store.cache.CacheServiceRequestMessageHandlerLive
import org.knora.webapi.store.cache.api.CacheService
import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl
import org.knora.webapi.store.iiif.IIIFServiceManager
import org.knora.webapi.store.iiif.IIIFRequestMessageHandler
import org.knora.webapi.store.iiif.IIIFRequestMessageHandlerLive
import org.knora.webapi.store.iiif.api.IIIFService
import org.knora.webapi.store.iiif.impl.IIIFServiceSipiImpl
import org.knora.webapi.store.triplestore.TriplestoreRequestMessageHandler
Expand Down Expand Up @@ -105,7 +106,7 @@ object LayersLive {
with GroupsResponderADM
with HttpServer
with IIIFService
with IIIFServiceManager
with IIIFRequestMessageHandler
with IriService
with JWTService
with ListsResponderV2
Expand Down Expand Up @@ -157,7 +158,7 @@ object LayersLive {
GroupsResponderADMLive.layer,
HttpServer.layer,
HttpServerZ.layer, // this is the new ZIO HTTP server layer
IIIFServiceManager.layer,
IIIFRequestMessageHandlerLive.layer,
IIIFServiceSipiImpl.layer,
IriConverter.layer,
IriService.layer,
Expand Down
Expand Up @@ -14,7 +14,6 @@ import dsp.errors.UnexpectedMessageException
import org.knora.webapi.config.AppConfig
import org.knora.webapi.core.MessageRelay
import org.knora.webapi.core.RelayedMessage
import org.knora.webapi.messages.store.sipimessages.IIIFRequest
import org.knora.webapi.messages.util.PermissionUtilADM
import org.knora.webapi.messages.util.ResponderData
import org.knora.webapi.messages.util.ValueUtilV1
Expand All @@ -31,11 +30,9 @@ import org.knora.webapi.responders.v2._
import org.knora.webapi.responders.v2.ontology.CardinalityHandler
import org.knora.webapi.responders.v2.ontology.OntologyHelpers
import org.knora.webapi.slice.ontology.domain.service.CardinalityService
import org.knora.webapi.store.iiif.IIIFServiceManager
import org.knora.webapi.util.ActorUtil

final case class RoutingActor(
iiifServiceManager: IIIFServiceManager,
appConfig: AppConfig,
messageRelay: MessageRelay,
implicit val runtime: zio.Runtime[
Expand Down Expand Up @@ -84,9 +81,6 @@ final case class RoutingActor(
case standoffResponderRequestV2: StandoffResponderRequestV2 =>
ActorUtil.future2Message(sender(), standoffResponderV2.receive(standoffResponderRequestV2), log)

// Admin request messages
case msg: IIIFRequest => ActorUtil.zio2Message(sender(), iiifServiceManager.receive(msg))

case other =>
throw UnexpectedMessageException(
s"RoutingActor received an unexpected message $other of type ${other.getClass.getCanonicalName}"
Expand Down
Expand Up @@ -8,18 +8,16 @@ package org.knora.webapi.messages.store.sipimessages
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json._

import org.knora.webapi.core.RelayedMessage
import org.knora.webapi.messages.admin.responder.usersmessages.UserADM
import org.knora.webapi.messages.store.StoreRequest
import org.knora.webapi.messages.traits.RequestWithSender

/**
* An abstract trait for messages that can be sent to the [[org.knora.webapi.store.iiif.IIIFManager]]
* An abstract trait for messages that can be sent to the [[org.knora.webapi.store.iiif.api.IIIFService]]
*/
sealed trait IIIFRequest extends StoreRequest
sealed trait IIIFRequest extends StoreRequest with RelayedMessage

/**
* An abstract trait for messages that can be sent to [[org.knora.webapi.store.iiif.SipiConnector]].
*/
sealed trait SipiRequest extends IIIFRequest {
def requestingUser: UserADM
}
Expand Down
@@ -0,0 +1,46 @@
/*
* Copyright © 2021 - 2023 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors.
* SPDX-License-Identifier: Apache-2.0
*/

package org.knora.webapi.store.iiif

import zio._

import org.knora.webapi.core.MessageHandler
import org.knora.webapi.core.MessageRelay
import org.knora.webapi.messages.ResponderRequest
import org.knora.webapi.messages.store.sipimessages.DeleteTemporaryFileRequest
import org.knora.webapi.messages.store.sipimessages.GetFileMetadataRequest
import org.knora.webapi.messages.store.sipimessages.IIIFRequest
import org.knora.webapi.messages.store.sipimessages.IIIFServiceGetStatus
import org.knora.webapi.messages.store.sipimessages.MoveTemporaryFileToPermanentStorageRequest
import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileRequest
import org.knora.webapi.store.iiif.api.IIIFService

trait IIIFRequestMessageHandler extends MessageHandler

final case class IIIFRequestMessageHandlerLive(iiifService: IIIFService) extends IIIFRequestMessageHandler {

override def isResponsibleFor(message: ResponderRequest): Boolean =
message.isInstanceOf[IIIFRequest]

override def handle(message: ResponderRequest): Task[Any] = message match {
case req: GetFileMetadataRequest => iiifService.getFileMetadata(req)
case req: MoveTemporaryFileToPermanentStorageRequest => iiifService.moveTemporaryFileToPermanentStorage(req)
case req: DeleteTemporaryFileRequest => iiifService.deleteTemporaryFile(req)
case req: SipiGetTextFileRequest => iiifService.getTextFileRequest(req)
case IIIFServiceGetStatus => iiifService.getStatus()
case other => ZIO.logError(s"IIIFServiceManager received an unexpected message: $other")
}
}

object IIIFRequestMessageHandlerLive {
val layer: URLayer[IIIFService with MessageRelay, IIIFRequestMessageHandler] = ZLayer.fromZIO {
for {
mr <- ZIO.service[MessageRelay]
is <- ZIO.service[IIIFService]
handler <- mr.subscribe(IIIFRequestMessageHandlerLive(is))
} yield handler
}
}

This file was deleted.

Expand Up @@ -26,7 +26,7 @@ trait IIIFService {
* @param getFileMetadataRequest the request.
* @return a [[GetFileMetadataResponse]] containing the requested metadata.
*/
def getFileMetadata(getFileMetadataRequest: GetFileMetadataRequest): UIO[GetFileMetadataResponse]
def getFileMetadata(getFileMetadataRequest: GetFileMetadataRequest): Task[GetFileMetadataResponse]

/**
* Asks Sipi to move a file from temporary storage to permanent storage.
Expand All @@ -36,25 +36,25 @@ trait IIIFService {
*/
def moveTemporaryFileToPermanentStorage(
moveTemporaryFileToPermanentStorageRequestV2: MoveTemporaryFileToPermanentStorageRequest
): UIO[SuccessResponseV2]
): Task[SuccessResponseV2]

/**
* Asks Sipi to delete a temporary file.
*
* @param deleteTemporaryFileRequestV2 the request.
* @return a [[SuccessResponseV2]].
*/
def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): UIO[SuccessResponseV2]
def deleteTemporaryFile(deleteTemporaryFileRequestV2: DeleteTemporaryFileRequest): Task[SuccessResponseV2]

/**
* Asks Sipi for a text file used internally by Knora.
*
* @param textFileRequest the request message.
*/
def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): UIO[SipiGetTextFileResponse]
def getTextFileRequest(textFileRequest: SipiGetTextFileRequest): Task[SipiGetTextFileResponse]

/**
* Tries to access the IIIF Service.
*/
def getStatus(): UIO[IIIFServiceStatusResponse]
def getStatus(): Task[IIIFServiceStatusResponse]
}

0 comments on commit 22e456b

Please sign in to comment.