This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 7662ea07e24bf40c35d13abc57d652f646ccc2ef Author: Benoit Tellier <[email protected]> AuthorDate: Tue Sep 15 10:46:03 2020 +0700 JAMES-3373 Use a sealed trait to represent BlobResolution results --- .../apache/james/jmap/routes/DownloadRoutes.scala | 45 +++++++++++++--------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala index cfb06fc..03af576 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala @@ -34,7 +34,6 @@ import org.apache.http.HttpStatus.SC_NOT_FOUND import org.apache.james.jmap.exceptions.UnauthorizedException import org.apache.james.jmap.http.Authenticator import org.apache.james.jmap.http.rfc8621.InjectionKeys -import org.apache.james.jmap.json.Serializer import org.apache.james.jmap.mail.Email.Size import org.apache.james.jmap.mail.{BlobId, EmailBodyPart, PartId} import org.apache.james.jmap.routes.DownloadRoutes.{BUFFER_SIZE, LOGGER} @@ -61,8 +60,18 @@ object DownloadRoutes { val BUFFER_SIZE: Int = 16 * 1024 } +sealed trait BlobResolutionResult { + def asOption: Option[SMono[Blob]] +} +case class NonApplicable() extends BlobResolutionResult { + override def asOption: Option[SMono[Blob]] = None +} +case class Applicable(blob: SMono[Blob]) extends BlobResolutionResult { + override def asOption: Option[SMono[Blob]] = Some(blob) +} + trait BlobResolver { - def resolve(blobId: BlobId, mailboxSession: MailboxSession): Option[SMono[Blob]] + def resolve(blobId: BlobId, mailboxSession: MailboxSession): BlobResolutionResult } trait Blob { @@ -100,10 +109,10 @@ case class EmailBodyPartBlob(blobId: BlobId, part: EmailBodyPart) extends Blob { class MessageBlobResolver @Inject()(val messageIdFactory: MessageId.Factory, val messageIdManager: MessageIdManager) extends BlobResolver { - override def resolve(blobId: BlobId, mailboxSession: MailboxSession): Option[SMono[Blob]] = { + override def resolve(blobId: BlobId, mailboxSession: MailboxSession): BlobResolutionResult = { Try(messageIdFactory.fromString(blobId.value.value)) match { - case Failure(_) => None - case Success(messageId) => Some(SMono.fromPublisher( + case Failure(_) => NonApplicable() + case Success(messageId) => Applicable(SMono.fromPublisher( messageIdManager.getMessagesReactive(List(messageId).asJava, FetchGroup.FULL_CONTENT, mailboxSession)) .map[Blob](MessageBlob(blobId, _)) .switchIfEmpty(SMono.raiseError(BlobNotFoundException(blobId)))) @@ -125,11 +134,11 @@ class MessagePartBlobResolver @Inject()(val messageIdFactory: MessageId.Factory, } } - override def resolve(blobId: BlobId, mailboxSession: MailboxSession): Option[SMono[Blob]] = { + override def resolve(blobId: BlobId, mailboxSession: MailboxSession): BlobResolutionResult = { asMessageAndPartId(blobId) match { - case Failure(_) => None + case Failure(_) => NonApplicable() case Success((messageId, partId)) => - Some(SMono.fromPublisher( + Applicable(SMono.fromPublisher( messageIdManager.getMessagesReactive(List(messageId).asJava, FetchGroup.FULL_CONTENT, mailboxSession)) .flatMap(message => SMono.fromTry(EmailBodyPart.of(messageId, message))) .flatMap(bodyStructure => SMono.fromTry(bodyStructure.flatten @@ -146,20 +155,20 @@ class MessagePartBlobResolver @Inject()(val messageIdFactory: MessageId.Factory, class BlobResolvers @Inject()(val messageBlobResolver: MessageBlobResolver, val messagePartBlobResolver: MessagePartBlobResolver) { def resolve(blobId: BlobId, mailboxSession: MailboxSession): SMono[Blob] = - messageBlobResolver.resolve(blobId, mailboxSession) - .orElse(messagePartBlobResolver.resolve(blobId, mailboxSession)) + messageBlobResolver + .resolve(blobId, mailboxSession).asOption + .orElse(messagePartBlobResolver.resolve(blobId, mailboxSession).asOption) .getOrElse(SMono.raiseError(BlobNotFoundException(blobId))) } class DownloadRoutes @Inject()(@Named(InjectionKeys.RFC_8621) val authenticator: Authenticator, - val serializer: Serializer, - val blobResolvers: BlobResolvers) extends JMAPRoutes { - - val accountIdParam: String = "accountId" - val blobIdParam: String = "blobId" - val nameParam: String = "name" - val contentTypeParam: String = "contentType" - val downloadUri = s"/download/{$accountIdParam}/{$blobIdParam}" + val blobResolvers: BlobResolvers) extends JMAPRoutes { + + private val accountIdParam: String = "accountId" + private val blobIdParam: String = "blobId" + private val nameParam: String = "name" + private val contentTypeParam: String = "contentType" + private val downloadUri = s"/download/{$accountIdParam}/{$blobIdParam}" override def routes(): stream.Stream[JMAPRoute] = Stream.of( JMAPRoute.builder --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
