All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.efaps.db.transaction.ConnectionResource Maven / Gradle / Ivy

/*
 * Copyright 2003 - 2012 The eFaps Team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Revision:        $Rev: 7483 $
 * Last Changed:    $Date: 2012-05-11 11:57:38 -0500 (Fri, 11 May 2012) $
 * Last Changed By: $Author: [email protected] $
 */

package org.efaps.db.transaction;

import java.sql.Connection;
import java.sql.SQLException;

import javax.transaction.xa.XAException;
import javax.transaction.xa.Xid;

import org.efaps.db.Context;
import org.efaps.util.EFapsException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The class implements the XAResource interface for SQL connections.
 *
 * @author The eFaps Team
 * @version $Id: ConnectionResource.java 7483 2012-05-11 16:57:38Z [email protected] $
 */
public class ConnectionResource
    extends AbstractResource
{
    /**
     * Logging instance used in this class.
     */
    private static final Logger LOG = LoggerFactory.getLogger(ConnectionResource.class);

    /**
     * Stores the SQL connection of this connection resource.
     */
    private Connection connection = null;

    /**
     * @param _connection   SQL connection
     * @throws SQLException if auto commit could not be set to false
     */
    public ConnectionResource(final Connection _connection)
        throws SQLException
    {
        this.connection = _connection;
        this.connection.setAutoCommit(false);
    }

    /**
     * This is the getter method for instance variable {@link #connection}.
     *
     * @return value of instance variable {@link #connection}
     * @see #connection
     */
    public final Connection getConnection()
    {
        return this.connection;
    }

    /**
     * Frees the resource and gives this connection resource back to the
     * context object.
     */
    @Override
    protected void freeResource()
    {
        try {
            Context.getThreadContext().returnConnectionResource(this);
        } catch (final EFapsException e) {
            ConnectionResource.LOG.error("EFapsException", e);
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // all further methods are implementing javax.transaction.xa.XAResource

    /**
     * Ask the resource manager to prepare for a transaction commit of the
     * transaction specified in xid (used for 2-phase commits).
     * @param _xid Xid
     * @return 0
     */
    public int prepare(final Xid _xid)
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("prepare (xid = " + _xid + ")");
        }
        return 0;
    }

    /**
     * Commits the global transaction specified by xid.
     * @param _xid      Xid
     * @param _onePhase one phase
     * @throws XAException on error
     */
    public void commit(final Xid _xid,
                       final boolean _onePhase)
        throws XAException
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("commit (xid = " + _xid + ", one phase = " + _onePhase + ")");
        }
        try  {
            if (this.connection != null)  {
                this.connection.commit();
            }
        } catch (final SQLException e)  {
            final XAException xa = new XAException(XAException.XA_RBCOMMFAIL);
            xa.initCause(e);
            throw xa;
        } finally  {
            try {
                if (this.connection != null)  {
                    this.connection.close();
                    this.connection = null;
                }
            } catch (final SQLException e) {
                ConnectionResource.LOG.error("SQLException", e);
            }
        }
    }

    /**
     * Informs the resource manager to roll back work done on behalf of a
     * transaction branch.
     * @param _xid Xid
     * @throws XAException on error
     */
    public void rollback(final Xid _xid)
        throws XAException
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("rollback (xid = " + _xid + ")");
        }
        try  {
            if (this.connection != null)  {
                this.connection.rollback();
            }
        } catch (final SQLException e)  {
            final XAException xa = new XAException(XAException.XA_RBCOMMFAIL);
            xa.initCause(e);
            throw xa;
        } finally  {
            try {
                if (this.connection != null)  {
                    this.connection.close();
                    this.connection = null;
                }
            } catch (final SQLException e) {
                ConnectionResource.LOG.error("SQLException", e);
            }
        }
    }

    /**
     * Tells the resource manager to forget about a heuristically completed
     * transaction branch.
     * @param _xid Xid
     */
    public void forget(final Xid _xid)
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("forget (xid = " + _xid + ")");
        }
    }

    /**
     * Obtains the current transaction timeout value set for this XAResource
     * instance.
     * @return 0
     */
    public int getTransactionTimeout()
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("getTransactionTimeout");
        }
        return 0;
    }

    /**
     * Obtains a list of prepared transaction branches from a resource manager.
     * @param _flag flag
     * @return null
     */
    public Xid[] recover(final int _flag)
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("recover (flag = " + _flag + ")");
        }
        return null;
    }

    /**
     * Sets the current transaction timeout value for this XAResource instance.
     * From this implementation ignored.
     *
     * @param _seconds  time out in seconds
     * @return always true
     */
    public boolean setTransactionTimeout(final int _seconds)
    {
        if (ConnectionResource.LOG.isDebugEnabled())  {
            ConnectionResource.LOG.debug("setTransactionTimout");
        }
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy