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.