001 package com.mockrunner.mock.jms; 002 003 import java.io.Serializable; 004 import java.util.ArrayList; 005 import java.util.Collections; 006 import java.util.HashSet; 007 import java.util.List; 008 import java.util.Set; 009 010 import javax.jms.Destination; 011 import javax.jms.JMSException; 012 import javax.jms.Message; 013 import javax.jms.Session; 014 015 import org.activemq.filter.mockrunner.Filter; 016 017 import com.mockrunner.base.NestedApplicationException; 018 019 /** 020 * Mock implementation of JMS <code>Destination</code>. 021 */ 022 public abstract class MockDestination implements Destination, Serializable 023 { 024 private Set sessions; 025 private List currentMessages; 026 private List receivedMessages; 027 028 public MockDestination() 029 { 030 sessions = new HashSet(); 031 currentMessages = new ArrayList(); 032 receivedMessages = new ArrayList(); 033 } 034 035 /** 036 * Adds a message and delivers it to the corresponding consumers. 037 * Implemented by {@link MockQueue} and {@link MockTopic}. 038 * @param message the message 039 */ 040 public abstract void addMessage(Message message) throws JMSException; 041 042 /** 043 * Adds a message to the list of current messages in this 044 * destination. The message is not delivered to registered 045 * consumers. Can be used to preload destinations with 046 * test messages. 047 * @param message the message 048 */ 049 public void loadMessage(Message message) 050 { 051 addCurrentMessage(message); 052 } 053 054 /** 055 * Returns if this destination contains messages. 056 * @return <code>false</code> if there's at least one message, 057 * <code>true</code> otherwise 058 */ 059 public boolean isEmpty() 060 { 061 return currentMessages.size() <= 0; 062 } 063 064 /** 065 * Clears all current messages. 066 */ 067 public void clear() 068 { 069 currentMessages.clear(); 070 } 071 072 /** 073 * Clears all current messages and resets the list of received messages. 074 */ 075 public void reset() 076 { 077 currentMessages.clear(); 078 receivedMessages.clear(); 079 } 080 081 /** 082 * Returns the next message. The message will be removed from the list 083 * of current messages. 084 * If there's no message, <code>null</code> will be returned. 085 * @return the <code>Message</code> 086 */ 087 public Message getMessage() 088 { 089 if(currentMessages.size() <= 0) return null; 090 return (Message)currentMessages.remove(0); 091 } 092 093 /** 094 * Returns the next message that matches the filter. 095 * The message will be removed from the list of current messages. 096 * If there's no matching message, <code>null</code> will be returned. 097 * @param filter the message filter 098 * @return the <code>Message</code> 099 */ 100 public Message getMatchingMessage(Filter filter) 101 { 102 for(int ii = 0; ii < currentMessages.size(); ii++) 103 { 104 Message currentMessage = (Message)currentMessages.get(ii); 105 try 106 { 107 if(filter.matches(currentMessage)) 108 { 109 currentMessages.remove(ii); 110 return currentMessage; 111 } 112 } 113 catch(JMSException exc) 114 { 115 throw new NestedApplicationException(exc); 116 } 117 } 118 return null; 119 } 120 121 /** 122 * Returns a <code>List</code> of all current messages. 123 * @return the <code>List</code> of messages 124 */ 125 public List getCurrentMessageList() 126 { 127 return Collections.unmodifiableList(currentMessages); 128 } 129 130 /** 131 * Returns a <code>List</code> of all received messages. 132 * @return the <code>List</code> of messages 133 */ 134 public List getReceivedMessageList() 135 { 136 return Collections.unmodifiableList(receivedMessages); 137 } 138 139 /** 140 * Adds a <code>Session</code>. 141 * @param session the session 142 */ 143 public void addSession(Session session) 144 { 145 sessions.add(session); 146 } 147 148 /** 149 * Removes a <code>Session</code>. 150 * @param session the session 151 */ 152 public void removeSession(Session session) 153 { 154 sessions.remove(session); 155 } 156 157 /** 158 * Return a <code>Set</code> of all sessions. 159 * @return a <code>Set</code> of all sessions 160 */ 161 public Set sessionSet() 162 { 163 return Collections.unmodifiableSet(sessions); 164 } 165 166 protected void addReceivedMessage(Message message) 167 { 168 receivedMessages.add(message); 169 } 170 171 protected void addCurrentMessage(Message message) 172 { 173 currentMessages.add(message); 174 } 175 176 protected void acknowledgeMessage(Message message, MockSession session) throws JMSException 177 { 178 if(session.isAutoAcknowledge()) 179 { 180 message.acknowledge(); 181 } 182 } 183 }