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 this subscriber. Usually only durable 055 * subscribers have a name. If no name is specified, this 056 * method returns <code>null</code>. 057 * @return the name of this subscriber 058 */ 059 public String getName() 060 { 061 return name; 062 } 063 064 /** 065 * Set the name of this subscriber. 066 * @param name the name of this subscriber 067 */ 068 public void setName(String name) 069 { 070 this.name = name; 071 } 072 073 public Topic getTopic() throws JMSException 074 { 075 getConnection().throwJMSException(); 076 return topic; 077 } 078 079 public boolean getNoLocal() throws JMSException 080 { 081 getConnection().throwJMSException(); 082 return noLocal; 083 } 084 085 public Message receive() throws JMSException 086 { 087 getConnection().throwJMSException(); 088 if(isClosed()) 089 { 090 throw new JMSException("Subscriber is closed"); 091 } 092 if(topic.isEmpty()) return null; 093 Message message; 094 if((!getConnection().getConfigurationManager().getUseMessageSelectors()) || (null == getMessageFilter())) 095 { 096 message = topic.getMessage(); 097 } 098 else 099 { 100 message = topic.getMatchingMessage(getMessageFilter()); 101 } 102 if(null == message) return null; 103 if(session.isAutoAcknowledge()) message.acknowledge(); 104 return message; 105 } 106 }