package siena.core.lifecycle;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import siena.ClassInfo;
import siena.SienaException;
public class LifeCycleUtils {
private static final Map<Class<? extends Annotation>, LifeCyclePhase> lifeCycleClasses = new ConcurrentHashMap<Class<? extends Annotation>, LifeCyclePhase>() {
private static final long serialVersionUID = -3454152184796684592L;
{
put(PreFetch.class, LifeCyclePhase.PRE_FETCH);
put(PreInsert.class, LifeCyclePhase.PRE_INSERT);
put(PreDelete.class, LifeCyclePhase.PRE_DELETE);
put(PreUpdate.class, LifeCyclePhase.PRE_UPDATE);
put(PreSave.class, LifeCyclePhase.PRE_SAVE);
put(PostFetch.class, LifeCyclePhase.POST_FETCH);
put(PostInsert.class, LifeCyclePhase.POST_INSERT);
put(PostDelete.class, LifeCyclePhase.POST_DELETE);
put(PostUpdate.class, LifeCyclePhase.POST_UPDATE);
put(PostSave.class, LifeCyclePhase.POST_SAVE);
}
};
public static List<LifeCyclePhase> getMethodLifeCycles(Method m){
List<LifeCyclePhase> l = new ArrayList<LifeCyclePhase>();
for(Class<? extends Annotation> cl : lifeCycleClasses.keySet()){
if(m.isAnnotationPresent(cl)){
l.add(lifeCycleClasses.get(cl));
}
}
return l;
}
public static void executeMethods(LifeCyclePhase lcp, ClassInfo ci, Object obj){
List<Method> methods = ci.getLifeCycleMethod(lcp);
if(methods == null) return;
try {
for(Method m: methods){
// injects lifeCyclePhase if it is the FIRST param
Class<?> params[] = m.getParameterTypes();
boolean wasAccessible = true;
if(!m.isAccessible()){
wasAccessible = false;
m.setAccessible(true);
}
if(params != null && params.length != 0){
if(LifeCyclePhase.class.isAssignableFrom(params[0])){
m.invoke(obj, lcp);
}
}
else {
m.invoke(obj);
}
if(!wasAccessible){
m.setAccessible(false);
}
}
}catch (IllegalArgumentException e) {
throw new SienaException(e);
} catch (IllegalAccessException e) {
throw new SienaException(e);
} catch (InvocationTargetException e) {
throw new SienaException(e);
}
}
}