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 8f0ca105341c77fd13ec9a720760bc59439883a0 Author: Tran Tien Duc <[email protected]> AuthorDate: Thu Nov 28 17:55:15 2019 +0700 JAMES-2998 MessageFastViewProjection with retrieve hit & miss metric count --- server/data/data-jmap-cassandra/pom.xml | 5 ++ .../CassandraMessageFastViewProjection.java | 16 ++++++- .../CassandraMessageFastViewProjectionTest.java | 10 +++- server/data/data-jmap/pom.xml | 9 ++++ .../api/projections/MessageFastViewProjection.java | 4 ++ .../MemoryMessageFastViewProjection.java | 15 +++++- .../MessageFastViewProjectionContract.java | 54 +++++++++++++++++++++- .../MemoryMessageFastViewProjectionTest.java | 10 +++- .../jmap/draft/methods/GetMessagesMethodTest.java | 5 +- .../jmap/draft/methods/MessageSenderTest.java | 3 +- .../methods/SetMessagesCreationProcessorTest.java | 2 +- .../message/view/MessageFastViewFactoryTest.java | 5 +- .../message/view/MessageFullViewFactoryTest.java | 3 +- 13 files changed, 126 insertions(+), 15 deletions(-) diff --git a/server/data/data-jmap-cassandra/pom.xml b/server/data/data-jmap-cassandra/pom.xml index 058ca36..e0162ff 100644 --- a/server/data/data-jmap-cassandra/pom.xml +++ b/server/data/data-jmap-cassandra/pom.xml @@ -76,6 +76,11 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java index 47fa83d..9b0ac29 100644 --- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java +++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java @@ -36,6 +36,8 @@ import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedPropertie import org.apache.james.jmap.api.projections.MessageFastViewProjection; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.model.MessageId; +import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.MetricFactory; import org.reactivestreams.Publisher; import com.datastax.driver.core.PreparedStatement; @@ -44,8 +46,13 @@ import com.datastax.driver.core.Session; import com.datastax.driver.core.querybuilder.QueryBuilder; import com.google.common.base.Preconditions; +import reactor.core.publisher.Mono; + public class CassandraMessageFastViewProjection implements MessageFastViewProjection { + private final Metric metricRetrieveHitCount; + private final Metric metricRetrieveMissCount; + private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement storeStatement; @@ -53,7 +60,7 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec private final PreparedStatement deleteStatement; @Inject - CassandraMessageFastViewProjection(Session session) { + CassandraMessageFastViewProjection(MetricFactory metricFactory, Session session) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.deleteStatement = session.prepare(QueryBuilder.delete() @@ -68,6 +75,9 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec this.retrieveStatement = session.prepare(select() .from(TABLE_NAME) .where(eq(MESSAGE_ID, bindMarker(MESSAGE_ID)))); + + this.metricRetrieveHitCount = metricFactory.generate(METRIC_RETRIEVE_HIT_COUNT); + this.metricRetrieveMissCount = metricFactory.generate(METRIC_RETRIEVE_MISS_COUNT); } @Override @@ -86,7 +96,9 @@ public class CassandraMessageFastViewProjection implements MessageFastViewProjec return cassandraAsyncExecutor.executeSingleRow(retrieveStatement.bind() .setUUID(MESSAGE_ID, ((CassandraMessageId) messageId).get())) - .map(this::fromRow); + .map(this::fromRow) + .doOnNext(preview -> metricRetrieveHitCount.increment()) + .switchIfEmpty(Mono.fromRunnable(metricRetrieveMissCount::increment)); } @Override diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java index 36f1b25..9612b43 100644 --- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java +++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java @@ -27,6 +27,7 @@ import org.apache.james.jmap.api.projections.MessageFastViewProjectionContract; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestMessageId; +import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -38,11 +39,13 @@ class CassandraMessageFastViewProjectionTest implements MessageFastViewProjectio private CassandraMessageFastViewProjection testee; private CassandraMessageId.Factory cassandraMessageIdFactory; + private RecordingMetricFactory metricFactory; @BeforeEach void setUp() { + metricFactory = new RecordingMetricFactory(); cassandraMessageIdFactory = new CassandraMessageId.Factory(); - testee = new CassandraMessageFastViewProjection(cassandra.getCassandraCluster().getConf()); + testee = new CassandraMessageFastViewProjection(metricFactory, cassandra.getCassandraCluster().getConf()); } @Override @@ -55,6 +58,11 @@ class CassandraMessageFastViewProjectionTest implements MessageFastViewProjectio return cassandraMessageIdFactory.generate(); } + @Override + public RecordingMetricFactory metricFactory() { + return metricFactory; + } + @Test void storeShouldThrowWhenMessageIdIsNotCassandraType() { assertThatThrownBy(() -> testee.store(TestMessageId.of(1), MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) diff --git a/server/data/data-jmap/pom.xml b/server/data/data-jmap/pom.xml index 3626162..cc74155 100644 --- a/server/data/data-jmap/pom.xml +++ b/server/data/data-jmap/pom.xml @@ -68,6 +68,15 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>metrics-api</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-tests</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java index a93f582..3233366 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java @@ -34,6 +34,10 @@ import reactor.core.scheduler.Schedulers; public interface MessageFastViewProjection { + String MESSAGE_FAST_VIEW_PROJECTION = "MessageFastViewProjection"; + String METRIC_RETRIEVE_HIT_COUNT = MESSAGE_FAST_VIEW_PROJECTION + ":retrieveHitCount"; + String METRIC_RETRIEVE_MISS_COUNT = MESSAGE_FAST_VIEW_PROJECTION + ":retrieveMissCount"; + Publisher<Void> store(MessageId messageId, MessageFastViewPrecomputedProperties preview); Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId); diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java index c599b8c..9492ab3 100644 --- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java +++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java @@ -21,9 +21,13 @@ package org.apache.james.jmap.memory.projections; import java.util.concurrent.ConcurrentHashMap; +import javax.inject.Inject; + import org.apache.james.jmap.api.projections.MessageFastViewPrecomputedProperties; import org.apache.james.jmap.api.projections.MessageFastViewProjection; import org.apache.james.mailbox.model.MessageId; +import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.MetricFactory; import org.reactivestreams.Publisher; import com.google.common.base.Preconditions; @@ -33,9 +37,14 @@ import reactor.core.publisher.Mono; public class MemoryMessageFastViewProjection implements MessageFastViewProjection { private final ConcurrentHashMap<MessageId, MessageFastViewPrecomputedProperties> previews; + private final Metric metricRetrieveHitCount; + private final Metric metricRetrieveMissCount; - public MemoryMessageFastViewProjection() { + @Inject + public MemoryMessageFastViewProjection(MetricFactory metricFactory) { this.previews = new ConcurrentHashMap<>(); + this.metricRetrieveHitCount = metricFactory.generate(METRIC_RETRIEVE_HIT_COUNT); + this.metricRetrieveMissCount = metricFactory.generate(METRIC_RETRIEVE_MISS_COUNT); } @Override @@ -50,7 +59,9 @@ public class MemoryMessageFastViewProjection implements MessageFastViewProjectio public Publisher<MessageFastViewPrecomputedProperties> retrieve(MessageId messageId) { Preconditions.checkNotNull(messageId); - return Mono.fromSupplier(() -> previews.get(messageId)); + return Mono.fromSupplier(() -> previews.get(messageId)) + .doOnNext(preview -> metricRetrieveHitCount.increment()) + .switchIfEmpty(Mono.fromRunnable(metricRetrieveMissCount::increment)); } @Override diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java index 7c11d05..1e5fa66 100644 --- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java +++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java @@ -19,18 +19,20 @@ package org.apache.james.jmap.api.projections; +import static org.apache.james.jmap.api.projections.MessageFastViewProjection.METRIC_RETRIEVE_HIT_COUNT; +import static org.apache.james.jmap.api.projections.MessageFastViewProjection.METRIC_RETRIEVE_MISS_COUNT; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.time.Duration; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.IntStream; import org.apache.james.jmap.api.model.Preview; -import java.util.List; - import org.apache.james.mailbox.model.MessageId; +import org.apache.james.metrics.tests.RecordingMetricFactory; import org.apache.james.util.concurrency.ConcurrentTestRunner; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Test; @@ -57,6 +59,8 @@ public interface MessageFastViewProjectionContract { MessageId newMessageId(); + RecordingMetricFactory metricFactory(); + @Test default void retrieveShouldThrowWhenNullMessageId() { assertThatThrownBy(() -> Mono.from(testee().retrieve((MessageId) null)).block()) @@ -309,4 +313,50 @@ public interface MessageFastViewProjectionContract { assertThat(Mono.from(testee().retrieve(messageId1)).blockOptional()) .isEmpty(); } + + @Test + default void retrieveShouldIncrementMetricHitCountWhenPreviewIsFound() { + MessageId messageId1 = newMessageId(); + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) + .block(); + + Mono.from(testee().retrieve(messageId1)) + .block(); + + assertThat(metricFactory().countFor(METRIC_RETRIEVE_HIT_COUNT)) + .isEqualTo(1); + } + + @Test + default void retrieveShouldNotIncrementMetricMissCountWhenPreviewIsFound() { + MessageId messageId1 = newMessageId(); + Mono.from(testee().store(messageId1, MESSAGE_FAST_VIEW_PRECOMPUTED_PROPERTIES_1)) + .block(); + + Mono.from(testee().retrieve(messageId1)) + .block(); + + assertThat(metricFactory().countFor(METRIC_RETRIEVE_MISS_COUNT)) + .isEqualTo(0); + } + + @Test + default void retrieveShouldIncrementMetricMissCountWhenPreviewIsNotFound() { + MessageId messageId1 = newMessageId(); + Mono.from(testee().retrieve(messageId1)) + .block(); + + assertThat(metricFactory().countFor(METRIC_RETRIEVE_MISS_COUNT)) + .isEqualTo(1); + } + + @Test + default void retrieveShouldNotIncrementMetricHitCountWhenPreviewIsNotFound() { + MessageId messageId1 = newMessageId(); + Mono.from(testee().retrieve(messageId1)) + .block(); + + assertThat(metricFactory().countFor(METRIC_RETRIEVE_HIT_COUNT)) + .isEqualTo(0); + } } \ No newline at end of file diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjectionTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjectionTest.java index 275c176..c7b0243 100644 --- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjectionTest.java +++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjectionTest.java @@ -23,17 +23,20 @@ import org.apache.james.jmap.api.projections.MessageFastViewProjection; import org.apache.james.jmap.api.projections.MessageFastViewProjectionContract; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestMessageId; +import org.apache.james.metrics.tests.RecordingMetricFactory; import org.junit.jupiter.api.BeforeEach; class MemoryMessageFastViewProjectionTest implements MessageFastViewProjectionContract { private MemoryMessageFastViewProjection testee; private TestMessageId.Factory messageIdFactory; + private RecordingMetricFactory metricFactory; @BeforeEach void setUp() { + metricFactory = new RecordingMetricFactory(); messageIdFactory = new TestMessageId.Factory(); - testee = new MemoryMessageFastViewProjection(); + testee = new MemoryMessageFastViewProjection(metricFactory); } @Override @@ -45,4 +48,9 @@ class MemoryMessageFastViewProjectionTest implements MessageFastViewProjectionCo public MessageId newMessageId() { return messageIdFactory.generate(); } + + @Override + public RecordingMetricFactory metricFactory() { + return metricFactory; + } } \ No newline at end of file diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java index fdd7059..8b38bd8 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java @@ -67,6 +67,7 @@ import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.StoreMailboxManager; +import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.metrics.logger.DefaultMetricFactory; import org.apache.james.mime4j.message.BodyPartBuilder; import org.apache.james.mime4j.message.MultipartBuilder; @@ -124,9 +125,9 @@ public class GetMessagesMethodTest { messageMetadataViewFactory = spy(new MessageMetadataViewFactory(blobManager, messageIdManager)); MessageFullViewFactory messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager, - new MemoryMessageFastViewProjection()); + new MemoryMessageFastViewProjection(new NoopMetricFactory())); MessageFastViewFactory messageFastViewFactory = new MessageFastViewFactory(blobManager, messageIdManager, - new MemoryMessageFastViewProjection(), messageFullViewFactory); + new MemoryMessageFastViewProjection(new NoopMetricFactory()), messageFullViewFactory); MetaMessageViewFactory metaMessageViewFactory = new MetaMessageViewFactory( messageFullViewFactory, diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java index f4a7573..1da53f4 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java @@ -48,6 +48,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.model.BlobId; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestMessageId; +import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.server.core.Envelope; import org.apache.james.util.mime.MessageContentExtractor; import org.apache.mailet.Mail; @@ -91,7 +92,7 @@ class MessageSenderTest { when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake")); MessageIdManager messageIdManager = mock(MessageIdManager.class); MessageFullViewFactory messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager, - new MemoryMessageFastViewProjection()); + new MemoryMessageFastViewProjection(new NoopMetricFactory())); jmapMessage = messageFullViewFactory.fromMetaDataWithContent(message); envelope = EnvelopeUtils.fromMessage(jmapMessage); } diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java index 6965932..f5059d6 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java @@ -128,7 +128,7 @@ public class SetMessagesCreationProcessorTest { MessageIdManager messageIdManager = mock(MessageIdManager.class); messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager, - new MemoryMessageFastViewProjection()); + new MemoryMessageFastViewProjection(new NoopMetricFactory())); mockedMailSpool = mock(MailSpool.class); mockedAttachmentManager = mock(AttachmentManager.class); mockedMailboxManager = mock(MailboxManager.class); diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java index c7da512..2dcc64c 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java @@ -55,6 +55,7 @@ import org.apache.james.mailbox.model.ComposedMessageId; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.StoreBlobManager; +import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.util.ClassLoaderUtils; import org.apache.james.util.mime.MessageContentExtractor; import org.assertj.core.api.SoftAssertions; @@ -134,7 +135,7 @@ class MessageFastViewFactoryTest { .build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")), session); - fastViewProjection = new MemoryMessageFastViewProjection(); + fastViewProjection = new MemoryMessageFastViewProjection(new NoopMetricFactory()); Mono.from(fastViewProjection.store(previewComputedMessage1.getMessageId(), PROJECTION_1)) .block(); @@ -145,7 +146,7 @@ class MessageFastViewFactoryTest { blobManager = resources.getBlobManager(); messageFullViewFactory = new MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, messageIdManager, - new MemoryMessageFastViewProjection()); + new MemoryMessageFastViewProjection(new NoopMetricFactory())); messageFastViewFactory = new MessageFastViewFactory(blobManager, messageIdManager, fastViewProjection, messageFullViewFactory); } diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java index c3fb39f..b1dd9f8 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java @@ -69,6 +69,7 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mailbox.model.TestMessageId; +import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.util.ClassLoaderUtils; import org.apache.james.util.mime.MessageContentExtractor; import org.assertj.core.api.SoftAssertions; @@ -118,7 +119,7 @@ class MessageFullViewFactoryTest { .build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")), session); - fastViewProjection = spy(new MemoryMessageFastViewProjection()); + fastViewProjection = spy(new MemoryMessageFastViewProjection(new NoopMetricFactory())); messageFullViewFactory = new MessageFullViewFactory(resources.getBlobManager(), messageContentExtractor, htmlTextExtractor, messageIdManager, fastViewProjection); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
