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