Article.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:11k
- /*
- * 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");
- }
- }