[jboss-cvs] jboss-seam/src/main/org/jboss/seam/transaction ...
Gavin King
gavin.king at jboss.com
Wed May 30 16:16:00 EDT 2007
User: gavin
Date: 07/05/30 16:16:00
Added: src/main/org/jboss/seam/transaction
EJBTransaction.java LocalTransactionListener.java
NoTransaction.java Transaction.java
TransactionListener.java UTTransaction.java
UserTransaction.java
Log:
refactor
Revision Changes Path
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/EJBTransaction.java
Index: EJBTransaction.java
===================================================================
package org.jboss.seam.transaction;
import javax.ejb.EJBContext;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
/**
* Wraps EJBContext transaction management in a
* UserTransaction interface.
*
* @author Mike Youngstrom
* @author Gavin King
*
*/
public class EJBTransaction extends UserTransaction
{
private EJBContext ejbContext;
public EJBTransaction(EJBContext ejbContext)
{
this.ejbContext = ejbContext;
}
public void begin() throws NotSupportedException, SystemException
{
throw new UnsupportedOperationException();
}
public void commit() throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
{
throw new UnsupportedOperationException();
}
public int getStatus() throws SystemException
{
try
{
if ( !ejbContext.getRollbackOnly() )
{
return Status.STATUS_ACTIVE;
}
else
{
return Status.STATUS_MARKED_ROLLBACK;
}
}
catch (IllegalStateException ise)
{
return Status.STATUS_NO_TRANSACTION;
}
}
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
throw new UnsupportedOperationException();
}
public void setRollbackOnly() throws IllegalStateException, SystemException
{
ejbContext.setRollbackOnly();
}
public void setTransactionTimeout(int timeout) throws SystemException
{
throw new UnsupportedOperationException();
}
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/LocalTransactionListener.java
Index: LocalTransactionListener.java
===================================================================
package org.jboss.seam.transaction;
import javax.ejb.Local;
@Local
public interface LocalTransactionListener
{
public void scheduleEvent(String type, Object... parameters);
public void destroy();
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/NoTransaction.java
Index: NoTransaction.java
===================================================================
package org.jboss.seam.transaction;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
/**
* When no kind of transaction management
* exists.
*
* @author Mike Youngstrom
* @author Gavin King
*
*/
public class NoTransaction extends UserTransaction
{
public void begin() throws NotSupportedException, SystemException
{
throw new UnsupportedOperationException();
}
public void commit() throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
{
throw new UnsupportedOperationException();
}
public int getStatus() throws SystemException
{
return Status.STATUS_NO_TRANSACTION;
}
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
throw new UnsupportedOperationException();
}
public void setRollbackOnly() throws IllegalStateException, SystemException
{
throw new UnsupportedOperationException();
}
public void setTransactionTimeout(int timeout) throws SystemException
{
throw new UnsupportedOperationException();
}
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/Transaction.java
Index: Transaction.java
===================================================================
package org.jboss.seam.transaction;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.util.EJB;
import org.jboss.seam.util.Naming;
/**
* Abstracts all possible transaction management APIs
* behind a JTA-compatible interface.
*
* @author Mike Youngstrom
* @author Gavin King
*
*/
@Name("org.jboss.seam.transaction.transaction")
@Scope(ScopeType.STATELESS)
@Install(precedence=BUILT_IN)
public class Transaction
{
private static final String STANDARD_USER_TRANSACTION_NAME = "java:comp/UserTransaction";
private static String userTransactionName = "UserTransaction";
public static void setUserTransactionName(String name)
{
userTransactionName = name;
}
public static String getUserTransactionName()
{
return userTransactionName;
}
public static UserTransaction instance()
{
if (!Contexts.isApplicationContextActive())
{
throw new IllegalStateException("No application context active, cannot obtain Transaction component");
}
return (UserTransaction) Component.getInstance(Transaction.class, ScopeType.STATELESS);
}
@Unwrap
public UserTransaction getTransaction() throws NamingException
{
try
{
return new UTTransaction( getUserTransaction() );
}
catch (NameNotFoundException nnfe)
{
try
{
return new EJBTransaction( EJB.getEJBContext() );
}
catch (NameNotFoundException nnfe2)
{
return new NoTransaction();
}
}
}
private static javax.transaction.UserTransaction getUserTransaction() throws NamingException
{
try
{
return (javax.transaction.UserTransaction) Naming.getInitialContext().lookup(userTransactionName);
}
catch (NameNotFoundException nnfe)
{
return (javax.transaction.UserTransaction) Naming.getInitialContext().lookup(STANDARD_USER_TRANSACTION_NAME);
}
}
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/TransactionListener.java
Index: TransactionListener.java
===================================================================
package org.jboss.seam.transaction;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Remove;
import javax.ejb.SessionSynchronization;
import javax.ejb.Stateful;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Events;
/**
* Temporary solution for getting JTA transaction lifecycle
* callbacks. Once all appservers support the new EE5 APIs,
* this will be removed.
*
* @author Gavin King
*
*/
@Stateful
@Scope(ScopeType.EVENT)
@Name("org.jboss.seam.transaction.transactionListener")
@Install(value=false, precedence=BUILT_IN)
public class TransactionListener implements LocalTransactionListener, SessionSynchronization
{
static class Event
{
private String type;
private Object[] parameters;
public Event(String type, Object[] parameters)
{
this.type = type;
this.parameters = parameters;
}
public void call()
{
Events.instance().raiseEvent(type, parameters);
}
}
private List<Event> events = new ArrayList<Event>();
public static LocalTransactionListener instance()
{
if ( !Contexts.isEventContextActive() )
{
throw new IllegalStateException("no event context active");
}
return (LocalTransactionListener) Component.getInstance(TransactionListener.class, ScopeType.EVENT);
}
public void afterBegin() throws EJBException, RemoteException
{
}
public void scheduleEvent(String type, Object... parameters)
{
events.add( new Event(type, parameters) );
}
public void afterCompletion(boolean success) throws EJBException, RemoteException
{
try
{
if (success)
{
for (Event event: events) event.call();
}
}
finally
{
events.clear();
}
}
public void beforeCompletion() throws EJBException, RemoteException
{
}
@Remove @Destroy
public void destroy() {}
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/UTTransaction.java
Index: UTTransaction.java
===================================================================
package org.jboss.seam.transaction;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
/**
* Wraps EJBContext transaction management in a
* UserTransaction interface.
*
* @author Mike Youngstrom
* @author Gavin King
*
*/
public class UTTransaction extends UserTransaction
{
private javax.transaction.UserTransaction delegate;
UTTransaction(javax.transaction.UserTransaction delegate)
{
this.delegate = delegate;
}
public void begin() throws NotSupportedException, SystemException
{
delegate.begin();
}
public void commit() throws RollbackException, HeuristicMixedException,
HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
{
delegate.commit();
}
public int getStatus() throws SystemException
{
return delegate.getStatus();
}
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
delegate.rollback();
}
public void setRollbackOnly() throws IllegalStateException, SystemException
{
delegate.setRollbackOnly();
}
public void setTransactionTimeout(int timeout) throws SystemException
{
delegate.setTransactionTimeout(timeout);
}
}
1.1 date: 2007/05/30 20:16:00; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/transaction/UserTransaction.java
Index: UserTransaction.java
===================================================================
package org.jboss.seam.transaction;
import static javax.transaction.Status.STATUS_ACTIVE;
import static javax.transaction.Status.STATUS_MARKED_ROLLBACK;
import javax.transaction.SystemException;
/**
* Extends the standard UserTransaction interface with a couple
* of helpful methods.
*
* @author Gavin King
*
*/
public abstract class UserTransaction implements javax.transaction.UserTransaction
{
public boolean isActive() throws SystemException
{
return getStatus() == STATUS_ACTIVE;
}
public boolean isActiveOrMarkedRollback() throws SystemException
{
int status = getStatus();
return status == STATUS_ACTIVE || status == STATUS_MARKED_ROLLBACK;
}
public boolean isMarkedRollback() throws SystemException
{
return getStatus() == STATUS_MARKED_ROLLBACK;
}
}
More information about the jboss-cvs-commits
mailing list