You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/04/12 21:30:18 UTC
svn commit: r1091555 -
/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
Author: norman
Date: Tue Apr 12 19:30:18 2011
New Revision: 1091555
URL: http://svn.apache.org/viewvc?rev=1091555&view=rev
Log:
Send "heartbeats" during COPY. This only works at with OioIMAPServer, so its just a workaround yet. See IMAP-296
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java?rev=1091555&r1=1091554&r2=1091555&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java Tue Apr 12 19:30:18 2011
@@ -21,14 +21,21 @@ package org.apache.james.imap.processor;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
import javax.mail.Flags;
import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapSessionState;
import org.apache.james.imap.api.ImapSessionUtils;
import org.apache.james.imap.api.display.HumanReadableText;
import org.apache.james.imap.api.message.IdRange;
import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.imap.api.message.response.StatusResponse;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.api.process.ImapSession;
@@ -45,6 +52,10 @@ import org.apache.james.mailbox.MessageR
public class CopyProcessor extends AbstractMailboxProcessor<CopyRequest> {
+ private ScheduledExecutorService heartbeatService = Executors.newScheduledThreadPool(10);
+ private final static String COPY_HEARTBEAT_FUTURE = "COPY_HEARTBEAT_FUTURE";
+ private final static int COPY_HEARTBEAT_INTERVAL = 30;
+
public CopyProcessor(final ImapProcessor next,
final MailboxManager mailboxManager,
final StatusResponseFactory factory) {
@@ -55,8 +66,8 @@ public class CopyProcessor extends Abstr
* (non-Javadoc)
* @see org.apache.james.imap.processor.AbstractMailboxProcessor#doProcess(org.apache.james.imap.api.message.request.ImapRequest, org.apache.james.imap.api.process.ImapSession, java.lang.String, org.apache.james.imap.api.ImapCommand, org.apache.james.imap.api.process.ImapProcessor.Responder)
*/
- protected void doProcess(CopyRequest request, ImapSession session,
- String tag, ImapCommand command, Responder responder) {
+ protected void doProcess(CopyRequest request, final ImapSession session,
+ String tag, ImapCommand command, final Responder responder) {
final MailboxPath targetMailbox = buildFullPath(session, request.getMailboxName());
final IdRange[] idSet = request.getIdSet();
final boolean useUids = request.isUseUids();
@@ -65,11 +76,30 @@ public class CopyProcessor extends Abstr
final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
final MailboxManager mailboxManager = getMailboxManager();
final boolean mailboxExists = mailboxManager.mailboxExists(targetMailbox, mailboxSession);
-
+
if (!mailboxExists) {
no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX,
ResponseCode.tryCreate());
} else {
+ // Send heartbeats during COPY. See IMAP-296
+ final ScheduledFuture<?> future = heartbeatService.scheduleWithFixedDelay(new Runnable() {
+
+ public void run() {
+ if (ImapSessionState.LOGOUT.equals(session.getState())) {
+ Object o = session.getAttribute(COPY_HEARTBEAT_FUTURE);
+ if (o != null) {
+ ((ScheduledFuture<?>) o).cancel(true);
+ session.setAttribute(COPY_HEARTBEAT_FUTURE, null);
+ }
+
+ } else {
+ StatusResponse response = getStatusResponseFactory().untaggedOk(HumanReadableText.HEARTBEAT);
+ responder.respond(response);
+ }
+ }
+ }, COPY_HEARTBEAT_INTERVAL, COPY_HEARTBEAT_INTERVAL, TimeUnit.SECONDS);
+ session.setAttribute(COPY_HEARTBEAT_FUTURE, future);
+
final MessageManager mailbox = mailboxManager.getMailbox(targetMailbox, mailboxSession);
List<IdRange> resultRanges=new ArrayList<IdRange>();
@@ -97,6 +127,12 @@ public class CopyProcessor extends Abstr
taggedBad(command, tag, responder, HumanReadableText.INVALID_MESSAGESET);
} catch (MailboxException e) {
no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+ } finally {
+ Object o = session.getAttribute(COPY_HEARTBEAT_FUTURE);
+ if (o != null) {
+ ((ScheduledFuture<?>) o).cancel(true);
+ session.setAttribute(COPY_HEARTBEAT_FUTURE, null);
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org