You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by he...@apache.org on 2007/01/03 01:29:52 UTC
svn commit: r491988 - in /velocity/site/velocity-news-plugin: ./
src/main/java/org/apache/velocity/maven/plugin/news/
Author: henning
Date: Tue Jan 2 16:29:52 2007
New Revision: 491988
URL: http://svn.apache.org/viewvc?view=rev&rev=491988
Log:
Add Rome based RSS generator.
Added:
velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java (with props)
velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java (with props)
Modified:
velocity/site/velocity-news-plugin/pom.xml
velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsPlugin.java
velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsReport.java
velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/VelocityNewsReport.java
Modified: velocity/site/velocity-news-plugin/pom.xml
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/pom.xml?view=diff&rev=491988&r1=491987&r2=491988
==============================================================================
--- velocity/site/velocity-news-plugin/pom.xml (original)
+++ velocity/site/velocity-news-plugin/pom.xml Tue Jan 2 16:29:52 2007
@@ -9,7 +9,7 @@
<artifactId>velocity-news-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>Velocity News Plugin</name>
- <version>0.0.1</version>
+ <version>1.0.0</version>
<description>This plugin generates a news page and rss feed from news items. It also allows timed display of these items and
integration into other pages through doxia macros.</description>
<url>http://people.apache.org/~henning/velocity-news-plugin/</url>
@@ -64,7 +64,17 @@
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-news-extension</artifactId>
- <version>0.0.1</version>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>rome</groupId>
+ <artifactId>rome</artifactId>
+ <version>0.8</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.2</version>
</dependency>
</dependencies>
<reporting>
@@ -122,4 +132,4 @@
<url>scpexe://people.apache.org/home/henning/public_html/velocity-news-plugin</url>
</site>
</distributionManagement>
-</project>
+</project>
\ No newline at end of file
Modified: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsPlugin.java
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsPlugin.java?view=diff&rev=491988&r1=491987&r2=491988
==============================================================================
--- velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsPlugin.java (original)
+++ velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsPlugin.java Tue Jan 2 16:29:52 2007
@@ -44,6 +44,14 @@
*/
protected String newsFileName;
+ /**
+ * Configuration of the base URL of the feed
+ *
+ * @parameter expression="${baseUrl}"
+ * @required
+ */
+ protected String baseUrl;
+
public Parser getAptParser() {
return aptParser;
}
@@ -56,7 +64,11 @@
return newsContainer;
}
- protected String getNewsFileName() {
+ public String getNewsFileName() {
return newsFileName;
+ }
+
+ public String getBaseUrl() {
+ return baseUrl;
}
}
Modified: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsReport.java
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsReport.java?view=diff&rev=491988&r1=491987&r2=491988
==============================================================================
--- velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsReport.java (original)
+++ velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/AbstractVelocityNewsReport.java Tue Jan 2 16:29:52 2007
@@ -27,7 +27,16 @@
* @required
* @readonly
*/
- protected Renderer siteRenderer;
+ private Renderer siteRenderer;
+
+ /**
+ * Specifies the directory where the report will be generated
+ *
+ * @parameter default-value="${project.reporting.outputDirectory}"
+ * @required
+ */
+ private File outputDirectory;
+
/**
* The Maven Project Object
@@ -39,12 +48,20 @@
private MavenProject project;
/**
- * Specifies the directory where the report will be generated
- *
- * @parameter default-value="${project.reporting.outputDirectory}"
- * @required
+ * @see org.apache.maven.reporting.AbstractMavenReport#getOutputDirectory()
*/
- protected File outputDirectory;
+ public String getOutputDirectory()
+ {
+ return outputDirectory.getAbsolutePath();
+ }
+
+ /**
+ * @see org.apache.maven.reporting.AbstractMavenReport#getProject()
+ */
+ public MavenProject getProject()
+ {
+ return project;
+ }
/**
* Shortcut Mojo Execution. This is not a real plugin.
@@ -99,22 +116,6 @@
public boolean isExternalReport()
{
return false;
- }
-
- /**
- * @see org.apache.maven.reporting.AbstractMavenReport#getOutputDirectory()
- */
- protected String getOutputDirectory()
- {
- return outputDirectory.getAbsolutePath();
- }
-
- /**
- * @see org.apache.maven.reporting.AbstractMavenReport#getProject()
- */
- protected MavenProject getProject()
- {
- return project;
}
/**
Added: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java?view=auto&rev=491988
==============================================================================
--- velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java (added)
+++ velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java Tue Jan 2 16:29:52 2007
@@ -0,0 +1,24 @@
+package org.apache.velocity.maven.plugin.news;
+
+import org.apache.maven.doxia.parser.Parser;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * Describes the dependencies needed by the NewsFeedGenerator.
+ *
+ * @author <a href="mailto:henning@apache.org">Henning P. Schmiedehausen</a>
+ * @version $Revision$
+ */
+
+public interface NewsFeed {
+
+ MavenProject getProject();
+
+ String getNewsFileName();
+
+ String getOutputDirectory();
+
+ Parser getAptParser();
+
+ String getBaseUrl();
+}
Propchange: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeed.java
------------------------------------------------------------------------------
svn:keywords = Id Author Date Revision
Added: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java?view=auto&rev=491988
==============================================================================
--- velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java (added)
+++ velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java Tue Jan 2 16:29:52 2007
@@ -0,0 +1,178 @@
+package org.apache.velocity.maven.plugin.news;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.doxia.module.xhtml.XhtmlSink;
+import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
+import org.apache.maven.doxia.parser.ParseException;
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.velocity.maven.plugin.news.model.Item;
+import org.apache.velocity.news.VelocityNewsException;
+import org.apache.velocity.news.utils.VelocityNewsUtils;
+
+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;
+
+/**
+ * Generate the RSS News Feed.
+ *
+ * @author <a href="mailto:henning@apache.org">Henning P. Schmiedehausen</a>
+ * @version $Revision$
+ *
+ */
+public class NewsFeedGenerator {
+
+ private final NewsFeed newsFeed;
+
+ private SyndFeed feed = null;
+
+ private List feedEntries = new ArrayList();
+
+ public NewsFeedGenerator(final NewsFeed newsFeed) {
+ this.newsFeed = newsFeed;
+ }
+
+ public void openFeed() {
+
+ feed = new SyndFeedImpl();
+ feed.setFeedType("rss_2.0");
+ feed.setEncoding("UTF-8");
+
+ // Todo Localization ?
+ String projectName = newsFeed.getProject().getName();
+ feed.setTitle(projectName + " News");
+ feed.setDescription("Recent news from " + projectName);
+
+ String link = newsFeed.getProject().getUrl();
+ if (StringUtils.isNotEmpty(link)) {
+ feed.setLink(link);
+ }
+ }
+
+ public void publishItem(final Item item) throws VelocityNewsException {
+ if (feed != null) {
+ SyndEntry entry = new SyndEntryImpl();
+ entry.setTitle(item.getHeadline());
+ entry.setLink(newsFeed.getBaseUrl() + newsFeed.getNewsFileName() + ".html#" + item.getId());
+
+ if (item.getDate() != null) {
+ entry.setPublishedDate(VelocityNewsUtils.parseItemDate(item.getDate()));
+ }
+
+ SyndContent content = new SyndContentImpl();
+ content.setType("text/html");
+ content.setValue(getAsHtml(item.getText()));
+
+ entry.setDescription(content);
+
+ feedEntries.add(entry);
+ }
+ }
+
+ public void publishFeed() throws VelocityNewsException {
+ if (feed != null) {
+
+ File dir = new File(newsFeed.getOutputDirectory(), "/rss");
+
+ if (!dir.exists()) {
+ if (!dir.mkdir()) {
+ throw new VelocityNewsException("Could not create RSS dir " + dir);
+ }
+ }
+ if (!dir.canWrite() || !dir.isDirectory()) {
+ throw new VelocityNewsException("RSS dir " + dir
+ + " already exists but it is either no directory or not writeable!");
+ }
+
+ File feedFile = new File(dir, "/" + newsFeed.getNewsFileName() + ".rss");
+
+ if (feedFile.exists() && !feedFile.canWrite()) {
+ throw new VelocityNewsException("Can not write to the RSS file " + feedFile);
+ }
+
+ FileOutputStream fos = null;
+ OutputStreamWriter osw = null;
+ BufferedWriter bw = null;
+
+ try {
+ fos = new FileOutputStream(feedFile);
+ osw = new OutputStreamWriter(fos, "UTF-8");
+ bw = new BufferedWriter(osw);
+
+ SyndFeedOutput output = new SyndFeedOutput();
+ try {
+ feed.setEntries(feedEntries);
+ output.output(feed, bw);
+ } catch (FeedException fe) {
+ throw new VelocityNewsException("While publishing Feed: ", fe);
+ }
+
+ bw.flush();
+ } catch (IOException ioe) {
+ throw new VelocityNewsException("While writing feed: ", ioe);
+ } finally {
+ IOUtils.closeQuietly(bw);
+ IOUtils.closeQuietly(osw);
+ IOUtils.closeQuietly(fos);
+ }
+ }
+ }
+
+ private String getAsHtml(final String itemText) throws VelocityNewsException {
+
+ String aptText = " " + itemText;
+
+ StringWriter stringWriter = new StringWriter();
+ RenderingContext renderContext = new RenderingContext(new File(newsFeed.getOutputDirectory()), "/" + newsFeed.getNewsFileName() + ".html", null);
+
+ Sink sink = new NewsItemSink(stringWriter, renderContext);
+
+ try {
+ newsFeed.getAptParser().parse(new StringReader(aptText), sink);
+ } catch (ParseException pe) {
+ throw new VelocityNewsException("While parsing Apt: ", pe);
+ }
+
+ return stringWriter.toString();
+ }
+
+ public static class NewsItemSink
+ extends XhtmlSink {
+ private NewsItemSink(final Writer writer, final RenderingContext renderingContext) {
+ super(writer, renderingContext, Collections.EMPTY_MAP);
+ }
+
+ public void head() {
+ resetState();
+ setHeadFlag(true);
+ }
+
+ public void head_() {
+ setHeadFlag(false);
+ }
+
+ public void body() {
+ }
+
+ public void body_() {
+ }
+ }
+}
Propchange: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/NewsFeedGenerator.java
------------------------------------------------------------------------------
svn:keywords = Id Author Date Revision
Modified: velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/VelocityNewsReport.java
URL: http://svn.apache.org/viewvc/velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/VelocityNewsReport.java?view=diff&rev=491988&r1=491987&r2=491988
==============================================================================
--- velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/VelocityNewsReport.java (original)
+++ velocity/site/velocity-news-plugin/src/main/java/org/apache/velocity/maven/plugin/news/VelocityNewsReport.java Tue Jan 2 16:29:52 2007
@@ -21,7 +21,7 @@
*
* @goal news
*/
-public class VelocityNewsReport extends AbstractVelocityNewsReport implements MavenReport, NewsReport {
+public class VelocityNewsReport extends AbstractVelocityNewsReport implements MavenReport, NewsReport, NewsFeed {
public ResourceBundle getBundle(final Locale locale) {
return ResourceBundle.getBundle( "velocity-news-report", locale, VelocityNewsReport.class.getClassLoader() );
@@ -53,6 +53,7 @@
if (newsModel != null) {
generateNewsPage(newsModel, locale);
+ generateNewsRssFeed(newsModel);
}
} catch (VelocityNewsException vne) {
@@ -75,5 +76,26 @@
}
newsPageGenerator.closePage();
+ }
+
+ private void generateNewsRssFeed(final NewsModel newsModel) throws VelocityNewsException {
+ String outputDirectory = getOutputDirectory();
+
+ if (outputDirectory == null) {
+ throw new VelocityNewsException("No output directory specified!");
+ }
+
+ NewsFeedGenerator newsFeedGenerator = new NewsFeedGenerator(this);
+
+ newsFeedGenerator.openFeed();
+
+ List items = VelocityNewsUtils.sortItemsByReverseDate(newsModel.getItem());
+
+ for(Iterator it = items.iterator(); it.hasNext(); ) {
+ Item newsItem = (Item) it.next();
+ newsFeedGenerator.publishItem(newsItem);
+ }
+
+ newsFeedGenerator.publishFeed();
}
}