001 /**
002 *
003 * Copyright 2003-2006 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package javax.mail.internet;
019
020 import java.util.ArrayList;
021 import java.util.List;
022 import java.util.StringTokenizer;
023
024 import javax.mail.Address;
025
026 import sun.security.provider.Sun;
027
028 /**
029 * A representation of an RFC1036 Internet newsgroup address.
030 *
031 * @version $Rev: 421852 $ $Date: 2006-07-14 03:02:19 -0700 (Fri, 14 Jul 2006) $
032 */
033 public class NewsAddress extends Address {
034 /**
035 * The host for this newsgroup
036 */
037 protected String host;
038
039 /**
040 * The name of this newsgroup
041 */
042 protected String newsgroup;
043
044 public NewsAddress() {
045 }
046
047 public NewsAddress(String newsgroup) {
048 this.newsgroup = newsgroup;
049 }
050
051 public NewsAddress(String newsgroup, String host) {
052 this.newsgroup = newsgroup;
053 this.host = host;
054 }
055
056 /**
057 * The type of this address; always "news".
058 * @return "news"
059 */
060 public String getType() {
061 return "news";
062 }
063
064 public void setNewsgroup(String newsgroup) {
065 this.newsgroup = newsgroup;
066 }
067
068 public String getNewsgroup() {
069 return newsgroup;
070 }
071
072 public void setHost(String host) {
073 this.host = host;
074 }
075
076 public String getHost() {
077 return host;
078 }
079
080 public String toString() {
081 // Sun impl only appears to return the newsgroup name, no host.
082 return newsgroup;
083 }
084
085 public boolean equals(Object o) {
086 if (this == o) return true;
087 if (!(o instanceof NewsAddress)) return false;
088
089 final NewsAddress newsAddress = (NewsAddress) o;
090
091 if (host != null ? !host.equals(newsAddress.host) : newsAddress.host != null) return false;
092 if (newsgroup != null ? !newsgroup.equals(newsAddress.newsgroup) : newsAddress.newsgroup != null) return false;
093
094 return true;
095 }
096
097 public int hashCode() {
098 int result;
099 result = (host != null ? host.toLowerCase().hashCode() : 0);
100 result = 29 * result + (newsgroup != null ? newsgroup.hashCode() : 0);
101 return result;
102 }
103
104 /**
105 * Parse a comma-spearated list of addresses.
106 *
107 * @param addresses the list to parse
108 * @return the array of extracted addresses
109 * @throws AddressException if one of the addresses is invalid
110 */
111 public static NewsAddress[] parse(String addresses) throws AddressException {
112 List result = new ArrayList();
113 StringTokenizer tokenizer = new StringTokenizer(addresses, ",");
114 while (tokenizer.hasMoreTokens()) {
115 String address = tokenizer.nextToken().trim();
116 int index = address.indexOf('@');
117 if (index == -1) {
118 result.add(new NewsAddress(address));
119 } else {
120 String newsgroup = address.substring(0, index).trim();
121 String host = address.substring(index+1).trim();
122 result.add(new NewsAddress(newsgroup, host));
123 }
124 }
125 return (NewsAddress[]) result.toArray(new NewsAddress[result.size()]);
126 }
127
128 /**
129 * Convert the supplied addresses to a comma-separated String.
130 * If addresses is null, returns null; if empty, returns an empty string.
131 *
132 * @param addresses the addresses to convert
133 * @return a comma-separated list of addresses
134 */
135 public static String toString(Address[] addresses) {
136 if (addresses == null) {
137 return null;
138 }
139 if (addresses.length == 0) {
140 return "";
141 }
142
143 StringBuffer result = new StringBuffer(addresses.length * 32);
144 result.append(addresses[0]);
145 for (int i = 1; i < addresses.length; i++) {
146 result.append(',').append(addresses[i].toString());
147 }
148 return result.toString();
149 }
150 }