[prev in list] [next in list] [prev in thread] [next in thread] 

List:       james-dev
Subject:    svn commit: r1717083 - in /james/project/trunk/mailbox/tool/src: main/java/org/apache/james/mailbox/
From:       btellier () apache ! org
Date:       2015-11-29 15:46:08
Message-ID: 20151129154608.977843A0D46 () svn01-us-west ! apache ! org
[Download RAW message or body]

Author: btellier
Date: Sun Nov 29 15:46:08 2015
New Revision: 1717083

URL: http://svn.apache.org/viewvc?rev=1717083&view=rev
Log:
MAILBOX-259 Adding tests for reindexing registration listeners

Added:
    james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/
  james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistrationTest.java
  james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
 Modified:
    james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
  james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/FlagsMessageEvent.java
  james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/MessageDeletedEvent.java
  james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistration.java


Modified: james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/main/java/org/a \
pache/james/mailbox/indexer/ReIndexerImpl.java?rev=1717083&r1=1717082&r2=1717083&view=diff
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java \
                (original)
+++ james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java \
Sun Nov 29 15:46:08 2015 @@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.indexer;
 
+import com.google.common.base.Optional;
 import com.google.common.collect.Iterables;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -80,18 +81,16 @@ public class ReIndexerImpl<Id extends Ma
 
     public void reIndex() throws MailboxException {
         MailboxSession mailboxSession = \
mailboxManager.createSystemSession("re-indexing", LOGGER); +        \
                LOGGER.info("Starting a full reindex");
         List<MailboxPath> mailboxPaths = mailboxManager.list(mailboxSession);
         GlobalRegistration globalRegistration = new GlobalRegistration();
         mailboxManager.addGlobalListener(globalRegistration, mailboxSession);
         try {
-            for (MailboxPath mailboxPath : mailboxPaths) {
-                if (globalRegistration.pathNeedsIndexing(mailboxPath)) {
-                    reIndex(mailboxPath, mailboxSession);
-                }
-            }
+            handleFullReindexingIterations(mailboxPaths, globalRegistration);
         } finally {
             mailboxManager.removeGlobalListener(globalRegistration, mailboxSession);
         }
+        LOGGER.info("Full reindex finished");
     }
 
     private void reIndex(MailboxPath path, MailboxSession mailboxSession) throws \
MailboxException { @@ -101,7 +100,7 @@ public class ReIndexerImpl<Id extends Ma
         messageSearchIndex.delete(mailboxSession, mailbox, MessageRange.all());
         mailboxManager.addListener(path, mailboxRegistration, mailboxSession);
         try {
-            handleIterations(mailboxSession,
+            handleMailboxIndexingIterations(mailboxSession,
                 mailboxRegistration,
                 mailbox,
                 mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
@@ -115,7 +114,20 @@ public class ReIndexerImpl<Id extends Ma
         }
     }
 
-    private void handleIterations(MailboxSession mailboxSession, MailboxRegistration \
mailboxRegistration, Mailbox<Id> mailbox, Iterator<Message<Id>> iterator) throws \
MailboxException { +    private void handleFullReindexingIterations(List<MailboxPath> \
mailboxPaths, GlobalRegistration globalRegistration) throws MailboxException { +      \
for (MailboxPath mailboxPath : mailboxPaths) { +            Optional<MailboxPath> \
pathToIndex = globalRegistration.getPathToIndex(mailboxPath); +            if \
(pathToIndex.isPresent()) { +                try {
+                    reIndex(pathToIndex.get());
+                } catch(Throwable e) {
+                    LOGGER.error("Error while proceeding to full reindexing on {}", \
pathToIndex.get(), e); +                }
+            }
+        }
+    }
+
+    private void handleMailboxIndexingIterations(MailboxSession mailboxSession, \
MailboxRegistration mailboxRegistration, Mailbox<Id> mailbox, Iterator<Message<Id>> \
iterator) throws MailboxException {  while (iterator.hasNext()) {
             Message<Id> message = iterator.next();
             ImpactingMessageEvent impactingMessageEvent = \
findMostRelevant(mailboxRegistration.getImpactingEvents(message.getUid()));

Modified: james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/FlagsMessageEvent.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/main/java/org/a \
pache/james/mailbox/indexer/events/FlagsMessageEvent.java?rev=1717083&r1=1717082&r2=1717083&view=diff
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/FlagsMessageEvent.java \
                (original)
+++ james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/FlagsMessageEvent.java \
Sun Nov 29 15:46:08 2015 @@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.indexer.events;
 
+import com.google.common.base.Objects;
 import org.apache.james.mailbox.model.MailboxPath;
 
 import javax.mail.Flags;
@@ -53,4 +54,18 @@ public class FlagsMessageEvent implement
     public Flags getFlags() {
         return flags;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || getClass() != o.getClass()) return false;
+        FlagsMessageEvent that = (FlagsMessageEvent) o;
+        return Objects.equal(uid, that.uid) &&
+            Objects.equal(mailboxPath, that.mailboxPath) &&
+            Objects.equal(flags, that.flags);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(uid, mailboxPath, flags);
+    }
 }

Modified: james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/MessageDeletedEvent.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/main/java/org/a \
pache/james/mailbox/indexer/events/MessageDeletedEvent.java?rev=1717083&r1=1717082&r2=1717083&view=diff
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/MessageDeletedEvent.java \
                (original)
+++ james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/events/MessageDeletedEvent.java \
Sun Nov 29 15:46:08 2015 @@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.indexer.events;
 
+import com.google.common.base.Objects;
 import org.apache.james.mailbox.model.MailboxPath;
 
 public class MessageDeletedEvent implements ImpactingMessageEvent {
@@ -45,4 +46,16 @@ public class MessageDeletedEvent impleme
     public ImpactingEventType getType() {
         return ImpactingEventType.Deletion;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || getClass() != o.getClass()) return false;
+        MessageDeletedEvent that = (MessageDeletedEvent) o;
+        return Objects.equal(uid, that.uid) && Objects.equal(mailboxPath, \
that.mailboxPath); +    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(uid, mailboxPath);
+    }
 }

Modified: james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistration.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/main/java/org/a \
pache/james/mailbox/indexer/registrations/GlobalRegistration.java?rev=1717083&r1=1717082&r2=1717083&view=diff
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistration.java \
                (original)
+++ james/project/trunk/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistration.java \
Sun Nov 29 15:46:08 2015 @@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.indexer.registrations;
 
+import com.google.common.base.Optional;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.model.MailboxPath;
 
@@ -26,14 +27,20 @@ import java.util.concurrent.ConcurrentHa
 
 public class GlobalRegistration implements MailboxListener {
 
-    private final ConcurrentHashMap<MailboxPath, Boolean> impactingEvents;
+    private final ConcurrentHashMap<MailboxPath, Boolean> isPathDeleted;
+    private final ConcurrentHashMap<MailboxPath, MailboxPath> nameCorrespondence;
 
     public GlobalRegistration() {
-        this.impactingEvents = new ConcurrentHashMap<MailboxPath, Boolean>();
+        this.isPathDeleted = new ConcurrentHashMap<MailboxPath, Boolean>();
+        this.nameCorrespondence = new ConcurrentHashMap<MailboxPath, MailboxPath>();
     }
 
-    public boolean pathNeedsIndexing(MailboxPath mailboxPath) {
-        return impactingEvents.get(mailboxPath) != null;
+    public Optional<MailboxPath> getPathToIndex(MailboxPath mailboxPath) {
+        if (isPathDeleted.get(mailboxPath) != null) {
+            return Optional.absent();
+        }
+        return Optional.of(
+            Optional.fromNullable(nameCorrespondence.get(mailboxPath)).or(mailboxPath));
  }
 
     @Override
@@ -49,9 +56,9 @@ public class GlobalRegistration implemen
     @Override
     public void event(Event event) {
         if (event instanceof MailboxDeletion) {
-            impactingEvents.put(event.getMailboxPath(), true);
-        } else if (event instanceof Expunged) {
-            impactingEvents.put(event.getMailboxPath(), true);
+            isPathDeleted.put(event.getMailboxPath(), true);
+        } else if (event instanceof MailboxRenamed) {
+            nameCorrespondence.put(event.getMailboxPath(), ((MailboxRenamed) \
event).getNewPath());  }
     }
 }

Added: james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistrationTest.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/test/java/org/a \
pache/james/mailbox/indexer/registrations/GlobalRegistrationTest.java?rev=1717083&view=auto
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistrationTest.java \
                (added)
+++ james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/GlobalRegistrationTest.java \
Sun Nov 29 15:46:08 2015 @@ -0,0 +1,79 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.indexer.registrations;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.common.base.Optional;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.TestId;
+import org.apache.james.mailbox.store.event.EventFactory;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GlobalRegistrationTest {
+
+    public static final MockMailboxSession SESSION = new MockMailboxSession("test");
+    public static final MailboxPath INBOX = new MailboxPath("#private", \
"btellier@apache.org", "INBOX"); +    public static final MailboxPath NEW_PATH = new \
MailboxPath("#private", "btellier@apache.org", "INBOX.new"); +    public static final \
int UID_VALIDITY = 45; +    public static final SimpleMailbox<TestId> MAILBOX = new \
SimpleMailbox<TestId>(INBOX, UID_VALIDITY); +    public static final \
SimpleMailbox<TestId> NEW_MAILBOX = new SimpleMailbox<TestId>(NEW_PATH, \
UID_VALIDITY); +
+    private GlobalRegistration globalRegistration;
+    private EventFactory<TestId> eventFactory;
+
+    @Before
+    public void setUp() {
+        eventFactory = new EventFactory<TestId>();
+        globalRegistration = new GlobalRegistration();
+    }
+
+    @Test
+    public void pathToIndexShouldNotBeChangedByDefault() {
+        assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(INBOX);
+    }
+
+    @Test
+    public void pathToIndexShouldNotBeChangedByAddedEvents() {
+        MailboxListener.Event event = eventFactory.mailboxAdded(SESSION, MAILBOX);
+        globalRegistration.event(event);
+        assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(INBOX);
+    }
+
+    @Test
+    public void pathToIndexShouldBeNullifiedByDeletedEvents() {
+        MailboxListener.Event event = eventFactory.mailboxDeleted(SESSION, MAILBOX);
+        globalRegistration.event(event);
+        assertThat(globalRegistration.getPathToIndex(INBOX)).isEqualTo(Optional.absent());
 +    }
+
+    @Test
+    public void pathToIndexShouldBeModifiedByRenamedEvents() {
+        MailboxListener.Event event = eventFactory.mailboxRenamed(SESSION, INBOX, \
NEW_MAILBOX); +        globalRegistration.event(event);
+        assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(NEW_PATH);
 +    }
+
+
+}

Added: james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java
                
URL: http://svn.apache.org/viewvc/james/project/trunk/mailbox/tool/src/test/java/org/a \
pache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java?rev=1717083&view=auto
 ==============================================================================
--- james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java \
                (added)
+++ james/project/trunk/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/registrations/MailboxRegistrationTest.java \
Sun Nov 29 15:46:08 2015 @@ -0,0 +1,96 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.indexer.registrations;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.common.collect.Lists;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.indexer.events.FlagsMessageEvent;
+import org.apache.james.mailbox.indexer.events.MessageDeletedEvent;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.MessageMetaData;
+import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.store.SimpleMessageMetaData;
+import org.apache.james.mailbox.store.TestId;
+import org.apache.james.mailbox.store.event.EventFactory;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.mail.Flags;
+import java.util.Date;
+import java.util.TreeMap;
+
+public class MailboxRegistrationTest {
+
+    public static final MailboxPath INBOX = new MailboxPath("#private", \
"btellier@apache.org", "INBOX"); +    public static final Long UID = 18L;
+    public static final int UID_VALIDITY = 45;
+    public static final SimpleMailbox<TestId> MAILBOX = new \
SimpleMailbox<TestId>(INBOX, UID_VALIDITY); +    public static final \
MockMailboxSession SESSION = new MockMailboxSession("test"); +    public static final \
int MOD_SEQ = 21; +    public static final int SIZE = 41;
+    public static final Flags NEW_FLAGS = new Flags(Flags.Flag.ANSWERED);
+    private MailboxRegistration mailboxRegistration;
+    private EventFactory<TestId> eventFactory;
+
+    @Before
+    public void setUp() {
+        eventFactory = new EventFactory<TestId>();
+        mailboxRegistration = new MailboxRegistration(INBOX);
+    }
+
+    @Test
+    public void reportedEventsShouldBeInitiallyEmpty() {
+        assertThat(mailboxRegistration.getImpactingEvents(UID)).isEmpty();
+    }
+
+
+    @Test
+    public void AddedEventsShouldNotBeReported() {
+        TreeMap<Long, MessageMetaData> treeMap = new TreeMap<Long, \
MessageMetaData>(); +        treeMap.put(UID, new SimpleMessageMetaData(UID, MOD_SEQ, \
new Flags(), SIZE, new Date())); +        MailboxListener.Event event = \
eventFactory.added(SESSION, treeMap, MAILBOX); +        \
mailboxRegistration.event(event); +        \
assertThat(mailboxRegistration.getImpactingEvents(UID)).isEmpty(); +    }
+
+    @Test
+    public void ExpungedEventsShouldBeReported() {
+        TreeMap<Long, MessageMetaData> treeMap = new TreeMap<Long, \
MessageMetaData>(); +        treeMap.put(UID, new SimpleMessageMetaData(UID, MOD_SEQ, \
new Flags(), SIZE, new Date())); +        MailboxListener.Event event = \
eventFactory.expunged(SESSION, treeMap, MAILBOX); +        \
mailboxRegistration.event(event); +        \
assertThat(mailboxRegistration.getImpactingEvents(UID)).containsExactly(new \
MessageDeletedEvent(INBOX, UID)); +    }
+
+    @Test
+    public void FlagsEventsShouldBeReported() {
+        MailboxListener.Event event = eventFactory.flagsUpdated(SESSION,
+            Lists.newArrayList(UID),
+            MAILBOX,
+            Lists.newArrayList(new UpdatedFlags(UID, MOD_SEQ, new Flags(), \
NEW_FLAGS))); +        mailboxRegistration.event(event);
+        assertThat(mailboxRegistration.getImpactingEvents(UID)).containsExactly(new \
FlagsMessageEvent(INBOX, UID, NEW_FLAGS)); +    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic