1 6 7 package org.jfox.ejb.handler; 8 9 import java.util.Iterator ; 10 import javax.ejb.EJBException ; 11 import javax.ejb.EnterpriseBean ; 12 import javax.ejb.SessionSynchronization ; 13 import javax.transaction.NotSupportedException ; 14 import javax.transaction.Status ; 15 import javax.transaction.Transaction ; 16 import javax.transaction.TransactionManager ; 17 import javax.transaction.TransactionRequiredException ; 18 19 import org.jfox.ejb.Bucket; 20 import org.jfox.ejb.EJBSynchronization; 21 import org.jfox.ejb.connector.EJBInvocation; 22 import org.jfox.ejb.meta.EJBDescriptor; 23 import org.jfox.ejb.meta.SessionDescriptor; 24 import org.jfox.ejb.meta.TransactionAttribute; 25 import org.jfox.tm.TxManager; 26 27 30 31 public class T5_TransactionHandler extends AbstractHandler { 32 private static TransactionManager tm = TxManager.getInstance(); 33 34 public Object invokeBean(Bucket bucket, EJBInvocation invocation, Iterator iter) throws Exception { 35 logger.debug("invokeBean " + bucket + ", " + invocation); 36 Transaction suspendedTrans = null; 37 EJBDescriptor meta = bucket.getEJBDescriptor(); 38 39 41 EnterpriseBean bean = invocation.getBean(); 43 boolean isSync = bean instanceof SessionSynchronization ? true : false; 44 if(isSync) { 45 if(!meta.isSession()) 46 throw new EJBException ("only stateful session bean can implement javax.ejb.SessionSynchronization."); 47 else { 48 if(((SessionDescriptor) meta).isStateless()) { 49 throw new EJBException ("only stateful session bean can implement javax.ejb.SessionSynchronization."); 50 } 51 } 52 } 53 54 byte type = meta.getMethodTransactionAttribute(invocation.getMethod()); 56 int status = tm.getStatus(); 57 58 62 boolean created = false; 63 boolean toCommit = true; 64 try { 65 switch(type) { 66 case TransactionAttribute.TX_NOT_SUPPORTED: 67 { 68 if(status != Status.STATUS_NO_TRANSACTION) { 69 suspendedTrans = tm.suspend(); 70 } 71 break; 72 } 73 case TransactionAttribute.TX_SUPPORTS: 74 { 75 break; 76 } 77 case TransactionAttribute.TX_REQUIRED: 78 { 79 if(status == Status.STATUS_NO_TRANSACTION) { 80 tm.begin(); 81 if(isSync) { 83 EJBSynchronization ejbSync = new EJBSynchronization((SessionSynchronization ) bean, tm.getTransaction()); 84 ejbSync.afterBegin(); 85 } 86 created = true; 87 } 88 break; 89 } 90 case TransactionAttribute.TX_REQUIRES_NEW: 91 { 92 if(status != Status.STATUS_NO_TRANSACTION) { 93 suspendedTrans = tm.suspend(); 94 } 95 tm.begin(); 96 if(isSync) { 98 EJBSynchronization ejbSync = new EJBSynchronization((SessionSynchronization ) bean, tm.getTransaction()); 99 tm.getTransaction().registerSynchronization(ejbSync); 100 ejbSync.afterBegin(); 101 } 102 created = true; 103 break; 104 } 105 case TransactionAttribute.TX_MANDATORY: 106 { 107 if(status == Status.STATUS_NO_TRANSACTION) { 108 throw new TransactionRequiredException ("Transaction Required"); 109 } 110 break; 111 } 112 case TransactionAttribute.TX_NEVER: 113 { 114 if(status != Status.STATUS_NO_TRANSACTION) { 115 throw new NotSupportedException ("Transaction Not Supported"); 116 } 117 break; 118 } 119 } 120 return super.invokeBean(bucket, invocation, iter); 121 } 122 catch(EJBException e) { 125 toCommit = false; 126 throw e; 127 } 128 finally { 129 if(created == true) { 130 if(toCommit) { 131 tm.commit(); 132 } 133 else { 134 tm.rollback(); 135 } 136 } 137 else { if(toCommit == false && tm.getStatus() != Status.STATUS_NO_TRANSACTION) { 139 tm.getTransaction().setRollbackOnly(); 140 } 141 } 142 if(suspendedTrans != null) { 143 tm.resume(suspendedTrans); 144 } 145 } 146 } 147 148 public static void main(String [] args) { 149 150 } 151 } | Popular Tags |