001    package com.mockrunner.mock.jms;
002    
003    import javax.jms.JMSException;
004    import javax.jms.Message;
005    import javax.jms.Topic;
006    import javax.jms.TopicSubscriber;
007    
008    /**
009     * Mock implementation of JMS <code>TopicSubscriber</code>.
010     */
011    public class MockTopicSubscriber extends MockMessageConsumer implements TopicSubscriber
012    {
013        private MockSession session;
014        private MockTopic topic;
015        private boolean noLocal;
016        private String name;
017        private boolean isDurable;
018        
019        public MockTopicSubscriber(MockConnection connection, MockSession session, MockTopic topic)
020        {
021            this(connection, session, topic, null, false);
022        }
023    
024        public MockTopicSubscriber(MockConnection connection, MockSession session, MockTopic topic, String messageSelector, boolean noLocal)
025        {
026            super(connection, messageSelector);
027            this.session = session;
028            this.topic = topic;
029            this.noLocal = noLocal;
030            name = null;
031            isDurable = false;
032        }
033        
034        /**
035         * Returns if this subscriber is durable.
036         * @return <code>true</code> if this subscriber is durable
037         */
038        public boolean isDurable()
039        {
040            return isDurable;
041        }
042        
043        /**
044         * Set if this subscriber is durable. This is automatically
045         * done when creating the subscriber.
046         * @param isDurable is this a durable subscriber?
047         */
048        public void setDurable(boolean isDurable)
049        {
050            this.isDurable = isDurable;
051        }
052    
053        /**
054         * Returns the name of the subscription if the subscription
055         * is durable. Otherwise, this method returns <code>null</code>.
056         * @return the name of this subscriber
057         */
058        public String getName()
059        {
060            return name;
061        }
062    
063        /**
064         * Set the name of the subscription.
065         * @param name the name of this subscriber
066         */
067        public void setName(String name)
068        {
069            this.name = name;
070        }
071    
072        public Topic getTopic() throws JMSException
073        {
074            getConnection().throwJMSException();
075            return topic;
076        }
077    
078        public boolean getNoLocal() throws JMSException
079        {
080            getConnection().throwJMSException();
081            return noLocal;
082        }
083    
084        public Message receive() throws JMSException
085        {
086            getConnection().throwJMSException();
087            if(isClosed())
088            {
089                throw new JMSException("Subscriber is closed");
090            }
091            if(topic.isEmpty()) return null;
092            Message message;
093            if((!getConnection().getConfigurationManager().getUseMessageSelectors()) || (null == getMessageFilter()))
094            {
095                message = topic.getMessage();
096            }
097            else
098            {
099                message = topic.getMatchingMessage(getMessageFilter());
100            }
101            if(null == message) return null;
102            if(session.isAutoAcknowledge()) message.acknowledge();
103            return message;
104        }
105    }