1 21 22 package org.armedbear.j.mail; 23 24 import java.io.Serializable ; 25 import java.util.ArrayList ; 26 import org.armedbear.j.FastStringBuffer; 27 28 public final class MailAddress implements Serializable 29 { 30 private final String personal; 31 private final String encodedPersonal; 32 private final String address; 33 34 public MailAddress(String encodedPersonal, String address) 35 { 36 if (encodedPersonal != null && encodedPersonal.length() > 0) { 37 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 getPersonal() 80 { 81 return personal; 82 } 83 84 public final String getEncodedPersonal() 85 { 86 return encodedPersonal; 87 } 88 89 public final String getAddress() 90 { 91 return address; 92 } 93 94 public String 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 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 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 pattern) 151 { 152 if (personal != null) 153 if (personal.indexOf(pattern) >= 0) 154 return true; if (address != null) 156 if (address.indexOf(pattern) >= 0) 157 return true; return false; 159 } 160 161 public final boolean matchesIgnoreCase(String pattern) 163 { 164 if (personal != null) 165 if (personal.toLowerCase().indexOf(pattern) >= 0) 166 return true; if (address != null) 168 if (address.toLowerCase().indexOf(pattern) >= 0) 169 return true; return false; 171 } 172 173 public final boolean matches(MailAddress a) 174 { 175 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 s) 193 { 194 int index = s.lastIndexOf('<'); 195 if (index >= 0) { 196 String encodedPersonal = s.substring(0, index).trim(); 197 String address = s.substring(index); 198 return new MailAddress(encodedPersonal, address); 199 } 200 index = s.indexOf('('); 201 if (index >= 0) { 202 String 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 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 input) 216 { 217 if (input == null) 218 return null; 219 input = input.trim(); 220 if (input.length() == 0) 221 return null; 222 ArrayList addresses = new ArrayList (); 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 sb.append(c); 238 } else { 239 String 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 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 |