/**
* <p>类描述: 生成接口描述信息并放入Application中 </p>
* <p>创建人:王成委 </p>
* <p>创建时间:2015年1月19日 下午4:42:24 </p>
* <p>版权说明: © 2015 Tiamaes </p>
* @see com.tiamaes.gjds.app.annotation.AppInterface
*/
public class InterfaceAnnotationConfigProcesser implements ApplicationContextAware,InitializingBean{
private Log logger = LogFactory.getLog(getClass());
private Map<String,List<RequestMethodMapping>> mappers =
new HashMap<String,List<RequestMethodMapping>>();
private WebApplicationContext applicationContext;
/**
* <p>方法描述:加载带有{@link com.tiamaes.gjds.app.annotation.AppInterface}注解的接口</p>
* <p>首先需要获取所有接口,然后过滤方法中带有@AppInterface</p>
* <p>创建人: 王成委 </p>
* <p>创建时间: 2015年1月10日 上午10:50:06 </p>
*/
public void loadHandlerMapping(){
this.logger.info("初始化配置");
Map<String, HandlerMapping> handlers = BeanFactoryUtils.beansOfTypeIncludingAncestors(
applicationContext, HandlerMapping.class, true, false);
for(Entry<String, HandlerMapping> entry : handlers.entrySet()){
HandlerMapping mapping = entry.getValue();
if(mapping instanceof RequestMappingHandlerMapping){
RequestMappingHandlerMapping requestHandler = (RequestMappingHandlerMapping)mapping;
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestHandler.getHandlerMethods();
for(Entry<RequestMappingInfo, HandlerMethod> handlerMethod : handlerMethods.entrySet()){
AppInterface annotation = handlerMethod.getValue().getMethodAnnotation(AppInterface.class);
if(annotation== null)continue;
PatternsRequestCondition patternsCondition = handlerMethod.getKey().getPatternsCondition();
String requestUrl = SetUtils.first(patternsCondition.getPatterns());
this.register(requestUrl, annotation,handlerMethod.getValue().getBeanType());
}
}
}
}
/**
* <p>方法描述:注册方法</p>
* <p>创建人: 王成委 </p>
* <p>创建时间: 2015年1月10日 上午10:50:06 </p>
* @param requestUrl
* @param annotation
* @param beanType
*/
private void register(String requestUrl, AppInterface annotation,
Class<?> beanType) {
String group = annotation.group();
List<RequestMethodMapping> groupMappers = this.mappers.get(group);
if(groupMappers == null)groupMappers = new ArrayList<RequestMethodMapping>();
RequestMethodMapping mapper = new RequestMethodMapping();
mapper.setGroup(group);
mapper.setController(beanType.getName());
mapper.setOrder(annotation.order());
mapper.setName(annotation.value());
mapper.setUrl(requestUrl);
mapper.setParams(this.toParameters(annotation.params()));
groupMappers.add(mapper);
this.mappers.put(group, groupMappers);
}
/**
* <p>方法描述:读取参数</p>
* <p>创建人: 王成委 </p>
* <p>创建时间: 2015年1月10日 上午10:50:06 </p>
* @param params
* @return
*/
private List<RequestMethodParameter> toParameters(InterfaceParam[] params){
List<RequestMethodParameter> parameters = new ArrayList<RequestMethodParameter>();
for(InterfaceParam param : params){
RequestMethodParameter bean = new RequestMethodParameter();
bean.setName(param.name());
bean.setDesc(param.desc());
if(StringUtils.startsWithIgnoreCase(param.testValue(), "#")){
String var = param.testValue();
String value = getByVariable(var.substring(var.indexOf("#")+1));
bean.setTestValue(value);
}else{
bean.setTestValue(param.testValue());
}
parameters.add(bean);
}
return parameters;
}
/**
* <p>方法描述:获取变量的值</p>
* <p>创建人: 王成委 </p>
* <p>创建时间: 2015年1月10日 上午10:50:06 </p>
* @param var
* @return
*/
private String getByVariable(String var){
Variable variable = Variable.valueOf(var);
return variable.getValue();
}