001 package com.mockrunner.mock.jms;
002
003 import java.util.Iterator;
004 import java.util.List;
005
006 import javax.jms.JMSException;
007 import javax.jms.Message;
008 import javax.jms.MessageListener;
009 import javax.jms.Queue;
010
011 /**
012 * Mock implementation of JMS <code>Queue</code>.
013 */
014 public class MockQueue extends MockDestination implements Queue
015 {
016 private String name;
017
018 public MockQueue(String name)
019 {
020 this.name = name;
021 }
022
023 public String getQueueName() throws JMSException
024 {
025 return name;
026 }
027
028 /**
029 * Adds a message to this <code>Queue</code> that will
030 * be propagated to the corresponding receiver. Only one
031 * receiver will get the message. The order is not
032 * predictable.
033 * @param message the message
034 */
035 public void addMessage(Message message) throws JMSException
036 {
037 addReceivedMessage(message);
038 boolean isConsumed = false;
039 Iterator sessionsIterator = sessionSet().iterator();
040 while(sessionsIterator.hasNext() && !isConsumed)
041 {
042 MockSession session = (MockSession)sessionsIterator.next();
043 MessageListener globalListener = session.getMessageListener();
044 if(null != globalListener)
045 {
046 globalListener.onMessage(message);
047 isConsumed = true;
048 acknowledgeMessage(message, session);
049 }
050 else
051 {
052 List receivers = session.getQueueTransmissionManager().getQueueReceiverList(name);
053 for(int ii = 0; ii < receivers.size() && !isConsumed; ii++)
054 {
055 MockQueueReceiver receiver = (MockQueueReceiver)receivers.get(ii);
056 if(receiver.canConsume(message))
057 {
058 receiver.receiveMessage(message);
059 isConsumed = true;
060 acknowledgeMessage(message, session);
061 }
062 }
063 }
064 }
065 if(!isConsumed)
066 {
067 addCurrentMessage(message);
068 }
069 }
070 }