Return-Path:
+ *
+ *
+ * @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("