diff -r 9f0b95aafaa3 -r ed84c8bdd87b org/sonews/storage/Article.java --- a/org/sonews/storage/Article.java Sun Aug 29 17:04:25 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* - * SONEWS News Server - * see AUTHORS for the list of contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.sonews.storage; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.UUID; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import javax.mail.Header; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.internet.InternetHeaders; -import org.sonews.config.Config; - -/** - * Represents a newsgroup article. - * @author Christian Lins - * @author Denis Schwerdel - * @since n3tpd/0.1 - */ -public class Article extends ArticleHead -{ - - /** - * Loads the Article identified by the given ID from the JDBCDatabase. - * @param messageID - * @return null if Article is not found or if an error occurred. - */ - public static Article getByMessageID(final String messageID) - { - try - { - return StorageManager.current().getArticle(messageID); - } - catch(StorageBackendException ex) - { - ex.printStackTrace(); - return null; - } - } - - private byte[] body = new byte[0]; - - /** - * Default constructor. - */ - public Article() - { - } - - /** - * Creates a new Article object using the date from the given - * raw data. - */ - public Article(String headers, byte[] body) - { - try - { - this.body = body; - - // Parse the header - this.headers = new InternetHeaders( - new ByteArrayInputStream(headers.getBytes())); - - this.headerSrc = headers; - } - catch(MessagingException ex) - { - ex.printStackTrace(); - } - } - - /** - * Creates an Article instance using the data from the javax.mail.Message - * object. This constructor is called by the Mailinglist gateway. - * @see javax.mail.Message - * @param msg - * @throws IOException - * @throws MessagingException - */ - public Article(final Message msg) - throws IOException, MessagingException - { - this.headers = new InternetHeaders(); - - for(Enumeration e = msg.getAllHeaders() ; e.hasMoreElements();) - { - final Header header = (Header)e.nextElement(); - this.headers.addHeader(header.getName(), header.getValue()); - } - - // Reads the raw byte body using Message.writeTo(OutputStream out) - this.body = readContent(msg); - - // Validate headers - validateHeaders(); - } - - /** - * Reads from the given Message into a byte array. - * @param in - * @return - * @throws IOException - */ - private byte[] readContent(Message in) - throws IOException, MessagingException - { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - in.writeTo(out); - return out.toByteArray(); - } - - /** - * Removes the header identified by the given key. - * @param headerKey - */ - public void removeHeader(final String headerKey) - { - this.headers.removeHeader(headerKey); - this.headerSrc = null; - } - - /** - * Generates a message id for this article and sets it into - * the header object. You have to update the JDBCDatabase manually to make this - * change persistent. - * Note: a Message-ID should never be changed and only generated once. - */ - private String generateMessageID() - { - String randomString; - MessageDigest md5; - try - { - md5 = MessageDigest.getInstance("MD5"); - md5.reset(); - md5.update(getBody()); - md5.update(getHeader(Headers.SUBJECT)[0].getBytes()); - md5.update(getHeader(Headers.FROM)[0].getBytes()); - byte[] result = md5.digest(); - StringBuffer hexString = new StringBuffer(); - for (int i = 0; i < result.length; i++) - { - hexString.append(Integer.toHexString(0xFF & result[i])); - } - randomString = hexString.toString(); - } - catch (NoSuchAlgorithmException e) - { - e.printStackTrace(); - randomString = UUID.randomUUID().toString(); - } - String msgID = "<" + randomString + "@" - + Config.inst().get(Config.HOSTNAME, "localhost") + ">"; - - this.headers.setHeader(Headers.MESSAGE_ID, msgID); - - return msgID; - } - - /** - * Returns the body string. - */ - public byte[] getBody() - { - return body; - } - - /** - * @return Numerical IDs of the newsgroups this Article belongs to. - */ - public List getGroups() - { - String[] groupnames = getHeader(Headers.NEWSGROUPS)[0].split(","); - ArrayList groups = new ArrayList(); - - try - { - for(String newsgroup : groupnames) - { - newsgroup = newsgroup.trim(); - Group group = StorageManager.current().getGroup(newsgroup); - if(group != null && // If the server does not provide the group, ignore it - !groups.contains(group)) // Yes, there may be duplicates - { - groups.add(group); - } - } - } - catch(StorageBackendException ex) - { - ex.printStackTrace(); - return null; - } - return groups; - } - - public void setBody(byte[] body) - { - this.body = body; - } - - /** - * - * @param groupname Name(s) of newsgroups - */ - public void setGroup(String groupname) - { - this.headers.setHeader(Headers.NEWSGROUPS, groupname); - } - - /** - * Returns the Message-ID of this Article. If the appropriate header - * is empty, a new Message-ID is created. - * @return Message-ID of this Article. - */ - public String getMessageID() - { - String[] msgID = getHeader(Headers.MESSAGE_ID); - return msgID[0].equals("") ? generateMessageID() : msgID[0]; - } - - /** - * @return String containing the Message-ID. - */ - @Override - public String toString() - { - return getMessageID(); - } - -}