| Commit in servicemix/base/src/main/java/org/servicemix/components/rss on MAIN | |||
| FeedWriter.java | +243 | added 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;
+ }
+
+}
