1 /*** 2 * 3 * Copyright 2004 Protique Ltd 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 **/ 18 package org.codehaus.activemq.store.jdbm; 19 20 import jdbm.btree.BTree; 21 import jdbm.helper.Tuple; 22 import jdbm.helper.TupleBrowser; 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 import org.codehaus.activemq.message.ActiveMQXid; 26 import org.codehaus.activemq.service.Transaction; 27 import org.codehaus.activemq.service.TransactionManager; 28 import org.codehaus.activemq.store.PreparedTransactionStore; 29 30 import javax.jms.JMSException; 31 import javax.transaction.xa.XAException; 32 import java.io.IOException; 33 import java.util.ArrayList; 34 import java.util.List; 35 36 /*** 37 * @version $Revision: 1.3 $ 38 */ 39 public class JdbmPreparedTransactionStore implements PreparedTransactionStore { 40 private static final Log log = LogFactory.getLog(JdbmPreparedTransactionStore.class); 41 42 private BTree database; 43 44 public JdbmPreparedTransactionStore(BTree database) { 45 this.database = database; 46 } 47 48 public ActiveMQXid[] getXids() throws XAException { 49 try { 50 List list = new ArrayList(); 51 Tuple tuple = new Tuple(); 52 TupleBrowser iter = database.browse(); 53 while (iter.getNext(tuple)) { 54 list.add(tuple.getKey()); 55 } 56 ActiveMQXid[] answer = new ActiveMQXid[list.size()]; 57 list.toArray(answer); 58 return answer; 59 } 60 catch (IOException e) { 61 throw new XAException("Failed to recover Xids. Reason: " + e); 62 } 63 } 64 65 public void remove(ActiveMQXid xid) throws XAException { 66 try { 67 database.remove(xid); 68 } 69 catch (IOException e) { 70 throw new XAException("Failed to remove: " + xid + ". Reason: " + e); 71 } 72 } 73 74 public void put(ActiveMQXid xid, Transaction transaction) throws XAException { 75 try { 76 database.insert(xid, transaction, true); 77 } 78 catch (IOException e) { 79 throw new XAException("Failed to add: " + xid + " for transaction: " + transaction + ". Reason: " + e); 80 } 81 } 82 83 public void loadPreparedTransactions(TransactionManager transactionManager) throws XAException { 84 log.info("Recovering prepared transactions"); 85 86 try { 87 Tuple tuple = new Tuple(); 88 TupleBrowser iter = database.browse(); 89 while (iter.getNext(tuple)) { 90 ActiveMQXid xid = (ActiveMQXid) tuple.getKey(); 91 Transaction transaction = (Transaction) tuple.getValue(); 92 transactionManager.loadTransaction(xid, transaction); 93 } 94 } 95 catch (IOException e) { 96 log.error("Failed to recover prepared transactions: " + e, e); 97 throw new XAException("Failed to recover prepared transactions. Reason: " + e); 98 } 99 } 100 101 public void start() throws JMSException { 102 } 103 104 public void stop() throws JMSException { 105 } 106 }