diff options
author | Maria Odea B. Ching <oching@apache.org> | 2008-04-02 10:01:50 +0000 |
---|---|---|
committer | Maria Odea B. Ching <oching@apache.org> | 2008-04-02 10:01:50 +0000 |
commit | 545b41143c4c7744ac65a9887de44c5beb0158fc (patch) | |
tree | c82f591418a3717daf959271ff1c74697ce226e8 /archiva-modules/archiva-base | |
parent | 06fa65523c4762ab74890613fe584ce4a88ed87e (diff) | |
download | archiva-545b41143c4c7744ac65a9887de44c5beb0158fc.tar.gz archiva-545b41143c4c7744ac65a9887de44c5beb0158fc.zip |
[MRM-123]
-use rome for the rss feeds
-added the rss feed generator
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@643826 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'archiva-modules/archiva-base')
4 files changed, 354 insertions, 0 deletions
diff --git a/archiva-modules/archiva-base/archiva-common/pom.xml b/archiva-modules/archiva-base/archiva-common/pom.xml index de064e520..1bce10113 100644 --- a/archiva-modules/archiva-base/archiva-common/pom.xml +++ b/archiva-modules/archiva-base/archiva-common/pom.xml @@ -64,11 +64,21 @@ <version>2.7.0</version> </dependency> <dependency> + <groupId>rome</groupId> + <artifactId>rome</artifactId> + <version>0.9</version> + </dependency> + <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> <scope>test</scope> </dependency> + <dependency> + <groupId>xmlunit</groupId> + <artifactId>xmlunit</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> <plugins> diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedEntry.java b/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedEntry.java new file mode 100644 index 000000000..cb9f81cde --- /dev/null +++ b/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedEntry.java @@ -0,0 +1,137 @@ +package org.apache.maven.archiva.common.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. + */ + +/** + * Holds the data for the SyndEntry in the RSS feed. + * + * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a> + * @version + */ +public class RssFeedEntry +{ + private String title; + + private String link; + + private String description; + + private String author; + + private String category; + + private String comments; + + private String enclosure; + + private String guid; + + private String source; + + public String getTitle() + { + return title; + } + + public void setTitle( String title ) + { + this.title = title; + } + + public String getLink() + { + return link; + } + + public void setLink( String link ) + { + this.link = link; + } + + public String getDescription() + { + return description; + } + + public void setDescription( String description ) + { + this.description = description; + } + + public String getAuthor() + { + return author; + } + + public void setAuthor( String author ) + { + this.author = author; + } + + public String getCategory() + { + return category; + } + + public void setCategory( String category ) + { + this.category = category; + } + + public String getComments() + { + return comments; + } + + public void setComments( String comments ) + { + this.comments = comments; + } + + public String getEnclosure() + { + return enclosure; + } + + public void setEnclosure( String enclosure ) + { + this.enclosure = enclosure; + } + + public String getGuid() + { + return guid; + } + + public void setGuid( String guid ) + { + this.guid = guid; + } + + public String getSource() + { + return source; + } + + public void setSource( String source ) + { + this.source = source; + } +} diff --git a/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedGenerator.java b/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedGenerator.java new file mode 100644 index 000000000..8187b7c1f --- /dev/null +++ b/archiva-modules/archiva-base/archiva-common/src/main/java/org/apache/maven/archiva/common/rss/RssFeedGenerator.java @@ -0,0 +1,114 @@ +package org.apache.maven.archiva.common.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.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.sun.syndication.feed.synd.SyndContent; +import com.sun.syndication.feed.synd.SyndContentImpl; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndEntryImpl; +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.feed.synd.SyndFeedImpl; +import com.sun.syndication.io.FeedException; +import com.sun.syndication.io.SyndFeedOutput; + +/** + * Generates RSS feeds. + * + * @plexus.component role="org.apache.maven.archiva.common.rss.RssFeedGenerator" + * + * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a> + * @version + */ +public class RssFeedGenerator +{ + private Logger log = LoggerFactory.getLogger( RssFeedGenerator.class ); + + // TODO: make configurable + public static String DEFAULT_FEEDTYPE = "rss_2.0"; + + public static String DEFAULT_LANGUAGE = "en-us"; + + public void generateFeed( String title, String link, String description, List<RssFeedEntry> dataEntries, + File outputFile ) + { + SyndFeed feed = new SyndFeedImpl(); + feed.setFeedType( DEFAULT_FEEDTYPE ); + + feed.setTitle( title ); + feed.setLink( link ); + feed.setDescription( description ); + feed.setLanguage( DEFAULT_LANGUAGE ); + feed.setPublishedDate( Calendar.getInstance().getTime() ); + + feed.setEntries( getEntries( dataEntries ) ); + + try + { + Writer writer = new FileWriter( outputFile ); + SyndFeedOutput output = new SyndFeedOutput(); + output.output( feed, writer ); + writer.close(); + } + catch ( IOException ie ) + { + log.error( "Error occurred while generating the feed : " + ie.getMessage() ); + } + catch ( FeedException fe ) + { + log.error( "Error occurred while generating the feed : " + fe.getMessage() ); + } + } + + private List<SyndEntry> getEntries( List<RssFeedEntry> dataEntries ) + { + List<SyndEntry> entries = new ArrayList<SyndEntry>(); + SyndEntry entry; + SyndContent description; + + for ( RssFeedEntry dataEntry : dataEntries ) + { + entry = new SyndEntryImpl(); + entry.setTitle( dataEntry.getTitle() ); + entry.setLink( dataEntry.getLink() ); + entry.setPublishedDate( Calendar.getInstance().getTime() ); + + description = new SyndContentImpl(); + description.setType( "text/plain" ); + description.setValue( dataEntry.getDescription() ); + entry.setDescription( description ); + + entries.add( entry ); + } + + return entries; + } + +} diff --git a/archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/maven/archiva/common/rss/RssFeedGeneratorTest.java b/archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/maven/archiva/common/rss/RssFeedGeneratorTest.java new file mode 100644 index 000000000..cf2b0e73f --- /dev/null +++ b/archiva-modules/archiva-base/archiva-common/src/test/java/org/apache/maven/archiva/common/rss/RssFeedGeneratorTest.java @@ -0,0 +1,93 @@ +package org.apache.maven.archiva.common.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.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.codehaus.plexus.PlexusTestCase; +import org.custommonkey.xmlunit.XMLAssert; + +/** + * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a> + * @version + */ +public class RssFeedGeneratorTest + extends PlexusTestCase +{ + private RssFeedGenerator generator; + + public void setUp() + throws Exception + { + super.setUp(); + + generator = (RssFeedGenerator) lookup( RssFeedGenerator.class ); + + File outputDir = new File( getBasedir(), "/target/test-classes/rss-feeds" ); + outputDir.mkdir(); + } + + public void testGenerateFeed() + throws Exception + { + File outputFile = new File( getBasedir(), "/target/test-classes/rss-feeds/generated-rss2.0-feed.xml" ); + + List<RssFeedEntry> entries = new ArrayList<RssFeedEntry>(); + RssFeedEntry entry = new RssFeedEntry(); + + entry.setTitle( "Item 1" ); + entry.setLink( "http://rss-2.0-test-feed.com" ); + entry.setDescription( "RSS 2.0 feed item 1." ); + entry.setGuid( "http://rss-2.0-test-feed.com/item1" ); + entries.add( entry ); + + entry = new RssFeedEntry(); + entry.setTitle( "Item 2" ); + entry.setLink( "http://rss-2.0-test-feed.com" ); + entry.setDescription( "RSS 2.0 feed item 2." ); + entry.setGuid( "http://rss-2.0-test-feed.com/item2" ); + entries.add( entry ); + + entry = new RssFeedEntry(); + entry.setTitle( "Item 3" ); + entry.setLink( "http://rss-2.0-test-feed.com" ); + entry.setDescription( "RSS 2.0 feed item 3." ); + entry.setGuid( "http://rss-2.0-test-feed.com/item3" ); + entries.add( entry ); + + generator.generateFeed( "Test Feed", "http://localhost:8080/archiva", "The test feed from Archiva.", entries, + outputFile ); + + String generatedContent = FileUtils.readFileToString( outputFile ); + + XMLAssert.assertXpathEvaluatesTo( "Test Feed", "//channel/title", generatedContent ); + XMLAssert.assertXpathEvaluatesTo( "http://localhost:8080/archiva", "//channel/link", generatedContent ); + XMLAssert.assertXpathEvaluatesTo( "The test feed from Archiva.", "//channel/description", generatedContent ); + XMLAssert.assertXpathEvaluatesTo( "en-us", "//channel/language", generatedContent ); + + String expectedItem1 = + "<channel><item><title>Item 1</title></item><item><title>Item 2</title></item>" + + "<item><title>Item 3</title></item></channel>"; + XMLAssert.assertXpathsEqual( "//channel/item/title", expectedItem1, "//channel/item/title", generatedContent ); + } +} |