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