You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2006/03/28 13:57:56 UTC

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...

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 @@
         <groupId>org.apache.derby</groupId>
         <artifactId>derby</artifactId>
         <version>${derby_version}</version>
+      <properties>
+        <war.bundle>true</war.bundle>
+      </properties>
     </dependency>
 
     <!-- For Spring servlet -->
@@ -91,6 +94,41 @@
       <groupId>${pom.groupId}</groupId>
       <artifactId>activeio-core</artifactId>
       <version>${activeio_version}</version>
+      <properties>
+        <war.bundle>true</war.bundle>
+      </properties>
+    </dependency>
+
+    <!-- Rome RSS Reader -->
+    <dependency>
+      <id>rome</id>
+      <version>${rome_version}</version>
+      <properties>
+        <war.bundle>true</war.bundle>
+      </properties>
+    </dependency>
+
+    <dependency>
+      <id>jdom</id>
+      <version>${jdom_version}</version>
+      <properties>
+        <war.bundle>true</war.bundle>
+      </properties>
+    </dependency>
+
+    <dependency>
+      <groupId>xstream</groupId>
+      <artifactId>xstream</artifactId>
+      <version>${xstream_version}</version>
+      <properties>
+        <war.bundle>true</war.bundle>
+      </properties>
+    </dependency>
+
+    <dependency>
+      <groupId>xmlpull</groupId>
+      <artifactId>xmlpull</artifactId>
+      <version>${xmlpull_version}</version>
     </dependency>
 
     <!-- optional used for in-web container testing -->

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("<ajax-response></ajax-response>");
+            */
+            
+            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
+ * 
+ * <ul>
+ * <li>view - specifies the type of the view such as simple, xml, rss</li>
+ * <li>selector - specifies the SQL 92 selector to apply to the queue</li>
+ * </ul>
+ * 
+ * @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("<message id='");
+        writer.print(message.getJMSMessageID());
+        writer.println("'/>");
+    }
+
+    // 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("<messages queue='");
+        writer.print(browser.getQueue());
+        writer.print("'");
+        String selector = browser.getMessageSelector();
+        if (selector != null) {
+            writer.print(" selector='");
+            writer.print(selector);
+            writer.print("'");
+        }
+        writer.println(">");
+    }
+
+    protected void printFooter(PrintWriter writer, QueueBrowser browser, HttpServletRequest request)
+            throws IOException, JMSException, ServletException {
+        writer.println("</messages>");
+    }
+
+}

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 @@
         <load-on-startup>1</load-on-startup>
     </servlet>
 
+    <!-- the queue browse servlet -->
+    <servlet>
+        <servlet-name>QueueBrowseServlet</servlet-name>
+        <servlet-class>org.apache.activemq.web.QueueBrowseServlet</servlet-class>
+    </servlet>
+
     <!-- servlets for the portfolio demo -->
     <servlet>
         <servlet-name>PortfolioPublishServlet</servlet-name>
@@ -63,6 +69,11 @@
     <servlet-mapping>
         <servlet-name>MessageListenerServlet</servlet-name>
         <url-pattern>/amq/*</url-pattern>
+    </servlet-mapping>
+    
+    <servlet-mapping>
+        <servlet-name>QueueBrowseServlet</servlet-name>
+        <url-pattern>/queueBrowse/*</url-pattern>
     </servlet-mapping>
     
     <servlet-mapping>

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 @@
 <a href="amq/FOO/BAR?timeout=10000">Receive a message</a>
 </p>
 
+
+<h2>Queue browser example</h2>
+
+<ul>
+<li><a href="queueBrowse/FOO/BAR">Browse a queue</a></li>
+<li><a href="queueBrowse/FOO/BAR?view=xml">Browse a queue as XML</a></li>
+<li><a href="queueBrowse/FOO/BAR?view=rss&feedTyoe=atom_0.3">Browse a queue as Atom</a></li>
+<li><a href="queueBrowse/FOO/BAR?view=rss&feedType=rss_1.0">Browse a queue as RSS 1.0</a></li>
+<li><a href="queueBrowse/FOO/BAR?view=rss&feedType=rss_2.0">Browse a queue as RSS 2.0</a></li>
+</ul>
+
 </body>
 </html>

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 @@
 <body>
 <h1>Send a JMS Message</h1>
 
-<form action="amq/FOO/BAR" method="post">
+<form action="amq/FOO/BAR?topic=false" method="post">
   <p>
     <label for="body">Message body: </label>
   </p>

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];