Package siena.core.lifecycle

Source Code of siena.core.lifecycle.LifeCycleUtils

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);
    }
   
  }
}
TOP

Related Classes of siena.core.lifecycle.LifeCycleUtils

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.