TransactionTemplate.java 5.26 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.transaction.HeuristicMixedException
 *  javax.transaction.HeuristicRollbackException
 *  javax.transaction.NotSupportedException
 *  javax.transaction.RollbackException
 *  javax.transaction.SystemException
 *  javax.transaction.Transaction
 *  javax.transaction.TransactionManager
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.pdfg.transaction;

import com.adobe.pdfg.transaction.DefaultTransactionDefinition;
import com.adobe.pdfg.transaction.TransactionCallback;
import com.adobe.pdfg.transaction.TransactionDefinition;
import com.adobe.pdfg.transaction.exception.TransactionException;
import com.adobe.pdfg.transaction.exception.TransactionSystemException;
import java.lang.reflect.UndeclaredThrowableException;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
public class TransactionTemplate
extends DefaultTransactionDefinition {
    protected final Logger logger;
    private TransactionManager transactionManager;

    public TransactionTemplate() {
        this.logger = LoggerFactory.getLogger(this.getClass());
    }

    public TransactionTemplate(TransactionManager transactionManager) {
        this.logger = LoggerFactory.getLogger(this.getClass());
        this.transactionManager = transactionManager;
    }

    public TransactionTemplate(TransactionManager transactionManager, TransactionDefinition transactionDefinition) {
        super(transactionDefinition);
        this.logger = LoggerFactory.getLogger(this.getClass());
        this.transactionManager = transactionManager;
    }

    public void setTransactionManager(TransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public TransactionManager getTransactionManager() {
        return this.transactionManager;
    }

    public void afterPropertiesSet() {
        if (this.transactionManager == null) {
            throw new IllegalArgumentException("Property 'transactionManager' is required");
        }
    }

    public <T> T execute(TransactionCallback<T> action) throws TransactionException {
        T result;
        boolean selfOwned = true;
        try {
            selfOwned = this.acquireTransaction();
            result = action.doInTransaction();
            if (selfOwned) {
                this.commitTransaction();
            }
        }
        catch (RuntimeException ex) {
            this.rollbackOnException(ex, selfOwned);
            throw ex;
        }
        catch (Error err) {
            this.rollbackOnException(err, selfOwned);
            throw err;
        }
        catch (Exception ex) {
            this.rollbackOnException(ex, selfOwned);
            throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
        }
        return result;
    }

    private void rollbackOnException(Throwable ex, boolean selfOwned) throws TransactionException {
        this.logger.debug("Initiating transaction rollback on application exception", ex);
        try {
            if (selfOwned) {
                this.rollbackTransaction();
            } else {
                this.transactionManager.setRollbackOnly();
            }
        }
        catch (TransactionSystemException ex2) {
            this.logger.error("Application exception overridden by rollback exception", ex);
            this.logger.trace(ex2.getMessage(), (Throwable)ex2);
            ex2.initApplicationException(ex);
            throw ex2;
        }
        catch (RuntimeException ex2) {
            this.logger.error("Application exception overridden by rollback exception", ex);
            this.logger.trace(ex2.getMessage(), (Throwable)ex2);
            throw ex2;
        }
        catch (Error err) {
            this.logger.error("Application exception overridden by rollback error", ex);
            this.logger.trace(err.getMessage(), (Throwable)err);
            throw err;
        }
        catch (SystemException ex3) {
            this.logger.error("Application exception overridden by rollback exception", ex);
            throw new TransactionSystemException("SystemException while rolling back transaction", (Throwable)ex3);
        }
    }

    private boolean acquireTransaction() throws SystemException, NotSupportedException {
        Transaction trans = this.transactionManager.getTransaction();
        if (trans != null && trans.getStatus() == 0) {
            return false;
        }
        this.transactionManager.begin();
        return true;
    }

    private void commitTransaction() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
        this.transactionManager.commit();
    }

    private void rollbackTransaction() throws IllegalStateException, SecurityException, SystemException {
        this.transactionManager.rollback();
    }
}