package net.tooan.ynpay.third.jfinal.ext.interceptor.ejb; import net.tooan.ynpay.third.jfinal.log.Logger; import java.lang.reflect.Field; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class EJBManager { private static Logger logger = Logger.getLogger(EJBManager.class); private static ConcurrentMap<String, Object> facades = new ConcurrentHashMap<String, Object>(); public static EJBManager manager = new EJBManager(); private static final String LOCAL_LABEL = "local:"; private static final String REMOTE_LABEL = "remote:"; private EJBManager() { } public void setEJB(Object obj) { try { Object o = obj; Class clazz = o.getClass(); do { Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.getType().isInterface()) { if (field.isAnnotationPresent(RemoteEJB.class)) { RemoteEJB ejb = field.getAnnotation(RemoteEJB.class); if (!field.isAccessible()) { field.setAccessible(true); } field.set(o, getEjbResources(REMOTE_LABEL + field.getType().getSimpleName(), ejb.mappedName())); } if (field.isAnnotationPresent(LocalEJB.class)) { LocalEJB ejb = field.getAnnotation(LocalEJB.class); if (!field.isAccessible()) { field.setAccessible(true); } field.set(o, getEjbResources(LOCAL_LABEL + field.getType().getSimpleName(), ejb.mappedName())); } } } clazz = clazz.getSuperclass(); } while (clazz != Object.class); } catch (IllegalAccessException e) { if (logger.isErrorEnabled()) { logger.error(e.getMessage(), e); } } } private <T> Object getEjbResources(String name, String jndi) { if (!facades.containsKey(name)) { setEjbResources(name, jndi); } return facades.get(name); } private void setEjbResources(String keyName, String jndi) { try { facades.put(keyName, EJBServerFactory.getEJBServer().lookup(jndi)); } catch (Exception e) { if (logger.isErrorEnabled()) { logger.error(e.getMessage(), e); } } } }