// 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-core/src/main/java/com/redant/core/interceptor/InterceptorProvider.java
// public class InterceptorProvider {
// 
//     private static volatile boolean loaded = false;
// 
//     private static volatile InterceptorBuilder builder = null;
// 
//     public static List<Interceptor> getInterceptors(){
//         // 优先获取用户自定义的 InterceptorBuilder 构造的 Interceptor
//         if(!loaded){
//             synchronized (InterceptorProvider.class) {
//                 if(!loaded) {
//                     Set<Class<?>> builders = ClassScaner.scanPackageBySuper(CommonConstants.INTERCEPTOR_SCAN_PACKAGE, InterceptorBuilder.class);
//                     if (CollectionUtil.isNotEmpty(builders)) {
//                         try {
//                             for (Class<?> cls : builders) {
//                                 builder = (InterceptorBuilder) cls.newInstance();
//                                 break;
//                             }
//                         } catch (IllegalAccessException | InstantiationException e) {
//                             e.printStackTrace();
//                         }
//                     }
//                     loaded = true;
//                 }
//             }
//         }
//         if(builder!=null){
//             return builder.build();
//         }
//         // 获取不到时，再扫描所有指定目录下的 Interceptor
//         return InterceptorsHolder.interceptors;
//     }
// 
//     static class InterceptorsHolder {
// 
//         static List<Interceptor> interceptors;
// 
//         static {
//             interceptors = scanInterceptors();
//         }
// 
//         private static List<Interceptor> scanInterceptors() {
//             Set<Class<?>> classSet = ClassScaner.scanPackageBySuper(CommonConstants.INTERCEPTOR_SCAN_PACKAGE,Interceptor.class);
//             if(CollectionUtil.isEmpty(classSet)){
//                 return Collections.emptyList();
//             }
//             List<InterceptorWrapper> wrappers = new ArrayList<>(classSet.size());
//             try {
//                 for (Class<?> cls : classSet) {
//                     Interceptor interceptor =(Interceptor)cls.newInstance();
//                     insertSorted(wrappers,interceptor);
//                 }
//             }catch (IllegalAccessException | InstantiationException e) {
//                 e.printStackTrace();
//             }
//             return wrappers.stream()
//                     .map(InterceptorWrapper::getInterceptor)
//                     .collect(Collectors.toList());
//         }
// 
//         private static void insertSorted(List<InterceptorWrapper> list, Interceptor interceptor) {
//             int order = resolveOrder(interceptor);
//             int idx = 0;
//             for (; idx < list.size(); idx++) {
//                 // 将当前interceptor插入到order值比他大的第一个interceptor前面
//                 if (list.get(idx).getOrder() > order) {
//                     break;
//                 }
//             }
//             list.add(idx, new InterceptorWrapper(order, interceptor));
//         }
// 
//         private static int resolveOrder(Interceptor interceptor) {
//             if (!interceptor.getClass().isAnnotationPresent(Order.class)) {
//                 return Order.LOWEST_PRECEDENCE;
//             } else {
//                 return interceptor.getClass().getAnnotation(Order.class).value();
//             }
//         }
// 
//         private static class InterceptorWrapper {
//             private final int order;
//             private final Interceptor interceptor;
// 
//             InterceptorWrapper(int order, Interceptor interceptor) {
//                 this.order = order;
//                 this.interceptor = interceptor;
//             }
// 
//             int getOrder() {
//                 return order;
//             }
// 
//             Interceptor getInterceptor() {
//                 return interceptor;
//             }
//         }
//     }
// }


import com.redant.core.interceptor.Interceptor;
import com.redant.core.interceptor.InterceptorProvider;
import java.util.List;
package com.lememo.core.interceptor;



/**
 * @author houyi
 **/
public class InterceptorProviderTest {

    public static void main(String[] args) {
        for(int i=0;i<10;i++){
            new Thread(new Run()).start();
        }
    }

    static class Run implements Runnable {
        @Override
        public void run() {
// 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-core/src/main/java/com/redant/core/interceptor/InterceptorProvider.java
// public class InterceptorProvider {
// 
//     private static volatile boolean loaded = false;
// 
//     private static volatile InterceptorBuilder builder = null;
// 
//     public static List<Interceptor> getInterceptors(){
//         // 优先获取用户自定义的 InterceptorBuilder 构造的 Interceptor
//         if(!loaded){
//             synchronized (InterceptorProvider.class) {
//                 if(!loaded) {
//                     Set<Class<?>> builders = ClassScaner.scanPackageBySuper(CommonConstants.INTERCEPTOR_SCAN_PACKAGE, InterceptorBuilder.class);
//                     if (CollectionUtil.isNotEmpty(builders)) {
//                         try {
//                             for (Class<?> cls : builders) {
//                                 builder = (InterceptorBuilder) cls.newInstance();
//                                 break;
//                             }
//                         } catch (IllegalAccessException | InstantiationException e) {
//                             e.printStackTrace();
//                         }
//                     }
//                     loaded = true;
//                 }
//             }
//         }
//         if(builder!=null){
//             return builder.build();
//         }
//         // 获取不到时，再扫描所有指定目录下的 Interceptor
//         return InterceptorsHolder.interceptors;
//     }
// 
//     static class InterceptorsHolder {
// 
//         static List<Interceptor> interceptors;
// 
//         static {
//             interceptors = scanInterceptors();
//         }
// 
//         private static List<Interceptor> scanInterceptors() {
//             Set<Class<?>> classSet = ClassScaner.scanPackageBySuper(CommonConstants.INTERCEPTOR_SCAN_PACKAGE,Interceptor.class);
//             if(CollectionUtil.isEmpty(classSet)){
//                 return Collections.emptyList();
//             }
//             List<InterceptorWrapper> wrappers = new ArrayList<>(classSet.size());
//             try {
//                 for (Class<?> cls : classSet) {
//                     Interceptor interceptor =(Interceptor)cls.newInstance();
//                     insertSorted(wrappers,interceptor);
//                 }
//             }catch (IllegalAccessException | InstantiationException e) {
//                 e.printStackTrace();
//             }
//             return wrappers.stream()
//                     .map(InterceptorWrapper::getInterceptor)
//                     .collect(Collectors.toList());
//         }
// 
//         private static void insertSorted(List<InterceptorWrapper> list, Interceptor interceptor) {
//             int order = resolveOrder(interceptor);
//             int idx = 0;
//             for (; idx < list.size(); idx++) {
//                 // 将当前interceptor插入到order值比他大的第一个interceptor前面
//                 if (list.get(idx).getOrder() > order) {
//                     break;
//                 }
//             }
//             list.add(idx, new InterceptorWrapper(order, interceptor));
//         }
// 
//         private static int resolveOrder(Interceptor interceptor) {
//             if (!interceptor.getClass().isAnnotationPresent(Order.class)) {
//                 return Order.LOWEST_PRECEDENCE;
//             } else {
//                 return interceptor.getClass().getAnnotation(Order.class).value();
//             }
//         }
// 
//         private static class InterceptorWrapper {
//             private final int order;
//             private final Interceptor interceptor;
// 
//             InterceptorWrapper(int order, Interceptor interceptor) {
//                 this.order = order;
//                 this.interceptor = interceptor;
//             }
// 
//             int getOrder() {
//                 return order;
//             }
// 
//             Interceptor getInterceptor() {
//                 return interceptor;
//             }
//         }
//     }
// }


// Path: redant-example/src/test/java/com/lememo/core/interceptor/InterceptorProviderTest.java
import com.redant.core.interceptor.Interceptor;
import com.redant.core.interceptor.InterceptorProvider;
import java.util.List;

package com.lememo.core.interceptor;



/**
 * @author houyi
 **/
public class InterceptorProviderTest {

    public static void main(String[] args) {
        for(int i=0;i<10;i++){
            new Thread(new Run()).start();
        }
    }

    static class Run implements Runnable {
        @Override
        public void run() {
            List<Interceptor> interceptors = InterceptorProvider.getInterceptors();