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 import sun.security.provider.Sun; 029 030 /** 031 * A representation of an RFC1036 Internet newsgroup address. 032 * 033 * @version $Rev: 467553 $ $Date: 2006-10-25 00:01:51 -0400 (Wed, 25 Oct 2006) $ 034 */ 035 public class NewsAddress extends Address { 036 /** 037 * The host for this newsgroup 038 */ 039 protected String host; 040 041 /** 042 * The name of this newsgroup 043 */ 044 protected String newsgroup; 045 046 public NewsAddress() { 047 } 048 049 public NewsAddress(String newsgroup) { 050 this.newsgroup = newsgroup; 051 } 052 053 public NewsAddress(String newsgroup, String host) { 054 this.newsgroup = newsgroup; 055 this.host = host; 056 } 057 058 /** 059 * The type of this address; always "news". 060 * @return "news" 061 */ 062 public String getType() { 063 return "news"; 064 } 065 066 public void setNewsgroup(String newsgroup) { 067 this.newsgroup = newsgroup; 068 } 069 070 public String getNewsgroup() { 071 return newsgroup; 072 } 073 074 public void setHost(String host) { 075 this.host = host; 076 } 077 078 public String getHost() { 079 return host; 080 } 081 082 public String toString() { 083 // Sun impl only appears to return the newsgroup name, no host. 084 return newsgroup; 085 } 086 087 public boolean equals(Object o) { 088 if (this == o) return true; 089 if (!(o instanceof NewsAddress)) return false; 090 091 final NewsAddress newsAddress = (NewsAddress) o; 092 093 if (host != null ? !host.equals(newsAddress.host) : newsAddress.host != null) return false; 094 if (newsgroup != null ? !newsgroup.equals(newsAddress.newsgroup) : newsAddress.newsgroup != null) return false; 095 096 return true; 097 } 098 099 public int hashCode() { 100 int result; 101 result = (host != null ? host.toLowerCase().hashCode() : 0); 102 result = 29 * result + (newsgroup != null ? newsgroup.hashCode() : 0); 103 return result; 104 } 105 106 /** 107 * Parse a comma-spearated list of addresses. 108 * 109 * @param addresses the list to parse 110 * @return the array of extracted addresses 111 * @throws AddressException if one of the addresses is invalid 112 */ 113 public static NewsAddress[] parse(String addresses) throws AddressException { 114 List result = new ArrayList(); 115 StringTokenizer tokenizer = new StringTokenizer(addresses, ","); 116 while (tokenizer.hasMoreTokens()) { 117 String address = tokenizer.nextToken().trim(); 118 int index = address.indexOf('@'); 119 if (index == -1) { 120 result.add(new NewsAddress(address)); 121 } else { 122 String newsgroup = address.substring(0, index).trim(); 123 String host = address.substring(index+1).trim(); 124 result.add(new NewsAddress(newsgroup, host)); 125 } 126 } 127 return (NewsAddress[]) result.toArray(new NewsAddress[result.size()]); 128 } 129 130 /** 131 * Convert the supplied addresses to a comma-separated String. 132 * If addresses is null, returns null; if empty, returns an empty string. 133 * 134 * @param addresses the addresses to convert 135 * @return a comma-separated list of addresses 136 */ 137 public static String toString(Address[] addresses) { 138 if (addresses == null) { 139 return null; 140 } 141 if (addresses.length == 0) { 142 return ""; 143 } 144 145 StringBuffer result = new StringBuffer(addresses.length * 32); 146 result.append(addresses[0]); 147 for (int i = 1; i < addresses.length; i++) { 148 result.append(',').append(addresses[i].toString()); 149 } 150 return result.toString(); 151 } 152 }