blob: 2eac120a90c5c992959245daa253575806ee52a9 [file] [log] [blame]
package org.apache.commons.digester3.rss;
/*
* 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.
*/
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.digester3.Digester;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* <p>Implementation of <strong>org.apache.commons.digester3.Digester</strong>
* designed to process input streams that conform to the <em>Rich Site
* Summary</em> DTD, version 0.91. For more information about this format,
* see the <a href="http://my.netscape.com/publish/">My Netscape</a> site.</p>
*
* <p>The default implementation object returned by calling
* <code>parse()</code> (an instance of
* <code>org.apache.commons.digester3.rss.Channel</code>)
* knows how to render itself in XML format via the <code>render()</code>
* method. See the test <code>main()</code> method below for an
* example of using these classes.</p>
*/
public class RSSDigester
extends Digester
{
// ----------------------------------------------------------- Constructors
// ----------------------------------------------------- Instance Variables
/**
* Have we been configured yet?
*/
protected boolean configured = false;
// ------------------------------------------------------------- Properties
/**
* The fully qualified class name of the <code>Channel</code>
* implementation class.
*/
protected String channelClass = "org.apache.commons.digester3.rss.Channel";
public String getChannelClass()
{
return ( this.channelClass );
}
public void setChannelClass( String channelClass )
{
this.channelClass = channelClass;
}
/**
* The fully qualified class name of the <code>Image</code>
* implementation class.
*/
protected String imageClass = "org.apache.commons.digester3.rss.Image";
public String getImageClass()
{
return ( this.imageClass );
}
public void setImageClass( String imageClass )
{
this.imageClass = imageClass;
}
/**
* The fully qualified class name of the <code>Item</code>
* implementation class.
*/
protected String itemClass = "org.apache.commons.digester3.rss.Item";
public String getItemClass()
{
return ( this.itemClass );
}
public void setItemClass( String itemClass )
{
this.itemClass = itemClass;
}
/**
* The fully qualified class name of the <code>TextInput</code>
* implementation class.
*/
protected String textInputClass = "org.apache.commons.digester3.rss.TextInput";
public String getTextInputClass()
{
return ( this.textInputClass );
}
public void setTextInputClass( String textInputClass )
{
this.textInputClass = textInputClass;
}
// --------------------------------------------------------- Public Methods
/**
* Parse the content of the specified file using this Digester. Returns
* the root element from the object stack (which will be the Channel).
*
* @param file File containing the XML data to be parsed
*
* @throws IOException if an input/output error occurs
* @throws SAXException if a parsing exception occurs
*/
@Override
public <T> T parse( File file )
throws IOException, SAXException
{
configure();
return ( super.<T>parse( file ) );
}
/**
* Parse the content of the specified input source using this Digester.
* Returns the root element from the object stack (which will be the
* Channel).
*
* @param input Input source containing the XML data to be parsed
*
* @throws IOException if an input/output error occurs
* @throws SAXException if a parsing exception occurs
*/
@Override
public <T> T parse( InputSource input )
throws IOException, SAXException
{
configure();
return ( super.<T>parse( input ) );
}
/**
* Parse the content of the specified input stream using this Digester.
* Returns the root element from the object stack (which will be
* the Channel).
*
* @param input Input stream containing the XML data to be parsed
*
* @throws IOException if an input/output error occurs
* @throws SAXException if a parsing exception occurs
*/
@Override
public <T> T parse( InputStream input )
throws IOException, SAXException
{
configure();
return ( super.<T>parse( input ) );
}
/**
* Parse the content of the specified URI using this Digester.
* Returns the root element from the object stack (which will be
* the Channel).
*
* @param uri URI containing the XML data to be parsed
*
* @throws IOException if an input/output error occurs
* @throws SAXException if a parsing exception occurs
*/
@Override
public <T> T parse( String uri )
throws IOException, SAXException
{
configure();
return ( super.<T>parse( uri ) );
}
// -------------------------------------------------------- Package Methods
// ------------------------------------------------------ Protected Methods
/**
* Configure the parsing rules that will be used to process RSS input.
*/
@Override
protected void configure()
{
if ( configured )
{
return;
}
// FIXME - validate the "version" attribute of the rss element?
// Add the rules for the Channel object
addObjectCreate( "rss/channel", channelClass );
addCallMethod( "rss/channel/copyright", "setCopyright", 0 );
addCallMethod( "rss/channel/description", "setDescription", 0 );
addCallMethod( "rss/channel/docs", "setDocs", 0 );
addCallMethod( "rss/channel/language", "setLanguage", 0 );
addCallMethod( "rss/channel/lastBuildDate", "setLastBuildDate", 0 );
addCallMethod( "rss/channel/link", "setLink", 0 );
addCallMethod( "rss/channel/managingEditor", "setManagingEditor", 0 );
addCallMethod( "rss/channel/pubDate", "setPubDate", 0 );
addCallMethod( "rss/channel/rating", "setRating", 0 );
addCallMethod( "rss/channel/skipDays/day", "addSkipDay", 0 );
addCallMethod( "rss/channel/skipHours/hour", "addSkipHour", 0 );
addCallMethod( "rss/channel/title", "setTitle", 0 );
addCallMethod( "rss/channel/webMaster", "setWebMaster", 0 );
// Add the rules for the Image object
addObjectCreate( "rss/channel/image", imageClass );
addSetNext( "rss/channel/image", "setImage", "org.apache.commons.digester3.rss.Image" );
addCallMethod( "rss/channel/image/description", "setDescription", 0 );
addCallMethod( "rss/channel/image/height", "setHeight", 0, new Class[] { Integer.TYPE } );
addCallMethod( "rss/channel/image/link", "setLink", 0 );
addCallMethod( "rss/channel/image/title", "setTitle", 0 );
addCallMethod( "rss/channel/image/url", "setURL", 0 );
addCallMethod( "rss/channel/image/width", "setWidth", 0, new Class[] { Integer.TYPE } );
// Add the rules for the Item object
addObjectCreate( "rss/channel/item", itemClass );
addSetNext( "rss/channel/item", "addItem", "org.apache.commons.digester3.rss.Item" );
addCallMethod( "rss/channel/item/description", "setDescription", 0 );
addCallMethod( "rss/channel/item/link", "setLink", 0 );
addCallMethod( "rss/channel/item/title", "setTitle", 0 );
// Add the rules for the TextInput object
addObjectCreate( "rss/channel/textinput", textInputClass );
addSetNext( "rss/channel/textinput", "setTextInput", "org.apache.commons.digester3.rss.TextInput" );
addCallMethod( "rss/channel/textinput/description", "setDescription", 0 );
addCallMethod( "rss/channel/textinput/link", "setLink", 0 );
addCallMethod( "rss/channel/textinput/name", "setName", 0 );
addCallMethod( "rss/channel/textinput/title", "setTitle", 0 );
// Mark this digester as having been configured
configured = true;
}
// ------------------------------------------------------ Test Main Program
/**
* Test main program that parses the channel description included in this
* package as a static resource.
*
* @param args The command line arguments (ignored)
*/
public static void main( String args[] )
{
try
{
System.out.println( "RSSDigester Test Program" );
System.out.println( "Opening input stream ..." );
InputStream is =
RSSDigester.class.getResourceAsStream( "/org/apache/commons/digester3/rss/rss-example.xml" );
System.out.println( "Creating new digester ..." );
RSSDigester digester = new RSSDigester();
if ( ( args.length > 0 ) && ( args[0].equals( "-debug" ) ) )
{
digester.setLogger( LogFactory.getLog( "RSSDigester" ) );
}
System.out.println( "Parsing input stream ..." );
Channel channel = (Channel) digester.parse( is );
System.out.println( "Closing input stream ..." );
is.close();
System.out.println( "Dumping channel info ..." );
channel.render( System.out );
}
catch ( Exception e )
{
System.out.println( "-->Exception" );
e.printStackTrace( System.out );
}
}
}