chris@3: /*
chris@3:  *   SONEWS News Server
chris@3:  *   see AUTHORS for the list of contributors
chris@3:  *
chris@3:  *   This program is free software: you can redistribute it and/or modify
chris@3:  *   it under the terms of the GNU General Public License as published by
chris@3:  *   the Free Software Foundation, either version 3 of the License, or
chris@3:  *   (at your option) any later version.
chris@3:  *
chris@3:  *   This program is distributed in the hope that it will be useful,
chris@3:  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
chris@3:  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
chris@3:  *   GNU General Public License for more details.
chris@3:  *
chris@3:  *   You should have received a copy of the GNU General Public License
chris@3:  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
chris@3:  */
chris@3: 
chris@3: package org.sonews.storage;
chris@3: 
chris@3: import java.io.ByteArrayInputStream;
chris@3: import java.util.Enumeration;
chris@3: import javax.mail.Header;
chris@3: import javax.mail.MessagingException;
chris@3: import javax.mail.internet.InternetHeaders;
chris@3: import javax.mail.internet.MimeUtility;
chris@3: import org.sonews.config.Config;
chris@3: 
chris@3: /**
chris@3:  * An article with no body only headers.
chris@3:  * @author Christian Lins
chris@3:  * @since sonews/0.5.0
chris@3:  */
chris@3: public class ArticleHead 
chris@3: {
chris@3: 
chris@3:   protected InternetHeaders headers   = null;
chris@3:   protected String          headerSrc = null;
chris@3:   
chris@3:   protected ArticleHead()
chris@3:   {
chris@3:   }
chris@3:   
chris@3:   public ArticleHead(String headers)
chris@3:   {
chris@3:     try
chris@3:     {
chris@3:       // Parse the header
chris@3:       this.headers = new InternetHeaders(
chris@3:           new ByteArrayInputStream(headers.getBytes()));
chris@3:     }
chris@3:     catch(MessagingException ex)
chris@3:     {
chris@3:       ex.printStackTrace();
chris@3:     }
chris@3:   }
chris@3:   
chris@3:   /**
chris@3:    * Returns the header field with given name.
chris@3:    * @param name Name of the header field(s).
chris@3:    * @param returnNull If set to true, this method will return null instead
chris@3:    *                   of an empty array if there is no header field found.
chris@3:    * @return Header values or empty string.
chris@3:    */
chris@3:   public String[] getHeader(String name, boolean returnNull)
chris@3:   {
chris@3:     String[] ret = this.headers.getHeader(name);
chris@3:     if(ret == null && !returnNull)
chris@3:     {
chris@3:       ret = new String[]{""};
chris@3:     }
chris@3:     return ret;
chris@3:   }
chris@3: 
chris@3:   public String[] getHeader(String name)
chris@3:   {
chris@3:     return getHeader(name, false);
chris@3:   }
chris@3:   
chris@3:   /**
chris@3:    * Sets the header value identified through the header name.
chris@3:    * @param name
chris@3:    * @param value
chris@3:    */
chris@3:   public void setHeader(String name, String value)
chris@3:   {
chris@3:     this.headers.setHeader(name, value);
chris@3:     this.headerSrc = null;
chris@3:   }
chris@3: 
chris@3:     public Enumeration getAllHeaders()
chris@3:   {
chris@3:     return this.headers.getAllHeaders();
chris@3:   }
chris@3: 
chris@3:   /**
chris@3:    * @return Header source code of this Article.
chris@3:    */
chris@3:   public String getHeaderSource()
chris@3:   {
chris@3:     if(this.headerSrc != null)
chris@3:     {
chris@3:       return this.headerSrc;
chris@3:     }
chris@3: 
chris@3:     StringBuffer buf = new StringBuffer();
chris@3: 
chris@3:     for(Enumeration en = this.headers.getAllHeaders(); en.hasMoreElements();)
chris@3:     {
chris@3:       Header entry = (Header)en.nextElement();
chris@3: 
chris@3:       String value = entry.getValue().replaceAll("[\r\n]", " ");
chris@3:       buf.append(entry.getName());
chris@3:       buf.append(": ");
chris@3:       buf.append(MimeUtility.fold(entry.getName().length() + 2, value));
chris@3: 
chris@3:       if(en.hasMoreElements())
chris@3:       {
chris@3:         buf.append("\r\n");
chris@3:       }
chris@3:     }
chris@3: 
chris@3:     this.headerSrc = buf.toString();
chris@3:     return this.headerSrc;
chris@3:   }
chris@3: 
chris@3:   /**
chris@3:    * Sets the headers of this Article. If headers contain no
chris@3:    * Message-Id a new one is created.
chris@3:    * @param headers
chris@3:    */
chris@3:   public void setHeaders(InternetHeaders headers)
chris@3:   {
chris@3:     this.headers   = headers;
chris@3:     this.headerSrc = null;
chris@3:     validateHeaders();
chris@3:   }
chris@3: 
chris@3:     /**
chris@3:    * Checks some headers for their validity and generates an
chris@3:    * appropriate Path-header for this host if not yet existing.
chris@3:    * This method is called by some Article constructors and the
chris@3:    * method setHeaders().
chris@3:    * @return true if something on the headers was changed.
chris@3:    */
chris@3:   protected void validateHeaders()
chris@3:   {
chris@3:     // Check for valid Path-header
chris@3:     final String path = getHeader(Headers.PATH)[0];
chris@3:     final String host = Config.inst().get(Config.HOSTNAME, "localhost");
chris@3:     if(!path.startsWith(host))
chris@3:     {
chris@3:       StringBuffer pathBuf = new StringBuffer();
chris@3:       pathBuf.append(host);
chris@3:       pathBuf.append('!');
chris@3:       pathBuf.append(path);
chris@3:       this.headers.setHeader(Headers.PATH, pathBuf.toString());
chris@3:     }
chris@3:   }
chris@3:   
chris@3: }