From df3925bac2caf640553cffd943f0f7c71c4fdbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=E1=BA=A7n=20H=E1=BB=93ng=20Qu=C3=A2n?= <55171818+quantranhong1999@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:44:40 +0700 Subject: [PATCH] Guice binding for SearchSnippet/get (#1279) --- .../tmail/james/app/DistributedServer.java | 45 +++++++++++++++++-- ...DistributedSearchSnippetGetMethodTest.java | 45 +++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 tmail-backend/integration-tests/jmap/distributed-jmap-integration-tests/src/test/java/com/linagora/tmail/james/DistributedSearchSnippetGetMethodTest.java diff --git a/tmail-backend/apps/distributed/src/main/java/com/linagora/tmail/james/app/DistributedServer.java b/tmail-backend/apps/distributed/src/main/java/com/linagora/tmail/james/app/DistributedServer.java index 93d43a0e08..00ad7961de 100644 --- a/tmail-backend/apps/distributed/src/main/java/com/linagora/tmail/james/app/DistributedServer.java +++ b/tmail-backend/apps/distributed/src/main/java/com/linagora/tmail/james/app/DistributedServer.java @@ -14,6 +14,7 @@ import org.apache.james.ExtraProperties; import org.apache.james.GuiceJamesServer; import org.apache.james.JamesServerMain; +import org.apache.james.OpenSearchHighlightModule; import org.apache.james.SearchConfiguration; import org.apache.james.backends.redis.RedisHealthCheck; import org.apache.james.core.healthcheck.HealthCheck; @@ -21,10 +22,17 @@ import org.apache.james.eventsourcing.eventstore.EventNestedTypes; import org.apache.james.jmap.InjectionKeys; import org.apache.james.jmap.JMAPListenerModule; +import org.apache.james.jmap.method.Method; +import org.apache.james.jmap.method.SearchSnippetGetMethod; import org.apache.james.json.DTO; import org.apache.james.json.DTOModule; import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.cassandra.CassandraMailboxManager; +import org.apache.james.mailbox.model.MessageId; +import org.apache.james.mailbox.model.MultimailboxesSearchQuery; +import org.apache.james.mailbox.searchhighligt.SearchHighlighter; +import org.apache.james.mailbox.searchhighligt.SearchSnippet; import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex; import org.apache.james.mailbox.store.search.MessageSearchIndex; import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex; @@ -100,6 +108,7 @@ import org.apache.james.utils.InitializationOperation; import org.apache.james.utils.InitilizationOperationBuilder; import org.apache.james.vault.VaultConfiguration; +import org.reactivestreams.Publisher; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -174,6 +183,8 @@ import com.linagora.tmail.webadmin.archival.InboxArchivalTaskModule; import com.linagora.tmail.webadmin.cleanup.MailboxesCleanupModule; +import reactor.core.publisher.Mono; + public class DistributedServer { private static class ScanningQuotaSearchModule extends AbstractModule { @Override @@ -192,6 +203,13 @@ protected void configure() { } } + public static final Module JMAP_DISTRIBUTED_METHOD_SUPPORTED_MODULE = new AbstractModule() { + @Override + protected void configure() { + Multibinder.newSetBinder(binder(), Method.class).addBinding().to(SearchSnippetGetMethod.class); + } + }; + public static final Module WEBADMIN = Modules.combine( new CassandraRoutesModule(), new DataRoutesModules(), @@ -242,7 +260,8 @@ protected void configure() { new WebFingerModule(), new LabelMethodModule(), new JmapSettingsMethodModule(), - new ContactSupportCapabilitiesModule()) + new ContactSupportCapabilitiesModule(), + JMAP_DISTRIBUTED_METHOD_SUPPORTED_MODULE) .with(new CassandraTicketStoreModule(), new TeamMailboxJmapModule()); public static final Module PROTOCOLS = Modules.combine( @@ -361,22 +380,40 @@ public static List chooseModules(SearchConfiguration searchConfiguration new OSContactAutoCompleteModule(), new OpenSearchClientModule(), new OpenSearchMailboxModule(), - new ReIndexingModule()); + new ReIndexingModule(), + new OpenSearchHighlightModule()); case Scanning: return ImmutableList.of( new DisabledEmailAddressContactSearchEngineModule(), new ScanningQuotaSearchModule(), - new ScanningSearchModule()); + new ScanningSearchModule(), + new FakeSearchHighlightModule()); case OpenSearchDisabled: return ImmutableList.of( new DisabledEmailAddressContactSearchEngineModule(), new OpenSearchDisabledModule(), - new ScanningQuotaSearchModule()); + new ScanningQuotaSearchModule(), + new FakeSearchHighlightModule()); default: throw new RuntimeException("Unsupported search implementation " + searchConfiguration.getImplementation()); } } + private static class FakeSearchHighlighter implements SearchHighlighter { + + @Override + public Publisher highlightSearch(List messageIds, MultimailboxesSearchQuery expression, MailboxSession session) { + return Mono.error(new NotImplementedException("not implemented")); + } + } + + private static class FakeSearchHighlightModule extends AbstractModule { + @Override + protected void configure() { + bind(SearchHighlighter.class).toInstance(new FakeSearchHighlighter()); + } + } + private static Module chooseJmapModule(DistributedJamesConfiguration configuration) { if (configuration.jmapEnabled()) { return new JMAPListenerModule(); diff --git a/tmail-backend/integration-tests/jmap/distributed-jmap-integration-tests/src/test/java/com/linagora/tmail/james/DistributedSearchSnippetGetMethodTest.java b/tmail-backend/integration-tests/jmap/distributed-jmap-integration-tests/src/test/java/com/linagora/tmail/james/DistributedSearchSnippetGetMethodTest.java new file mode 100644 index 0000000000..c00646cce9 --- /dev/null +++ b/tmail-backend/integration-tests/jmap/distributed-jmap-integration-tests/src/test/java/com/linagora/tmail/james/DistributedSearchSnippetGetMethodTest.java @@ -0,0 +1,45 @@ +package com.linagora.tmail.james; + +import org.apache.james.JamesServerBuilder; +import org.apache.james.JamesServerExtension; +import org.apache.james.backends.redis.RedisExtension; +import org.apache.james.jmap.rfc8621.contract.SearchSnippetGetMethodContract; +import org.apache.james.jmap.rfc8621.contract.probe.DelegationProbeModule; +import org.apache.james.modules.AwsS3BlobStoreExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.linagora.tmail.blob.guice.BlobStoreConfiguration; +import com.linagora.tmail.james.app.CassandraExtension; +import com.linagora.tmail.james.app.DistributedJamesConfiguration; +import com.linagora.tmail.james.app.DistributedServer; +import com.linagora.tmail.james.app.DockerOpenSearchExtension; +import com.linagora.tmail.james.app.EventBusKeysChoice; +import com.linagora.tmail.james.app.RabbitMQExtension; +import com.linagora.tmail.james.jmap.firebase.FirebaseModuleChooserConfiguration; +import com.linagora.tmail.module.LinagoraTestJMAPServerModule; + +public class DistributedSearchSnippetGetMethodTest implements SearchSnippetGetMethodContract { + @RegisterExtension + static JamesServerExtension testExtension = new JamesServerBuilder(tmpDir -> + DistributedJamesConfiguration.builder() + .workingDirectory(tmpDir) + .configurationFromClasspath() + .blobStore(BlobStoreConfiguration.builder() + .disableCache() + .deduplication() + .noCryptoConfig() + .disableSingleSave() + .noSecondaryS3BlobStore()) + .eventBusKeysChoice(EventBusKeysChoice.REDIS) + .firebaseModuleChooserConfiguration(FirebaseModuleChooserConfiguration.DISABLED) + .build()) + .extension(new DockerOpenSearchExtension()) + .extension(new CassandraExtension()) + .extension(new RabbitMQExtension()) + .extension(new RedisExtension()) + .extension(new AwsS3BlobStoreExtension()) + .server(configuration -> DistributedServer.createServer(configuration) + .overrideWith(new LinagoraTestJMAPServerModule()) + .overrideWith(new DelegationProbeModule())) + .build(); +}