// Path: redant-core/src/main/java/com/redant/core/context/RedantContext.java
// public class RedantContext {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(RedantContext.class);
// 
//     /**
//      * 使用FastThreadLocal替代JDK自带的ThreadLocal以提升并发性能
//      */
//     private static final FastThreadLocal<RedantContext> CONTEXT_HOLDER = new FastThreadLocal<>();
// 
//     private HttpRequest request;
// 
//     private ChannelHandlerContext context;
// 
//     private HttpResponse response;
// 
//     private Set<Cookie> cookies;
// 
//     private RedantContext(){
// 
//     }
// 
//     public RedantContext setRequest(HttpRequest request){
//         this.request = request;
//         return this;
//     }
// 
//     public RedantContext setContext(ChannelHandlerContext context){
//         this.context = context;
//         return this;
//     }
// 
//     public RedantContext setResponse(HttpResponse response){
//         this.response = response;
//         return this;
//     }
// 
//     public RedantContext addCookie(Cookie cookie){
//         if(cookie!=null){
//             if(CollectionUtil.isEmpty(cookies)){
//                 cookies = new HashSet<>();
//             }
//             cookies.add(cookie);
//         }
//         return this;
//     }
// 
//     public RedantContext addCookies(Set<Cookie> cookieSet){
//         if(CollectionUtil.isNotEmpty(cookieSet)){
//             if(CollectionUtil.isEmpty(cookies)){
//                 cookies = new HashSet<>();
//             }
//             cookies.addAll(cookieSet);
//         }
//         return this;
//     }
// 
//     public HttpRequest getRequest() {
//         return request;
//     }
// 
//     public ChannelHandlerContext getContext() {
//         return context;
//     }
// 
//     public HttpResponse getResponse() {
//         return response;
//     }
// 
//     public Set<Cookie> getCookies() {
//         return cookies;
//     }
// 
//     public static RedantContext currentContext(){
//         RedantContext context = CONTEXT_HOLDER.get();
//         if(context==null){
//             context = new RedantContext();
//             CONTEXT_HOLDER.set(context);
//         }
//         return context;
//     }
// 
//     public static void clear(){
//         CONTEXT_HOLDER.remove();
//     }
// 
// 
// }
// 
// Path: redant-core/src/main/java/com/redant/core/interceptor/Interceptor.java
// public abstract class Interceptor {
// 
//     /**
//      * 拦截器的前置处理方法
//      */
//     public boolean preHandle(Map<String, List<String>> paramMap){
//         return true;
//     }
// 
//     /**
//      * 拦截器的后置处理方法
//      */
//     public abstract void postHandle(Map<String, List<String>> paramMap);
// 
// }


import com.redant.core.anno.Order;
import com.redant.core.context.RedantContext;
import com.redant.core.interceptor.Interceptor;
import io.netty.handler.codec.http.HttpRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
package com.redant.example.interceptor;



/**
 * 该拦截器可以计算出用户自定义 Controller 方法的执行时间
 * @author houyi
 **/
@Order(value = 2)
public class PerformanceInterceptor extends Interceptor {

    private static final Logger LOGGER = LoggerFactory.getLogger(PerformanceInterceptor.class);

    private ThreadLocal<Long> start = new ThreadLocal<>();

    @Override
    public boolean preHandle(Map<String, List<String>> paramMap) {
        start.set(System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(Map<String, List<String>> paramMap) {
        try {
            long end = System.currentTimeMillis();
            long cost = end - start.get();
// Path: redant-core/src/main/java/com/redant/core/context/RedantContext.java
// public class RedantContext {
// 
//     private static final Logger LOGGER = LoggerFactory.getLogger(RedantContext.class);
// 
//     /**
//      * 使用FastThreadLocal替代JDK自带的ThreadLocal以提升并发性能
//      */
//     private static final FastThreadLocal<RedantContext> CONTEXT_HOLDER = new FastThreadLocal<>();
// 
//     private HttpRequest request;
// 
//     private ChannelHandlerContext context;
// 
//     private HttpResponse response;
// 
//     private Set<Cookie> cookies;
// 
//     private RedantContext(){
// 
//     }
// 
//     public RedantContext setRequest(HttpRequest request){
//         this.request = request;
//         return this;
//     }
// 
//     public RedantContext setContext(ChannelHandlerContext context){
//         this.context = context;
//         return this;
//     }
// 
//     public RedantContext setResponse(HttpResponse response){
//         this.response = response;
//         return this;
//     }
// 
//     public RedantContext addCookie(Cookie cookie){
//         if(cookie!=null){
//             if(CollectionUtil.isEmpty(cookies)){
//                 cookies = new HashSet<>();
//             }
//             cookies.add(cookie);
//         }
//         return this;
//     }
// 
//     public RedantContext addCookies(Set<Cookie> cookieSet){
//         if(CollectionUtil.isNotEmpty(cookieSet)){
//             if(CollectionUtil.isEmpty(cookies)){
//                 cookies = new HashSet<>();
//             }
//             cookies.addAll(cookieSet);
//         }
//         return this;
//     }
// 
//     public HttpRequest getRequest() {
//         return request;
//     }
// 
//     public ChannelHandlerContext getContext() {
//         return context;
//     }
// 
//     public HttpResponse getResponse() {
//         return response;
//     }
// 
//     public Set<Cookie> getCookies() {
//         return cookies;
//     }
// 
//     public static RedantContext currentContext(){
//         RedantContext context = CONTEXT_HOLDER.get();
//         if(context==null){
//             context = new RedantContext();
//             CONTEXT_HOLDER.set(context);
//         }
//         return context;
//     }
// 
//     public static void clear(){
//         CONTEXT_HOLDER.remove();
//     }
// 
// 
// }
// 
// Path: redant-core/src/main/java/com/redant/core/interceptor/Interceptor.java
// public abstract class Interceptor {
// 
//     /**
//      * 拦截器的前置处理方法
//      */
//     public boolean preHandle(Map<String, List<String>> paramMap){
//         return true;
//     }
// 
//     /**
//      * 拦截器的后置处理方法
//      */
//     public abstract void postHandle(Map<String, List<String>> paramMap);
// 
// }


// Path: redant-example/src/main/java/com/redant/example/interceptor/PerformanceInterceptor.java
import com.redant.core.anno.Order;
import com.redant.core.context.RedantContext;
import com.redant.core.interceptor.Interceptor;
import io.netty.handler.codec.http.HttpRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;

package com.redant.example.interceptor;



/**
 * 该拦截器可以计算出用户自定义 Controller 方法的执行时间
 * @author houyi
 **/
@Order(value = 2)
public class PerformanceInterceptor extends Interceptor {

    private static final Logger LOGGER = LoggerFactory.getLogger(PerformanceInterceptor.class);

    private ThreadLocal<Long> start = new ThreadLocal<>();

    @Override
    public boolean preHandle(Map<String, List<String>> paramMap) {
        start.set(System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(Map<String, List<String>> paramMap) {
        try {
            long end = System.currentTimeMillis();
            long cost = end - start.get();
            HttpRequest request = RedantContext.currentContext().getRequest();