KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > mail > MailAddress


1 /*
2  * MailAddress.java
3  *
4  * Copyright (C) 2000-2003 Peter Graves
5  * $Id: MailAddress.java,v 1.4 2003/08/13 18:25:17 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j.mail;
23
24 import java.io.Serializable JavaDoc;
25 import java.util.ArrayList JavaDoc;
26 import org.armedbear.j.FastStringBuffer;
27
28 public final class MailAddress implements Serializable JavaDoc
29 {
30     private final String JavaDoc personal;
31     private final String JavaDoc encodedPersonal;
32     private final String JavaDoc address;
33
34     public MailAddress(String JavaDoc encodedPersonal, String JavaDoc address)
35     {
36         if (encodedPersonal != null && encodedPersonal.length() > 0) {
37             // Remove enclosing quotes if any.
38
// Handle cases like "'mikol@onebox.com'" where the actual string
39
// is enclosed in both single and double quotes.
40
char c = encodedPersonal.charAt(0);
41             if (c == '"' || c =='\'') {
42                 int length = encodedPersonal.length();
43                 if (length >= 2) {
44                     if (encodedPersonal.charAt(length-1) == c) {
45                         encodedPersonal =
46                             encodedPersonal.substring(1, length-1);
47                         length -= 2;
48                         if (length >= 2) {
49                             c = encodedPersonal.charAt(0);
50                             if (c == '"' || c == '\'') {
51                                 if (encodedPersonal.charAt(length-1) == c) {
52                                     encodedPersonal =
53                                         encodedPersonal.substring(1, length-1);
54                                 }
55                             }
56                         }
57                     }
58                 }
59             }
60             this.encodedPersonal = encodedPersonal.intern();
61             personal = RFC2047.decode(encodedPersonal).trim().intern();
62         } else {
63             this.encodedPersonal = null;
64             personal = null;
65         }
66         if (address != null && address.length() > 0) {
67             if (address.charAt(0) == '<') {
68                 final int length = address.length();
69                 if (length >= 2) {
70                     if (address.charAt(length-1) == '>')
71                         address = address.substring(1, length-1);
72                 }
73             }
74             this.address = address.intern();
75         } else
76             this.address = null;
77     }
78
79     public final String JavaDoc getPersonal()
80     {
81         return personal;
82     }
83
84     public final String JavaDoc getEncodedPersonal()
85     {
86         return encodedPersonal;
87     }
88
89     public final String JavaDoc getAddress()
90     {
91         return address;
92     }
93
94     public String JavaDoc toString()
95     {
96         FastStringBuffer sb = new FastStringBuffer();
97         if (personal != null && personal.length() > 0) {
98             if (personal.indexOf(',') >= 0 || personal.indexOf('.') >= 0) {
99                 sb.append('"');
100                 sb.append(personal);
101                 sb.append('"');
102             } else
103                 sb.append(personal);
104             if (address != null && address.length() > 0) {
105                 sb.append(" <");
106                 sb.append(address);
107                 sb.append('>');
108             }
109         } else if (address != null && address.length() > 0)
110             sb.append(address);
111         return sb.toString();
112     }
113
114     public String JavaDoc toEncodedString()
115     {
116         if (encodedPersonal == null || encodedPersonal.length() == 0)
117             return toString();
118         FastStringBuffer sb = new FastStringBuffer();
119         if (encodedPersonal.indexOf(',') >= 0 || encodedPersonal.indexOf('.') >= 0) {
120             sb.append('"');
121             sb.append(encodedPersonal);
122             sb.append('"');
123         } else
124             sb.append(encodedPersonal);
125         if (address != null && address.length() > 0) {
126             sb.append(" <");
127             sb.append(address);
128             sb.append('>');
129         }
130         return sb.toString();
131     }
132
133     public boolean equals(Object JavaDoc o)
134     {
135         if (this == o)
136             return true;
137         if (o instanceof MailAddress) {
138             MailAddress ma = (MailAddress) o;
139             if (personal != ma.personal)
140                 return false;
141             if (encodedPersonal != ma.encodedPersonal)
142                 return false;
143             if (address != ma.address)
144                 return false;
145             return true;
146         } else
147             return false;
148     }
149
150     public final boolean matches(String JavaDoc pattern)
151     {
152         if (personal != null)
153             if (personal.indexOf(pattern) >= 0)
154                 return true; // Personal name matches.
155
if (address != null)
156             if (address.indexOf(pattern) >= 0)
157                 return true; // Address matches.
158
return false;
159     }
160
161     // Pattern is already lower case.
162
public final boolean matchesIgnoreCase(String JavaDoc pattern)
163     {
164         if (personal != null)
165             if (personal.toLowerCase().indexOf(pattern) >= 0)
166                 return true; // Personal name matches.
167
if (address != null)
168             if (address.toLowerCase().indexOf(pattern) >= 0)
169                 return true; // Address matches.
170
return false;
171     }
172
173     public final boolean matches(MailAddress a)
174     {
175         // Personal name must be exact match.
176
if (personal != null && personal.equals(a.personal))
177             return true;
178         else if (address != null && address.equalsIgnoreCase(a.address))
179             return true;
180         else
181             return false;
182     }
183
184     public final boolean addressMatches(MailAddress a)
185     {
186         if (address != null && address.equalsIgnoreCase(a.address))
187             return true;
188         else
189             return false;
190     }
191
192     public static MailAddress parseAddress(String JavaDoc s)
193     {
194         int index = s.lastIndexOf('<');
195         if (index >= 0) {
196             String JavaDoc encodedPersonal = s.substring(0, index).trim();
197             String JavaDoc address = s.substring(index);
198             return new MailAddress(encodedPersonal, address);
199         }
200         index = s.indexOf('(');
201         if (index >= 0) {
202             String JavaDoc address = s.substring(0, index).trim();
203             if (address.indexOf('@') >= 0) {
204                 int begin = index + 1;
205                 int end = s.indexOf(')', begin);
206                 if (end >= 0) {
207                     String JavaDoc encodedPersonal = s.substring(begin, end).trim();
208                     return new MailAddress(encodedPersonal, address);
209                 }
210             }
211         }
212         return new MailAddress(null, s);
213     }
214
215     public static MailAddress[] parseAddresses(String JavaDoc input)
216     {
217         if (input == null)
218             return null;
219         input = input.trim();
220         if (input.length() == 0)
221             return null;
222         ArrayList JavaDoc addresses = new ArrayList JavaDoc();
223         FastStringBuffer sb = new FastStringBuffer();
224         boolean inQuote = false;
225         final int limit = input.length();
226         for (int i = 0; i < limit; i++) {
227             char c = input.charAt(i);
228             switch (c) {
229                 case '"':
230                     inQuote = !inQuote;
231                     sb.append(c);
232                     break;
233                 case ',':
234                     if (inQuote) {
235                         // A comma inside a quoted string is just an ordinary
236
// character.
237
sb.append(c);
238                     } else {
239                         // Otherwise a comma marks the end of the address.
240
String JavaDoc s = sb.toString().trim();
241                         if (s.length() > 0) {
242                             MailAddress address = parseAddress(s);
243                             if (address != null)
244                                 addresses.add(address);
245                         }
246                         sb.setLength(0);
247                     }
248                     break;
249                 default:
250                     sb.append(c);
251                     break;
252             }
253         }
254         if (sb.length() > 0) {
255             String JavaDoc s = sb.toString().trim();
256             if (s.length() > 0) {
257                 MailAddress address = parseAddress(s);
258                 if (address != null)
259                     addresses.add(address);
260             }
261         }
262         if (addresses.size() == 0)
263             return null;
264         MailAddress[] array = new MailAddress[addresses.size()];
265         return (MailAddress[]) addresses.toArray(array);
266     }
267 }
268
Popular Tags