Author: norman
Date: Wed Mar 23 11:28:26 2011
New Revision: 1084542
URL: http://svn.apache.org/viewvc?rev=1084542&view=rev
Log:
Make sure UIDL/STAT/LIST commands are still work in a consistent way when more
the one client connections to the same mailbox. See JAMES-1202
Added:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/DeleCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -44,6 +44,7 @@ public class DeleCmdHandler implements C
* mailbox.
*
*/
+ @SuppressWarnings("unchecked")
public Response onCommand(POP3Session session, Request request) {
POP3Response response = null;
if (session.getHandlerState() == POP3Session.TRANSACTION) {
@@ -55,10 +56,10 @@ public class DeleCmdHandler implements C
return response;
}
try {
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
- Long uid = uidList.get(num -1);
+ Long uid = uidList.get(num -1).getUid();
if (deletedUidList.contains(uid)) {
StringBuilder responseBuffer =
@@ -68,7 +69,7 @@ public class DeleCmdHandler implements C
.append(") already deleted.");
response = new
POP3Response(POP3Response.ERR_RESPONSE,responseBuffer.toString());
} else {
- deletedUidList.add(uid);
+ deletedUidList.add(uid);
// we are replacing our reference with "DELETED", so we
have
// to dispose the no-more-referenced mail object.
response = new
POP3Response(POP3Response.OK_RESPONSE,"Message deleted");
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -21,15 +21,8 @@ package org.apache.james.pop3server.core
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import java.util.List;
-import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.util.FetchGroupImpl;
import org.apache.james.pop3server.POP3Response;
import org.apache.james.pop3server.POP3Session;
import org.apache.james.protocols.api.CommandHandler;
@@ -50,59 +43,46 @@ public class ListCmdHandler implements C
* the first argument parsed by the parseCommand method
*/
+ @SuppressWarnings("unchecked")
public Response onCommand(POP3Session session, Request request) {
POP3Response response = null;
String parameters = request.getArgument();
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
- MailboxSession mailboxSession = (MailboxSession)
session.getState().get(POP3Session.MAILBOX_SESSION);
if (session.getHandlerState() == POP3Session.TRANSACTION) {
if (parameters == null) {
- try {
- long size = 0;
- int count = 0;
- List<MessageResult> validResults = new
ArrayList<MessageResult>();
-
- if (uidList.isEmpty() == false) {
- Iterator<MessageResult> results;
- if (uidList.size() > 1) {
- results =
session.getUserMailbox().getMessages(MessageRange.range(uidList.get(0),
uidList.get(uidList.size() - 1)), new FetchGroupImpl(FetchGroup.MINIMAL),
mailboxSession);
- } else {
- results =
session.getUserMailbox().getMessages(MessageRange.one(uidList.get(0)), new
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
- }
-
- while (results.hasNext()) {
- MessageResult result = results.next();
- if (deletedUidList.contains(result.getUid()) ==
false) {
- size += result.getSize();
- count++;
- validResults.add(result);
- }
+ long size = 0;
+ int count = 0;
+ List<MessageMetaData> validResults = new
ArrayList<MessageMetaData>();
+ if (uidList.isEmpty() == false) {
+
+ for (int i = 0; i < uidList.size(); i++) {
+ MessageMetaData data = uidList.get(i);
+ if (deletedUidList.contains(data.getUid()) == false) {
+ size += data.getSize();
+ count++;
+ validResults.add(data);
}
}
- StringBuilder responseBuffer = new
StringBuilder(32).append(count).append(" ").append(size);
- response = new POP3Response(POP3Response.OK_RESPONSE,
responseBuffer.toString());
- count = 0;
- for (int i = 0; i < validResults.size(); i++) {
- responseBuffer = new StringBuilder(16).append(i +
1).append(" ").append(validResults.get(i).getSize());
- response.appendLine(responseBuffer.toString());
-
- }
- response.appendLine(".");
- } catch (MailboxException me) {
- response = new POP3Response(POP3Response.ERR_RESPONSE);
}
+ StringBuilder responseBuffer = new
StringBuilder(32).append(count).append(" ").append(size);
+ response = new POP3Response(POP3Response.OK_RESPONSE,
responseBuffer.toString());
+ count = 0;
+ for (int i = 0; i < validResults.size(); i++) {
+ responseBuffer = new StringBuilder(16).append(i +
1).append(" ").append(validResults.get(i).getSize());
+ response.appendLine(responseBuffer.toString());
+ }
+ response.appendLine(".");
} else {
int num = 0;
try {
num = Integer.parseInt(parameters);
- Long uid = uidList.get(num - 1);
- if (deletedUidList.contains(uid) == false) {
- Iterator<MessageResult> results =
session.getUserMailbox().getMessages(MessageRange.one(uid), new
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
-
- StringBuilder responseBuffer = new
StringBuilder(64).append(num).append(" ").append(results.next().getSize());
+ MessageMetaData data = uidList.get(num - 1);
+ if (deletedUidList.contains(data.getUid()) == false) {
+
+ StringBuilder responseBuffer = new
StringBuilder(64).append(num).append(" ").append(data.getSize());
response = new POP3Response(POP3Response.OK_RESPONSE,
responseBuffer.toString());
} else {
StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
@@ -114,9 +94,7 @@ public class ListCmdHandler implements C
} catch (NumberFormatException nfe) {
StringBuilder responseBuffer = new
StringBuilder(64).append(parameters).append(" is not a valid number");
response = new POP3Response(POP3Response.ERR_RESPONSE,
responseBuffer.toString());
- } catch (MailboxException me) {
- response = new POP3Response(POP3Response.ERR_RESPONSE);
- }
+ }
}
} else {
response = new POP3Response(POP3Response.ERR_RESPONSE);
Added:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java?rev=1084542&view=auto
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
(added)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/MessageMetaData.java
Wed Mar 23 11:28:26 2011
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.pop3server.core;
+
+
+/**
+ * Hold meta data for a message
+ *
+ *
+ */
+public final class MessageMetaData {
+
+ private long uid;
+ private long size;
+
+ public MessageMetaData(long uid, long size) {
+ this.uid = uid;
+ this.size = size;
+ }
+
+ /**
+ * Return the uid of the message
+ *
+ * @return uid
+ */
+ public long getUid() {
+ return uid;
+ }
+
+ /**
+ * Return the size of a message
+ *
+ * @return size
+ */
+ public long getSize() {
+ return size;
+ }
+}
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import java.util.NoSuchElementException;
import org.apache.james.mailbox.Content;
import org.apache.james.mailbox.InputStreamContent;
@@ -55,6 +56,7 @@ public class RetrCmdHandler implements C
* retrieves a particular mail message from the mailbox.
*
*/
+ @SuppressWarnings("unchecked")
public Response onCommand(POP3Session session, Request request) {
POP3Response response = null;
String parameters = request.getArgument();
@@ -67,35 +69,41 @@ public class RetrCmdHandler implements C
return response;
}
try {
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
MailboxSession mailboxSession = (MailboxSession)
session.getState().get(POP3Session.MAILBOX_SESSION);
- Long uid = uidList.get(num - 1);
+ Long uid = uidList.get(num - 1).getUid();
if (deletedUidList.contains(uid) == false) {
Iterator<MessageResult> results =
session.getUserMailbox().getMessages(MessageRange.one(uid), new
FetchGroupImpl(FetchGroup.FULL_CONTENT), mailboxSession);
- session.writeStream(new
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message
follows\r\n").getBytes()));
- // response = new POP3Response(POP3Response.OK_RESPONSE,
- // "Message follows");
- try {
+ if (results.hasNext()) {
MessageResult result = results.next();
- Content content = result.getFullContent();
- InputStream in;
- if (content instanceof InputStreamContent) {
- in =((InputStreamContent)
content).getInputStream();
- } else {
- in = createInputStream(content);
+
+ try {
+ session.writeStream(new
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message
follows\r\n").getBytes()));
+ // response = new
POP3Response(POP3Response.OK_RESPONSE,
+ // "Message follows");
+ Content content = result.getFullContent();
+ InputStream in;
+ if (content instanceof InputStreamContent) {
+ in =((InputStreamContent)
content).getInputStream();
+ } else {
+ in = createInputStream(content);
+ }
+ //session.writeStream(new ExtraDotInputStream(in));
+ session.writeStream(new ExtraDotInputStream(new
CRLFTerminatedInputStream(in)));
+
+ } finally {
+ // write a single dot to mark message as complete
+ session.writeStream(new
ByteArrayInputStream(".\r\n".getBytes()));
}
- //session.writeStream(new ExtraDotInputStream(in));
- session.writeStream(new ExtraDotInputStream(new
CRLFTerminatedInputStream(in)));
- } finally {
- // write a single dot to mark message as complete
- session.writeStream(new
ByteArrayInputStream(".\r\n".getBytes()));
+ return null;
+ } else {
+ StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+ response = new POP3Response(POP3Response.ERR_RESPONSE,
responseBuffer.toString());
}
-
- return null;
} else {
StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
@@ -108,6 +116,9 @@ public class RetrCmdHandler implements C
} catch (IndexOutOfBoundsException iob) {
StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
response = new POP3Response(POP3Response.ERR_RESPONSE,
responseBuffer.toString());
+ } catch (NoSuchElementException e) {
+ StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+ response = new POP3Response(POP3Response.ERR_RESPONSE,
responseBuffer.toString());
}
} else {
response = new POP3Response(POP3Response.ERR_RESPONSE);
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -69,10 +69,12 @@ public class RsetCmdHandler implements C
try {
MailboxSession mailboxSession = (MailboxSession)
session.getState().get(POP3Session.MAILBOX_SESSION);
- List<Long> uids = new ArrayList<Long>();
+ List<MessageMetaData> uids = new ArrayList<MessageMetaData>();
Iterator<MessageResult> it =
session.getUserMailbox().getMessages(MessageRange.all(), new
FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession);
while (it.hasNext()) {
- uids.add(it.next().getUid());
+ MessageResult result = it.next();
+ uids.add(new MessageMetaData(result.getUid(),
result.getSize()));
+
}
session.getState().put(POP3Session.UID_LIST, uids);
session.getState().put(POP3Session.DELETED_UID_LIST, new
ArrayList<Long>());
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -21,15 +21,8 @@ package org.apache.james.pop3server.core
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import java.util.List;
-import org.apache.james.mailbox.MailboxException;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.MessageResult.FetchGroup;
-import org.apache.james.mailbox.util.FetchGroupImpl;
import org.apache.james.pop3server.POP3Response;
import org.apache.james.pop3server.POP3Session;
import org.apache.james.protocols.api.CommandHandler;
@@ -47,34 +40,29 @@ public class StatCmdHandler implements C
* of messages in the mailbox and its aggregate size.
*
*/
+ @SuppressWarnings("unchecked")
public Response onCommand(POP3Session session, Request request) {
POP3Response response = null;
if (session.getHandlerState() == POP3Session.TRANSACTION) {
- try {
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
- List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
- long size = 0;
- int count = 0;
- if (uidList.isEmpty() == false) {
- MailboxSession mailboxSession = (MailboxSession)
session.getState().get(POP3Session.MAILBOX_SESSION);
- Iterator<MessageResult> results =
session.getUserMailbox().getMessages(MessageRange.range(uidList.get(0),
uidList.get(uidList.size() - 1)), new FetchGroupImpl(FetchGroup.MINIMAL),
mailboxSession);
-
- List<MessageResult> validResults = new
ArrayList<MessageResult>();
- while (results.hasNext()) {
- MessageResult result = results.next();
- if (deletedUidList.contains(result.getUid()) == false)
{
- size += result.getSize();
- count++;
- validResults.add(result);
- }
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
+ List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
+ long size = 0;
+ int count = 0;
+ if (uidList.isEmpty() == false) {
+ List<MessageMetaData> validResults = new
ArrayList<MessageMetaData>();
+ for (int i = 0; i < uidList.size(); i++) {
+ MessageMetaData data = uidList.get(i);
+ if (deletedUidList.contains(data.getUid()) == false) {
+ size += data.getSize();
+ count++;
+ validResults.add(data);
}
}
- StringBuilder responseBuffer = new
StringBuilder(32).append(count).append(" ").append(size);
- response = new POP3Response(POP3Response.OK_RESPONSE,
responseBuffer.toString());
- } catch (MailboxException me) {
- response = new POP3Response(POP3Response.ERR_RESPONSE);
}
+ StringBuilder responseBuffer = new
StringBuilder(32).append(count).append(" ").append(size);
+ response = new POP3Response(POP3Response.OK_RESPONSE,
responseBuffer.toString());
+
} else {
response = new POP3Response(POP3Response.ERR_RESPONSE);
}
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -31,6 +31,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import java.util.NoSuchElementException;
import org.apache.james.mailbox.Content;
import org.apache.james.mailbox.InputStreamContent;
@@ -89,54 +90,59 @@ public class TopCmdHandler extends RetrC
return response;
}
try {
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
MailboxSession mailboxSession = (MailboxSession)
session.getState().get(POP3Session.MAILBOX_SESSION);
- Long uid = uidList.get(num - 1);
+ Long uid = uidList.get(num - 1).getUid();
if (deletedUidList.contains(uid) == false) {
FetchGroupImpl fetchGroup = new
FetchGroupImpl(FetchGroup.BODY_CONTENT);
fetchGroup.or(FetchGroup.HEADERS);
Iterator<MessageResult> results =
session.getUserMailbox().getMessages(MessageRange.one(uid), fetchGroup,
mailboxSession);
- session.writeStream(new
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message
follows\r\n").getBytes()));
- try {
+ if (results.hasNext()) {
MessageResult result = results.next();
+
+ session.writeStream(new
ByteArrayInputStream((POP3Response.OK_RESPONSE + " Message
follows\r\n").getBytes()));
+ try {
- ByteArrayOutputStream headersOut = new
ByteArrayOutputStream();
- WritableByteChannel headersChannel =
Channels.newChannel(headersOut);
+ ByteArrayOutputStream headersOut = new
ByteArrayOutputStream();
+ WritableByteChannel headersChannel =
Channels.newChannel(headersOut);
- // write headers
- Iterator<Header> headers = result.headers();
- while (headers.hasNext()) {
- headers.next().writeTo(headersChannel);
-
- // we need to write out the CRLF after each header
+ // write headers
+ Iterator<Header> headers = result.headers();
+ while (headers.hasNext()) {
+ headers.next().writeTo(headersChannel);
+
+ // we need to write out the CRLF after each
header
+
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
+ }
+ // headers and body are seperated by a CRLF
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
-
- }
- // headers and body are seperated by a CRLF
-
headersChannel.write(ByteBuffer.wrap("\r\n".getBytes()));
- session.writeStream(new
ByteArrayInputStream(headersOut.toByteArray()));
+ session.writeStream(new
ByteArrayInputStream(headersOut.toByteArray()));
- InputStream bodyIn;
- Content content = result.getBody();
- if (content instanceof InputStreamContent) {
- bodyIn = ((InputStreamContent)
content).getInputStream();
- } else {
- bodyIn = createInputStream(content);
+ InputStream bodyIn;
+ Content content = result.getBody();
+ if (content instanceof InputStreamContent) {
+ bodyIn = ((InputStreamContent)
content).getInputStream();
+ } else {
+ bodyIn = createInputStream(content);
+ }
+ // write body
+ session.writeStream(new
CountingBodyInputStream(new CRLFTerminatedInputStream(bodyIn), lines));
+
+ } finally {
+ // write a single dot to mark message as complete
+ session.writeStream(new
ByteArrayInputStream(".\r\n".getBytes()));
+
}
- // write body
- session.writeStream(new CountingBodyInputStream(new
CRLFTerminatedInputStream(bodyIn), lines));
- } finally {
- // write a single dot to mark message as complete
- session.writeStream(new
ByteArrayInputStream(".\r\n".getBytes()));
-
+ return null;
+ } else {
+ StringBuilder exceptionBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+ response = new POP3Response(POP3Response.ERR_RESPONSE,
exceptionBuffer.toString());
}
-
- return null;
-
+
} else {
StringBuilder responseBuffer = new
StringBuilder(64).append("Message (").append(num).append(") already deleted.");
response = new POP3Response(POP3Response.ERR_RESPONSE,
responseBuffer.toString());
@@ -148,8 +154,9 @@ public class TopCmdHandler extends RetrC
} catch (IndexOutOfBoundsException iob) {
StringBuilder exceptionBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
response = new POP3Response(POP3Response.ERR_RESPONSE,
exceptionBuffer.toString());
- } catch (Exception e) {
- e.printStackTrace();
+ } catch (NoSuchElementException iob) {
+ StringBuilder exceptionBuffer = new
StringBuilder(64).append("Message (").append(num).append(") does not exist.");
+ response = new POP3Response(POP3Response.ERR_RESPONSE,
exceptionBuffer.toString());
}
} else {
response = new POP3Response(POP3Response.ERR_RESPONSE);
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
(original)
+++
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
Wed Mar 23 11:28:26 2011
@@ -40,17 +40,18 @@ public class UidlCmdHandler implements C
* of message ids to the client.
*
*/
+ @SuppressWarnings("unchecked")
public Response onCommand(POP3Session session, Request request) {
POP3Response response = null;
String parameters = request.getArgument();
if (session.getHandlerState() == POP3Session.TRANSACTION) {
- List<Long> uidList = (List<Long>)
session.getState().get(POP3Session.UID_LIST);
+ List<MessageMetaData> uidList = (List<MessageMetaData>)
session.getState().get(POP3Session.UID_LIST);
List<Long> deletedUidList = (List<Long>)
session.getState().get(POP3Session.DELETED_UID_LIST);
if (parameters == null) {
response = new POP3Response(POP3Response.OK_RESPONSE,
"unique-id listing follows");
for (int i = 0; i < uidList.size(); i++) {
- Long uid = uidList.get(i);
+ Long uid = uidList.get(i).getUid();
if (deletedUidList.contains(uid) == false) {
StringBuilder responseBuffer = new
StringBuilder(64).append(i + 1).append(" ").append(uid);
response.appendLine(responseBuffer.toString());
@@ -62,7 +63,7 @@ public class UidlCmdHandler implements C
int num = 0;
try {
num = Integer.parseInt(parameters);
- Long uid = uidList.get(num - 1);
+ Long uid = uidList.get(num - 1).getUid();
if (deletedUidList.contains(uid) == false) {
StringBuilder responseBuffer = new
StringBuilder(64).append(num).append(" ").append(uid.hashCode());
Modified:
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java?rev=1084542&r1=1084541&r2=1084542&view=diff
==============================================================================
---
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
(original)
+++
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
Wed Mar 23 11:28:26 2011
@@ -491,6 +491,89 @@ public class POP3ServerTest extends Test
manager.deleteMailbox(mailboxPath, session);
}
+
+ // Test for JAMES-1202
+ // This was failing before as the more then one connection to the same
mailbox was not handled the right way
+ public void testStatUidlListTwoConnections() throws Exception {
+ finishSetUp(m_testConfiguration);
+
+ m_pop3Protocol = new POP3Client();
+ m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+ m_usersRepository.addUser("foo2", "bar2");
+
+ MailboxPath mailboxPath = new
MailboxPath(MailboxConstants.USER_NAMESPACE, "foo2", "INBOX");
+ MailboxSession session = manager.login("foo2", "bar2",
LoggerFactory.getLogger("Test"));
+
+ if (manager.mailboxExists(mailboxPath, session) == false) {
+ manager.createMailbox(mailboxPath, session);
+ }
+
+ int msgCount = 100;
+ for (int i = 0; i < msgCount;i++) {
+ manager.getMailbox(mailboxPath, session).appendMessage(new
ByteArrayInputStream(("Subject: test\r\n\r\n" +i).getBytes()), new Date(),
session, true, new Flags());
+ }
+
+ m_pop3Protocol.login("foo2", "bar2");
+ assertEquals(1, m_pop3Protocol.getState());
+
+ POP3MessageInfo[] listEntries = m_pop3Protocol.listMessages();
+ POP3MessageInfo[] uidlEntries = m_pop3Protocol.listUniqueIdentifiers();
+ POP3MessageInfo statInfo = m_pop3Protocol.status();
+ assertEquals(msgCount, listEntries.length);
+ assertEquals(msgCount, uidlEntries.length);
+ assertEquals(msgCount, statInfo.number);
+
+ POP3Client m_pop3Protocol2 = new POP3Client();
+ m_pop3Protocol2.connect("127.0.0.1",m_pop3ListenerPort);
+ m_pop3Protocol2.login("foo2", "bar2");
+ assertEquals(1, m_pop3Protocol2.getState());
+
+ POP3MessageInfo[] listEntries2 = m_pop3Protocol2.listMessages();
+ POP3MessageInfo[] uidlEntries2 =
m_pop3Protocol2.listUniqueIdentifiers();
+ POP3MessageInfo statInfo2 = m_pop3Protocol2.status();
+ assertEquals(msgCount, listEntries2.length);
+ assertEquals(msgCount, uidlEntries2.length);
+ assertEquals(msgCount, statInfo2.number);
+
+ m_pop3Protocol.deleteMessage(1);
+ listEntries = m_pop3Protocol.listMessages();
+ uidlEntries = m_pop3Protocol.listUniqueIdentifiers();
+ statInfo = m_pop3Protocol.status();
+ assertEquals(msgCount - 1, listEntries.length);
+ assertEquals(msgCount - 1, uidlEntries.length);
+ assertEquals(msgCount - 1, statInfo.number);
+
+
+ // even after the message was deleted it should get displayed in the
second connection
+ listEntries2 = m_pop3Protocol2.listMessages();
+ uidlEntries2 = m_pop3Protocol2.listUniqueIdentifiers();
+ statInfo2 = m_pop3Protocol2.status();
+ assertEquals(msgCount, listEntries2.length);
+ assertEquals(msgCount, uidlEntries2.length);
+ assertEquals(msgCount, statInfo2.number);
+
+ assertTrue(m_pop3Protocol.logout());
+ m_pop3Protocol.disconnect();
+
+ // even after the message was deleted and the session was quit it
should get displayed in the second connection
+ listEntries2 = m_pop3Protocol2.listMessages();
+ uidlEntries2 = m_pop3Protocol2.listUniqueIdentifiers();
+ statInfo2 = m_pop3Protocol2.status();
+ assertEquals(msgCount, listEntries2.length);
+ assertEquals(msgCount, uidlEntries2.length);
+ assertEquals(msgCount, statInfo2.number);
+
+ // This both should error and so return null
+ assertNull(m_pop3Protocol2.retrieveMessageTop(1, 100));
+ assertNull(m_pop3Protocol2.retrieveMessage(1));
+
+ m_pop3Protocol2.sendCommand("quit");
+ m_pop3Protocol2.disconnect();
+
+ manager.deleteMailbox(mailboxPath, session);
+ }
+
/*
public void testTwoSimultaneousMails() throws Exception {
finishSetUp(m_testConfiguration);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]