Feed Class

package javaxt.rss;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;

//******************************************************************************
//**  RSS Feed
//******************************************************************************
/**
 *   Used to represent an RSS feed/channel. Returns a list of entries and other
 *   attributes associated with the feed.
 *
 ******************************************************************************/

public class Feed {
    
    private String title = "";
    private String description = "";
    private java.net.URL link = null;
    private Location location = null;

    private java.util.Date lastUpdate = null;
    private Integer interval = null;
    
    private java.util.ArrayList<Item> items = new java.util.ArrayList<Item>();

    
  //**************************************************************************
  //** Constructor
  //**************************************************************************
    public Feed(){}

    
  //**************************************************************************
  //** Constructor
  //**************************************************************************
  /** Creates a new instance of this class using an XML node from an RSS XML
   *  document. 
   */ 
    protected Feed(org.w3c.dom.Node node, java.util.HashMap<String, String> namespaces) {
        //java.util.ArrayList<Item> items = new java.util.ArrayList<Item>();
        NodeList nodeList = node.getChildNodes();
        for (int i=0; i<nodeList.getLength(); i++){
            node = nodeList.item(i);
            if (node.getNodeType()==1){
                String nodeName = node.getNodeName().toLowerCase();
                String nodeValue = Parser.getNodeValue(node).trim();
                if (nodeName.equals("title")) title = nodeValue;
                else if(nodeName.equals("description") || nodeName.equals("subtitle")){
                    description = nodeValue;
                }


              //Parse Location Information (GeoRSS)
                else if (Location.isLocationNode(nodeName, namespaces)){
                    location = new Location(node, namespaces);
                }
                
                else if (nodeName.equals("link")){
                    String url = nodeValue.trim();
                    if (url.length()==0){
                        //get href attribute?
                    }
                    try{
                        link = new java.net.URL(url);
                    }
                    catch(Exception e){}
                }

                else if (nodeName.equals("item") || nodeName.equals("entry")){
                    items.add(new Item(node, namespaces));
                }
                else if (nodeName.equalsIgnoreCase("lastBuildDate")){ //pubDate?
                    try{
                        lastUpdate = Parser.getDate(nodeValue);
                    }
                    catch(java.text.ParseException e){
                    }
                }
                else if (nodeName.equals("ttl")){
                    try{
                        interval = Integer.parseInt(nodeValue);
                    }
                    catch(Exception e){
                    }
                }
            } 
        }

    }
    
    
  //**************************************************************************
  //** getTitle
  //**************************************************************************
    public String getTitle(){ return title; }
    public void setTitle(String title){ this.title = title; }
    
    
  //**************************************************************************
  //** getDescription
  //**************************************************************************
    public String getDescription(){ return description; }
    public void setDescription(String description){ this.description = description; }
    
    
  //**************************************************************************
  //** getLink
  //**************************************************************************
    public java.net.URL getLink(){ return link; }
    public void setLink(java.net.URL link){ this.link = link; }
    

  //**************************************************************************
  //** getLocation
  //**************************************************************************
  /** Returns location information associated with the current feed (e.g.
   *  GeoRSS element).
   */
    public Location getLocation(){
        return location;
    }

    
  //**************************************************************************
  //** getLastUpdate
  //**************************************************************************
    public java.util.Date getLastUpdate(){ return lastUpdate; }
    public void setLastUpdate(java.util.Date date){ this.lastUpdate = date; }
    
    
  //**************************************************************************
  //** getItems
  //**************************************************************************
  /** Returns a list of items found in an RSS feed. 
   */ 
    public Item[] getItems(){ 
        return items.toArray(new Item[items.size()]);
    }

    
  //**************************************************************************
  //** addItem
  //**************************************************************************
  /** Used to add an RSS item to the Feed.
   */ 
    public void addItem(Item item){
        items.add(item);
    }
    
    
  //**************************************************************************
  //** getRefreshInterval
  //**************************************************************************
  /** Returns the number of minutes that the channel can be cached before
   *  refreshing from the source. Derived from the ttl tag in RSS feeds.
   *  Returns null if the refresh interval is not specified or unknown.
   */
    public Integer getRefreshInterval(){
        return interval;
    }
    
    public void setRefreshInterval(Integer interval){
        this.interval = interval;
    }
    
    
  //**************************************************************************
  //** toString
  //**************************************************************************
    public String toString(){
        StringBuffer out = new StringBuffer();
        String br = "\r\n";
        out.append("Title: " + getTitle() + br);
        out.append("Description: " + getDescription() + br);
        out.append("Last Update: " + getLastUpdate() + br);
        out.append("Link: " + getLink() + br);
        if (location!=null){
            out.append("Location: " + location.toWKT() + br);
        }
        return out.toString();
    }
    
    
  //**************************************************************************
  //** toXML
  //**************************************************************************
  /** Returns an RSS/XML document for this Feed.
   */
    public org.w3c.dom.Document toXML(){
        StringBuffer str = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        str.append("<rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:atom=\"http://www.w3.org/2005/Atom\" version=\"2.0\" xmlns:media=\"http://search.yahoo.com/mrss/\">\n");
        str.append("  <channel>\n");
        str.append("  <title>" + getTitle() + "</title>\n");
        str.append("  <link>" + getLink() + "</link>\n");
        str.append("  <lastBuildDate>" + formatDate(lastUpdate==null ? new java.util.Date() : lastUpdate) + "</lastBuildDate>\n");
        str.append("  <generator>JavaXT RSS</generator>\n");
        str.append("  <ttl>" + (interval==null ? 15 : interval) + "</ttl>\n");
        for (Item item : items){
            str.append(item.toXML());
        }
        str.append("  </channel>\n");
        str.append("</rss>");


        return createDocument(str.toString());
    }

    
  //**************************************************************************
  //** createDocument
  //**************************************************************************
    private Document createDocument(String xml){
        try{
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
            return builder.parse(is);
        }
        catch(Exception e){
            //e.printStackTrace();
            return null;
        }
    }


  //**************************************************************************
  //** formatDate
  //**************************************************************************
    protected static String formatDate(java.util.Date date){
        java.text.DateFormat formatter = new java.text.SimpleDateFormat(
        "EEE, dd MMM yyyy HH:mm:ss zzz", java.util.Locale.US);
        return formatter.format(date);
    }
}