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     */
017    package org.apache.activemq.web.view;
018    
019    import java.io.IOException;
020    import java.io.PrintWriter;
021    import java.util.Date;
022    import java.util.List;
023    
024    import javax.jms.JMSException;
025    import javax.jms.Message;
026    import javax.jms.QueueBrowser;
027    import javax.jms.TextMessage;
028    import javax.servlet.ServletException;
029    import javax.servlet.http.HttpServletRequest;
030    import javax.servlet.http.HttpServletResponse;
031    
032    import com.sun.syndication.feed.synd.SyndContent;
033    import com.sun.syndication.feed.synd.SyndContentImpl;
034    import com.sun.syndication.feed.synd.SyndEntry;
035    import com.sun.syndication.feed.synd.SyndEntryImpl;
036    import com.sun.syndication.feed.synd.SyndFeed;
037    import com.sun.syndication.feed.synd.SyndFeedImpl;
038    import com.sun.syndication.io.FeedException;
039    import 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     */
046    public 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    }