diff -r f907866f0e4b -r 6fceb66e1ad7 trunk/com/so/news/storage/Article.java --- a/trunk/com/so/news/storage/Article.java Tue Jan 20 10:21:03 2009 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,307 +0,0 @@ -/* - * StarOffice 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 com.so.news.storage; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - -import com.so.news.Config; -import com.so.news.Debug; - -/** - * Represents a newsgroup article. - * @author Christian Lins - * @author Denis Schwerdel - */ -public class Article -{ - /** - * Loads the Article identified by the given ID from the Database. - * @param messageID - * @return null if Article is not found or if an error occurred. - */ - public static Article getByMessageID(String messageID) - { - try - { - return Database.getInstance().getArticle(messageID); - } - catch(SQLException ex) - { - ex.printStackTrace(Debug.getInstance().getStream()); - return null; - } - } - - public static Article getByNumberInGroup(Group group, int number) - throws SQLException - { - long gid = group.getID(); - return Database.getInstance().getArticle(gid, number); // Is number her correct? - } - - private String body = ""; - private long groupID = -1; - private Map header = new HashMap(); - private int numberInGroup = -1; - private String msgID = null; - - /** - * Default constructor. - */ - public Article() - { - } - - /** - * Creates a new Article object using the date from the given - * ResultSet. It is expected that ResultSet.next() was already - * called by the Database class. - * This construction has only package visibility. - * @param rs - */ - Article(ResultSet rs) - throws SQLException - { - this.body = rs.getString("body"); - this.msgID = rs.getString("message_id"); - - // Parse the header - parseHeader(rs.getString("header")); - } - - /** - * Parses the header fields and puts them into a map for faster access. - * TODO: There could be fields that go over more than one line, some - * bad clients do create them. - * @param hsrc - */ - private void parseHeader(String hsrc) - { - String[] lines = hsrc.split("\n"); - - for(String line : lines) - { - String[] kv = line.split(":"); - if(kv.length < 2) - { - Debug.getInstance().log("Invalid header field: " + line); - continue; - } - else - { - // Set value in the header hash map - String value = kv[1]; - for(int n = 2; n < kv.length; n++) - value += ":" + kv[n]; - this.header.put(kv[0], value); - } - } - } - - /** - * Returnes the next Article in the group of this Article. - * @return - */ - public Article nextArticleInGroup() - { - return null; - } - - /** - * Returns the previous Article in the group of this Article. - * @return - */ - public Article prevArticleInGroup() - { - return null; - } - - /** - * Generates a message id for this article and sets it into - * the header HashMap. - */ - private String generateMessageID() - { - this.msgID = "<" + UUID.randomUUID() + "@" - + Config.getInstance().get("n3tpd.hostname", "localhost") + ">"; - - this.header.put("Message-ID", msgID); - - return msgID; - } - - /** - * Tries to delete this article. - * @return false if the article could not be deleted, otherwise true - */ - public boolean delete() - { - return false; - } - - /** - * Checks if all necessary header fields are within this header. - */ - private void validateHeader() - { - // Forces a MessageID creation if not existing - getMessageID(); - - // Check if the references are correct... - String rep = header.get("In-Reply-To"); - if(rep == null) // Some clients use only references instead of In-Reply-To - return; //rep = header.get("References"); - - String ref = getMessageID(); - - if(rep != null && !rep.equals("")) - { - Article art = null; //TODO // getByMessageID(rep, articleDir); - if(art != null) - { - ref = art.header.get("References") + " " + rep; - } - } - header.put("References", ref); - } - - /** - * Returns the body string. - */ - public String getBody() - { - return body; - } - - /** - * @return Numerical ID of the associated Group. - */ - long getGroupID() - { - if(groupID == -1) // If the GroupID was not determined yet - { - // Determining GroupID - String newsgroups = this.header.get("Newsgroups"); - if(newsgroups != null) - { - String[] newsgroup = newsgroups.split(","); - // Crossposting is not supported - try - { - Group group; - if(newsgroup.length > 0) - group = Database.getInstance().getGroup(newsgroup[0].trim()); - else - group = Database.getInstance().getGroup(newsgroups.trim()); - // TODO: What to do if Group does not exist? - this.groupID = group.getID(); - } - catch(SQLException ex) - { - ex.printStackTrace(Debug.getInstance().getStream()); - System.err.println(ex.getLocalizedMessage()); - } - } - else - System.err.println("Should never happen: Article::getGroupID"); - } - return this.groupID; - } - - public void setBody(String body) - { - this.body = body; - } - - public int getNumberInGroup() - { - return this.numberInGroup; - } - - public void setHeader(HashMap header) - { - this.header = header; - } - - public void setNumberInGroup(int id) - { - this.numberInGroup = id; - } - - public String getMessageID() - { - if(msgID == null) - msgID = generateMessageID(); - return msgID; - } - - /** - * @return Header source code of this Article. - */ - public String getHeaderSource() - { - StringBuffer buf = new StringBuffer(); - - for(Entry entry : this.header.entrySet()) - { - buf.append(entry.getKey()); - buf.append(":"); - buf.append(entry.getValue()); - buf.append("\n"); - } - - return buf.toString(); - } - - public Map getHeader() - { - return this.header; - } - - public Date getDate() - { - try - { - String date = this.header.get("Date"); - return new Date(Date.parse(date)); - } - catch(Exception e) - { - e.printStackTrace(Debug.getInstance().getStream()); - return null; - } - } - - public void setDate(Date date) - { - this.header.put("Date", date.toString()); - } - - @Override - public String toString() - { - return getMessageID(); - } -}