com.facultyshowcase.app.model.helpers.TransactionAspect.java Source code

Java tutorial

Introduction

Here is the source code for com.facultyshowcase.app.model.helpers.TransactionAspect.java

Source

/*
 * Copyright (c) Interactive Information R & D (I2RD) LLC.
 * All Rights Reserved.
 *
 * This software is confidential and proprietary information of
 * I2RD LLC ("Confidential Information"). You shall not disclose
 * such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered
 * into with I2RD.
 */

package com.facultyshowcase.app.model.helpers;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

import java.lang.reflect.Method;

import net.proteusframework.core.hibernate.dao.DAOHelper;

/**
 * Don't want to hand roll transaction logic every time....
 *
 * @author Jerry Maine (jmaine@venturetech.com)
 * @since 7/3/14 7:04 AM
 */
@Aspect
public class TransactionAspect {

    /** Logger. */
    private final static Logger _logger = Logger.getLogger(TransactionAspect.class);

    private final Method beginTransaction;
    private final Method rollbackTransaction;
    private final Method commitTransaction;

    public TransactionAspect() {
        _logger.trace("Starting Transaction Aspect");

        try {
            beginTransaction = DAOHelper.class.getDeclaredMethod("beginTransaction");
            rollbackTransaction = DAOHelper.class.getDeclaredMethod("recoverableRollbackTransaction");
            commitTransaction = DAOHelper.class.getDeclaredMethod("commitTransaction");
        } catch (NoSuchMethodException e) {
            _logger.error("FIXME : Your Message", e);

            throw new RuntimeException(e);
        }
        beginTransaction.setAccessible(true);
        rollbackTransaction.setAccessible(true);
        commitTransaction.setAccessible(true);
    }

    @Pointcut(value = "execution(public * net.proteusframework.core.hibernate.dao.DAOHelper+.*(..))")
    public void daoMethod() {
        _logger.trace("daoMethod()");
    }

    @Around("daoMethod() && @annotation(withTransaction)")
    public Object wrapWithTransaction(ProceedingJoinPoint pjp, WithTransaction withTransaction) throws Throwable {
        _logger.trace("wrapWithTransaction()");
        DAOHelper dao = (DAOHelper) pjp.getTarget();

        try {

            beginTransaction.invoke(dao);

            Object ret = pjp.proceed();

            commitTransaction.invoke(dao);
            return ret;
        } catch (Throwable e) {
            try {
                rollbackTransaction.invoke(dao);
            } catch (Throwable e2) {
                e.addSuppressed(e2);
            }
            throw e;
        }
    }
}