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