Return-Path: Delivered-To: apmail-geronimo-activemq-commits-archive@www.apache.org Received: (qmail 43823 invoked from network); 28 Mar 2006 11:58:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 28 Mar 2006 11:58:26 -0000 Received: (qmail 47528 invoked by uid 500); 28 Mar 2006 11:58:26 -0000 Delivered-To: apmail-geronimo-activemq-commits-archive@geronimo.apache.org Received: (qmail 47507 invoked by uid 500); 28 Mar 2006 11:58:25 -0000 Mailing-List: contact activemq-commits-help@geronimo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: activemq-dev@geronimo.apache.org Delivered-To: mailing list activemq-commits@geronimo.apache.org Received: (qmail 47497 invoked by uid 99); 28 Mar 2006 11:58:25 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 28 Mar 2006 03:58:25 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Tue, 28 Mar 2006 03:58:24 -0800 Received: (qmail 43714 invoked by uid 65534); 28 Mar 2006 11:58:03 -0000 Message-ID: <20060328115803.43713.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r389482 - in /incubator/activemq/trunk/activemq-web: ./ src/main/java/org/apache/activemq/web/ src/main/java/org/apache/activemq/web/view/ src/main/resources/META-INF/services/ src/main/resources/META-INF/services/org/ src/main/resources/ME... Date: Tue, 28 Mar 2006 11:57:56 -0000 To: activemq-commits@geronimo.apache.org From: jstrachan@apache.org X-Mailer: svnmailer-1.0.7 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jstrachan Date: Tue Mar 28 03:57:51 2006 New Revision: 389482 URL: http://svn.apache.org/viewcvs?rev=389482&view=rev Log: added support for RESTful browsing of message queues using a web container; either as XML or as RSS/Atom feeds. Fixes AMQ-666 - crikey thats a bad number for an AMQ issue :) Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java (with props) incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java (with props) incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java (with props) incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java (with props) incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java (with props) incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java (with props) incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/rss incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/simple incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/xml Modified: incubator/activemq/trunk/activemq-web/project.xml incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java incubator/activemq/trunk/activemq-web/src/main/webapp/WEB-INF/web.xml incubator/activemq/trunk/activemq-web/src/main/webapp/index.html incubator/activemq/trunk/activemq-web/src/main/webapp/send.html incubator/activemq/trunk/activemq-web/src/test/java/org/apache/activemq/web/JettyServer.java Modified: incubator/activemq/trunk/activemq-web/project.xml URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/project.xml?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/project.xml (original) +++ incubator/activemq/trunk/activemq-web/project.xml Tue Mar 28 03:57:51 2006 @@ -74,6 +74,9 @@ org.apache.derby derby ${derby_version} + + true + @@ -91,6 +94,41 @@ ${pom.groupId} activeio-core ${activeio_version} + + true + + + + + + rome + ${rome_version} + + true + + + + + jdom + ${jdom_version} + + true + + + + + xstream + xstream + ${xstream_version} + + true + + + + + xmlpull + xmlpull + ${xmlpull_version} Modified: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java (original) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/MessageListenerServlet.java Tue Mar 28 03:57:51 2006 @@ -185,11 +185,30 @@ } else { + // lets assume a simple POST of a message + /* response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.getWriter().print(""); + */ + + try { + Destination destination=getDestination(client, request); + String body = getPostedMessageBody(request); + TextMessage message = client.getSession().createTextMessage(body ); + client.send(destination, message); + if (log.isDebugEnabled()) { + log.debug("Sent to destination: " + destination + " body: " + body); + } + + response.setContentType("text"); + response.setHeader("Cache-Control", "no-cache"); + response.getWriter().print(message.getJMSMessageID()); + } + catch (JMSException e) { + throw new ServletException(e); + } } - // System.err.println("=="); } /** Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,38 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web; + +import javax.servlet.ServletException; + +/** + * + * @version $Revision: $ + */ +public class NoSuchViewStyleException extends ServletException { + + private static final long serialVersionUID = -3590398087507019767L; + + private final String style; + + public NoSuchViewStyleException(String style, Throwable cause) { + super("The view style '" + style + "' could not be created", cause); + this.style = style; + } + + public String getStyle() { + return style; + } +} Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/NoSuchViewStyleException.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,182 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web; + +import org.apache.activeio.util.FactoryFinder; +import org.apache.activemq.ActiveMQConnectionFactory; +import org.apache.activemq.util.IntrospectionSupport; +import org.apache.activemq.web.view.MessageRenderer; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.JMSException; +import javax.jms.Queue; +import javax.jms.QueueBrowser; +import javax.jms.Session; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + +/** + * Renders the contents of a queue using some kind of view. The URI is assumed + * to be the queue. The following parameters can be used + * + *
    + *
  • view - specifies the type of the view such as simple, xml, rss
  • + *
  • selector - specifies the SQL 92 selector to apply to the queue
  • + *
+ * + * @version $Revision: $ + */ +public class QueueBrowseServlet extends HttpServlet { + + private static FactoryFinder factoryFinder = new FactoryFinder("META-INF/services/org/apache/activemq/web/view/"); + + private ConnectionFactory connectionFactory; + private Connection connection; + private LinkedList sessions = new LinkedList(); + + public Connection getConnection() throws JMSException { + if (connection == null) { + connection = getConnectionFactory().createConnection(); + connection.start(); + } + return connection; + } + + public void setConnection(Connection connection) { + this.connection = connection; + } + + public ConnectionFactory getConnectionFactory() { + if (connectionFactory == null) { + // TODO support remote brokers too + connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); + } + return connectionFactory; + } + + public void setConnectionFactory(ConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + } + + // Implementation methods + // ------------------------------------------------------------------------- + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Session session = null; + try { + session = borrowSession(); + Queue queue = getQueue(request, session); + if (queue == null) { + throw new ServletException("No queue URI specified"); + } + String selector = getSelector(request); + QueueBrowser browser = session.createBrowser(queue, selector); + MessageRenderer renderer = getMessageRenderer(request); + configureRenderer(request, renderer); + renderer.renderMessages(request, response, browser); + } + catch (JMSException e) { + throw new ServletException(e); + } + finally { + returnSession(session); + } + } + + protected MessageRenderer getMessageRenderer(HttpServletRequest request) throws IOException, ServletException { + String style = request.getParameter("view"); + if (style == null) { + style = "simple"; + } + try { + return (MessageRenderer) factoryFinder.newInstance(style); + } + catch (IllegalAccessException e) { + throw new NoSuchViewStyleException(style, e); + } + catch (InstantiationException e) { + throw new NoSuchViewStyleException(style, e); + } + catch (ClassNotFoundException e) { + throw new NoSuchViewStyleException(style, e); + } + } + + protected void configureRenderer(HttpServletRequest request, MessageRenderer renderer) { + Map properties = new HashMap(); + for (Enumeration iter = request.getParameterNames(); iter.hasMoreElements(); ) { + String name = (String) iter.nextElement(); + properties.put(name, request.getParameter(name)); + } + IntrospectionSupport.setProperties(renderer, properties); + } + + protected Session borrowSession() throws JMSException { + Session answer = null; + synchronized (sessions) { + if (sessions.isEmpty()) { + answer = createSession(); + } + else { + answer = (Session) sessions.removeLast(); + } + } + return answer; + } + + protected void returnSession(Session session) { + if (session != null) { + synchronized (sessions) { + sessions.add(session); + } + } + } + + protected Session createSession() throws JMSException { + return getConnection().createSession(false, Session.AUTO_ACKNOWLEDGE); + } + + protected String getSelector(HttpServletRequest request) { + return request.getParameter("selector"); + } + + protected Queue getQueue(HttpServletRequest request, Session session) throws JMSException { + String uri = request.getPathInfo(); + if (uri == null) + return null; + + // replace URI separator with JMS destination separator + if (uri.startsWith("/")) { + uri = uri.substring(1); + if (uri.length() == 0) + return null; + } + uri = uri.replace('/', '.'); + + System.out.println("destination uri = " + uri); + + return session.createQueue(uri); + } + +} Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/QueueBrowseServlet.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,42 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web.view; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.QueueBrowser; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; + +/** + * Represents a rendering of the messages + * + * @version $Revision: $ + */ +public interface MessageRenderer { + + public void renderMessages(HttpServletRequest request, HttpServletResponse response, QueueBrowser browser) + throws IOException, JMSException, ServletException; + + public void renderMessage(PrintWriter writer, HttpServletRequest request, HttpServletResponse response, + QueueBrowser browser, Message message) throws JMSException, ServletException; + +} \ No newline at end of file Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/MessageRenderer.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,153 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web.view; + +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; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.QueueBrowser; +import javax.jms.TextMessage; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Date; +import java.util.List; + +/** + * This renderer uses XStream to render messages on a queue as full XML elements + * + * @version $Revision: $ + */ +public class RssMessageRenderer extends SimpleMessageRenderer { + + //private String feedType = "atom_0.3"; + private String feedType = "rss_2.0"; + private SyndFeed feed; + private String description = "This feed is auto-generated by Apache ActiveMQ"; + private String entryContentType = "text/plain"; + + public void renderMessage(PrintWriter writer, HttpServletRequest request, HttpServletResponse response, + QueueBrowser browser, Message message) throws JMSException { + SyndFeed feed = getFeed(browser, request); + + List entries = feed.getEntries(); + SyndEntry entry = createEntry(browser, message, request); + SyndContent description = createEntryContent(browser, message, request); + entry.setDescription(description); + entries.add(entry); + } + + // Properties + // ------------------------------------------------------------------------- + public String getDescription() { + return description; + } + + public void setDescription(String feedDescription) { + this.description = feedDescription; + } + + public String getFeedType() { + return feedType; + } + + public void setFeedType(String feedType) { + this.feedType = feedType; + } + + public String getEntryContentType() { + return entryContentType; + } + + public void setEntryContentType(String entryContentType) { + this.entryContentType = entryContentType; + } + + // Implementation methods + // ------------------------------------------------------------------------- + + protected void printFooter(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) + throws IOException, JMSException, ServletException { + // now lets actually write out the content + SyndFeed feed = getFeed(browser, request); + SyndFeedOutput output = new SyndFeedOutput(); + try { + output.output(feed, writer); + } + catch (FeedException e) { + throw new ServletException(e); + } + } + + protected void printHeader(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) + throws IOException, JMSException { + } + + public SyndFeed getFeed(QueueBrowser browser, HttpServletRequest request) throws JMSException { + if (feed == null) { + feed = createFeed(browser, request); + } + return feed; + } + + protected SyndEntry createEntry(QueueBrowser browser, Message message, HttpServletRequest request) throws JMSException { + SyndEntry entry = new SyndEntryImpl(); + String title = message.getJMSMessageID(); + entry.setTitle(title); + String link = request.getRequestURI() + "/" + title; + entry.setLink(link); + entry.setPublishedDate(new Date()); + return entry; + } + + protected SyndContent createEntryContent(QueueBrowser browser, Message message, HttpServletRequest request) throws JMSException { + SyndContent description = new SyndContentImpl(); + description.setType(entryContentType); + + if (message instanceof TextMessage) { + String text = ((TextMessage) message).getText(); + description.setValue(text); + } + return description; + } + + protected SyndFeed createFeed(QueueBrowser browser, HttpServletRequest request) throws JMSException { + SyndFeed feed = new SyndFeedImpl(); + feed.setFeedType(feedType); + + String title = browser.getQueue().toString(); + String selector = browser.getMessageSelector(); + if (selector != null) { + title += " with selector: " + selector; + } + feed.setTitle(title); + feed.setLink(request.getRequestURI()); + feed.setDescription(getDescription()); + return feed; + } + +} Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/RssMessageRenderer.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,105 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web.view; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.QueueBrowser; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; + +/** + * A simple rendering of the contents of a queue appear as a list of message + * elements which just contain an ID attribute. + * + * @version $Revision: $ + */ +public class SimpleMessageRenderer implements MessageRenderer { + + private String contentType = "text/xml"; + private int maxMessages = 0; + + public void renderMessages(HttpServletRequest request, HttpServletResponse response, QueueBrowser browser) + throws IOException, JMSException, ServletException { + // lets use XML by default + response.setContentType(getContentType()); + PrintWriter writer = response.getWriter(); + printHeader(writer, browser, request); + + Enumeration iter = browser.getEnumeration(); + for (int counter = 0; iter.hasMoreElements() && (maxMessages <= 0 || counter < maxMessages); counter++) { + Message message = (Message) iter.nextElement(); + renderMessage(writer, request, response, browser, message); + } + + printFooter(writer, browser, request); + } + + public void renderMessage(PrintWriter writer, HttpServletRequest request, HttpServletResponse response, + QueueBrowser browser, Message message) throws JMSException, ServletException { + // lets just write the message IDs for now + writer.print(""); + } + + // Properties + // ------------------------------------------------------------------------- + public int getMaxMessages() { + return maxMessages; + } + + public void setMaxMessages(int maxMessages) { + this.maxMessages = maxMessages; + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + // Implementation methods + // ------------------------------------------------------------------------- + + protected void printHeader(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) + throws IOException, JMSException, ServletException { + writer.println(""); + writer.print(""); + } + + protected void printFooter(PrintWriter writer, QueueBrowser browser, HttpServletRequest request) + throws IOException, JMSException, ServletException { + writer.println(""); + } + +} Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/SimpleMessageRenderer.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java (added) +++ incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java Tue Mar 28 03:57:51 2006 @@ -0,0 +1,51 @@ +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * 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.apache.activemq.web.view; + +import com.thoughtworks.xstream.XStream; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.QueueBrowser; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.PrintWriter; + +/** + * This renderer uses XStream to render messages on a queue as full XML elements + * + * @version $Revision: $ + */ +public class XmlMessageRenderer extends SimpleMessageRenderer { + + private XStream xstream; + + public void renderMessage(PrintWriter writer, HttpServletRequest request, HttpServletResponse response, QueueBrowser browser, Message message) throws JMSException { + getXstream().toXML(message, writer); + } + + public XStream getXstream() { + if (xstream == null) { + xstream = new XStream(); + } + return xstream; + } + + public void setXstream(XStream xstream) { + this.xstream = xstream; + } +} Propchange: incubator/activemq/trunk/activemq-web/src/main/java/org/apache/activemq/web/view/XmlMessageRenderer.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/rss URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/rss?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/rss (added) +++ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/rss Tue Mar 28 03:57:51 2006 @@ -0,0 +1 @@ +class=org.apache.activemq.web.view.RssMessageRenderer \ No newline at end of file Added: incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/simple URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/simple?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/simple (added) +++ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/simple Tue Mar 28 03:57:51 2006 @@ -0,0 +1 @@ +class=org.apache.activemq.web.view.SimpleMessageRenderer \ No newline at end of file Added: incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/xml URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/xml?rev=389482&view=auto ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/xml (added) +++ incubator/activemq/trunk/activemq-web/src/main/resources/META-INF/services/org/apache/activemq/web/view/xml Tue Mar 28 03:57:51 2006 @@ -0,0 +1 @@ +class=org.apache.activemq.web.view.XmlMessageRenderer \ No newline at end of file Modified: incubator/activemq/trunk/activemq-web/src/main/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/webapp/WEB-INF/web.xml?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/webapp/WEB-INF/web.xml (original) +++ incubator/activemq/trunk/activemq-web/src/main/webapp/WEB-INF/web.xml Tue Mar 28 03:57:51 2006 @@ -53,6 +53,12 @@ 1 + + + QueueBrowseServlet + org.apache.activemq.web.QueueBrowseServlet + + PortfolioPublishServlet @@ -63,6 +69,11 @@ MessageListenerServlet /amq/* + + + + QueueBrowseServlet + /queueBrowse/* Modified: incubator/activemq/trunk/activemq-web/src/main/webapp/index.html URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/webapp/index.html?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/webapp/index.html (original) +++ incubator/activemq/trunk/activemq-web/src/main/webapp/index.html Tue Mar 28 03:57:51 2006 @@ -42,5 +42,16 @@ Receive a message

+ +

Queue browser example

+ + + Modified: incubator/activemq/trunk/activemq-web/src/main/webapp/send.html URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/main/webapp/send.html?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/src/main/webapp/send.html (original) +++ incubator/activemq/trunk/activemq-web/src/main/webapp/send.html Tue Mar 28 03:57:51 2006 @@ -8,7 +8,7 @@

Send a JMS Message

-
+

Modified: incubator/activemq/trunk/activemq-web/src/test/java/org/apache/activemq/web/JettyServer.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-web/src/test/java/org/apache/activemq/web/JettyServer.java?rev=389482&r1=389481&r2=389482&view=diff ============================================================================== --- incubator/activemq/trunk/activemq-web/src/test/java/org/apache/activemq/web/JettyServer.java (original) +++ incubator/activemq/trunk/activemq-web/src/test/java/org/apache/activemq/web/JettyServer.java Tue Mar 28 03:57:51 2006 @@ -17,6 +17,8 @@ package org.apache.activemq.web; +import org.apache.activemq.broker.BrokerService; +import org.apache.activemq.demo.DefaultQueueSender; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; @@ -39,6 +41,18 @@ public static final String WEBAPP_CTX = "/"; public static void main(String[] args) throws Exception { + // lets create a broker + BrokerService broker = new BrokerService(); + broker.setPersistent(false); + broker.setUseJmx(true); + broker.addConnector("tcp://localhost:61616"); + broker.addConnector("stomp://localhost:61613"); + broker.start(); + + // lets publish some messages so that there is some stuff to browse + DefaultQueueSender.main(new String[] {"FOO.BAR"}); + + // now lets start the web server int port = PORT; if (args.length > 0) { String text = args[0];