📄 article.java
字号:
/*
* Article.java
* Copyright (C) 1999 dog <dog@dog.net.uk>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* You may retrieve the latest version of this library from
* http://www.dog.net.uk/knife/
*/
package dog.mail.nntp;
import java.io.*;
import java.util.*;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.*;
/**
* The message class implementing the NNTP mail protocol.
*
* @author dog@dog.net.uk
* @version 1.2
*/
public class Article extends MimeMessage {
/**
* The unique message-id of this message.
*/
protected String messageId;
// Whether the headers for this article were retrieved using xover.
boolean xoverHeaders = false;
/**
* Creates an NNTP message with the specified article number.
*/
protected Article(Newsgroup folder, int msgnum) throws MessagingException {
super(folder, msgnum);
checkNewsrc(folder.newsrcline);
}
/**
* Creates an NNTP message with the specified message-id.
*/
protected Article(Newsgroup folder, String messageId) throws MessagingException {
super(folder, 0);
this.messageId = messageId;
checkNewsrc(folder.newsrcline);
}
// Adds headers retrieved by an xover call to this article.
void addXoverHeaders(InternetHeaders headers) {
this.headers = headers;
xoverHeaders = true;
headers.addHeader("Newsgroups", folder.getName());
}
void checkNewsrc(String newsrcline) throws MessagingException {
if (newsrcline!=null) {
int articlenum = getArticleNumber();
StringTokenizer st = new StringTokenizer(newsrcline, ",");
while (st.hasMoreTokens()) {
String token = st.nextToken();
int hyphenIndex = token.indexOf('-');
if (hyphenIndex>-1) { // range
try {
int lo = Integer.parseInt(token.substring(0, hyphenIndex));
int hi = Integer.parseInt(token.substring(hyphenIndex+1));
if (articlenum>=lo && articlenum<=hi) {
setFlag(Flags.Flag.SEEN, true);
return;
}
} catch (NumberFormatException e) {
}
} else { // single number
try {
int num = Integer.parseInt(token);
if (articlenum==num) {
setFlag(Flags.Flag.SEEN, true);
return;
}
} catch (NumberFormatException e) {
}
}
}
}
}
int getArticleNumber() {
return getMessageNumber();
}
/**
* Returns the message content.
*/
public Object getContent() throws IOException, MessagingException {
if (content==null) content = ((NNTPStore)folder.getStore()).getContent(this);
/*
// check for embedded uuencoded content
BufferedReader reader = new BufferedReader(new InputStreamReader(ByteArrayInputStream(content)));
Hashtable parts = null;
try {
StringBuffer buffer = new StringBuffer();
int count = 1;
for (String line = reader.readLine(); line!=null; line = reader.readLine()) {
if (line.startsWith("begin")) {
StringTokenizer st = new StringTokenizer(line, " ");
if (st.countTokens()==3) {
String ignore = st.nextToken();
int lines = Integer.parseInt(st.nextToken());
String name = st.nextToken();
String contentType = guessContentType(name, count++);
if (contentType!=null) {
parts = new Hashtable();
if (buffer.length>0) {
parts.put("text/plain; partid="+(count++), buffer.toString());
buffer = new StringBuffer();
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
}
}
} else
buffer.append(line);
}
} catch (NumberFormatException e) {
} finally {
reader.close();
}
*/
return super.getContent();
}
String guessContentType(String name, int count) {
String lname = name.toLowerCase();
if (lname.indexOf(".jpg")>-1 || lname.indexOf(".jpeg")>-1)
return "image/jpeg; name=\""+name+"\", partid="+count;
if (lname.indexOf(".gif")>-1)
return "image/gif; name=\""+name+"\", partid="+count;
if (lname.indexOf(".au")>-1)
return "audio/basic; name=\""+name+"\", partid="+count;
return null;
}
/**
* Returns the from address.
*/
public Address[] getFrom() throws MessagingException {
NNTPStore s = (NNTPStore)folder.getStore();
if (xoverHeaders && !s.validateOverviewHeader("From")) headers = null;
if (headers==null) headers = s.getHeaders(this);
Address[] a = getAddressHeader("From");
if (a==null) a = getAddressHeader("Sender");
return a;
}
/**
* Returns the recipients' addresses for the specified RecipientType.
*/
public Address[] getRecipients(RecipientType type) throws MessagingException {
NNTPStore s = (NNTPStore)folder.getStore();
if (xoverHeaders && !s.validateOverviewHeader(getHeaderKey(type))) headers = null;
if (headers==null) headers = s.getHeaders(this);
if (type==RecipientType.NEWSGROUPS) {
String key = getHeader("Newsgroups", ",");
if (key==null) return null;
return NewsAddress.parse(key);
} else {
return getAddressHeader(getHeaderKey(type));
}
}
/**
* Returns all the recipients' addresses.
*/
public Address[] getAllRecipients() throws MessagingException {
if (headers==null || xoverHeaders) headers = ((NNTPStore)folder.getStore()).getHeaders(this);
return super.getAllRecipients();
}
/**
* Returns the reply-to address.
*/
public Address[] getReplyTo() throws MessagingException {
NNTPStore s = (NNTPStore)folder.getStore();
if (xoverHeaders && !s.validateOverviewHeader("Reply-To")) headers = null;
if (headers==null) headers = s.getHeaders(this);
Address[] a = getAddressHeader("Reply-To");
if (a==null) a = getFrom();
return a;
}
/**
* Returns the subject line.
*/
public String getSubject() throws MessagingException {
NNTPStore s = (NNTPStore)folder.getStore();
if (xoverHeaders && !s.validateOverviewHeader("Subject")) headers = null;
if (headers==null) headers = s.getHeaders(this);
return super.getSubject();
}
/**
* Returns the sent date.
*/
public Date getSentDate() throws MessagingException {
NNTPStore s = (NNTPStore)folder.getStore();
if (xoverHeaders && !s.validateOverviewHeader("Date")) headers = null;
if (headers==null) headers = s.getHeaders(this);
return super.getSentDate();
}
/**
* Returns the received date.
*/
public Date getReceivedDate() throws MessagingException {
if (headers==null || xoverHeaders) headers = ((NNTPStore)folder.getStore()).getHeaders(this);
return super.getReceivedDate();
}
/**
* Returns an array of addresses for the specified header key.
*/
protected Address[] getAddressHeader(String key) throws MessagingException {
String header = getHeader(key, ",");
if (header==null) return null;
try {
return InternetAddress.parse(header);
} catch (AddressException e) {
String message = e.getMessage();
if (message!=null && message.indexOf("@domain")>-1)
try {
return parseAddress(header, ((NNTPStore)folder.getStore()).getHostName());
} catch (AddressException e2) {
throw new MessagingException("Invalid address: "+header, e);
}
//throw e;
return null;
}
}
/**
* Makes a pass at parsing internet addresses.
*/
protected Address[] parseAddress(String in, String defhost) throws AddressException {
Vector v = new Vector();
for (StringTokenizer st = new StringTokenizer(in, ","); st.hasMoreTokens(); ) {
String s = st.nextToken().trim();
try {
v.addElement(new InternetAddress(s));
} catch (AddressException e) {
int index = s.indexOf('>');
if (index>-1) { // name <address>
StringBuffer buffer = new StringBuffer();
buffer.append(s.substring(0, index));
buffer.append('@');
buffer.append(defhost);
buffer.append(s.substring(index));
v.addElement(new InternetAddress(buffer.toString()));
} else {
index = s.indexOf(" (");
if (index>-1) { // address (name)
StringBuffer buffer = new StringBuffer();
buffer.append(s.substring(0, index));
buffer.append('@');
buffer.append(defhost);
buffer.append(s.substring(index));
v.addElement(new InternetAddress(buffer.toString()));
} else // address
v.addElement(new InternetAddress(s+"@"+defhost));
}
}
}
Address[] a = new Address[v.size()]; v.copyInto(a);
return a;
}
/**
* Returns the header key for the specified RecipientType.
*/
protected String getHeaderKey(RecipientType type) throws MessagingException {
if (type==RecipientType.TO)
return "To";
if (type==RecipientType.CC)
return "Cc";
if (type==RecipientType.BCC)
return "Bcc";
if (type==RecipientType.NEWSGROUPS)
return "Newsgroups";
throw new MessagingException("Invalid recipient type: "+type);
}
// -- Need to override these since we are read-only --
/**
* NNTP messages are read-only.
*/
public void setFrom(Address address) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void addFrom(Address a[]) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setRecipients(javax.mail.Message.RecipientType recipienttype, Address a[]) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void addRecipients(javax.mail.Message.RecipientType recipienttype, Address a[]) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setReplyTo(Address a[]) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setSubject(String s, String s1) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setSentDate(Date date) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setDisposition(String s) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setContentID(String s) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setContentMD5(String s) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setDescription(String s, String s1) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
/**
* NNTP messages are read-only.
*/
public void setDataHandler(DataHandler datahandler) throws MessagingException {
throw new IllegalWriteException("Article is read-only");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -