001 package com.mockrunner.mock.jms; 002 003 import java.io.Serializable; 004 import java.util.ArrayList; 005 import java.util.Enumeration; 006 import java.util.List; 007 import java.util.Vector; 008 009 import javax.jms.InvalidSelectorException; 010 import javax.jms.JMSException; 011 import javax.jms.Message; 012 import javax.jms.Queue; 013 import javax.jms.QueueBrowser; 014 015 import org.activemq.filter.mockrunner.Filter; 016 import org.activemq.selector.mockrunner.SelectorParser; 017 018 /** 019 * Mock implementation of JMS <code>QueueBrowser</code>. 020 */ 021 public class MockQueueBrowser implements QueueBrowser, Serializable 022 { 023 private MockConnection connection; 024 private MockQueue queue; 025 private boolean closed; 026 private String messageSelector; 027 private Filter messageSelectorFilter; 028 029 public MockQueueBrowser(MockConnection connection, MockQueue queue) 030 { 031 this(connection, queue, null); 032 } 033 034 public MockQueueBrowser(MockConnection connection, MockQueue queue, String messageSelector) 035 { 036 this.connection = connection; 037 this.queue = queue; 038 closed = false; 039 this.messageSelector = messageSelector; 040 parseMessageSelector(); 041 } 042 043 private void parseMessageSelector() 044 { 045 if(null == messageSelector || messageSelector.length() == 0) 046 { 047 this.messageSelectorFilter = null; 048 } 049 else 050 { 051 try 052 { 053 this.messageSelectorFilter = new SelectorParser().parse(messageSelector); 054 } 055 catch(InvalidSelectorException exc) 056 { 057 throw new RuntimeException("Error parsing message selector: " + exc.getMessage()); 058 } 059 } 060 } 061 062 /** 063 * Returns if this browser was closed. 064 * @return <code>true</code> if this browser is closed 065 */ 066 public boolean isClosed() 067 { 068 return closed; 069 } 070 071 public Queue getQueue() throws JMSException 072 { 073 connection.throwJMSException(); 074 return queue; 075 } 076 077 public String getMessageSelector() throws JMSException 078 { 079 connection.throwJMSException(); 080 return messageSelector; 081 } 082 083 public Enumeration getEnumeration() throws JMSException 084 { 085 connection.throwJMSException(); 086 if(isClosed()) 087 { 088 throw new JMSException("Browser is closed"); 089 } 090 return new Vector(getFilteredMessageList()).elements(); 091 } 092 093 public void close() throws JMSException 094 { 095 connection.throwJMSException(); 096 closed = true; 097 } 098 099 private List getFilteredMessageList() 100 { 101 List messages = queue.getCurrentMessageList(); 102 if(null == messageSelectorFilter) return messages; 103 if(!connection.getConfigurationManager().getUseMessageSelectors()) return messages; 104 List filteredMessages = new ArrayList(); 105 for(int ii = 0; ii < messages.size(); ii++) 106 { 107 Message nextMessage = (Message)messages.get(ii); 108 try 109 { 110 if(messageSelectorFilter.matches(nextMessage)) 111 { 112 filteredMessages.add(nextMessage); 113 } 114 } 115 catch(JMSException exc) 116 { 117 throw new RuntimeException(exc.getMessage()); 118 } 119 } 120 return filteredMessages; 121 } 122 }