Author: rdonkin
Date: Fri Nov  9 10:48:09 2007
New Revision: 593622

URL: http://svn.apache.org/viewvc?rev=593622&view=rev
Log:
Prepared for FETCH ENVELOPE implementation by replacing Headers with Header.

Added:
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResultUtils.java
    james/server/trunk/core-library/src/test/java/org/
    james/server/trunk/core-library/src/test/java/org/apache/
    james/server/trunk/core-library/src/test/java/org/apache/james/
    
james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/
    
james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/MessageResultUtilsTest.java
Modified:
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResult.java
    
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/MessageResultImpl.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
    
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/FetchCommand.java
    
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java

Modified: 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResult.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResult.java?rev=593622&r1=593621&r2=593622&view=diff
==============================================================================
--- 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResult.java
 (original)
+++ 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResult.java
 Fri Nov  9 10:48:09 2007
@@ -20,6 +20,7 @@
 package org.apache.james.mailboxmanager;
 
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 
 import javax.mail.Flags;
@@ -141,42 +142,29 @@
     
     /**
      * Gets headers for the message.
-     * @return <code>Headers</code>, 
+     * @return <code>Header</code> <code>Iterator</code>, 
      * or null if [EMAIL PROTECTED] #HEADERS} was not fetched
      */
-    Headers getHeaders();
+    Iterator iterateHeaders();
     
     /**
-     * Details of the mail headers for this result.
+     * A header.
      */
-    public interface Headers {
-        /**
-         * Gets all header lines.
-         * @return <code>List</code> of <code>String</code> header lines,
-         * in their natural order
-         * @throws MessagingException
-         */
-        List getAllLines() throws MessagingException;
+    public interface Header extends Content{
         
         /**
-         * Gets header lines whose header names matches (ignoring case)
-         * any of those given.
-         * @param names header names to be matched, not null
-         * @return <code>List</code> of <code>String</code> header lines,
-         * in their natural order
-         * @throws MessagingException
+         * Gets the name of this header.
+         * @return name of this header
+         * @throws MessagingException 
          */
-        List getMatchingLines(String[] names) throws MessagingException;
+        public String getName() throws MessagingException;
         
         /**
-         * Gets header lines whose header name fails to match (ignoring case)
-         * all of the given names.
-         * @param names header names, not null
-         * @return <code>List</code> of <code>String</code> header lines,
-         * in their natural order
+         * Gets the (unparsed) value of this header.
+         * @return value of this header
          * @throws MessagingException
          */
-        List getOtherLines(String[] names) throws MessagingException;
+        public String getValue() throws MessagingException;
     }
     
     /**

Added: 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResultUtils.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResultUtils.java?rev=593622&view=auto
==============================================================================
--- 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResultUtils.java
 (added)
+++ 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/MessageResultUtils.java
 Fri Nov  9 10:48:09 2007
@@ -0,0 +1,108 @@
+/****************************************************************
+ * 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.mailboxmanager;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.mail.MessagingException;
+
+import org.apache.commons.collections.IteratorUtils;
+
+public class MessageResultUtils {
+
+    /**
+     * Gets all header lines.
+     * @param iterator [EMAIL PROTECTED] MessageResult.Header} 
<code>Iterator</code>
+     * @return <code>List</code> of <code>MessageResult.Header<code>'s,
+     * in their natural order
+     * 
+     * @throws MessagingException
+     */
+    public static List getAll(final Iterator iterator) throws 
MessagingException {
+        List results = IteratorUtils.toList(iterator);
+        return results;
+    }
+    
+    /**
+     * Gets header lines whose header names matches (ignoring case)
+     * any of those given.
+     * @param names header names to be matched, not null
+     * @param iterator [EMAIL PROTECTED] MessageResult.Header} 
<code>Iterator</code>
+     * @return <code>List</code> of <code>MessageResult.Header</code>'s,
+     * in their natural order
+     * @throws MessagingException
+     */
+    public static List getMatching(final String[] names, final Iterator 
iterator) throws MessagingException {
+        final List results = new ArrayList(20);
+        if (iterator != null) {
+            while(iterator.hasNext()) {
+                MessageResult.Header header = (MessageResult.Header) 
iterator.next();
+                final String headerName = header.getName();
+                if (headerName != null) {
+                    final int length = names.length;
+                    for (int i=0;i<length;i++) {
+                        final String name = names[i];
+                        if (headerName.equalsIgnoreCase(name)) {
+                            results.add(header);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return results;
+    }
+    
+    /**
+     * Gets header lines whose header name fails to match (ignoring case)
+     * all of the given names.
+     * @param names header names, not null
+     * @param iterator [EMAIL PROTECTED] MessageResult.Header} 
<code>Iterator</code>
+     * @return <code>List</code> of <code>@MessageResult.Header</code>'s,
+     * in their natural order
+     * @throws MessagingException
+     */
+    public static List getNotMatching(final String[] names, final Iterator 
iterator) throws MessagingException {
+        final List results = new ArrayList(20);
+        if (iterator != null) {
+            while(iterator.hasNext()) {
+                MessageResult.Header header = (MessageResult.Header) 
iterator.next();
+                final String headerName = header.getName();
+                if (headerName != null) {
+                    final int length = names.length;
+                    boolean match = false;
+                    for (int i=0;i<length;i++) {
+                        final String name = names[i];
+                        if (headerName.equalsIgnoreCase(name)) {
+                            match = true;
+                            break;
+                        }
+                    }
+                    if (!match) {
+                        results.add(header);
+                    }
+                }
+            }
+        }
+        return results;
+    }
+}

Modified: 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/MessageResultImpl.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/MessageResultImpl.java?rev=593622&r1=593621&r2=593622&view=diff
==============================================================================
--- 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/MessageResultImpl.java
 (original)
+++ 
james/server/trunk/core-library/src/main/java/org/apache/james/mailboxmanager/impl/MessageResultImpl.java
 Fri Nov  9 10:48:09 2007
@@ -20,6 +20,8 @@
 package org.apache.james.mailboxmanager.impl;
 
 import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -37,7 +39,7 @@
     private int size;
     private Date internalDate;
     private String key;
-    private Headers headers;
+    private List headers;
     private Content messageBody;
     private Content fullMessage;
     
@@ -187,11 +189,15 @@
         this.key=key;
     }
 
-    public Headers getHeaders() {
+    public Iterator iterateHeaders() {
+        return headers.iterator();
+    }
+    
+    public List getHeaders() {
         return headers;
     }
 
-    public void setHeaders(Headers headers) {
+    public void setHeaders(List headers) {
         this.headers = headers;
     }
 

Added: 
james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/MessageResultUtilsTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/MessageResultUtilsTest.java?rev=593622&view=auto
==============================================================================
--- 
james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/MessageResultUtilsTest.java
 (added)
+++ 
james/server/trunk/core-library/src/test/java/org/apache/james/mailboxmanager/MessageResultUtilsTest.java
 Fri Nov  9 10:48:09 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.mailboxmanager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.mail.MessagingException;
+
+import junit.framework.TestCase;
+
+public class MessageResultUtilsTest extends TestCase {
+
+    private static final String[] NAMES = {"One", "Three"};
+    
+    Header headerOne;
+    Header headerTwo;
+    Header headerThree;
+    List headers;
+    
+    private static class Header implements MessageResult.Header {
+
+        public String name;
+        public String value;
+        
+        public Header(String name) {
+            this.name = name;
+            value = "Value";
+        }
+        
+        public long size() throws MessagingException {
+            return 0;
+        }
+
+        public void writeTo(StringBuffer buffer) throws MessagingException {
+        }
+        
+        public String getName() {
+            return name;
+        }
+
+        public String getValue() {
+            return value;
+        }
+        
+    }
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        headerOne = new Header("One");
+        headerTwo = new Header("Two");
+        headerThree = new Header("Three");
+        headers = new ArrayList();
+        headers.add(headerOne);
+        headers.add(headerTwo);
+        headers.add(headerThree);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testGetAllContent() throws Exception {
+        List results = MessageResultUtils.getAll(headers.iterator());
+        assertEquals(3, results.size());
+        assertEquals(headerOne, results.get(0));
+        assertEquals(headerTwo, results.get(1));
+        assertEquals(headerThree, results.get(2));
+    }
+
+    public void testGetMatching() throws Exception {
+        
+        List results = MessageResultUtils.getMatching(NAMES, 
headers.iterator());
+        assertEquals(2, results.size());
+        assertEquals(headerOne, results.get(0));
+        assertEquals(headerThree, results.get(1));
+    }
+
+    public void testGetNotMatching() throws Exception {
+        
+        List results = MessageResultUtils.getNotMatching(NAMES, 
headers.iterator());
+        assertEquals(1, results.size());
+        assertEquals(headerTwo, results.get(0));
+    }
+}

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java?rev=593622&r1=593621&r2=593622&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
 Fri Nov  9 10:48:09 2007
@@ -19,8 +19,6 @@
 
 package org.apache.james.imapserver.processor.imap4rev1;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -28,7 +26,6 @@
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapConstants;
@@ -43,8 +40,6 @@
 import 
org.apache.james.api.imap.message.response.imap4rev1.StatusResponseFactory;
 import org.apache.james.api.imap.process.ImapProcessor;
 import org.apache.james.api.imap.process.ImapSession;
-import org.apache.james.api.imap.process.ImapProcessor.Responder;
-import org.apache.james.core.MimeMessageWrapper;
 import org.apache.james.imap.message.request.imap4rev1.FetchRequest;
 import org.apache.james.imap.message.response.imap4rev1.legacy.FetchResponse;
 import org.apache.james.imapserver.codec.encode.EncoderUtils;
@@ -56,11 +51,9 @@
 import org.apache.james.mailboxmanager.GeneralMessageSet;
 import org.apache.james.mailboxmanager.MailboxManagerException;
 import org.apache.james.mailboxmanager.MessageResult;
+import org.apache.james.mailboxmanager.MessageResultUtils;
 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 {
 
@@ -286,20 +279,20 @@
             addLiteralContent(fullMessage, response);
         }
         else if ( sectionSpecifier.equalsIgnoreCase( "HEADER" ) ) {
-            final MessageResult.Headers headers = result.getHeaders();
-            List lines = headers.getAllLines();
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getAll(headers);
             addHeaders( lines, response );
         }
         else if ( sectionSpecifier.startsWith( "HEADER.FIELDS.NOT " ) ) {
             String[] excludeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS.NOT ".length() );
-            final MessageResult.Headers headers = result.getHeaders();
-            List lines = headers.getOtherLines(excludeNames);
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getMatching(excludeNames, headers);
             addHeaders( lines, response );
         }
         else if ( sectionSpecifier.startsWith( "HEADER.FIELDS " ) ) {
             String[] includeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS ".length() );
-            final MessageResult.Headers headers = result.getHeaders();
-            List lines = headers.getMatchingLines(includeNames);
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getMatching(includeNames, headers);
             addHeaders( lines, response );
         } else if (sectionSpecifier.equalsIgnoreCase("MIME")) {
             // TODO implement
@@ -367,12 +360,12 @@
         return (String[]) strings.toArray(new String[0]);
     }
 
-    private void addHeaders( List headerLines, StringBuffer response )
+    private void addHeaders( List headerLines, StringBuffer response ) throws 
MessagingException
     {
         int count = 0;
         for (final Iterator it=headerLines.iterator();it.hasNext();) {
-            String line = (String) it.next();
-            count += line.length() + 2;
+            MessageResult.Header header = (MessageResult.Header) it.next();
+            count += header.size() + 2;
         }
         response.append( '{' );
         response.append( count + 2 );
@@ -380,8 +373,8 @@
         response.append("\r\n");
 
         for (final Iterator it=headerLines.iterator();it.hasNext();) {
-            String line = (String) it.next();
-            response.append(line);
+            MessageResult.Header header = (MessageResult.Header) it.next();
+            header.writeTo(response);
             response.append("\r\n");
         }
         response.append("\r\n");

Modified: 
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/FetchCommand.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/FetchCommand.java?rev=593622&r1=593621&r2=593622&view=diff
==============================================================================
--- 
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/FetchCommand.java
 (original)
+++ 
james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/commands/FetchCommand.java
 Fri Nov  9 10:48:09 2007
@@ -19,11 +19,8 @@
 
 package org.apache.james.imapserver.commands;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -31,10 +28,8 @@
 
 import javax.mail.Flags;
 import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
 
 import org.apache.james.api.imap.message.MessageFlags;
-import org.apache.james.core.MimeMessageWrapper;
 import org.apache.james.imapserver.ImapRequestLineReader;
 import org.apache.james.imapserver.ImapResponse;
 import org.apache.james.imapserver.ImapSession;
@@ -44,13 +39,12 @@
 import org.apache.james.mailboxmanager.GeneralMessageSet;
 import org.apache.james.mailboxmanager.MailboxManagerException;
 import org.apache.james.mailboxmanager.MessageResult;
+import org.apache.james.mailboxmanager.MessageResultUtils;
 import org.apache.james.mailboxmanager.MessageResult.Content;
 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;
-
 /**
  * Handles processeing for the FETCH imap command.
  *
@@ -221,17 +215,20 @@
             addLiteralContent(fullMessage, response);
         }
         else if ( sectionSpecifier.equalsIgnoreCase( "HEADER" ) ) {
-            final List lines = result.getHeaders().getAllLines();
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getAll(headers);
             addHeaders( lines, response );
         }
         else if ( sectionSpecifier.startsWith( "HEADER.FIELDS.NOT " ) ) {
             String[] excludeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS.NOT ".length() );
-            final List lines = result.getHeaders().getOtherLines( excludeNames 
);
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getMatching(excludeNames, headers);
             addHeaders( lines, response );
         }
         else if ( sectionSpecifier.startsWith( "HEADER.FIELDS " ) ) {
             String[] includeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS ".length() );
-            final List lines = result.getHeaders().getMatchingLines( 
includeNames );
+            final Iterator headers = result.iterateHeaders();
+            List lines = MessageResultUtils.getMatching(includeNames, headers);
             addHeaders( lines, response );
         }
         else if ( sectionSpecifier.equalsIgnoreCase( "MIME" ) ) {
@@ -295,12 +292,12 @@
         return (String[]) strings.toArray(new String[0]);
     }
 
-    private void addHeaders( final List headers, final StringBuffer response )
+    private void addHeaders( final List headers, final StringBuffer response ) 
throws MessagingException
     {
         int count = 0;
         for (final Iterator it=headers.iterator();it.hasNext();) {
-            final String line = (String) it.next();
-            count += line.length() + 2;
+            final MessageResult.Header header = (MessageResult.Header) 
it.next();
+            count += header.size() + 2;
         }
 
         response.append( '{' );
@@ -309,8 +306,8 @@
         response.append("\r\n");
 
         for (final Iterator it=headers.iterator();it.hasNext();) {
-            final String line = (String) it.next();
-            response.append( line );
+            final MessageResult.Header line = (MessageResult.Header) it.next();
+            line.writeTo(response);
             response.append( "\r\n" );
         }
         response.append("\r\n");

Modified: 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=593622&r1=593621&r2=593622&view=diff
==============================================================================
--- 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 (original)
+++ 
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
 Fri Nov  9 10:48:09 2007
@@ -373,21 +373,19 @@
         private final List headers;
         private final long size;
         
-        public FullContent(final byte[] contents, final List headers) {
+        public FullContent(final byte[] contents, final List headers) throws 
MessagingException {
             this.contents =  contents;
             this.headers = headers;
             this.size = caculateSize();
         }
 
-        private long caculateSize(){
+        private long caculateSize() throws MessagingException{
             long result = contents.length + 
MessageUtils.countUnnormalLines(contents);
             result += 2;
             for (final Iterator it=headers.iterator(); it.hasNext();) {
-                final String line = (String) it.next();
-                if (line != null) {
-                    // we don't know the appropriate encoding for the headers
-                    // TODO: sort out on entry (if possible)
-                    result += line.getBytes().length;
+                final MessageResult.Header header = (MessageResult.Header) 
it.next();
+                if (header != null) {
+                    result += header.size();
                     result += 2;
                 }
             }
@@ -396,14 +394,9 @@
 
         public void writeTo(StringBuffer buffer) throws MessagingException {
             for (final Iterator it=headers.iterator(); it.hasNext();) {
-                final String line = (String) it.next();
-                if (line != null) {
-                    // we don't know the appropriate encoding for the headers
-                    // TODO: sort out on entry (if possible)
-                    byte[] bytes = line.getBytes();
-                    for (int i=0;i<bytes.length;i++) {
-                        buffer.append((char) bytes[i]);
-                    }
+                final MessageResult.Header header = (MessageResult.Header) 
it.next();
+                if (header != null) {
+                    header.writeTo(buffer);
                 }
                 buffer.append('\r');
                 buffer.append('\n');
@@ -418,14 +411,13 @@
         }
     }
 
-    private Content createFullContent(final MessageRow messageRow, 
MessageResult.Headers headers) throws TorqueException, MessagingException {
+    private Content createFullContent(final MessageRow messageRow, List 
headers) throws TorqueException, MessagingException {
         if (headers == null) {
             headers = createHeaders(messageRow);
         }
         final MessageBody body = (MessageBody) 
messageRow.getMessageBodys().get(0);
         final byte[] bytes = body.getBody();
-        final List lines = headers.getAllLines();
-        final FullContent results = new FullContent(bytes, lines);
+        final FullContent results = new FullContent(bytes, headers);
         return results;
     }
     
@@ -454,7 +446,7 @@
         }
     } 
     
-    private MessageResult.Headers createHeaders(MessageRow messageRow) throws 
TorqueException {
+    private List createHeaders(MessageRow messageRow) throws TorqueException {
         final List headers=messageRow.getMessageHeaders();
         Collections.sort(headers, new Comparator() {
 
@@ -463,56 +455,53 @@
             }
             
         });
-        final MessageResult.Headers results = new HeaderRows(headers);
+        
+        final List results = new ArrayList(headers.size());
+        for (Iterator it=headers.iterator();it.hasNext();) {
+            final MessageHeader messageHeader = (MessageHeader) it.next();
+            final Header header = new Header(messageHeader);
+            results.add(header);
+        }
         return results;
     }
-
-    private static final class HeaderRows implements MessageResult.Headers {
-        private static final String[] EMPTY_STRING_ARRAY={};
-        private final List messageHeaders;
-        public HeaderRows(final List messageHeaders) {
-            this.messageHeaders = messageHeaders;
-        }
+    
+    private static final class Header implements MessageResult.Header, 
MessageResult.Content {
+        private final String name;
+        private final String value;
+        private final long size;
         
-        public List getAllLines() throws MessagingException {
-            final ArrayList results = new ArrayList(messageHeaders.size());
-            int i = 0;
-            for (final Iterator it = 
messageHeaders.iterator();it.hasNext();i++) {
-                MessageHeader header = (MessageHeader) it.next();
-                final String line = toHeaderLine(header);
-                results.add(line);
-            }
-            return results;
+        public Header(final MessageHeader header) {
+            this.name = header.getField();
+            this.value = header.getValue();
+            size = name.length() + value.length() + 2;
         }
         
-        private String toHeaderLine(MessageHeader header) {
-            return header.getField() + ": " + header.getValue();
+        public Content getContent() throws MessagingException {
+            return this;
         }
-        
-        public List getMatchingLines(String[] names) throws MessagingException 
{
-            final ArrayList results = new ArrayList(messageHeaders.size());
-            for (final Iterator it = messageHeaders.iterator();it.hasNext();) {
-                MessageHeader header = (MessageHeader) it.next();
-                for (int i=0;i<names.length;i++) {
-                    if (names[i].equalsIgnoreCase(header.getField())) {
-                        results.add(toHeaderLine(header));
-                    }
-                }
-            }
-            return results;
+
+        public String getName() throws MessagingException {
+            return name;
         }
-        
-        public List getOtherLines(String[] names) throws MessagingException {
-            final ArrayList results = new ArrayList(messageHeaders.size());
-            for (final Iterator it = messageHeaders.iterator();it.hasNext();) {
-                MessageHeader header = (MessageHeader) it.next();
-                for (int i=0;i<names.length;i++) {
-                    if (!names[i].equalsIgnoreCase(header.getField())) {
-                        results.add(toHeaderLine(header));
-                    }
-                }
+
+        public String getValue() throws MessagingException {
+            return value;
+        }
+
+        public long size() throws MessagingException {
+            return size;
+        }
+
+        public void writeTo(StringBuffer buffer) throws MessagingException {
+// TODO: sort out encoding
+            for (int i=0; i<name.length();i++) {
+                buffer.append((char)(byte) name.charAt(i));
+            }
+            buffer.append(':');
+            buffer.append(' ');
+            for (int i=0; i<value.length();i++) {
+                buffer.append((char)(byte) value.charAt(i));
             }
-            return results;
         }
         
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to