You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by oz...@apache.org on 2004/07/05 12:55:21 UTC

cvs commit: jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms RDBMSComparableResourcesPool.java AbstractRDBMSStore.java

ozeigermann    2004/07/05 03:55:21

  Modified:    src/stores/org/apache/slide/store/impl/rdbms
                        RDBMSComparableResourcesPool.java
                        AbstractRDBMSStore.java
  Log:
  Migration to unified XA stuff inherited from AbstractXAServiceBase
  
  Revision  Changes    Path
  1.2       +4 -4      jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/RDBMSComparableResourcesPool.java
  
  Index: RDBMSComparableResourcesPool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/RDBMSComparableResourcesPool.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RDBMSComparableResourcesPool.java	4 Jul 2004 18:57:35 -0000	1.1
  +++ RDBMSComparableResourcesPool.java	5 Jul 2004 10:55:21 -0000	1.2
  @@ -133,7 +133,7 @@
       }
   
       private ObjectNode[] retrieveObjects() throws ServiceAccessException, BadQueryException {
  -        if (_store.getActiveTransactionContext() == null) {
  +        if (_store.getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = _store.getNewConnection();
  
  
  
  1.6       +95 -250   jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/AbstractRDBMSStore.java
  
  Index: AbstractRDBMSStore.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/impl/rdbms/AbstractRDBMSStore.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AbstractRDBMSStore.java	4 Jul 2004 18:57:35 -0000	1.5
  +++ AbstractRDBMSStore.java	5 Jul 2004 10:55:21 -0000	1.6
  @@ -34,6 +34,8 @@
   import javax.transaction.xa.Xid;
   
   import org.apache.slide.common.AbstractXAService;
  +import org.apache.slide.common.AbstractXAServiceBase;
  +import org.apache.slide.common.Scope;
   import org.apache.slide.common.Service;
   import org.apache.slide.common.ServiceAccessException;
   import org.apache.slide.common.ServiceConnectionFailedException;
  @@ -67,6 +69,7 @@
   import org.apache.slide.structure.ObjectAlreadyExistsException;
   import org.apache.slide.structure.ObjectNode;
   import org.apache.slide.structure.ObjectNotFoundException;
  +import org.apache.slide.transaction.TransactionalResource;
   import org.apache.slide.util.logger.Logger;
   
   /**
  @@ -80,7 +83,7 @@
    * @version $Revision$
    */
   public abstract class AbstractRDBMSStore
  -    extends AbstractXAService
  +    extends AbstractXAServiceBase
       implements
           LockStore,
           NodeStore,
  @@ -91,15 +94,7 @@
           SequenceStore,
           IBasicExpressionFactoryProvider {
   
  -    protected String LOG_CHANNEL = this.getClass().getName();
  -
  -    protected static final int TX_IDLE = 0;
  -
  -    protected static final int TX_PREPARED = 1;
  -
  -    protected static final int TX_SUSPENDED = 2;
  -
  -    protected ThreadLocal activeTransactionContext = new ThreadLocal();
  +    protected static final String LOG_CHANNEL = AbstractRDBMSStore.class.getName();
   
       protected RDBMSAdapter adapter;
   
  @@ -167,7 +162,7 @@
        * 
        * @exception ServiceConnectionFailedException if the connection failed
        */
  -    public synchronized void connect() throws ServiceConnectionFailedException {
  +    public void connect() throws ServiceConnectionFailedException {
       }
   
       /**
  @@ -191,10 +186,11 @@
        *
        * @exception ServiceResetFailedException Reset failed
        */
  -    public synchronized void reset() throws ServiceResetFailedException {
  +    public void reset() throws ServiceResetFailedException {
   
       }
   
  +    
       // ----------------------------------------------------- XAResource Methods
   
       /**
  @@ -216,227 +212,18 @@
       public Xid[] recover(int flag) throws XAException {
   
           getLogger().log("recover() for thread: " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        TransactionId id = getActiveTransactionContext();
  +        TransactionalResource id = getCurrentlyActiveTransactionalResource();
   
  -        if (id != null && id.status == TX_PREPARED) {
  +        if (id != null && id.getStatus() == STATUS_PREPARED) {
               Xid[] xids = new Xid[1];
  -            xids[0] = id.xid;
  +            xids[0] = id.getXid();
               return xids;
           } else
               return new Xid[0];
       }
   
  -    public int prepare(Xid xid) throws XAException {
  -
  -        getLogger().log("prepare() for thread: " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        TransactionId id = getActiveTransactionContext();
  -
  -        if (id == null)
  -            throw new XAException(XAException.XAER_NOTA);
  -        if (xid == null)
  -            throw new XAException(XAException.XAER_INVAL);
  -
  -        if (id.status != TX_IDLE && id.status != TX_SUSPENDED)
  -            throw new XAException(XAException.XAER_PROTO);
  -
  -        if (id.rollbackOnly)
  -            throw new XAException(XAException.XA_RBROLLBACK);
  -
  -        id.status = TX_PREPARED;
  -
  -        return XAResource.XA_OK;
  -    }
  -
       public boolean isSameRM(XAResource xares) throws XAException {
  -        if (xares == null)
  -            return false;
  -        else
  -            return this == xares;
  -    }
  -
  -    public void forget(Xid xid) throws XAException {
  -
  -        getLogger().log("forget() for thread: " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        TransactionId id = getActiveTransactionContext();
  -
  -        if (id == null || id.xid == null)
  -            throw new XAException(XAException.XAER_NOTA);
  -
  -        if (xid == null)
  -            throw new XAException(XAException.XAER_INVAL);
  -
  -        try {
  -            id.connection.close();
  -        } catch (SQLException e) {
  -            getLogger().log("Couldn't close connection.", LOG_CHANNEL, Logger.ERROR);
  -        }
  -        getLogger().log("forget(): removing from map: " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        activeTransactionContext.set(null);
  -    }
  -
  -    public void end(Xid xid, int flags) throws XAException {
  -
  -        getLogger().log("end() for thread: " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        TransactionId id = getActiveTransactionContext();
  -        if (id == null || id.xid == null)
  -            throw new XAException(XAException.XAER_NOTA);
  -        if (xid == null)
  -            throw new XAException(XAException.XAER_INVAL);
  -
  -        if (flags == XAResource.TMSUSPEND)
  -            id.status = TX_SUSPENDED;
  -
  -        if (flags == XAResource.TMFAIL)
  -            id.rollbackOnly = true;
  -
  -    }
  -
  -    /**
  -     * Commit the global transaction specified by xid.
  -     */
  -    public void commit(Xid xid, boolean onePhase) throws XAException {
  -
  -        getLogger().log(
  -            "commit() for thread " + Thread.currentThread() + ", removing from map",
  -            LOG_CHANNEL,
  -            Logger.DEBUG);
  -
  -        TransactionId id = getActiveTransactionContext();
  -        if (id == null) {
  -            getLogger().log(
  -                "Error committing: no transaction associated with current thread",
  -                LOG_CHANNEL,
  -                Logger.ERROR);
  -            throw new XAException(XAException.XAER_NOTA);
  -        }
  -        if (xid == null)
  -            throw new XAException(XAException.XAER_INVAL);
  -
  -        if (!onePhase && id.status != TX_PREPARED)
  -            throw new XAException(XAException.XAER_PROTO);
  -        if (onePhase && (!(id.status == TX_IDLE || id.status == TX_SUSPENDED)))
  -            throw new XAException(XAException.XAER_PROTO);
  -
  -        Connection conn = id.connection;
  -
  -        if (conn == null) {
  -            getLogger().log(
  -                "commit(): No connection in connectionMap for id \"" + id + "\"",
  -                LOG_CHANNEL,
  -                Logger.ERROR);
  -            throw new XAException(XAException.XAER_NOTA);
  -        }
  -
  -        try {
  -            if (!tmCommits) {
  -                if (id.rollbackOnly) {
  -
  -                    conn.rollback();
  -                } else {
  -                    conn.commit();
  -                }
  -            }
  -            activeTransactionContext.set(null);
  -        } catch (Exception e) {
  -            throw new XAException(XAException.XA_RBCOMMFAIL);
  -        } finally {
  -            try {
  -                conn.close();
  -                /* We must always return connections to the pool,
  -                                                or we'd eventually run out. */
  -            } catch (SQLException e) {
  -                getLogger().log(e, LOG_CHANNEL, Logger.ERROR);
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Inform the resource manager to roll back work done on behalf of a
  -     * transaction branch.
  -     */
  -    public void rollback(Xid xid) throws XAException {
  -
  -        getLogger().log(
  -            "rollback() for thread " + Thread.currentThread() + ", removing from map",
  -            LOG_CHANNEL,
  -            Logger.DEBUG);
  -
  -        TransactionId id = getActiveTransactionContext();
  -        if (id == null) {
  -            getLogger().log("No transaction associated with current thread, can't rollback", LOG_CHANNEL, Logger.ERROR);
  -            throw new XAException(XAException.XAER_NOTA);
  -        }
  -
  -        Connection conn = id.connection;
  -        if (conn == null) {
  -            getLogger().log(
  -                "rollback(): No connection in connectionMap for id \"" + id + "\"",
  -                LOG_CHANNEL,
  -                Logger.ERROR);
  -            throw new XAException(XAException.XAER_NOTA);
  -        }
  -
  -        try {
  -            if (!tmCommits) {
  -                conn.rollback();
  -            }
  -            activeTransactionContext.set(null);
  -            
  -        } catch (Exception e) {
  -            throw new XAException(XAException.XA_HEURCOM);
  -        } finally {
  -            try {
  -                conn.close();
  -                /* We must always return connections to the pool,
  -                                                or we'd eventually run out. */
  -            } catch (SQLException e) {
  -                getLogger().log(e, LOG_CHANNEL, Logger.ERROR);
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Start work on behalf of a transaction branch specified in xid.
  -     */
  -    public void start(Xid xid, int flags) throws XAException {
  -        getLogger().log("start(): beginning transaction with xid " + xid, LOG_CHANNEL, Logger.DEBUG);
  -
  -        TransactionId id = getActiveTransactionContext();
  -
  -        switch (flags) {
  -            case XAResource.TMNOFLAGS :
  -                if (id != null)
  -                    throw new XAException(XAException.XAER_INVAL);
  -                try {
  -                    id = new TransactionId(xid, TX_IDLE);
  -                } catch (SQLException e) {
  -                    throw new XAException(XAException.XAER_RMFAIL); // XXX or is it an error?
  -                }
  -
  -                getLogger().log("start(): adding to map for " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -
  -                activeTransactionContext.set(id);
  -                break;
  -            case XAResource.TMJOIN :
  -                getLogger().log(
  -                    "TMJOIN for transaction in thread: " + Thread.currentThread(),
  -                    LOG_CHANNEL,
  -                    Logger.DEBUG);
  -                if (id == null)
  -                    throw new XAException(XAException.XAER_NOTA);
  -                break;
  -            case XAResource.TMRESUME :
  -                getLogger().log(
  -                    "TMRESUME for transaction in thread: " + Thread.currentThread(),
  -                    LOG_CHANNEL,
  -                    Logger.DEBUG);
  -                if (id == null)
  -                    throw new XAException(XAException.XAER_NOTA);
  -                if (id.status != TX_SUSPENDED)
  -                    throw new XAException(XAException.XAER_INVAL);
  -                id.status = TX_IDLE;
  -                break;
  -        }
  +    	return (xares == this);
       }
       
       // ----------------------------------------------- IBasicExpressionFactoryProvider Implementation
  @@ -492,7 +279,7 @@
           // not change will running, it is either yes or no all the time
           if (isSequenceSupported > 0)
               return true;
  -        if (isSequenceSupported > 0)
  +        if (isSequenceSupported < 0)
               return false;
           Connection connection = null;
           try {
  @@ -590,7 +377,7 @@
        */
       public ObjectNode retrieveObject(Uri uri) throws ServiceAccessException, ObjectNotFoundException {
   
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -691,7 +478,7 @@
        * @exception ServiceAccessException Error accessing the Service
        */
       public Enumeration enumeratePermissions(Uri uri) throws ServiceAccessException {
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -769,7 +556,7 @@
        * @exception ServiceAccessException Service access error
        */
       public Enumeration enumerateLocks(Uri uri) throws ServiceAccessException {
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -802,7 +589,7 @@
        */
       public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
           throws ServiceAccessException, RevisionDescriptorNotFoundException {
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -872,7 +659,7 @@
        */
       public NodeRevisionDescriptor retrieveRevisionDescriptor(Uri uri, NodeRevisionNumber revisionNumber)
           throws ServiceAccessException, RevisionDescriptorNotFoundException {
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -943,7 +730,7 @@
        */
       public NodeRevisionContent retrieveRevisionContent(Uri uri, NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException, RevisionNotFoundException {
  -        if (getActiveTransactionContext() == null) {
  +        if (getCurrentlyActiveTransactionalResource() == null) {
               Connection connection = null;
               try {
                   connection = getNewConnection();
  @@ -1013,13 +800,18 @@
   
       // ------------------------------------------------------ Protected Methods
   
  +    // XXX just for visibility in RDBMSComparableResourcesPool
  +    protected TransactionalResource getCurrentlyActiveTransactionalResource() {
  +        return super.getCurrentlyActiveTransactionalResource();
  +    }
  +    
       /** 
        * Get the Connection object associated with the current transaction.
        */
       protected Connection getCurrentConnection() throws ServiceAccessException {
   
           getLogger().log("Getting current connection for thread " + Thread.currentThread(), LOG_CHANNEL, Logger.DEBUG);
  -        TransactionId id = getActiveTransactionContext();
  +        TransactionId id = (TransactionId) getCurrentlyActiveTransactionalResource();
           if (id == null) {
               getLogger().log("No id for current thread - called outside transaction?", LOG_CHANNEL, Logger.DEBUG);
               return null;
  @@ -1027,28 +819,81 @@
           return id.connection;
       }
   
  -    protected TransactionId getActiveTransactionContext() {
  -        Object txId = activeTransactionContext.get();
  -        return (TransactionId) txId;
  -    }
  -
       abstract protected Connection getNewConnection() throws SQLException;
   
  -    // ---------------------------------------------------------- Inner Classes
  -
  -    private class TransactionId {
  +    protected TransactionalResource createTransactionResource(Xid xid) throws SQLException {
  +			return new TransactionId(xid);
  +    }
  +    
  +    private class TransactionId implements TransactionalResource {
           Xid xid;
           int status;
  -        boolean rollbackOnly;
           Connection connection;
   
  -        TransactionId(Xid xid, int status) throws SQLException {
  +        TransactionId(Xid xid) throws SQLException {
               this.xid = xid;
  -            this.status = status;
  -            this.rollbackOnly = false;
  -
  +            
  +            status = STATUS_ACTIVE;
               connection = getNewConnection();
           }
  +
  +        public void commit() throws XAException {
  +			try {
  +				if (!tmCommits) {
  +					connection.commit();
  +				}
  +			} catch (SQLException e) {
  +				throw new XAException(XAException.XA_RBCOMMFAIL);
  +			} finally {
  +				try {
  +					connection.close();
  +				} catch (SQLException e) {
  +					getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
  +				}
  +			}
  +		}
  +        
  +        public void rollback() throws XAException {
  +			try {
  +				if (!tmCommits) {
  +					connection.rollback();
  +				}
  +			} catch (SQLException e) {
  +				throw new XAException(XAException.XA_RBCOMMFAIL);
  +			} finally {
  +				try {
  +					connection.close();
  +				} catch (SQLException e) {
  +					getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
  +				}
  +			}
  +		}
  +
  +        public int prepare() throws XAException {
  +        	// no check possible
  +        	return XA_OK;
  +        }
  +
  +        public void close() throws XAException {
  +            try {
  +                connection.close();
  +            } catch (SQLException e) {
  +                getLogger().log(e, LOG_CHANNEL, Logger.WARNING);
  +                // do not report, but gracefully ignore
  +            }
  +        }
  +        
  +        public int getStatus() {
  +        	return status;
  +        }
  +        
  +        public void setStatus(int status) {
  +        	this.status = status;
  +        }
  +
  +		public Xid getXid() {
  +			return xid;
  +		}
   
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org