001 /* 002 * Copyright 2010 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package com.hs.mail.imap.processor.fetch; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 import java.util.Map; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.apache.james.mime4j.field.address.AddressList; 024 import org.apache.james.mime4j.field.address.DomainList; 025 import org.apache.james.mime4j.field.address.Group; 026 import org.apache.james.mime4j.field.address.Mailbox; 027 import org.apache.james.mime4j.field.address.MailboxList; 028 import org.apache.james.mime4j.field.address.parser.ParseException; 029 import org.apache.log4j.Logger; 030 import org.springframework.util.CollectionUtils; 031 032 import com.hs.mail.imap.ImapConstants; 033 034 /** 035 * 036 * @author Won Chul Doh 037 * @since Mar 8, 2010 038 * 039 */ 040 public class EnvelopeBuilder { 041 042 private static Logger logger = Logger.getLogger(EnvelopeBuilder.class); 043 044 public static final String[] WANTED_FIELDS = new String[] { 045 ImapConstants.RFC822_DATE, ImapConstants.RFC822_SUBJECT, 046 ImapConstants.RFC822_FROM, ImapConstants.RFC822_SENDER, 047 ImapConstants.RFC822_REPLY_TO, ImapConstants.RFC822_TO, 048 ImapConstants.RFC822_CC, ImapConstants.RFC822_BCC, 049 ImapConstants.RFC822_IN_REPLY_TO, ImapConstants.RFC822_MESSAGE_ID }; 050 051 public Envelope build(Map<String, String> header) { 052 String date = header.get(ImapConstants.RFC822_DATE); 053 String subject = header.get(ImapConstants.RFC822_SUBJECT); 054 Address[] fromAddresses = buildAddresses(header 055 .get(ImapConstants.RFC822_FROM)); 056 Address[] senderAddresses = buildAddresses(header 057 .get(ImapConstants.RFC822_SENDER), fromAddresses); 058 Address[] replyToAddresses = buildAddresses(header 059 .get(ImapConstants.RFC822_REPLY_TO), fromAddresses); 060 Address[] toAddresses = buildAddresses(header 061 .get(ImapConstants.RFC822_TO)); 062 Address[] ccAddresses = buildAddresses(header 063 .get(ImapConstants.RFC822_CC)); 064 Address[] bccAddresses = buildAddresses(header 065 .get(ImapConstants.RFC822_BCC)); 066 String inReplyTo = header.get(ImapConstants.RFC822_IN_REPLY_TO); 067 String messageId = header.get(ImapConstants.RFC822_MESSAGE_ID); 068 Envelope envelope = new Envelope(date, subject, fromAddresses, 069 senderAddresses, replyToAddresses, toAddresses, ccAddresses, 070 bccAddresses, inReplyTo, messageId); 071 return envelope; 072 } 073 074 private Address[] buildAddresses(String value, Address[] defaults) { 075 Address[] addresses = buildAddresses(value); 076 return (null == addresses) ? defaults : addresses; 077 } 078 079 private Address[] buildAddresses(String value) { 080 try { 081 return buildMailAddresses(value); 082 } catch (ParseException ex) { 083 logger.warn(ex.getMessage()); 084 return null; 085 } 086 } 087 088 private Address[] buildMailAddresses(String value) throws ParseException { 089 if (StringUtils.isEmpty(value)) { 090 return null; 091 } else { 092 AddressList addressList = AddressList.parse(value); 093 int size = addressList.size(); 094 List<Address> addresses = new ArrayList<Address>(size); 095 for (int i = 0; i < size; i++) { 096 org.apache.james.mime4j.field.address.Address address = addressList 097 .get(i); 098 if (address instanceof Group) { 099 addAddresses((Group) address, addresses); 100 } else if (address instanceof Mailbox) { 101 Address mailboxAddress = buildAddress((Mailbox) address); 102 addresses.add(mailboxAddress); 103 } else { 104 logger.warn("Unknown address type"); 105 } 106 } 107 return addresses.toArray(Address.EMPTY); 108 } 109 } 110 111 private void addAddresses(Group group, List<Address> addresses) { 112 String groupName = group.getName(); 113 addresses.add(new Address(null, null, groupName, null)); 114 MailboxList mailboxList = group.getMailboxes(); 115 for (int i = 0; i < mailboxList.size(); i++) { 116 Address mailboxAddress = buildAddress(mailboxList.get(i)); 117 addresses.add(mailboxAddress); 118 } 119 addresses.add(new Address(null, null, null, null)); 120 } 121 122 private Address buildAddress(Mailbox mailbox) { 123 String name = mailbox.getName(); 124 String domain = mailbox.getDomain(); 125 DomainList route = mailbox.getRoute(); 126 String atDomainList; 127 if (CollectionUtils.isEmpty(route)) { 128 atDomainList = null; 129 } else { 130 atDomainList = route.toRouteString(); 131 } 132 String localPart = mailbox.getLocalPart(); 133 return new Address(atDomainList, domain, localPart, name); 134 } 135 136 }