package com.iplatform.base.callback;
import com.iplatform.base.PlatformLoginCallback;
import com.iplatform.base.PlatformUserCallback;
import com.iplatform.base.SystemController;
import com.walker.infrastructure.ApplicationCallback;
import com.walker.infrastructure.ApplicationRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 应用程序后处理器 - 回调接口的处理,启动扫描所有配置的实现类。
* 同时可以使用该对象的静态方法获取某个bean。
* @author shikeying
* @date 2014-11-25
*
*/
public class PlatformCallbackPostProcessor implements BeanPostProcessor {
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
/** 只有单个实现的才放这里面 */
private static final Map, Object> callbackReference = new java.util.HashMap, Object>(4);
// 2023-01-26 所有回调bean对象缓存,无论单个或多个实现类型。
private static final Map multipleCallbackBeans = new HashMap<>(8);
// 这里是系统支持的回调接口定义,后续开发会在这里添加新的。
private List> callbackList = Arrays.asList(PlatformUserCallback.class
, PlatformLoginCallback.class, UserProfileCallback.class, AfterLoginCallback.class
, SecurityCallback.class);
// 2023-03-10 集中初始化 SystemController
中的一些通用bean
private List systemControllerList = new ArrayList<>(64);
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(ApplicationCallback.class.isAssignableFrom(bean.getClass())){
String beanClazzName = bean.getClass().getName();
Object existBean = null;
for(Class> callbackClazz : callbackList){
if(callbackClazz.isAssignableFrom(bean.getClass())){
if(((ApplicationCallback) bean).supportMultiple()){
multipleCallbackBeans.put(beanClazzName, bean);
} else {
existBean = callbackReference.get(callbackClazz);
if(existBean != null){
throw new ApplicationRuntimeException("...... 回调实现类已经加载,不能重复配置: " + existBean.getClass().getName());
}
callbackReference.put(callbackClazz, bean);
}
logger.info("加载了'CallbackBean'=" + beanClazzName);
}
}
}
else if(SystemController.class.isAssignableFrom(bean.getClass())){
// 2023
// logger.debug("+++++++++++++ 找到一个 SystemController = {}", bean.getClass().getName());
this.systemControllerList.add((SystemController)bean);
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
/**
* 返回给定的回调实现bean,如果不存在返回null
* @param callbackClass 如: PlatformUserCallback.class
* @return
*/
public static final T getCallbackObject(Class callbackClass){
if(callbackClass == null){
return null;
}
Object bean = callbackReference.get(callbackClass);
if(bean != null){
return (T)bean;
}
return null;
}
/**
* 根据给定bean实现类型,返回具体的回调对象。
* 例如: PlatformLoginCallback会存在多个实现。
* @param callbackBean 给定的类型,如: WebLoginCallback.class
* @return
* @param
* @date 2023-01-26
*/
public static final T getCallbackMultipleBean(Class callbackBean){
if(callbackBean == null){
return null;
}
Object bean = multipleCallbackBeans.get(callbackBean.getName());
if(bean != null){
return (T)bean;
}
return null;
}
/**
* 返回系统收集到的 SystemController
对象集合。
* @return
* @date 2023-03-10
*/
public List getSystemControllerList(){
return this.systemControllerList;
}
}