package com.googlecode.tawus.hibernate.internal.services;
import java.lang.reflect.Method;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
import org.apache.tapestry5.ioc.annotations.Symbol;
import com.googlecode.tawus.Propagation;
import com.googlecode.tawus.annotations.Transactional;
import com.googlecode.tawus.hibernate.TawusHibernateConstants;
import com.googlecode.tawus.hibernate.internal.advices.MandatoryTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.NestedTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.NeverTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.NotSupportedTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.RequiredTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.RequiresNewTransactionAdvice;
import com.googlecode.tawus.hibernate.internal.advices.TransactionIsolationAdvice;
import com.googlecode.tawus.hibernate.services.HibernateSessionManager;
import com.googlecode.tawus.hibernate.services.TransactionAdvisor;
public class TransactionAdvisorImpl implements TransactionAdvisor {
private HibernateSessionManager sessionManager;
private String defaultFactoryID;
public TransactionAdvisorImpl(HibernateSessionManager sessionManager,
@Symbol(TawusHibernateConstants.DEFAULT_FACTORY_ID)String defaultFactoryID) {
this.sessionManager = sessionManager;
this.defaultFactoryID = defaultFactoryID;
}
public void addTransactionAdvice(
final MethodAdviceReceiver receiver, String factoryID) {
if(factoryID == null){
factoryID = defaultFactoryID;
}
for (Method method : receiver.getInterface().getMethods()) {
Transactional transactional = method
.getAnnotation(Transactional.class);
if (transactional != null) {
adviceMethod(transactional.propagation(), transactional.isolation(), factoryID, method, receiver);
}
}
}
public void addTransactionAdvice(final MethodAdviceReceiver receiver) {
addTransactionAdvice(receiver, "");
}
private void adviceMethod(final Propagation propagation, int isolation,
String factoryID,
Method method,
MethodAdviceReceiver receiver) {
switch (propagation) {
case REQUIRED:
receiver.adviseMethod(method, new RequiredTransactionAdvice(factoryID,
sessionManager));
break;
case MANDATORY:
receiver.adviseMethod(method, new MandatoryTransactionAdvice(factoryID,
sessionManager));
break;
case NESTED:
receiver.adviseMethod(method, new NestedTransactionAdvice(factoryID,
sessionManager));
break;
case NEVER:
receiver.adviseMethod(method, new NeverTransactionAdvice(factoryID,
sessionManager));
break;
case SUPPORTS:
break;
case REQUIRES_NEW:
receiver.adviseMethod(method, new RequiresNewTransactionAdvice(
factoryID, sessionManager));
break;
case NOT_SUPPORTED:
receiver.adviseMethod(method, new NotSupportedTransactionAdvice(
factoryID, sessionManager));
break;
}
if (isolation != 0) {
receiver.adviseMethod(method,
new TransactionIsolationAdvice(factoryID,
isolation, sessionManager));
}
}
}