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. Implemented by {@link MockQueue}
036 * and {@link MockTopic}.
037 */
038 public abstract void addMessage(Message message) throws JMSException;
039
040 /**
041 * Returns if this destination contains messages.
042 * @return <code>false</code> if there's at least one message,
043 * <code>true</code> otherwise
044 */
045 public boolean isEmpty()
046 {
047 return currentMessages.size() <= 0;
048 }
049
050 /**
051 * Clears all current messages.
052 */
053 public void clear()
054 {
055 currentMessages.clear();
056 }
057
058 /**
059 * Clears all current messages and resets the list of received messages.
060 */
061 public void reset()
062 {
063 currentMessages.clear();
064 receivedMessages.clear();
065 }
066
067 /**
068 * Returns the next message. The message will be deleted.
069 * If there's no message <code>null</code> will be returned.
070 * @return the <code>Message</code>
071 */
072 public Message getMessage()
073 {
074 if(currentMessages.size() <= 0) return null;
075 return (Message)currentMessages.remove(0);
076 }
077
078 /**
079 * Returns the next message that matches the filter.
080 * The message will be deleted.
081 * If there's no matching message <code>null</code> will be returned.
082 * @param filter the message filter
083 * @return the <code>Message</code>
084 */
085 public Message getMatchingMessage(Filter filter)
086 {
087 for(int ii = 0; ii < currentMessages.size(); ii++)
088 {
089 Message currentMessage = (Message)currentMessages.get(ii);
090 try
091 {
092 if(filter.matches(currentMessage))
093 {
094 currentMessages.remove(ii);
095 return currentMessage;
096 }
097 }
098 catch(JMSException exc)
099 {
100 throw new NestedApplicationException(exc);
101 }
102 }
103 return null;
104 }
105
106 /**
107 * Returns a <code>List</code> of all messages.
108 * No messages will be deleted.
109 * @return the <code>List</code> of messages
110 */
111 public List getCurrentMessageList()
112 {
113 return Collections.unmodifiableList(currentMessages);
114 }
115
116 /**
117 * Returns a <code>List</code> of all received messages.
118 * @return the <code>List</code> of messages
119 */
120 public List getReceivedMessageList()
121 {
122 return Collections.unmodifiableList(receivedMessages);
123 }
124
125 /**
126 * Adds a <code>Session</code>.
127 * @param session the session
128 */
129 public void addSession(Session session)
130 {
131 sessions.add(session);
132 }
133
134 protected List receivedMessageList()
135 {
136 return receivedMessages;
137 }
138
139 protected List currentMessageList()
140 {
141 return currentMessages;
142 }
143
144 protected Set sessionSet()
145 {
146 return sessions;
147 }
148
149 protected void acknowledgeMessage(Message message, MockSession session) throws JMSException
150 {
151 if(session.isAutoAcknowledge())
152 {
153 message.acknowledge();
154 }
155 }
156 }