Commit in servicemix/base/src/main/java/org/servicemix/components/rss on MAIN
FeedWriter.java+243added 1.1
added a simple RSS feed writer component which puts messages into an RSS feed so they can be viewed/polled using an RSS reader.

For SM-72

servicemix/base/src/main/java/org/servicemix/components/rss
FeedWriter.java added at 1.1
diff -N FeedWriter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ FeedWriter.java	23 Sep 2005 02:01:34 -0000	1.1
@@ -0,0 +1,243 @@
+/**
+ * 
+ * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
+ * 
+ * Licensed 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.servicemix.components.rss;
+
+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.SyndFeedInput;
+import com.sun.syndication.io.SyndFeedOutput;
+import com.sun.syndication.io.XmlReader;
+
+import org.servicemix.jbi.binding.OutBinding;
+import org.servicemix.jbi.jaxp.SourceTransformer;
+
+import javax.jbi.JBIException;
+import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
+import javax.jbi.messaging.NormalizedMessage;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * This component generates an RSS/Atom Feed from the JBI messages it
+ * receives.
+ * 
+ * @version $Revision$
+ */
+public class FeedWriter extends OutBinding {
+
+    private String feedType = "atom_0.3";
+    private SyndFeed cachedFeed;
+    private String title = "ServiceMix Message Feed";
+    private String link;
+    private String feedDescription = "This feed is autogenerated by ServiceMix";
+    private int maximumEntryCount = 20;
+    private File feedFile;
+    private SourceTransformer sourceTransformer = new SourceTransformer();
+
+    public SyndFeed getCachedFeed() throws IllegalArgumentException, FeedException, IOException {
+        if (cachedFeed == null) {
+            cachedFeed = loadOrCreateFeed();
+        }
+        return cachedFeed;
+    }
+
+    public void setCachedFeed(SyndFeed feed) {
+        this.cachedFeed = feed;
+    }
+
+    public String getFeedType() {
+        return feedType;
+    }
+
+    public void setFeedType(String feedType) {
+        this.feedType = feedType;
+    }
+
+    public String getFeedDescription() {
+        return feedDescription;
+    }
+
+    public void setFeedDescription(String feedDescription) {
+        this.feedDescription = feedDescription;
+    }
+
+    public String getLink() {
+        return link;
+    }
+
+    public void setLink(String link) {
+        this.link = link;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public int getMaximumEntryCount() {
+        return maximumEntryCount;
+    }
+
+    public void setMaximumEntryCount(int maximumEntryCount) {
+        this.maximumEntryCount = maximumEntryCount;
+    }
+
+    public File getFeedFile() {
+        if (feedFile == null) {
+            throw new IllegalArgumentException("You must set the 'feedFile' property");
+        }
+        return feedFile;
+    }
+
+    public void setFeedFile(File feedFile) {
+        this.feedFile = feedFile;
+    }
+
+    // Implementation methods
+    // -------------------------------------------------------------------------
+
+    public SourceTransformer getSourceTransformer() {
+        return sourceTransformer;
+    }
+
+    public void setSourceTransformer(SourceTransformer sourceTransformer) {
+        this.sourceTransformer = sourceTransformer;
+    }
+
+    protected void init() throws JBIException {
+        super.init();
+
+        // enforce validation
+        File file = getFeedFile();
+        if (file.exists() && file.isDirectory()) {
+            throw new IllegalArgumentException("Cannot generate the cachedFeed as the cachedFeed file is a directory: "
+                    + file);
+        }
+    }
+
+    protected void process(MessageExchange exchange, NormalizedMessage message) throws MessagingException {
+        try {
+            SyndFeed feed = getCachedFeed();
+            addMessageToFeed(feed, exchange, message);
+            removeExpiredEntries(feed);
+            writeFeed(feed, exchange, message);
+        }
+        catch (IOException e) {
+            throw new MessagingException(e);
+        }
+        catch (FeedException e) {
+            throw new MessagingException(e);
+        }
+        catch (TransformerException e) {
+            throw new MessagingException(e);
+        }
+    }
+
+    protected void addMessageToFeed(SyndFeed feed, MessageExchange exchange, NormalizedMessage message)
+            throws TransformerException {
+        List entries = feed.getEntries();
+        SyndEntry entry = createEntry(exchange, message);
+        SyndContent description = createEntryContent(exchange, message);
+        entry.setDescription(description);
+        entries.add(entry);
+    }
+
+    protected SyndEntry createEntry(MessageExchange exchange, NormalizedMessage message) {
+        SyndEntry entry = new SyndEntryImpl();
+
+        // TODO use expressions here...
+        entry.setTitle("ServiceMix");
+        entry.setLink("http://servicemix.org/RSS");
+        entry.setPublishedDate(new Date());
+        return entry;
+    }
+
+    protected SyndContent createEntryContent(MessageExchange exchange, NormalizedMessage message)
+            throws TransformerException {
+        SyndContent description = new SyndContentImpl();
+        description.setType("text/xml");
+        Source content = message.getContent();
+
+        // TODO use an _expression_ for the value?
+        if (content != null) {
+            String value = getSourceTransformer().toString(content);
+            description.setValue(value);
+        }
+        return description;
+    }
+
+    protected void writeFeed(SyndFeed feed, MessageExchange messageExchange, NormalizedMessage message)
+            throws IOException, FeedException {
+        Writer writer = new FileWriter(feedFile);
+        SyndFeedOutput output = new SyndFeedOutput();
+        output.output(feed, writer);
+        writer.close();
+    }
+
+    /**
+     * Removes any old entires no longer required in the cachedFeed
+     * 
+     * @param feed
+     */
+    protected void removeExpiredEntries(SyndFeed feed) {
+        // lets limit the count
+        if (maximumEntryCount > 0) {
+            List entries = feed.getEntries();
+            int size = entries.size();
+            if (size > maximumEntryCount) {
+                entries.subList(0, size - maximumEntryCount).clear();
+            }
+        }
+    }
+
+    protected SyndFeed loadOrCreateFeed() throws IllegalArgumentException, FeedException, IOException {
+        File file = getFeedFile();
+        if (file.exists() && file.isFile()) {
+            SyndFeedInput input = new SyndFeedInput();
+            return input.build(new XmlReader(file));
+        }
+        return createFeed();
+    }
+
+    protected SyndFeed createFeed() {
+        SyndFeed feed = new SyndFeedImpl();
+        feed.setFeedType(feedType);
+
+        feed.setTitle(getTitle());
+        feed.setLink(getLink());
+        feed.setDescription(getFeedDescription());
+        return feed;
+    }
+
+}
CVSspam 0.2.8

Reply via email to