/* * 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); } }