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