001 package com.mockrunner.mock.jms; 002 003 import java.util.ArrayList; 004 import java.util.Collections; 005 import java.util.HashSet; 006 import java.util.List; 007 import java.util.Set; 008 009 import javax.jms.Destination; 010 import javax.jms.JMSException; 011 import javax.jms.Message; 012 import javax.jms.Session; 013 014 import org.activemq.filter.mockrunner.Filter; 015 016 import com.mockrunner.base.NestedApplicationException; 017 018 /** 019 * Mock implementation of JMS <code>Destination</code>. 020 */ 021 public abstract class MockDestination implements Destination 022 { 023 private Set sessions; 024 private List currentMessages; 025 private List receivedMessages; 026 027 public MockDestination() 028 { 029 sessions = new HashSet(); 030 currentMessages = new ArrayList(); 031 receivedMessages = new ArrayList(); 032 } 033 034 /** 035 * Adds a message. Implemented by {@link MockQueue} 036 * and {@link MockTopic}. 037 */ 038 public abstract void addMessage(Message message) throws JMSException; 039 040 /** 041 * Returns if this destination contains messages. 042 * @return <code>false</code> if there's at least one message, 043 * <code>true</code> otherwise 044 */ 045 public boolean isEmpty() 046 { 047 return currentMessages.size() <= 0; 048 } 049 050 /** 051 * Clears all current messages. 052 */ 053 public void clear() 054 { 055 currentMessages.clear(); 056 } 057 058 /** 059 * Clears all current messages and resets the list of received messages. 060 */ 061 public void reset() 062 { 063 currentMessages.clear(); 064 receivedMessages.clear(); 065 } 066 067 /** 068 * Returns the next message. The message will be deleted. 069 * If there's no message <code>null</code> will be returned. 070 * @return the <code>Message</code> 071 */ 072 public Message getMessage() 073 { 074 if(currentMessages.size() <= 0) return null; 075 return (Message)currentMessages.remove(0); 076 } 077 078 /** 079 * Returns the next message that matches the filter. 080 * The message will be deleted. 081 * If there's no matching message <code>null</code> will be returned. 082 * @param filter the message filter 083 * @return the <code>Message</code> 084 */ 085 public Message getMatchingMessage(Filter filter) 086 { 087 for(int ii = 0; ii < currentMessages.size(); ii++) 088 { 089 Message currentMessage = (Message)currentMessages.get(ii); 090 try 091 { 092 if(filter.matches(currentMessage)) 093 { 094 currentMessages.remove(ii); 095 return currentMessage; 096 } 097 } 098 catch(JMSException exc) 099 { 100 throw new NestedApplicationException(exc); 101 } 102 } 103 return null; 104 } 105 106 /** 107 * Returns a <code>List</code> of all messages. 108 * No messages will be deleted. 109 * @return the <code>List</code> of messages 110 */ 111 public List getCurrentMessageList() 112 { 113 return Collections.unmodifiableList(currentMessages); 114 } 115 116 /** 117 * Returns a <code>List</code> of all received messages. 118 * @return the <code>List</code> of messages 119 */ 120 public List getReceivedMessageList() 121 { 122 return Collections.unmodifiableList(receivedMessages); 123 } 124 125 /** 126 * Adds a <code>Session</code>. 127 * @param session the session 128 */ 129 public void addSession(Session session) 130 { 131 sessions.add(session); 132 } 133 134 protected List receivedMessageList() 135 { 136 return receivedMessages; 137 } 138 139 protected List currentMessageList() 140 { 141 return currentMessages; 142 } 143 144 protected Set sessionSet() 145 { 146 return sessions; 147 } 148 149 protected void acknowledgeMessage(Message message, MockSession session) throws JMSException 150 { 151 if(session.isAutoAcknowledge()) 152 { 153 message.acknowledge(); 154 } 155 } 156 }