package com.alibaba.doris.dataserver.core; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; /** * RequestFilterChian的一种非线程安全的实现,<br> * RequestFilterChian必须在系统初始化过程中以线程安全的方式载入。 * * @author ajun Email:jack.yuj@alibaba-inc.com */ public class DefaultRequestFilterChian implements RequestFilterChian { public void doFilter(Request request, Response response) { Iterator<FilterEntry> itr = (Iterator<FilterEntry>) request.getFilterEntryIterator(); if (null == itr) { itr = filterChain.iterator(); request.setFilterEntryIteraor(itr); } if (itr.hasNext()) { RequestFilter filter = itr.next().filter; filter.doFilter(request, response, this); } } /** * 往FilterChain中增加一个Filter * * @param filter */ public void addFilter(RequestFilter filter) { filterChain.add(new FilterEntry(filter)); } public void addLastFilter(RequestFilter filter) { FilterEntry last = filterChain.getLast(); if (null == last || last.position != FilterEntry.EntryPosition.LAST) { filterChain.addLast(new FilterEntry(FilterEntry.EntryPosition.LAST, filter)); return; } throw new RuntimeException("The last filter already exists! Class name:" + last.getRequestFilter().getClass().getName()); } public void addFirstFilter(RequestFilter filter) { FilterEntry first = null; if (filterChain.size() > 0) { first = filterChain.getFirst(); } if (null == first || first.position != FilterEntry.EntryPosition.FIRST) { filterChain.addFirst(new FilterEntry(FilterEntry.EntryPosition.FIRST, filter)); return; } throw new RuntimeException("The first filter already exists! Class name:" + first.getRequestFilter().getClass().getName()); } public void addFilterAfter(RequestFilter currentFilter, RequestFilter filter) { ListIterator<FilterEntry> itr = filterChain.listIterator(); while (itr.hasNext()) { FilterEntry entry = itr.next(); Class<?> clazz = currentFilter.getClass(); if (clazz.getName().equals(entry.name)) { if (entry.position == FilterEntry.EntryPosition.LAST) { throw new RuntimeException("The last filter already exists! Class name:" + entry.getRequestFilter().getClass().getName()); } itr.add(new FilterEntry(filter)); return; } } throw new RuntimeException("Couldn't not find the filter in filter chain! "); } public RequestFilter getRequestFilter(String requestFilterName) { Iterator<FilterEntry> itr = filterChain.iterator(); while (itr.hasNext()) { FilterEntry entry = itr.next(); if (entry.name.equalsIgnoreCase(requestFilterName)) { return entry.filter; } } return null; } private LinkedList<FilterEntry> filterChain = new LinkedList<FilterEntry>(); }