001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.web.view;
018
019import java.io.IOException;
020import java.io.PrintWriter;
021import java.util.Date;
022import java.util.List;
023
024import javax.jms.JMSException;
025import javax.jms.Message;
026import javax.jms.QueueBrowser;
027import javax.jms.TextMessage;
028import javax.servlet.ServletException;
029import javax.servlet.http.HttpServletRequest;
030import javax.servlet.http.HttpServletResponse;
031
032import com.sun.syndication.feed.synd.SyndContent;
033import com.sun.syndication.feed.synd.SyndContentImpl;
034import com.sun.syndication.feed.synd.SyndEntry;
035import com.sun.syndication.feed.synd.SyndEntryImpl;
036import com.sun.syndication.feed.synd.SyndFeed;
037import com.sun.syndication.feed.synd.SyndFeedImpl;
038import com.sun.syndication.io.FeedException;
039import com.sun.syndication.io.SyndFeedOutput;
040
041/**
042 * This renderer uses XStream to render messages on a queue as full XML elements
043 * 
044 * 
045 */
046public class RssMessageRenderer extends SimpleMessageRenderer {
047
048    // private String feedType = "atom_0.3";
049    private String feedType = "rss_2.0";
050    private SyndFeed feed;
051    private String description = "This feed is auto-generated by Apache ActiveMQ";
052    private String entryContentType = "text/plain";
053
054    public void renderMessage(PrintWriter writer, HttpServletRequest request, HttpServletResponse response, QueueBrowser browser, Message message) throws JMSException {
055        SyndFeed feed = getFeed(browser, request);
056
057        List<SyndEntry> entries = feed.getEntries();
058        SyndEntry entry = createEntry(browser, message, request);
059        SyndContent description = createEntryContent(browser, message, request);
060        entry.setDescription(description);
061        entries.add(entry);
062    }
063
064    // Properties
065    // -------------------------------------------------------------------------
066    public String getDescription() {
067        return description;
068    }
069
070    public void setDescription(String feedDescription) {
071        this.description = feedDescription;
072    }
073
074    public String getFeedType() {
075        return feedType;
076    }
077
078    public void setFeedType(String feedType) {
079        this.feedType = feedType;
080    }
081
082    public String getEntryContentType() {
083        return entryContentType;
084    }
085
086    public void setEntryContentType(String entryContentType) {
087        this.entryContentType = entryContentType;
088    }
089
090    // Implementation methods
091    // -------------------------------------------------------------------------
092
093    protected void printFooter(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) throws IOException, JMSException, ServletException {
094        // now lets actually write out the content
095        SyndFeed feed = getFeed(browser, request);
096        SyndFeedOutput output = new SyndFeedOutput();
097        try {
098            output.output(feed, writer);
099        } catch (FeedException e) {
100            throw new ServletException(e);
101        }
102    }
103
104    protected void printHeader(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) throws IOException, JMSException {
105    }
106
107    public SyndFeed getFeed(QueueBrowser browser, HttpServletRequest request) throws JMSException {
108        if (feed == null) {
109            feed = createFeed(browser, request);
110        }
111        return feed;
112    }
113
114    protected SyndEntry createEntry(QueueBrowser browser, Message message, HttpServletRequest request) throws JMSException {
115        SyndEntry entry = new SyndEntryImpl();
116        String title = message.getJMSMessageID();
117        entry.setTitle(title);
118        String link = request.getRequestURI() + "?msgId=" + title;
119        entry.setLink(link);
120        entry.setPublishedDate(new Date(message.getJMSTimestamp()));
121        return entry;
122    }
123
124    protected SyndContent createEntryContent(QueueBrowser browser, Message message, HttpServletRequest request) throws JMSException {
125        SyndContent description = new SyndContentImpl();
126        description.setType(entryContentType);
127
128        if (message instanceof TextMessage) {
129            String text = ((TextMessage)message).getText();
130            description.setValue(text);
131        }
132        return description;
133    }
134
135    protected SyndFeed createFeed(QueueBrowser browser, HttpServletRequest request) throws JMSException {
136        SyndFeed feed = new SyndFeedImpl();
137        feed.setFeedType(feedType);
138
139        String title = browser.getQueue().toString();
140        String selector = browser.getMessageSelector();
141        if (selector != null) {
142            title += " with selector: " + selector;
143        }
144        feed.setTitle(title);
145        feed.setLink(request.getRequestURI());
146        feed.setDescription(getDescription());
147        return feed;
148    }
149
150}