blob: 549f6f8d666b82dae48a7a65f7d7319bd5b4b3c3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.digester.rss;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.ArrayList;
/**
* <p>Implementation object representing a <strong>channel</strong> in the
* <em>Rich Site Summary</em> DTD, version 0.91. This class may be subclassed
* to further specialize its behavior.</p>
*/
public class Channel implements Serializable {
// ----------------------------------------------------- Instance Variables
/**
* The set of items associated with this Channel.
*/
protected ArrayList items = new ArrayList();
/**
* The set of skip days for this channel.
*/
protected ArrayList skipDays = new ArrayList();
/**
* The set of skip hours for this channel.
*/
protected ArrayList skipHours = new ArrayList();
// ------------------------------------------------------------- Properties
/**
* The channel copyright (1-100 characters).
*/
protected String copyright = null;
public String getCopyright() {
return (this.copyright);
}
public void setCopyright(String copyright) {
this.copyright = copyright;
}
/**
* The channel description (1-500 characters).
*/
protected String description = null;
public String getDescription() {
return (this.description);
}
public void setDescription(String description) {
this.description = description;
}
/**
* The channel description file URL (1-500 characters).
*/
protected String docs = null;
public String getDocs() {
return (this.docs);
}
public void setDocs(String docs) {
this.docs = docs;
}
/**
* The image describing this channel.
*/
protected Image image = null;
public Image getImage() {
return (this.image);
}
public void setImage(Image image) {
this.image = image;
}
/**
* The channel language (2-5 characters).
*/
protected String language = null;
public String getLanguage() {
return (this.language);
}
public void setLanguage(String language) {
this.language = language;
}
/**
* The channel last build date (1-100 characters).
*/
protected String lastBuildDate = null;
public String getLastBuildDate() {
return (this.lastBuildDate);
}
public void setLastBuildDate(String lastBuildDate) {
this.lastBuildDate = lastBuildDate;
}
/**
* The channel link (1-500 characters).
*/
protected String link = null;
public String getLink() {
return (this.link);
}
public void setLink(String link) {
this.link = link;
}
/**
* The managing editor (1-100 characters).
*/
protected String managingEditor = null;
public String getManagingEditor() {
return (this.managingEditor);
}
public void setManagingEditor(String managingEditor) {
this.managingEditor = managingEditor;
}
/**
* The channel publication date (1-100 characters).
*/
protected String pubDate = null;
public String getPubDate() {
return (this.pubDate);
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
/**
* The channel rating (20-500 characters).
*/
protected String rating = null;
public String getRating() {
return (this.rating);
}
public void setRating(String rating) {
this.rating = rating;
}
/**
* The text input description for this channel.
*/
protected TextInput textInput = null;
public TextInput getTextInput() {
return (this.textInput);
}
public void setTextInput(TextInput textInput) {
this.textInput = textInput;
}
/**
* The channel title (1-100 characters).
*/
protected String title = null;
public String getTitle() {
return (this.title);
}
public void setTitle(String title) {
this.title = title;
}
/**
* The RSS specification version number used to create this Channel.
*/
protected double version = 0.91;
public double getVersion() {
return (this.version);
}
public void setVersion(double version) {
this.version = version;
}
/**
* The webmaster email address (1-100 characters).
*/
protected String webMaster = null;
public String getWebMaster() {
return (this.webMaster);
}
public void setWebMaster(String webMaster) {
this.webMaster = webMaster;
}
// --------------------------------------------------------- Public Methods
/**
* Add an additional item.
*
* @param item The item to be added
*/
public void addItem(Item item) {
synchronized (items) {
items.add(item);
}
}
/**
* Add an additional skip day name.
*
* @param skipDay The skip day to be added
*/
public void addSkipDay(String skipDay) {
synchronized (skipDays) {
skipDays.add(skipDay);
}
}
/**
* Add an additional skip hour name.
*
* @param skipHour The skip hour to be added
*/
public void addSkipHour(String skipHour) {
synchronized (skipHours) {
skipHours.add(skipHour);
}
}
/**
* Return the items for this channel.
*/
public Item[] findItems() {
synchronized (items) {
Item items[] = new Item[this.items.size()];
return ((Item[]) this.items.toArray(items));
}
}
/**
* Return the items for this channel.
*/
public Item[] getItems() {
return findItems();
}
/**
* Return the skip days for this channel.
*/
public String[] findSkipDays() {
synchronized (skipDays) {
String skipDays[] = new String[this.skipDays.size()];
return ((String[]) this.skipDays.toArray(skipDays));
}
}
/**
* Return the skip hours for this channel.
*/
public String[] getSkipHours() {
return findSkipHours();
}
/**
* Return the skip hours for this channel.
*/
public String[] findSkipHours() {
synchronized (skipHours) {
String skipHours[] = new String[this.skipHours.size()];
return ((String[]) this.skipHours.toArray(skipHours));
}
}
/**
* Return the skip days for this channel.
*/
public String[] getSkipDays() {
return findSkipDays();
}
/**
* Remove an item for this channel.
*
* @param item The item to be removed
*/
public void removeItem(Item item) {
synchronized (items) {
items.remove(item);
}
}
/**
* Remove a skip day for this channel.
*
* @param skipDay The skip day to be removed
*/
public void removeSkipDay(String skipDay) {
synchronized (skipDays) {
skipDays.remove(skipDay);
}
}
/**
* Remove a skip hour for this channel.
*
* @param skipHour The skip hour to be removed
*/
public void removeSkipHour(String skipHour) {
synchronized (skipHours) {
skipHours.remove(skipHour);
}
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified output stream, with no indication of character
* encoding.
*
* @param stream The output stream to write to
*/
public void render(OutputStream stream) {
try {
render(stream, null);
} catch (UnsupportedEncodingException e) {
; // Can not happen
}
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified output stream, with the specified character encoding.
*
* @param stream The output stream to write to
* @param encoding The character encoding to declare, or <code>null</code>
* for no declaration
*
* @throws UnsupportedEncodingException if the named encoding
* is not supported
*/
public void render(OutputStream stream, String encoding)
throws UnsupportedEncodingException {
PrintWriter pw = null;
if (encoding == null) {
pw = new PrintWriter(stream);
} else {
pw = new PrintWriter(new OutputStreamWriter(stream, encoding));
}
render(pw, encoding);
pw.flush();
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified writer, with no indication of character encoding.
*
* @param writer The writer to render output to
*/
public void render(Writer writer) {
render(writer, null);
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified writer, indicating the specified character encoding.
*
* @param writer The writer to render output to
* @param encoding The character encoding to declare, or <code>null</code>
* for no declaration
*/
public void render(Writer writer, String encoding) {
PrintWriter pw = new PrintWriter(writer);
render(pw, encoding);
pw.flush();
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified writer, with no indication of character encoding.
*
* @param writer The writer to render output to
*/
public void render(PrintWriter writer) {
render(writer, null);
}
/**
* Render this channel as XML conforming to the RSS 0.91 specification,
* to the specified writer, indicating the specified character encoding.
*
* @param writer The writer to render output to
* @param encoding The character encoding to declare, or <code>null</code>
* for no declaration
*/
public void render(PrintWriter writer, String encoding) {
writer.print("<?xml version=\"1.0\"");
if (encoding != null) {
writer.print(" encoding=\"");
writer.print(encoding);
writer.print("\"");
}
writer.println("?>");
writer.println();
writer.println("<!DOCTYPE rss PUBLIC");
writer.println(" \"-//Netscape Communications//DTD RSS 0.91//EN\"");
writer.println(" \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">");
writer.println();
writer.println("<rss version=\"0.91\">");
writer.println();
writer.println(" <channel>");
writer.println();
writer.print(" <title>");
writer.print(title);
writer.println("</title>");
writer.print(" <description>");
writer.print(description);
writer.println("</description>");
writer.print(" <link>");
writer.print(link);
writer.println("</link>");
writer.print(" <language>");
writer.print(language);
writer.println("</language>");
if (rating != null) {
writer.print(" <rating>");
writer.print(rating);
writer.println("</rating>");
}
if (copyright != null) {
writer.print(" <copyright>");
writer.print(copyright);
writer.print("</copyright>");
}
if (pubDate != null) {
writer.print(" <pubDate>");
writer.print(pubDate);
writer.println("</pubDate>");
}
if (lastBuildDate != null) {
writer.print(" <lastBuildDate>");
writer.print(lastBuildDate);
writer.println("</lastBuildDate>");
}
if (docs != null) {
writer.print(" <docs>");
writer.print(docs);
writer.println("</docs>");
}
if (managingEditor != null) {
writer.print(" <managingEditor>");
writer.print(managingEditor);
writer.println("</managingEditor>");
}
if (webMaster != null) {
writer.print(" <webMaster>");
writer.print(webMaster);
writer.println("</webMaster>");
}
writer.println();
if (image != null) {
image.render(writer);
writer.println();
}
if (textInput != null) {
textInput.render(writer);
writer.println();
}
String skipDays[] = findSkipDays();
if (skipDays.length > 0) {
writer.println(" <skipDays>");
for (int i = 0; i < skipDays.length; i++) {
writer.print(" <skipDay>");
writer.print(skipDays[i]);
writer.println("</skipDay>");
}
writer.println(" </skipDays>");
}
String skipHours[] = findSkipHours();
if (skipHours.length > 0) {
writer.println(" <skipHours>");
for (int i = 0; i < skipHours.length; i++) {
writer.print(" <skipHour>");
writer.print(skipHours[i]);
writer.println("</skipHour>");
}
writer.println(" </skipHours>");
writer.println();
}
Item items[] = findItems();
for (int i = 0; i < items.length; i++) {
items[i].render(writer);
writer.println();
}
writer.println(" </channel>");
writer.println();
writer.println("</rss>");
}
}