001    package com.mockrunner.mock.jms;
002    
003    import java.io.Serializable;
004    import java.util.ArrayList;
005    import java.util.List;
006    
007    import javax.jms.Connection;
008    import javax.jms.JMSException;
009    import javax.jms.QueueConnection;
010    import javax.jms.QueueConnectionFactory;
011    import javax.jms.TopicConnection;
012    import javax.jms.TopicConnectionFactory;
013    
014    import com.mockrunner.jms.ConfigurationManager;
015    import com.mockrunner.jms.DestinationManager;
016    
017    /**
018     * Mock implementation of JMS <code>ConnectionFactory</code>.
019     * Can be used as generic factory for JMS 1.1.
020     * Also implements <code>QueueConnectionFactory</code> and
021     * <code>TopicConnectionFactory</code> and can be used to 
022     * create queue and topic connections as well as generic 
023     * JMS 1.1 connections. It is recommended to use
024     * {@link com.mockrunner.mock.jms.MockQueueConnectionFactory}
025     * if you only use queues and 
026     * {@link com.mockrunner.mock.jms.MockTopicConnectionFactory}
027     * if you only use topics.
028     * This implementation is primary for generic JMS 1.1 connections
029     * but can also be used, if a server provides one implementation
030     * for both domains (which is not portable).
031     */
032    public class MockConnectionFactory implements QueueConnectionFactory, TopicConnectionFactory, Serializable
033    {
034        private DestinationManager destinationManager;
035        private ConfigurationManager configurationManager;
036        private List connections;
037        private JMSException exception;
038    
039        public MockConnectionFactory(DestinationManager destinationManager, ConfigurationManager configurationManager)
040        {
041            connections = new ArrayList();
042            this.destinationManager = destinationManager;
043            this.configurationManager = configurationManager;
044            exception = null;
045        }
046        
047        public Connection createConnection() throws JMSException
048        {
049            return createConnection(null, null);
050        }
051    
052        public Connection createConnection(String name, String password) throws JMSException
053        {
054            MockConnection connection = new MockConnection(destinationManager, configurationManager, name, password);
055            connection.setJMSException(exception);
056            connections.add(connection);
057            return connection;
058        }
059        
060        public QueueConnection createQueueConnection() throws JMSException
061        {
062            return createQueueConnection(null, null);
063        }
064    
065        public QueueConnection createQueueConnection(String name, String password) throws JMSException
066        {
067            MockQueueConnection connection = new MockQueueConnection(destinationManager(), configurationManager(), name, password);
068            connection.setJMSException(exception());
069            connections().add(connection);
070            return connection;
071        }
072        
073        public TopicConnection createTopicConnection() throws JMSException
074        {
075            return createTopicConnection(null, null);
076        }
077    
078        public TopicConnection createTopicConnection(String name, String password) throws JMSException
079        {
080            MockTopicConnection connection = new MockTopicConnection(destinationManager(), configurationManager(), name, password);
081            connection.setJMSException(exception());
082            connections().add(connection);
083            return connection;
084        }
085        
086        /**
087         * Set an exception that will be passed to all
088         * created connections. This can be used to
089         * simulate server errors. Check out
090         * {@link MockConnection#setJMSException}
091         * for details.
092         * @param exception the exception
093         */
094        public void setJMSException(JMSException exception)
095        {
096            this.exception = exception;
097        }
098    
099        /**
100         * Clears the list of connections
101         */
102        public void clearConnections()
103        {
104            connections.clear();
105        }
106    
107        /**
108         * Returns the connection with the specified index
109         * or <code>null</code> if no such connection
110         * exists.
111         * @param index the index
112         * @return the connection
113         */
114        public MockConnection getConnection(int index)
115        {
116            if(connections.size() <= index) return null;
117            return (MockConnection)connections.get(index);
118        }
119    
120        /**
121         * Returns the latest created connection
122         * or <code>null</code> if no such connection
123         * exists.
124         * @return the connection
125         */
126        public MockConnection getLatestConnection()
127        {
128            if(connections.size() == 0) return null;
129            return (MockConnection)connections.get(connections.size() - 1);
130        }
131        
132        protected DestinationManager destinationManager()
133        {
134            return destinationManager;
135        }
136        
137        protected ConfigurationManager configurationManager()
138        {
139            return configurationManager;
140        }
141        
142        protected List connections()
143        {
144            return connections;
145        }
146        
147        protected JMSException exception()
148        {
149            return exception;
150        }
151    }