| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.tuscany.sca.policy.transaction.runtime.geronimo; |
| |
| import java.util.logging.Logger; |
| |
| import javax.transaction.Transaction; |
| import javax.transaction.TransactionManager; |
| import javax.transaction.xa.XAException; |
| import javax.transaction.xa.XAResource; |
| import javax.transaction.xa.Xid; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.geronimo.transaction.manager.NamedXAResource; |
| import org.apache.tuscany.sca.policy.transaction.runtime.TransactionManagerHelper; |
| import org.apache.tuscany.sca.policy.transaction.runtime.geronimo.TransactionManagerWrapper; |
| |
| /** |
| * @version $Rev$ $Date$ |
| */ |
| public class TransactionManagerHelperTestCaseOFF extends TestCase { |
| private static final Logger logger = Logger.getLogger(TransactionManagerHelperTestCaseOFF.class.getName()); |
| |
| public static class MockXAResource implements NamedXAResource { |
| |
| private String rm; |
| private String id; |
| private int timeout = 1000; |
| |
| public MockXAResource(String rm, String id) { |
| super(); |
| this.rm = rm; |
| this.id = id; |
| } |
| |
| public String getName() { |
| return rm + ":" + id; |
| } |
| |
| public void commit(Xid xid, boolean onePhase) throws XAException { |
| logger.info(id + ": commit(" + xid + "," + onePhase + ")"); |
| } |
| |
| public void end(Xid xid, int flags) throws XAException { |
| logger.info(id + ": end(" + xid + "," + toString(flags) + ")"); |
| } |
| |
| public void forget(Xid xid) throws XAException { |
| logger.info(id + ": forget(" + xid + ")"); |
| } |
| |
| public int getTransactionTimeout() throws XAException { |
| return timeout; |
| } |
| |
| public boolean isSameRM(XAResource xares) throws XAException { |
| if (xares instanceof MockXAResource) { |
| MockXAResource res = (MockXAResource)xares; |
| return res.rm.endsWith(rm); |
| } else { |
| return false; |
| } |
| } |
| |
| public int prepare(Xid xid) throws XAException { |
| logger.info(id + ": prepare(" + xid + ")"); |
| return XA_OK; |
| } |
| |
| public Xid[] recover(int flag) throws XAException { |
| return null; |
| } |
| |
| public void rollback(Xid xid) throws XAException { |
| logger.info(id + ": rollback(" + xid + ")"); |
| } |
| |
| public boolean setTransactionTimeout(int seconds) throws XAException { |
| this.timeout = seconds; |
| return true; |
| } |
| |
| public void start(Xid xid, int flags) throws XAException { |
| logger.info(id + ": start(" + xid + "," + toString(flags) + ")"); |
| } |
| |
| private String toString(int flags) { |
| StringBuffer sb = new StringBuffer(); |
| if ((flags & TMENDRSCAN) != 0) { |
| sb.append("TMENDRSCAN "); |
| } |
| if ((flags & TMFAIL) != 0) { |
| sb.append("TMFAIL "); |
| } |
| if ((flags & TMJOIN) != 0) { |
| sb.append("TMJOIN "); |
| } |
| if ((flags & TMONEPHASE) != 0) { |
| sb.append("TMONEPHASE "); |
| } |
| if ((flags & TMRESUME) != 0) { |
| sb.append("TMRESUME "); |
| } |
| if ((flags & TMSTARTRSCAN) != 0) { |
| sb.append("TMSTARTRSCAN "); |
| } |
| if ((flags & TMSUCCESS) != 0) { |
| sb.append("TMSUCCESS "); |
| } |
| if ((flags & TMSUSPEND) != 0) { |
| sb.append("TMSUSPEND "); |
| } |
| if (sb.length() == 0) { |
| sb.append("TMNOFLAGS"); |
| } else { |
| sb.deleteCharAt(sb.length() - 1); |
| } |
| return sb.toString(); |
| } |
| |
| } |
| |
| public void testHelper() throws Exception { |
| TransactionManagerWrapper activator = new TransactionManagerWrapper(); |
| activator.start(); |
| TransactionManager tm = activator.getTransactionManager(); |
| // GeronimoUserTransaction tx = new GeronimoUserTransaction(tm); |
| TransactionManagerHelper helper = new TransactionManagerHelper(tm); |
| |
| // No TX yet |
| assertNull(tm.getTransaction()); |
| Transaction t1 = helper.managedGlobalTransactionPreInvoke(); |
| // Should create T1 |
| assertNotNull(t1); |
| // The current TX should be T1 |
| assertSame(t1, tm.getTransaction()); |
| |
| XAResource res1 = new MockXAResource("Derby", "001"); |
| XAResource res2 = new MockXAResource("DB2", "002"); |
| tm.getTransaction().enlistResource(res1); |
| tm.getTransaction().enlistResource(res2); |
| |
| Transaction suspended = helper.suspendsTransactionPreInvoke(); |
| suspended.delistResource(res1, XAResource.TMSUSPEND); |
| suspended.delistResource(res2, XAResource.TMSUSPEND); |
| |
| // T1 is suspended |
| assertSame(t1, suspended); |
| // No more active TX |
| assertNull(tm.getTransaction()); |
| |
| Transaction t2 = helper.managedGlobalTransactionPreInvoke(); |
| assertNotNull(t2); |
| // The current TX should be T2 |
| assertSame(t2, tm.getTransaction()); |
| |
| XAResource res3 = new MockXAResource("Oracle", "003"); |
| tm.getTransaction().enlistResource(res3); |
| |
| tm.getTransaction().delistResource(res3, XAResource.TMSUCCESS); |
| tm.rollback(); |
| |
| // Skip post |
| // helper.managedGlobalTransactionPostInvoke(t2); |
| |
| helper.suspendsTransactionPostInvoke(suspended); |
| suspended.enlistResource(res1); |
| suspended.enlistResource(res2); |
| // T1 is now resumed |
| assertSame(t1, tm.getTransaction()); |
| |
| helper.managedGlobalTransactionPostInvoke(t1, false); |
| assertNotNull(tm.getTransaction()); |
| assertEquals(6, t1.getStatus()); |
| |
| activator.stop(); |
| } |
| } |