@Override
 public final void initIndexes(FilterChainContext context) {
   final int startIdx = defaultStartIdx(context);
   context.setStartIdx(startIdx);
   context.setFilterIdx(startIdx);
   context.setEndIdx(defaultEndIdx(context));
 }
    @Override
    public final int defaultStartIdx(FilterChainContext context) {
      if (context.getFilterIdx() != FilterChainContext.NO_FILTER_INDEX) {
        return context.getFilterIdx();
      }

      context.setFilterIdx(0);
      return 0;
    }
    @Override
    public final int defaultStartIdx(FilterChainContext context) {
      if (context.getFilterIdx() != FilterChainContext.NO_FILTER_INDEX) {
        return context.getFilterIdx();
      }

      final int idx = context.getFilterChain().size() - 1;
      context.setFilterIdx(idx);
      return idx;
    }
 public static FilterExecutor resolve(final FilterChainContext context) {
   switch (context.getOperation()) {
     case READ:
       return READ_EXECUTOR;
     case WRITE:
       return WRITE_EXECUTOR;
     case ACCEPT:
       return ACCEPT_EXECUTOR;
     case CLOSE:
       return CLOSE_EXECUTOR;
     case CONNECT:
       return CONNECT_EXECUTOR;
     case EVENT:
       return (context.getFilterIdx() == FilterChainContext.NO_FILTER_INDEX
               || context.getStartIdx() <= context.getEndIdx())
           ? EVENT_UPSTREAM_EXECUTOR
           : EVENT_DOWNSTREAM_EXECUTOR;
     default:
       return null;
   }
 }
 @Override
 public final boolean hasPreviousFilter(FilterChainContext context, int idx) {
   return idx < context.getFilterChain().size() - 1;
 }
 @Override
 public final int getPreviousFilter(FilterChainContext context) {
   return context.getFilterIdx() + 1;
 }
 @Override
 public final int getNextFilter(FilterChainContext context) {
   return context.getFilterIdx() - 1;
 }
 @Override
 public final int defaultEndIdx(FilterChainContext context) {
   return context.getFilterChain().size();
 }