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();
     }
 }