Package com.caucho.web.webmail

Source Code of com.caucho.web.webmail.MboxArchive

/*
* Copyright (c) 1998-2001 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT.  See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*   Free SoftwareFoundation, Inc.
*   59 Temple Place, Suite 330
*   Boston, MA 02111-1307  USA
*
* @author Scott Ferguson
*/

package com.caucho.web.webmail;

import com.caucho.vfs.Path;
import com.caucho.vfs.ReadStream;
import com.caucho.vfs.WriteStream;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public class MboxArchive {
  private Path path;

  private ArrayList threads;
  private ArrayList messages;

  public MboxArchive(Path path)
    throws IOException
  {
    this.path = path;
  }

  public ArrayList getThreads()
  {
    return threads;
  }

  public ArrayList getMessages()
  {
    return messages;
  }

  public void analyzeMessages()
    throws IOException
  {
    threads = new ArrayList();
    messages = new ArrayList();

    int count = 0;
    HashMap map = new HashMap();
    HashMap subjectMap = new HashMap();

    ReadStream rawIs = path.openRead();
    MboxStream mboxStream = new MboxStream(rawIs);
    ReadStream message;

    while ((message = mboxStream.openRead()) != null) {
      MboxMessage msg = new MboxMessage(count++);

      String id = (String) message.getAttribute("Message-Id");

      id = normalizeMessageId(id);
     
      msg.setMessageId(id);
     
      msg.setFrom((String) message.getAttribute("From"));
      String subject = (String) message.getAttribute("Subject");
      msg.setSubject(subject);

      messages.add(msg);

      String inReplyTo = (String) message.getAttribute("In-Reply-To");

      inReplyTo = normalizeMessageId(inReplyTo);

      MboxMessage parent = null;
      if (inReplyTo != null)
        parent = (MboxMessage) map.get(inReplyTo);

      if (parent == null)
        parent = getParentBySubject(subjectMap, subject);

      if (parent != null)
        msg.setParent(parent);
      else
        threads.add(msg);
         
      map.put(id, msg);
      setParentBySubject(subjectMap, subject, msg);
    }

    rawIs.close();
  }

  private void generateThread(WriteStream os, MboxMessage threadHeader)
  {
   
  }

  private String normalizeMessageId(String id)
  {
    if (id == null)
      return id;

    int start = id.indexOf(id, '<');
    if (start < 0)
      return id;
   
    int end = id.indexOf(id, '>');
    if (end < start)
      return id;

    return id.substring(start, end);
  }

  private MboxMessage getParentBySubject(Map subjectMap, String subject)
  {
    if (subject == null || subject.equals(""))
      return null;

    MboxMessage message = (MboxMessage) subjectMap.get(subject);
    if (message != null)
      return message;

    while (subject.length() > 4) {
      String prefix = subject.substring(0, 4).toLowerCase(Locale.ENGLISH);
     
      if (! prefix.equals("re: ") && ! prefix.equals("aw: "))
        return null;

      subject = subject.substring(4);

      message = (MboxMessage) subjectMap.get(subject);
      if (message != null)
        return message;
    }

    return null;
  }

  private void setParentBySubject(Map subjectMap, String subject,
                                  MboxMessage message)
  {
    if (subject == null || subject.equals(""))
      return;

    while (subject.length() > 4) {
      String prefix = subject.substring(0, 4).toLowerCase(Locale.ENGLISH);
     
      if (! prefix.equals("re: ") && ! prefix.equals("aw: ")) {
        subjectMap.put(subject, message);
        return;
      }

      subject = subject.substring(4);
    }

    if (subject == null || subject.equals(""))
      return;

    subjectMap.put(subject, message);
  }
}
TOP

Related Classes of com.caucho.web.webmail.MboxArchive

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.