package com.github.signed.sandboxes.spring.advices;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.github.signed.sandboxes.spring.advices.configuration.AdvisedControllerApplicationConfiguration;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@SpringBootApplication
public class AdvisedControllerApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(AdvisedControllerApplicationConfiguration.class, args);
}
@Bean
public Reporter reporter() {
return new LoggingReporter();
}
@Bean
public BusinessLogic boringBusinessLogic(){
return new BoringBusinessLogic();
}
@Bean
public FilterRegistrationBean aFilter(Reporter reporter) {
FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setName("beforeAfterForwardLogging");
filter.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
filter.setFilter(new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try{
reporter.filterEnter();
filterChain.doFilter(request, response);
}finally {
reporter.filterExit();
}
}
});
return filter;
}
private static class LoggingReporter implements Reporter {
private static final Logger logger = LoggerFactory.getLogger(LoggingReporter.class);
@Override
public void filterEnter() {
logger.info("filterEnter");
}
@Override
public void filterExit() {
logger.info("filterExit");
}
@Override
public void earlierAdvise(String exceptionClassName) {
logger.info("earlierAdvice("+exceptionClassName+")");
}
@Override
public void laterAdvise(String exceptionClassName) {
logger.info("laterAdvise("+exceptionClassName+")");
}
@Override
public void aspectEnter() {
logger.info("aspectEnter");
}
@Override
public void aspectExit() {
logger.info("aspectExit");
}
@Override
public void controller() {
logger.info("controller");
}
@Override
public void webMvcConfigurationAdapter(String methodName) {
logger.info("webMvcConfigurationAdapter."+methodName);
}
}
private static class BoringBusinessLogic implements BusinessLogic {
@Override
public void executeLogic() {
}
}
}