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 018 package org.apache.geronimo.console.jmsmanager.renderers; 019 020 import java.io.IOException; 021 import java.util.ArrayList; 022 import java.util.Collections; 023 import java.util.Enumeration; 024 import java.util.Hashtable; 025 import java.util.List; 026 import java.util.Map; 027 028 import javax.jms.Destination; 029 import javax.jms.JMSException; 030 import javax.jms.Message; 031 import javax.jms.MessageListener; 032 import javax.jms.Queue; 033 import javax.jms.QueueBrowser; 034 import javax.jms.QueueConnection; 035 import javax.jms.QueueConnectionFactory; 036 import javax.jms.QueueSession; 037 import javax.jms.Topic; 038 import javax.management.ObjectName; 039 import javax.portlet.PortletException; 040 import javax.portlet.RenderRequest; 041 import javax.portlet.RenderResponse; 042 043 import org.apache.geronimo.console.jmsmanager.AbstractJMSManager; 044 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 045 import org.apache.geronimo.gbean.AbstractName; 046 import org.apache.commons.logging.Log; 047 import org.apache.commons.logging.LogFactory; 048 049 public class ViewMessagesRenderer extends AbstractJMSManager implements 050 PortletRenderer { 051 052 private static final Log log = LogFactory.getLog(ViewMessagesRenderer.class); 053 054 private static final TopicListener topicListener = new TopicListener(); 055 056 public String render(RenderRequest request, RenderResponse response) 057 throws PortletException, IOException { 058 List messageList = getMessageList(request, response); 059 request.setAttribute("messages", messageList); 060 return "/WEB-INF/view/jmsmanager/viewmessages.jsp"; 061 } 062 063 public List getMessageList(RenderRequest request, RenderResponse response) 064 throws PortletException { 065 String destinationApplicationName = request 066 .getParameter("destinationApplicationName"); 067 String destinationModuleName = request 068 .getParameter("destinationModuleName"); 069 String destinationName = request.getParameter("destinationName"); 070 071 List ret = new ArrayList(); 072 try { 073 //TODO configid disabled 074 AbstractName adminObjectName = null;//NameFactory.getComponentName(null, 075 // null, destinationApplicationName, NameFactory.JCA_RESOURCE, 076 // destinationModuleName, destinationName, null, baseContext); 077 Destination dest = (Destination) kernel.invoke(adminObjectName, 078 "$getResource"); 079 if (dest instanceof Queue) { 080 Queue queue = (Queue) dest; 081 QueueConnectionFactory qConFactory = null; 082 QueueConnection qConnection = null; 083 QueueSession qSession = null; 084 QueueBrowser qBrowser = null; 085 try { 086 qConFactory = (QueueConnectionFactory) kernel.invoke( 087 JCA_MANAGED_CONNECTION_FACTORY_NAME, 088 "$getResource"); 089 qConnection = qConFactory.createQueueConnection(); 090 qSession = qConnection.createQueueSession(false, 091 QueueSession.AUTO_ACKNOWLEDGE); 092 qBrowser = qSession.createBrowser(queue); 093 qConnection.start(); 094 for (Enumeration e = qBrowser.getEnumeration(); e 095 .hasMoreElements();) { 096 Object o = e.nextElement(); 097 ret.add(o); 098 } 099 qConnection.stop(); 100 } catch (Exception e) { 101 log.error(e.getMessage(), e); 102 } finally { 103 try { 104 if (qBrowser != null) { 105 qBrowser.close(); 106 } 107 } catch (JMSException ignore) { 108 } 109 try { 110 if (qSession != null) { 111 qSession.close(); 112 } 113 } catch (JMSException ignore) { 114 } 115 try { 116 if (qConnection != null) { 117 qConnection.close(); 118 } 119 } catch (JMSException ignore) { 120 } 121 } 122 } else if (dest instanceof Topic) { 123 //TODO configid disabled 124 AbstractName tBrowserObjName = null;//NameFactory.getComponentName(null, 125 // null, destinationApplicationName, 126 // NameFactory.JCA_RESOURCE, destinationModuleName, 127 // destinationName, "TopicBrowser", baseContext); 128 ret = (List) kernel.invoke(tBrowserObjName, "getMessages"); 129 } 130 } catch (Exception e) { 131 log.error(e.getMessage(), e); 132 } 133 return ret; 134 } 135 136 static class TopicListener implements MessageListener { 137 /** 138 * Hashtable to hold the messages for each topic. Messages are stored as 139 * Message/Topic key/value pairs. 140 */ 141 private Map messagesMap = new Hashtable(); 142 143 public final String name = this.toString(); 144 145 public synchronized void onMessage(Message message) { 146 try { 147 Destination dest = message.getJMSDestination(); 148 List messages = null; 149 if (!messagesMap.containsKey(dest)) { 150 register((Topic) dest); 151 } 152 messages = (List) messagesMap.get(dest); 153 154 if (!messages.contains(message)) { 155 messages.add(message); 156 } 157 messagesMap.put(dest, messages); 158 } catch (JMSException e) { 159 log.error(e.getMessage(), e); 160 } 161 } 162 163 public void register(Topic topic) { 164 if (!messagesMap.containsKey(topic)) { 165 List messages = new ArrayList(); 166 messagesMap.put(topic, messages); 167 } 168 } 169 170 public List getMessages(Topic topic) { 171 List ret; 172 if (messagesMap.containsKey(topic)) { 173 ret = (List) messagesMap.get(topic); 174 } else { 175 ret = Collections.EMPTY_LIST; 176 } 177 return Collections.unmodifiableList(ret); 178 } 179 180 public boolean isListeningTo(Topic topic) { 181 return messagesMap.containsKey(topic); 182 } 183 } 184 185 }