Package org.jboss.arquillian.transaction.spring.provider

Source Code of org.jboss.arquillian.transaction.spring.provider.AbstractSpringTransactionProvider

/*
* JBoss, Home of Professional Open Source
* Copyright 2012, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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 org.jboss.arquillian.transaction.spring.provider;

import org.jboss.arquillian.core.api.InstanceProducer;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.transaction.spi.annotation.TransactionScope;
import org.jboss.arquillian.transaction.spi.provider.TransactionProvider;
import org.jboss.arquillian.transaction.spi.test.TransactionalTest;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;

/**
* <p>A Spring transaction provider.</p>
*
* <p>It delegates all the transaction specific handling to the configured {@link PlatformTransactionManager}.</p>
*
* <p>This class is abstract, the concrete implementation provide means for retrieving the transaction manager from
* specific application context.</p>
*
* @author <a href="mailto:jmnarloch@gmail.com">Jakub Narloch</a>
* @version $Revision: $
*/
public abstract class AbstractSpringTransactionProvider implements TransactionProvider {

    /**
     * <p>Instance of {@link PlatformTransactionManager} to which all the operations are delegated.</p>
     */
    @Inject
    @TransactionScope
    InstanceProducer<PlatformTransactionManager> transactionManagerInstance;

    /**
     * <p>The {@link TransactionStatus} of the currently executed transaction.</p>
     */
    @Inject
    @TransactionScope
    InstanceProducer<TransactionStatus> transactionStatusInstance;

    /**
     * {@inheritDoc}
     */
    @Override
    public void beginTransaction(TransactionalTest transactionalTest) {

        // retrieves the transaction manager
        PlatformTransactionManager transactionManager = getTransactionManager(
                transactionalTest.getManager());
        transactionManagerInstance.set(transactionManager);

        // create the transaction definition
        TransactionDefinition transactionDefinition = createTransactionDefinition();

        // begins transaction
        TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
        transactionStatusInstance.set(transactionStatus);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void commitTransaction(TransactionalTest transactionalTest) {

        PlatformTransactionManager transactionManager = transactionManagerInstance.get();
        TransactionStatus transactionStatus = transactionStatusInstance.get();

        // commits the transaction
        transactionManager.commit(transactionStatus);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void rollbackTransaction(TransactionalTest transactionalTest) {

        PlatformTransactionManager transactionManager = transactionManagerInstance.get();
        TransactionStatus transactionStatus = transactionStatusInstance.get();

        // rollbacks the transaction
        transactionManager.rollback(transactionStatus);
    }

    /**
     * <p>Creates new transaction definition.</p>
     *
     * @return the transaction definition
     */
    private DefaultTransactionAttribute createTransactionDefinition() {

        return new DefaultTransactionAttribute();
    }

    /**
     * <p>Retrieves from the application context the configured {@link PlatformTransactionManager} for the given
     * test.</p>
     *
     * @param transactionManagerName the transaction manager name
     *
     * @return the {@link PlatformTransactionManager} retrieved from application context
     */
    private PlatformTransactionManager getTransactionManager(String transactionManagerName) {

        ApplicationContext applicationContext = getApplicationContext();

        return (PlatformTransactionManager) applicationContext.getBean(transactionManagerName,
                PlatformTransactionManager.class);
    }

    /**
     * <p>Retrieves the application context.</p>
     *
     * @return the application context
     */
    protected abstract ApplicationContext getApplicationContext();
}
TOP

Related Classes of org.jboss.arquillian.transaction.spring.provider.AbstractSpringTransactionProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.