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    }