You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Jukka Zitting (JIRA)" <ji...@apache.org> on 2009/07/08 12:06:15 UTC
[jira] Updated: (JCR-1446) Local transactions support
[ https://issues.apache.org/jira/browse/JCR-1446?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jukka Zitting updated JCR-1446:
-------------------------------
Status: Patch Available (was: Open)
> Local transactions support
> --------------------------
>
> Key: JCR-1446
> URL: https://issues.apache.org/jira/browse/JCR-1446
> Project: Jackrabbit Content Repository
> Issue Type: Improvement
> Components: jackrabbit-jca
> Affects Versions: 1.5.0
> Reporter: Stephane Landelle
> Original Estimate: 0.5h
> Remaining Estimate: 0.5h
>
> JCAManagedConnectionFactory doesn't currently support LocalTransaction. Wouldn't it be simple to provide a simple implemetation like the following (inspired of JR test suite):
> package com.weka.jackrabbit.jca;
> import javax.jcr.Session;
> import javax.resource.ResourceException;
> import javax.resource.spi.LocalTransaction;
> import javax.transaction.xa.XAException;
> import javax.transaction.xa.XAResource;
> import javax.transaction.xa.Xid;
> import org.apache.jackrabbit.api.XASession;
> /**
> * JackRabbit Local transaction (based on the XA Resource returned by
> * JackRabbit). <p/> Inspired from JackRabbit test suite.
> *
> * Internal {@link javax.transaction.LocalTransaction} implementation.
> *
> */
> public class JackRabbitLocalTransaction implements LocalTransaction {
> /**
> * Global transaction id counter. TODO: remove the static attribute
> */
> private static byte counter = 0;
> /**
> * XASession
> */
> private XASession session;
> /**
> * XAResource
> */
> private final XAResource xares;
> /**
> * Xid
> */
> private Xid xid;
> /**
> * Create a new instance of this class. Takes a session as parameter.
> *
> * @param session
> * session. If session is not of type {@link XASession}, an
> * <code>IllegalArgumentException</code> is thrown
> */
> public JackRabbitLocalTransaction(Session session) {
> if (session instanceof XASession) {
> this.session = (XASession) session;
> xares = this.session.getXAResource();
> } else {
> throw new IllegalArgumentException("Session not of type XASession");
> }
> }
> /**
> * @see javax.transaction.LocalTransaction#begin
> */
> public void begin() throws ResourceException {
> try {
> xid = new XidImpl(counter++);
> xares.start(xid, XAResource.TMNOFLAGS);
> } catch (XAException e) {
> throw new ResourceException("Unable to begin transaction: " + "XA_ERR=" + e.errorCode);
> }
> }
> /**
> * @see javax.transaction.LocalTransaction#commit
> */
> public void commit() throws ResourceException {
> try {
> xares.end(xid, XAResource.TMSUCCESS);
> xares.prepare(xid);
> xares.commit(xid, false);
> session.logout();
> } catch (XAException e) {
> if (e.errorCode >= XAException.XA_RBBASE && e.errorCode <= XAException.XA_RBEND) {
> throw new ResourceException(e.toString());
> }
> throw new ResourceException("Unable to commit transaction: " + "XA_ERR=" + e.errorCode);
> }
> }
> /**
> * @see javax.transaction.LocalTransaction#rollback
> */
> public void rollback() throws ResourceException {
> try {
> xares.end(xid, XAResource.TMFAIL);
> xares.rollback(xid);
> session.logout();
> } catch (XAException e) {
> throw new ResourceException("Unable to rollback transaction: " + "XA_ERR=" + e.errorCode);
> }
> }
> /**
> * Internal {@link Xid} implementation.
> */
> class XidImpl implements Xid {
> /** Global transaction id */
> private final byte[] globalTxId;
> /**
> * Create a new instance of this class. Takes a global transaction
> * number as parameter
> *
> * @param globalTxNumber
> * global transaction number
> */
> public XidImpl(byte globalTxNumber) {
> this.globalTxId = new byte[] { globalTxNumber };
> }
> /**
> * @see javax.transaction.xa.Xid#getFormatId()
> */
> public int getFormatId() {
> return 0;
> }
> /**
> * @see javax.transaction.xa.Xid#getBranchQualifier()
> */
> public byte[] getBranchQualifier() {
> return new byte[0];
> }
> /**
> * @see javax.transaction.xa.Xid#getGlobalTransactionId()
> */
> public byte[] getGlobalTransactionId() {
> return globalTxId;
> }
> }
> /**
> * @return Returns the counter.
> */
> public byte getCounter() {
> return counter;
> }
> /**
> * @param counter
> * The counter to set.
> */
> public void setCounter(byte counter) {
> JackRabbitLocalTransaction.counter = counter;
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.