001 package com.mockrunner.mock.jms;
002
003 import javax.jms.BytesMessage;
004 import javax.jms.DeliveryMode;
005 import javax.jms.Destination;
006 import javax.jms.InvalidDestinationException;
007 import javax.jms.JMSException;
008 import javax.jms.Message;
009 import javax.jms.MessageProducer;
010 import javax.jms.StreamMessage;
011
012 /**
013 * Mock implementation of JMS <code>MessageProducer</code>.
014 */
015 public class MockMessageProducer implements MessageProducer
016 {
017 private MockConnection connection;
018 private MockDestination destination;
019 private MockSession session;
020 private boolean closed;
021 private boolean disableMessageId;
022 private boolean disableTimestamp;
023 private int deliveryMode;
024 private int priority;
025 private long timeToLive;
026
027 public MockMessageProducer(MockConnection connection, MockSession session, MockDestination destination)
028 {
029 this.connection = connection;
030 this.destination = destination;
031 this.session = session;
032 closed = false;
033 disableMessageId = false;
034 disableTimestamp = false;
035 deliveryMode = DeliveryMode.PERSISTENT;
036 priority = 4;
037 timeToLive = 0;
038 }
039
040 /**
041 * Returns if this producer was closed.
042 * @return <code>true</code> if this sender is closed
043 */
044 public boolean isClosed()
045 {
046 return closed;
047 }
048
049 public void send(Message message) throws JMSException
050 {
051 send(destination, message, deliveryMode, priority, timeToLive);
052 }
053
054 public void send(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
055 {
056 send(destination, message, deliveryMode, priority, timeToLive);
057 }
058
059 public void send(Destination destination, Message message) throws JMSException
060 {
061 send(destination, message, deliveryMode, priority, timeToLive);
062 }
063
064 public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
065 {
066 connection.throwJMSException();
067 if(isClosed())
068 {
069 throw new JMSException("Producer is closed");
070 }
071 if(null == destination)
072 {
073 throw new InvalidDestinationException("destination must not be null");
074 }
075 if((message instanceof MockMessage) && connection.getConfigurationManager().getDoCloneOnSend())
076 {
077 message = (MockMessage)((MockMessage)message).clone();
078 }
079 if(destination instanceof MockQueue)
080 {
081 setJMSMessageHeaders(message, destination, deliveryMode, priority, timeToLive);
082 session.addSessionToQueue((MockQueue)destination);
083 ((MockQueue)destination).addMessage(message);
084 }
085 else if(destination instanceof MockTopic)
086 {
087 setJMSMessageHeaders(message, destination, deliveryMode, priority, timeToLive);
088 session.addSessionToTopic((MockTopic)destination);
089 ((MockTopic)destination).addMessage(message);
090 }
091 else
092 {
093 throw new InvalidDestinationException("destination must be an instance of MockQueue or MockTopic");
094 }
095 }
096
097 public Destination getDestination() throws JMSException
098 {
099 connection.throwJMSException();
100 return destination;
101 }
102
103 public void close() throws JMSException
104 {
105 connection.throwJMSException();
106 closed = true;
107 }
108
109 public void setDisableMessageID(boolean disableMessageId) throws JMSException
110 {
111 connection.throwJMSException();
112 this.disableMessageId = disableMessageId;
113 }
114
115 public boolean getDisableMessageID() throws JMSException
116 {
117 connection.throwJMSException();
118 return disableMessageId;
119 }
120
121 public void setDisableMessageTimestamp(boolean disableTimestamp) throws JMSException
122 {
123 connection.throwJMSException();
124 this.disableTimestamp = disableTimestamp;
125 }
126
127 public boolean getDisableMessageTimestamp() throws JMSException
128 {
129 connection.throwJMSException();
130 return disableTimestamp;
131 }
132
133 public void setDeliveryMode(int deliveryMode) throws JMSException
134 {
135 connection.throwJMSException();
136 this.deliveryMode = deliveryMode;
137 }
138
139 public int getDeliveryMode() throws JMSException
140 {
141 connection.throwJMSException();
142 return deliveryMode;
143 }
144
145 public void setPriority(int priority) throws JMSException
146 {
147 connection.throwJMSException();
148 this.priority = priority;
149 }
150
151 public int getPriority() throws JMSException
152 {
153 connection.throwJMSException();
154 return priority;
155 }
156
157 public void setTimeToLive(long timeToLive) throws JMSException
158 {
159 connection.throwJMSException();
160 this.timeToLive = timeToLive;
161 }
162
163 public long getTimeToLive() throws JMSException
164 {
165 connection.throwJMSException();
166 return timeToLive;
167 }
168
169 private void setJMSMessageHeaders(Message message, Destination destination, int deliveryMode, int priority, long timeToLive) throws JMSException
170 {
171 message.setJMSDeliveryMode(deliveryMode);
172 message.setJMSPriority(priority);
173 message.setJMSDestination(destination);
174 long currentTime = System.currentTimeMillis();
175 if(!disableTimestamp)
176 {
177 message.setJMSTimestamp(currentTime);
178 }
179 if(0 == timeToLive)
180 {
181 message.setJMSExpiration(0);
182 }
183 else
184 {
185 message.setJMSExpiration(currentTime + timeToLive);
186 }
187 if(!disableMessageId)
188 {
189 message.setJMSMessageID("ID:" + String.valueOf(Math.random()));
190 }
191 if(message instanceof MockMessage)
192 {
193 ((MockMessage)message).setReadOnly(true);
194 ((MockMessage)message).setReadOnlyProperties(true);
195 }
196 if(message instanceof BytesMessage)
197 {
198 ((BytesMessage)message).reset();
199 }
200 if(message instanceof StreamMessage)
201 {
202 ((StreamMessage)message).reset();
203 }
204 }
205 }