package egovframework.api.arms;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
*
*
* ******************************************************************************
* (C) 2013 - 2019 by 313 DEV GRP, Inc - All Rights Reserved
* Unauthorized copying of this file, via any medium is strictly prohibited
* Written by 313 developer group ( 313@313.co.kr ) , December 2013
* ******************************************************************************
*
* 메인 인덱스 컨트롤러이며, IncludeInfo 커스텀 어노테이션을 Controller 어노테이션을 기반으로 수집하여 json으로 제공한다.
*
*
* @author 313 DEV GRP
*/
@Controller
public class EgovComIndexController implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
private static final Logger LOGGER = LoggerFactory.getLogger(EgovComIndexController.class);
private static Map includeInfoAnnotaion = Collections.emptyMap();
public void afterPropertiesSet() throws Exception {}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
findAnnotatedClasses("egovframework");
LOGGER.info("EgovComIndexController setApplicationContext method has called!");
}
@ResponseBody
@RequestMapping(value = "/index.do")
public ModelAndView index(ModelMap model, HttpServletRequest request) throws Exception {
ModelAndView modelview = new ModelAndView();
modelview.setViewName("index");
return modelview;
}
private ModelAndView getIndexModelAndView() {
ModelAndView modelAndView = new ModelAndView("jsonView");
modelAndView.addObject("result", includeInfoAnnotaion);
return modelAndView;
}
public void findAnnotatedClasses(String scanPackage) {
ClassPathScanningCandidateComponentProvider provider = createComponentScanner();
for (BeanDefinition beanDef : provider.findCandidateComponents(scanPackage)) {
printMetadata(beanDef);
}
}
private ClassPathScanningCandidateComponentProvider createComponentScanner() {
// Don't pull default filters (@Component, etc.):
ClassPathScanningCandidateComponentProvider provider
= new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(Controller.class));
return provider;
}
private void printMetadata(BeanDefinition beanDef) {
try {
Class> cl = Class.forName(beanDef.getBeanClassName());
Method[] methods = cl.getMethods();
System.out.println("metthod length ="+methods.length );
for(Method method : methods){
includeInfoAnnotaion.put(beanDef.getBeanClassName(), method.getName());
}
} catch (Exception e) {
System.err.println("Got exception: " + e.getMessage());
}
}
}