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 rd...@apache.org on 2007/05/13 21:25:44 UTC
svn commit: r537643 [4/4] - in
/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src:
main/java/org/apache/james/experimental/imapserver/
main/java/org/apache/james/experimental/imapserver/decode/
main/java/org/apache/james/experi...
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/FetchProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/FetchProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/FetchProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/FetchProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,356 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.mail.Flags;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.core.MimeMessageWrapper;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapConstants;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.BodyFetchElement;
+import org.apache.james.experimental.imapserver.message.FetchData;
+import org.apache.james.experimental.imapserver.message.FetchResponseMessage;
+import org.apache.james.experimental.imapserver.message.IdRange;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.FetchRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.experimental.imapserver.store.MessageFlags;
+import org.apache.james.experimental.imapserver.store.SimpleMessageAttributes;
+import org.apache.james.mailboxmanager.GeneralMessageSet;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+import org.apache.james.mailboxmanager.MessageResult;
+import org.apache.james.mailboxmanager.impl.GeneralMessageSetImpl;
+import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
+import org.apache.mailet.dates.RFC822DateFormat;
+
+import com.sun.mail.util.CRLFOutputStream;
+
+
+public class FetchProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof FetchRequest) {
+ final FetchRequest request = (FetchRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected FetchRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Fetch processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(FetchRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final boolean useUids = request.isUseUids();
+ final IdRange[] idSet = request.getIdSet();
+ final FetchData fetch = request.getFetch();
+ final ImapResponseMessage result = doProcess(useUids, idSet, fetch, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final boolean useUids, final IdRange[] idSet, final FetchData fetch,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+
+ FetchResponseMessage result =
+ new FetchResponseMessage(command, useUids, tag);
+ // TODO only fetch needed results
+ int resultToFetch = MessageResult.FLAGS | MessageResult.MIME_MESSAGE
+ | MessageResult.INTERNAL_DATE | MessageResult.MSN
+ | MessageResult.SIZE;
+ ImapMailboxSession mailbox = session.getSelected().getMailbox();
+ for (int i = 0; i < idSet.length; i++) {
+ GeneralMessageSet messageSet=GeneralMessageSetImpl.range(idSet[i].getLowVal(),idSet[i].getHighVal(),useUids);
+ MessageResult[] fetchResults;
+ try {
+ fetchResults = mailbox.getMessages(messageSet,resultToFetch);
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+ for (int j = 0; j < fetchResults.length; j++) {
+ String msgData = outputMessage( fetch, fetchResults[j], mailbox, useUids );
+ // TODO: this is inefficient
+ // TODO: stream output upon response
+ result.addMessageData(fetchResults[j].getMsn(), msgData );
+ }
+ }
+ return result;
+ }
+
+
+ private String outputMessage(FetchData fetch, MessageResult result,
+ ImapMailboxSession mailbox, boolean useUids)
+ throws MailboxException, ProtocolException {
+ // Check if this fetch will cause the "SEEN" flag to be set on this
+ // message
+ // If so, update the flags, and ensure that a flags response is included
+ // in the response.
+ try {
+ boolean ensureFlagsResponse = false;
+ if (fetch.isSetSeen()
+ && !result.getFlags().contains(Flags.Flag.SEEN)) {
+ mailbox.setFlags(new Flags(Flags.Flag.SEEN), true, false,
+ GeneralMessageSetImpl.oneUid(result.getUid()), null);
+ result.getFlags().add(Flags.Flag.SEEN);
+ ensureFlagsResponse = true;
+ }
+
+ StringBuffer response = new StringBuffer();
+
+ // FLAGS response
+ if (fetch.isFlags() || ensureFlagsResponse) {
+ response.append(" FLAGS ");
+ response.append(MessageFlags.format(result.getFlags()));
+ }
+
+ // INTERNALDATE response
+ if (fetch.isInternalDate()) {
+ response.append(" INTERNALDATE \"");
+ // TODO format properly
+ response.append(RFC822DateFormat.toString(result
+ .getInternalDate())); // not right format
+ response.append("\"");
+
+ }
+
+ // RFC822.SIZE response
+ if (fetch.isSize()) {
+ response.append(" RFC822.SIZE ");
+ response.append(result.getSize());
+ }
+
+ SimpleMessageAttributes attrs = new SimpleMessageAttributes(result
+ .getMimeMessage(), getLogger());
+
+ // ENVELOPE response
+ if (fetch.isEnvelope()) {
+ response.append(" ENVELOPE ");
+ response.append(attrs.getEnvelope());
+ }
+
+ // BODY response
+ if (fetch.isBody()) {
+ response.append(" BODY ");
+ response.append(attrs.getBodyStructure(false));
+ }
+
+ // BODYSTRUCTURE response
+ if (fetch.isBodyStructure()) {
+ response.append(" BODYSTRUCTURE ");
+ response.append(attrs.getBodyStructure(true));
+ }
+
+ // UID response
+ if (fetch.isUid()) {
+ response.append(" UID ");
+ response.append(result.getUid());
+ }
+
+ // BODY part responses.
+ Collection elements = fetch.getBodyElements();
+ for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
+ BodyFetchElement fetchElement = (BodyFetchElement) iterator
+ .next();
+ response.append(ImapConstants.SP);
+ response.append(fetchElement.getResponseName());
+ response.append(ImapConstants.SP);
+
+ // Various mechanisms for returning message body.
+ String sectionSpecifier = fetchElement.getParameters();
+
+ MimeMessage mimeMessage = result.getMimeMessage();
+ try {
+ handleBodyFetch(mimeMessage, sectionSpecifier, response);
+ } catch (MessagingException e) {
+ throw new MailboxException(e.getMessage(), e);
+ }
+ }
+
+ if (response.length() > 0) {
+ // Remove the leading " ".
+ return response.substring(1);
+ } else {
+ return "";
+ }
+ } catch (MailboxManagerException mme) {
+ throw new MailboxException(mme);
+ } catch (MessagingException me) {
+ throw new MailboxException(me);
+ }
+ }
+
+ private void handleBodyFetch( MimeMessage mimeMessage,
+ String sectionSpecifier,
+ StringBuffer response )
+ throws ProtocolException, MessagingException
+ {
+ if ( sectionSpecifier.length() == 0 ) {
+ // TODO - need to use an InputStream from the response here.
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ try {
+ mimeMessage.writeTo(new CRLFOutputStream(bout));
+ }
+ catch ( IOException e ) {
+ throw new ProtocolException( "Error reading message source", e);
+ }
+ byte[] bytes = bout.toByteArray();
+ addLiteral( bytes, response );
+ // TODO JD maybe we've to add CRLF here
+
+ }
+ else if ( sectionSpecifier.equalsIgnoreCase( "HEADER" ) ) {
+ Enumeration e = mimeMessage.getAllHeaderLines();
+ addHeaders( e, response );
+ }
+ else if ( sectionSpecifier.startsWith( "HEADER.FIELDS.NOT " ) ) {
+ String[] excludeNames = extractHeaderList( sectionSpecifier, "HEADER.FIELDS.NOT ".length() );
+ Enumeration e = mimeMessage.getNonMatchingHeaderLines( excludeNames );
+ addHeaders( e, response );
+ }
+ else if ( sectionSpecifier.startsWith( "HEADER.FIELDS " ) ) {
+ String[] includeNames = extractHeaderList( sectionSpecifier, "HEADER.FIELDS ".length() );
+ Enumeration e = mimeMessage.getMatchingHeaderLines( includeNames );
+ addHeaders( e, response );
+ }
+ else if ( sectionSpecifier.equalsIgnoreCase( "MIME" ) ) {
+ // TODO implement
+ throw new ProtocolException( "MIME not yet implemented." );
+ }
+ else if ( sectionSpecifier.equalsIgnoreCase( "TEXT" ) ) {
+ // TODO - need to use an InputStream from the response here.
+ // TODO - this is a hack. To get just the body content, I'm using a null
+ // input stream to take the headers. Need to have a way of ignoring headers.
+ ByteArrayOutputStream headerOut = new ByteArrayOutputStream();
+ ByteArrayOutputStream bodyOut = new ByteArrayOutputStream();
+ try {
+ // TODO James Trunk : Is this okay?
+ MimeMessageWrapper mmw=new MimeMessageWrapper(mimeMessage);
+
+ mmw.writeTo(headerOut, bodyOut );
+ byte[] bytes = bodyOut.toByteArray();
+
+ addLiteral( bytes, response );
+
+ }
+ catch ( IOException e ) {
+ throw new ProtocolException( "Error reading message source", e);
+ }
+ }
+ else {
+ // Should be a part specifier followed by a section specifier.
+ // See if there's a leading part specifier.
+ // If so, get the number, get the part, and call this recursively.
+ int dotPos = sectionSpecifier.indexOf( '.' );
+ if ( dotPos == -1 ) {
+ throw new ProtocolException( "Malformed fetch attribute: " + sectionSpecifier );
+ }
+ int partNumber = Integer.parseInt( sectionSpecifier.substring( 0, dotPos ) );
+ String partSectionSpecifier = sectionSpecifier.substring( dotPos + 1 );
+
+ // TODO - get the MimePart of the mimeMessage, and call this method
+ // with the new partSectionSpecifier.
+// MimeMessage part;
+// handleBodyFetch( part, partSectionSpecifier, response );
+ throw new ProtocolException( "Mime parts not yet implemented for fetch." );
+ }
+
+ }
+
+ private void addLiteral( byte[] bytes, StringBuffer response )
+ {
+ response.append('{' );
+ response.append( bytes.length ); // TODO JD addLiteral: why was it bytes.length +1 here?
+ response.append( '}' );
+ response.append( "\r\n" );
+
+ for ( int i = 0; i < bytes.length; i++ ) {
+ byte b = bytes[i];
+ response.append((char)b);
+ }
+ }
+
+ // TODO should do this at parse time.
+ private String[] extractHeaderList( String headerList, int prefixLen )
+ {
+ // Remove the trailing and leading ')('
+ String tmp = headerList.substring( prefixLen + 1, headerList.length() - 1 );
+ String[] headerNames = split( tmp, " " );
+ return headerNames;
+ }
+
+ private String[] split(String value, String delimiter) {
+ ArrayList strings = new ArrayList();
+ int startPos = 0;
+ int delimPos;
+ while ( (delimPos = value.indexOf(delimiter, startPos) ) != -1) {
+ String sub = value.substring(startPos, delimPos);
+ strings.add(sub);
+ startPos = delimPos + 1;
+ }
+ String sub = value.substring(startPos);
+ strings.add(sub);
+
+ return (String[]) strings.toArray(new String[0]);
+ }
+
+ private void addHeaders( Enumeration e, StringBuffer response )
+ {
+ List lines = new ArrayList();
+ int count = 0;
+ while (e.hasMoreElements()) {
+ String line = (String)e.nextElement();
+ count += line.length() + 2;
+ lines.add(line);
+ }
+ response.append( '{' );
+ response.append( count + 2 );
+ response.append( '}' );
+ response.append("\r\n");
+
+ Iterator lit = lines.iterator();
+ while (lit.hasNext()) {
+ String line = (String)lit.next();
+ response.append( line );
+ response.append( "\r\n" );
+ }
+ response.append("\r\n");
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/ListProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/ListProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/ListProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/ListProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,69 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapConstants;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.ListResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.ListRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.ListResult;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+import org.apache.james.mailboxmanager.impl.ListResultImpl;
+
+
+public class ListProcessor extends AbstractListingProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof ListRequest) {
+ final ListRequest request = (ListRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected ListRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by List processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(ListRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String baseReferenceName = request.getBaseReferenceName();
+ final String mailboxPatternString = request.getMailboxPattern();
+ final ImapResponseMessage result = doProcess(baseReferenceName, mailboxPatternString, session, tag, command);
+ return result;
+ }
+
+ protected ListResult[] doList( ImapSession session, String base, String pattern ) throws MailboxException {
+ return doList( session, base, pattern, false);
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LoginProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LoginProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LoginProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LoginProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,77 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandCompleteResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandFailedResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.LoginRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.services.User;
+
+
+public class LoginProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof LoginRequest) {
+ final LoginRequest request = (LoginRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected LoginRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Login processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(LoginRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String userid = request.getUserid();
+ final String passwd = request.getPassword();
+ final ImapResponseMessage result = doProcess(userid, passwd, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final String userid, final String password,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ ImapResponseMessage result;
+ if ( session.getUsers().test( userid, password ) ) {
+ User user = session.getUsers().getUserByName( userid );
+ session.setAuthenticated( user );
+ result = CommandCompleteResponseMessage.createWithNoUnsolictedResponses(command, tag);
+ }
+ else {
+ result = new CommandFailedResponseMessage( command, "Invalid login/password", tag );
+ }
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LogoutProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LogoutProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LogoutProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LogoutProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.LogoutResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.LogoutRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+
+
+public class LogoutProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof LogoutRequest) {
+ final LogoutRequest request = (LogoutRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected LogoutRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Logout processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(LogoutRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result = doProcess(session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final LogoutResponseMessage result = new LogoutResponseMessage(command, tag);
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LsubProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LsubProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LsubProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/LsubProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.LsubRequest;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.ListResult;
+
+
+public class LsubProcessor extends AbstractListingProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof LsubRequest) {
+ final LsubRequest request = (LsubRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected LsubRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Lsub processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(LsubRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String baseReferenceName = request.getBaseReferenceName();
+ final String mailboxPatternString = request.getMailboxPattern();
+ final ImapResponseMessage result = doProcess(baseReferenceName, mailboxPatternString, session, tag, command);
+ return result;
+ }
+
+ protected ListResult[] doList( ImapSession session, String base, String pattern ) throws MailboxException {
+ return doList( session, base, pattern, true);
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/NoopProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/NoopProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/NoopProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/NoopProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandCompleteResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.NoopRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+
+
+public class NoopProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof NoopRequest) {
+ final NoopRequest request = (NoopRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected NoopRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Noop processor.");
+ }
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(NoopRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result = doProcess(session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ // TODO: untagged responses?
+ final CommandCompleteResponseMessage result = new CommandCompleteResponseMessage(false, command, tag);
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/RenameProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/RenameProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/RenameProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/RenameProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,75 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandCompleteResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.RenameRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+
+
+public class RenameProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof RenameRequest) {
+ final RenameRequest request = (RenameRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected RenameRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Rename processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(RenameRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String existingName = request.getExistingName();
+ final String newName = request.getNewName();
+ final ImapResponseMessage result = doProcess(existingName, newName, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final String existingName, final String newName,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ try {
+ final String fullExistingName=session.buildFullName(existingName);
+ final String fullNewName=session.buildFullName(newName);
+ session.getMailboxManager().renameMailbox( fullExistingName, fullNewName );
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+
+ return new CommandCompleteResponseMessage(false, command, tag);
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SearchProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SearchProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SearchProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SearchProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,102 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import javax.mail.search.SearchTerm;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapConstants;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.SearchResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.SearchRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+import org.apache.james.mailboxmanager.MessageResult;
+import org.apache.james.mailboxmanager.impl.GeneralMessageSetImpl;
+import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
+
+
+public class SearchProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof SearchRequest) {
+ final SearchRequest request = (SearchRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected SearchRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Search processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(SearchRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final SearchTerm searchTerm = request.getSearchTerm();
+ final boolean useUids = request.isUseUids();
+ final ImapResponseMessage result = doProcess(searchTerm, useUids, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final SearchTerm searchTerm, final boolean useUids,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ ImapMailboxSession mailbox = session.getSelected().getMailbox();
+ final int resultCode;
+ if (useUids) {
+ resultCode= MessageResult.UID;
+ } else {
+ resultCode= MessageResult.MSN;
+ }
+ MessageResult[] messageResults;
+ try {
+ messageResults = mailbox.search(GeneralMessageSetImpl.all(),searchTerm, resultCode);
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+ // TODO: probably more efficient to stream data
+ // TODO: directly to response
+ StringBuffer idList = new StringBuffer();
+ for (int i = 0; i < messageResults.length; i++) {
+ if ( i > 0 ) {
+ idList.append( ImapConstants.SP );
+ }
+ if ( useUids ) {
+ idList.append( messageResults[i].getUid());
+ } else {
+ idList.append( messageResults[i].getMsn());
+ }
+ }
+ final SearchResponseMessage result =
+ new SearchResponseMessage(command, idList.toString(),
+ useUids, tag);
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StatusProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StatusProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StatusProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StatusProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,134 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapConstants;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.StatusDataItems;
+import org.apache.james.experimental.imapserver.message.StatusResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.StatusRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
+
+
+public class StatusProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof StatusRequest) {
+ final StatusRequest request = (StatusRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected StatusRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Status processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(StatusRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String mailboxName = request.getMailboxName();
+ final StatusDataItems statusDataItems = request.getStatusDataItems();
+ final ImapResponseMessage result = doProcess(mailboxName, statusDataItems, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final String mailboxName, final StatusDataItems statusDataItems,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final Logger logger = getLogger();
+
+ // TODO: response should not be prepared in process
+ // TODO: return a transfer object
+ StringBuffer buffer = new StringBuffer( mailboxName );
+ buffer.append( ImapConstants.SP );
+ buffer.append( "(" );
+ try {
+ String fullMailboxName= session.buildFullName(mailboxName);
+
+ if (logger != null && logger.isDebugEnabled()) {
+ logger.debug("Status called on mailbox named " + mailboxName + " (" + fullMailboxName + ")");
+ }
+
+ ImapMailboxSession mailbox = session.getMailboxManager().getImapMailboxSession(fullMailboxName);
+
+ if (statusDataItems.isMessages()) {
+ buffer.append(ImapConstants.STATUS_MESSAGES);
+ buffer.append(ImapConstants.SP);
+
+ buffer.append(mailbox.getMessageCount());
+
+ buffer.append(ImapConstants.SP);
+ }
+
+ if (statusDataItems.isRecent()) {
+ buffer.append(ImapConstants.STATUS_RECENT);
+ buffer.append(ImapConstants.SP);
+ buffer.append(mailbox.getRecentCount(false));
+ buffer.append(ImapConstants.SP);
+ }
+
+ if (statusDataItems.isUidNext()) {
+ buffer.append(ImapConstants.STATUS_UIDNEXT);
+ buffer.append(ImapConstants.SP);
+ buffer.append(mailbox.getUidNext());
+ buffer.append(ImapConstants.SP);
+ }
+
+ if (statusDataItems.isUidValidity()) {
+ buffer.append(ImapConstants.STATUS_UIDVALIDITY);
+ buffer.append(ImapConstants.SP);
+ buffer.append(mailbox.getUidValidity());
+ buffer.append(ImapConstants.SP);
+ }
+
+ if (statusDataItems.isUnseen()) {
+ buffer.append(ImapConstants.STATUS_UNSEEN);
+ buffer.append(ImapConstants.SP);
+ buffer.append(mailbox.getUnseenCount());
+ buffer.append(ImapConstants.SP);
+ }
+ } catch (MailboxManagerException e) {
+ if (logger != null && logger.isDebugEnabled()) {
+ logger.debug("STATUS command failed: ", e);
+ }
+ throw new MailboxException(e);
+ }
+ if ( buffer.charAt( buffer.length() - 1 ) == ' ' ) {
+ buffer.setLength( buffer.length() - 1 );
+ }
+ buffer.append(')');
+ final StatusResponseMessage result =
+ new StatusResponseMessage(command, buffer.toString(), tag);
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StoreProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StoreProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StoreProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/StoreProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import javax.mail.Flags;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.IdRange;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.StoreDirective;
+import org.apache.james.experimental.imapserver.message.StoreResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.StoreRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.GeneralMessageSet;
+import org.apache.james.mailboxmanager.MailboxListener;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+import org.apache.james.mailboxmanager.impl.GeneralMessageSetImpl;
+import org.apache.james.mailboxmanager.mailbox.ImapMailboxSession;
+
+
+public class StoreProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof StoreRequest) {
+ final StoreRequest request = (StoreRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected StoreRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Store processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(StoreRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final IdRange[] idSet = request.getIdSet();
+ final StoreDirective directive = request.getDirective();
+ final Flags flags = request.getFlags();
+ final boolean useUids = request.isUseUids();
+ final ImapResponseMessage result = doProcess(idSet, directive, flags, useUids, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final IdRange[] idSet, final StoreDirective directive,
+ final Flags flags, final boolean useUids,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+
+ ImapMailboxSession mailbox = session.getSelected().getMailbox();
+ MailboxListener silentListener = null;
+
+ final boolean replace;
+ final boolean value;
+ if (directive.getSign() < 0) {
+ value=false;
+ replace=false;
+ }
+ else if (directive.getSign() > 0) {
+ value=true;
+ replace=false;
+ }
+ else {
+ replace=true;
+ value=true;
+ }
+ try {
+ if (directive.isSilent()) {
+ silentListener = session.getSelected().getMailbox();
+ }
+ for (int i = 0; i < idSet.length; i++) {
+ final GeneralMessageSet messageSet = GeneralMessageSetImpl
+ .range(idSet[i].getLowVal(), idSet[i].getHighVal(),
+ useUids);
+
+ mailbox.setFlags(flags, value, replace, messageSet,
+ silentListener);
+ }
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+
+ final StoreResponseMessage result =
+ new StoreResponseMessage(command, useUids, tag);
+ return result;
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SubscribeProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SubscribeProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SubscribeProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/SubscribeProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,72 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandCompleteResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.SubscribeRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+
+
+public class SubscribeProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof SubscribeRequest) {
+ final SubscribeRequest request = (SubscribeRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected SubscribeRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Subscribe processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(SubscribeRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String mailboxName = request.getMailboxName();
+ final ImapResponseMessage result = doProcess(mailboxName, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final String mailboxName,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ try {
+ final String fullMailboxName = session.buildFullName(mailboxName);
+ session.getMailboxManager().setSubscription(fullMailboxName,true);
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+ return new CommandCompleteResponseMessage(false, command, tag);
+ }
+}
Added: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/UnsubscribeProcessor.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/UnsubscribeProcessor.java?view=auto&rev=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/UnsubscribeProcessor.java (added)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/processor/imap4rev1/UnsubscribeProcessor.java Sun May 13 12:25:39 2007
@@ -0,0 +1,72 @@
+/****************************************************************
+ * 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.experimental.imapserver.processor.imap4rev1;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.james.experimental.imapserver.AuthorizationException;
+import org.apache.james.experimental.imapserver.ImapSession;
+import org.apache.james.experimental.imapserver.ProtocolException;
+import org.apache.james.experimental.imapserver.commands.ImapCommand;
+import org.apache.james.experimental.imapserver.message.BadResponseMessage;
+import org.apache.james.experimental.imapserver.message.CommandCompleteResponseMessage;
+import org.apache.james.experimental.imapserver.message.ImapResponseMessage;
+import org.apache.james.experimental.imapserver.message.request.AbstractImapRequest;
+import org.apache.james.experimental.imapserver.message.request.imap4rev1.UnsubscribeRequest;
+import org.apache.james.experimental.imapserver.processor.AbstractImapRequestProcessor;
+import org.apache.james.experimental.imapserver.store.MailboxException;
+import org.apache.james.mailboxmanager.MailboxManagerException;
+
+
+public class UnsubscribeProcessor extends AbstractImapRequestProcessor {
+
+ protected ImapResponseMessage doProcess(AbstractImapRequest message, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final ImapResponseMessage result;
+ if (message instanceof UnsubscribeRequest) {
+ final UnsubscribeRequest request = (UnsubscribeRequest) message;
+ result = doProcess(request, session, tag, command);
+ } else {
+ final Logger logger = getLogger();
+ if (logger != null)
+ {
+ logger.debug("Expected UnsubscribeRequest, was " + message);
+ }
+ result = new BadResponseMessage("Command unknown by Unsubscribe processor.");
+ }
+
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(UnsubscribeRequest request, ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ final String authType = request.getMailboxName();
+ final ImapResponseMessage result = doProcess(authType, session, tag, command);
+ return result;
+ }
+
+ private ImapResponseMessage doProcess(final String mailboxName,
+ ImapSession session, String tag, ImapCommand command) throws MailboxException, AuthorizationException, ProtocolException {
+ try {
+ final String fullMailboxName=session.buildFullName(mailboxName);
+ session.getMailboxManager().setSubscription(fullMailboxName,false);
+ } catch (MailboxManagerException e) {
+ throw new MailboxException(e);
+ }
+ return new CommandCompleteResponseMessage(false, command, tag);
+ }
+}
Modified: james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/test/java/org/apache/james/experimental/imapserver/commands/MockCommand.java
URL: http://svn.apache.org/viewvc/james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/test/java/org/apache/james/experimental/imapserver/commands/MockCommand.java?view=diff&rev=537643&r1=537642&r2=537643
==============================================================================
--- james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/test/java/org/apache/james/experimental/imapserver/commands/MockCommand.java (original)
+++ james/server/sandbox/seda-imap-modular/experimental-seda-imap-function/src/test/java/org/apache/james/experimental/imapserver/commands/MockCommand.java Sun May 13 12:25:39 2007
@@ -3,7 +3,7 @@
import org.apache.james.experimental.imapserver.ImapRequestLineReader;
import org.apache.james.experimental.imapserver.ProtocolException;
import org.apache.james.experimental.imapserver.commands.CommandTemplate;
-import org.apache.james.experimental.imapserver.message.ImapCommandMessage;
+import org.apache.james.experimental.imapserver.message.ImapRequestMessage;
public class MockCommand extends CommandTemplate {
@@ -17,7 +17,7 @@
return NAME;
}
- protected ImapCommandMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException {
+ protected ImapRequestMessage decode(ImapRequestLineReader request, String tag) throws ProtocolException {
// TODO implementation
return null;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org