001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.activemq.store.vm;
019    
020    import java.util.Collections;
021    import java.util.Iterator;
022    import java.util.LinkedHashMap;
023    import java.util.Map;
024    
025    import javax.jms.JMSException;
026    
027    import org.activemq.message.ActiveMQMessage;
028    import org.activemq.message.MessageAck;
029    import org.activemq.service.MessageIdentity;
030    import org.activemq.store.MessageStore;
031    import org.activemq.store.RecoveryListener;
032    
033    /**
034     * An implementation of {@link org.activemq.store.MessageStore} which uses a
035     *
036     * @version $Revision: 1.1.1.1 $
037     */
038    public class VMMessageStore implements MessageStore {
039    
040        protected Map messageTable;
041        protected MessageIdentity lastMessageIdentity;
042    
043        public VMMessageStore() {
044            this(new LinkedHashMap());
045        }
046    
047        public VMMessageStore(LinkedHashMap messageTable) {
048            this.messageTable = Collections.synchronizedMap(messageTable);
049        }
050    
051        public synchronized void addMessage(ActiveMQMessage message) throws JMSException {
052            messageTable.put(message.getJMSMessageID(), message);
053            lastMessageIdentity = message.getJMSMessageIdentity();
054        }
055    
056        public ActiveMQMessage getMessage(MessageIdentity identity) throws JMSException {
057            String messageID = identity.getMessageID();
058            return (ActiveMQMessage) messageTable.get(messageID);
059        }
060    
061        public void removeMessage(MessageAck ack) throws JMSException {
062            messageTable.remove(ack.getMessageID());
063        }
064        
065        public void removeMessage(MessageIdentity msgId) throws JMSException {
066            messageTable.remove(msgId.getMessageID());
067        }
068    
069        public void recover(RecoveryListener listener) throws JMSException {
070            for (Iterator iter = messageTable.values().iterator(); iter.hasNext();) {
071                ActiveMQMessage msg = (ActiveMQMessage) iter.next();
072                listener.recoverMessage(msg.getJMSMessageIdentity());
073            }
074        }
075    
076        public void start() throws JMSException {
077        }
078    
079        public void stop() throws JMSException {
080        }
081    
082        public void removeAllMessages() throws JMSException {
083            messageTable.clear();
084        }
085    
086    }