Android Open Source - jepldroid J E P L Non J T A Connection Impl






From Project

Back to project page jepldroid.

License

The source code is released under:

Apache License

If you think the Android project jepldroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
   Copyright 2011 Jose Maria Arranz Santamaria
/*ww  w .j  ava  2s . c o  m*/
   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.
*/

package jepl.impl.nonjta;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import jepl.JEPLConnection;
import jepl.JEPLConnectionListener;
import jepl.JEPLException;
import jepl.JEPLTask;
import jepl.JEPLTransactionalNonJTA;
import jepl.impl.JEPLConnectionImpl;
import jepl.impl.JEPLDALImpl;
import jepl.impl.JEPLListenerListImpl;
import jepl.impl.JEPLTaskOneExecWithConnectionImpl;
import jepl.impl.JEPLTaskOneExecWithConnectionWrapperImpl;

/**
 *
 * @author jmarranz
 */
public abstract class JEPLNonJTAConnectionImpl extends JEPLConnectionImpl
{
    public JEPLNonJTAConnectionImpl(JEPLNonJTADataSourceImpl ds,Connection con)
    {
        super(ds,con);
    }

    public JEPLNonJTADataSourceImpl getJEPLNonJTADataSource()
    {
        return (JEPLNonJTADataSourceImpl)ds;
    }

    public static <T> JEPLConnectionListener<?> createJEPLConnectionListener(final boolean autoCommit)
    {
        JEPLConnectionListener<T> listener = new JEPLConnectionListener<T>()
        {
            public void setupJEPLConnection(JEPLConnection con, JEPLTask<T> task) throws Exception
            {
                ((JEPLNonJTAConnectionImpl)con).configureAutoCommit(autoCommit);
            }
        };
        return listener;
    }

    public void configureAutoCommit(boolean autoCommit) throws SQLException
    {
        Connection con = getConnection();
        if (con.getAutoCommit() != autoCommit)
            con.setAutoCommit(autoCommit);
    }

    public <T> T execTask(JEPLTaskExecContextInConnectionNonJTAImpl<T> taskCtx,JEPLDALImpl dal,JEPLListenerListImpl paramListener) throws Exception
    {
        JEPLConnectionListener<T> listener = getJEPLConnectionListener(dal,paramListener);

        // Si el listener es del usuario el usuario si quiere puede demarcar la transaccin
        // si la demarca ha de llamar a exec() del task.

        JEPLTaskOneExecWithConnectionImpl<T> task = taskCtx.getJEPLTaskWithJEPLConnection();
        this.currentTxn = new JEPLCurrentTransactionNonJTAImpl(this);
        if (listener != null) listener.setupJEPLConnection(this, task);

        if (task.isExecuted())
        {
            // En este caso el programador es el responsable del control de la transaccin
            // (commit y rollback) si no lo ha hecho es problema suyo
            return task.getResult();
        }
        else
        {
            if (currentTxn.isUsed())
                throw new JEPLException("You have used the JEPLTransaction but the next task was not executed");

            if (listener == null)
            {
                // El usuario ha tenido la oportunidad de definir a travs de un JEPLConnectionListener
                // el autoCommit y no la ha usado por lo que definimos el autoCommit por defecto
                // Esta configuracin en teora la podramos ejecutar antes de ejecutar el JEPLConnectionListener
                // e incondicionalmente pero tiene el problema de que un setDefaultAutoCommit(true) hace un commit()
                // implcito, en el caso de task anidados podra hacer un commit indeseado si estuviera a false
                // cuando resulta que luego a travs de parmetro autoCommit o JEPLConnectionListener queramos mantener
                // el modo false para continuar la transaccin creada en el task anidado padre

                boolean autoCommit;
                
                // Vemos si hay anotacin en la task

                JEPLTask<T> originalTask = JEPLTaskOneExecWithConnectionWrapperImpl.getInnerJEPLTask(task);
                Method method = originalTask.getClass().getMethod("exec",(Class[])null);
                JEPLTransactionalNonJTA txnDec = method.getAnnotation(JEPLTransactionalNonJTA.class);
                if (txnDec != null)
                    autoCommit = txnDec.autoCommit();
                else // No hay anotacin, el valor por defecto
                    autoCommit = getJEPLNonJTADataSource().isDefaultAutoCommit();

                configureAutoCommit(autoCommit);
            }

            return executeTask(task);
        }
    }

    public <T> T executeTask(JEPLTask<T> task) throws Exception
    {
        Connection con = getConnection();
        try
        {
            T  objRes = task.exec();

            boolean useTxn = !con.getAutoCommit(); // As evitamos llamar a commit si no podemos hacerlo pues pudo haberse cambiado en la ejec. de la tarea
            if (useTxn)
                con.commit();

            return objRes;
        }
        catch (Exception ex) // Para cualquier excepcin tenemos que hacer el rollback incluidas las RuntimeException
        {
            try
            {
                boolean useTxn = !con.getAutoCommit(); // As evitamos llamar a rollback si no podemos hacerlo pues pudo haberse cambiado en la ejec. de la tarea
                if (useTxn)
                    con.rollback();
            }
            catch (SQLException ex2) { throw ex2; }

            throw ex; // Constatamos el error hacia fuera
        }
    }
}




Java Source Code List

com.innowhere.jepldroidtest.JEPLDroidTestActivity.java
jepl.JEPLBootNonJTA.java
jepl.JEPLBootRoot.java
jepl.JEPLBoot.java
jepl.JEPLCachedResultSet.java
jepl.JEPLConnectionListener.java
jepl.JEPLConnection.java
jepl.JEPLDALQuery.java
jepl.JEPLDAL.java
jepl.JEPLDAOQuery.java
jepl.JEPLDAO.java
jepl.JEPLDataSource.java
jepl.JEPLException.java
jepl.JEPLListener.java
jepl.JEPLNonJTADataSource.java
jepl.JEPLParameter.java
jepl.JEPLPreparedStatementListener.java
jepl.JEPLPreparedStatement.java
jepl.JEPLResultSetDALListener.java
jepl.JEPLResultSetDAOListenerDefault.java
jepl.JEPLResultSetDAOListener.java
jepl.JEPLResultSetDAO.java
jepl.JEPLResultSet.java
jepl.JEPLRowBeanMapper.java
jepl.JEPLStatement.java
jepl.JEPLTask.java
jepl.JEPLTransactionPropagation.java
jepl.JEPLTransaction.java
jepl.JEPLTransactionalJTA.java
jepl.JEPLTransactionalNonJTA.java
jepl.JEPLUserData.java
jepl.impl.JEPLBootImpl.java
jepl.impl.JEPLBootRootImpl.java
jepl.impl.JEPLConnectionImpl.java
jepl.impl.JEPLCurrentTransactionImpl.java
jepl.impl.JEPLDALDefaultImpl.java
jepl.impl.JEPLDALImpl.java
jepl.impl.JEPLDAOImpl.java
jepl.impl.JEPLDataSourceImpl.java
jepl.impl.JEPLListenerListImpl.java
jepl.impl.JEPLPreparedStatementDefaultImpl.java
jepl.impl.JEPLPreparedStatementImpl.java
jepl.impl.JEPLStatementImpl.java
jepl.impl.JEPLTaskExecContextImpl.java
jepl.impl.JEPLTaskExecContextInConnectionImpl.java
jepl.impl.JEPLTaskOneExecWithConnectionImpl.java
jepl.impl.JEPLTaskOneExecWithConnectionWrapperImpl.java
jepl.impl.JEPLTaskOneExecutionImpl.java
jepl.impl.JEPLTaskOneExecutionWrapperImpl.java
jepl.impl.JEPLUserDataMonoThreadImpl.java
jepl.impl.JEPLUserDataMultiThreadImpl.java
jepl.impl.JEPLUtilImpl.java
jepl.impl.lex.Cursor.java
jepl.impl.lex.Identifier.java
jepl.impl.lex.JDBCParamStandardToken.java
jepl.impl.lex.JDBCParamToken.java
jepl.impl.lex.JDBCParamWithNameToken.java
jepl.impl.lex.JDBCParamWithNumberToken.java
jepl.impl.lex.OtherCharToken.java
jepl.impl.lex.SourceCode.java
jepl.impl.lex.Space.java
jepl.impl.lex.StringDoubleQuote.java
jepl.impl.lex.StringLiteral.java
jepl.impl.lex.StringSimpleQuote.java
jepl.impl.lex.TestSourceCode.java
jepl.impl.lex.TokenFilter.java
jepl.impl.lex.Token.java
jepl.impl.nonjta.JEPLBootNonJTAImpl.java
jepl.impl.nonjta.JEPLCurrentTransactionNonJTAImpl.java
jepl.impl.nonjta.JEPLNonJTAConnectionDefaultImpl.java
jepl.impl.nonjta.JEPLNonJTAConnectionImpl.java
jepl.impl.nonjta.JEPLNonJTADataSourceDefaultImpl.java
jepl.impl.nonjta.JEPLNonJTADataSourceImpl.java
jepl.impl.nonjta.JEPLTaskExecContextInConnectionNonJTAImpl.java
jepl.impl.nonjta.android.JEPLNonJTAConnectionSQLDroidImpl.java
jepl.impl.nonjta.android.JEPLNonJTADataSourceAndroidImpl.java
jepl.impl.nonjta.android.JEPLPreparedStatementSQLDroidImpl.java
jepl.impl.query.JEPLCachedResultSetImpl.java
jepl.impl.query.JEPLDALQueryImpl.java
jepl.impl.query.JEPLDAOQueryImpl.java
jepl.impl.query.JEPLParameterDecImpl.java
jepl.impl.query.JEPLParameterDecWithNameImpl.java
jepl.impl.query.JEPLParameterDecWithNumberImpl.java
jepl.impl.query.JEPLParameterImpl.java
jepl.impl.query.JEPLParameterValueImpl.java
jepl.impl.query.JEPLParameterValueNamedImpl.java
jepl.impl.query.JEPLParameterWithNameImpl.java
jepl.impl.query.JEPLParameterWithNumberImpl.java
jepl.impl.query.JEPLPropertyDescriptorImpl.java
jepl.impl.query.JEPLPropertyDescriptorJavaBeansImpl.java
jepl.impl.query.JEPLQueryParsedCacheImpl.java
jepl.impl.query.JEPLQueryParsedImpl.java
jepl.impl.query.JEPLResultSetBeanInfo.java
jepl.impl.query.JEPLResultSetDAOImpl.java
jepl.impl.query.JEPLResultSetDAOIteratorImpl.java
jepl.impl.query.JEPLResultSetDAOListenerDefaultImpl.java
jepl.impl.query.JEPLResultSetDefaultImpl.java
jepl.impl.query.JEPLResultSetImpl.java