📄 defaultiofilterchainbuilder.java
字号:
return e.getFilter(); } } throw new IllegalArgumentException("Filter not found: " + filterType.getName()); } public synchronized IoFilter replace(String name, IoFilter newFilter) { checkBaseName(name); EntryImpl e = (EntryImpl) get(name); IoFilter oldFilter = e.getFilter(); e.setFilter(newFilter); return oldFilter; } public synchronized void replace(IoFilter oldFilter, IoFilter newFilter) { for (Entry e : entries) { if (e.getFilter() == oldFilter) { ((EntryImpl) e).setFilter(newFilter); return; } } throw new IllegalArgumentException("Filter not found: " + oldFilter.getClass().getName()); } public synchronized void replace(Class<? extends IoFilter> oldFilterType, IoFilter newFilter) { for (Entry e : entries) { if (oldFilterType.isAssignableFrom(e.getFilter().getClass())) { ((EntryImpl) e).setFilter(newFilter); return; } } throw new IllegalArgumentException("Filter not found: " + oldFilterType.getName()); } /** * @see IoFilterChain#clear() */ public synchronized void clear() { entries.clear(); } /** * Clears the current list of filters and adds the specified * filter mapping to this builder. Please note that you must specify * a {@link Map} implementation that iterates the filter mapping in the * order of insertion such as {@link LinkedHashMap}. Otherwise, it will * throw an {@link IllegalArgumentException}. */ public void setFilters(Map<String, ? extends IoFilter> filters) { if (filters == null) { throw new NullPointerException("filters"); } if (!isOrderedMap(filters)) { throw new IllegalArgumentException( "filters is not an ordered map. Please try " + LinkedHashMap.class.getName() + "."); } filters = new LinkedHashMap<String, IoFilter>(filters); for (Map.Entry<String, ? extends IoFilter> e: filters.entrySet()) { if (e.getKey() == null) { throw new NullPointerException("filters contains a null key."); } if (e.getValue() == null) { throw new NullPointerException("filters contains a null value."); } } synchronized (this) { clear(); for (Map.Entry<String, ? extends IoFilter> e: filters.entrySet()) { addLast(e.getKey(), e.getValue()); } } } @SuppressWarnings("unchecked") private boolean isOrderedMap(Map map) { Class<?> mapType = map.getClass(); if (LinkedHashMap.class.isAssignableFrom(mapType)) { if (logger.isDebugEnabled()) { logger.debug(mapType.getSimpleName() + " is an ordered map."); } return true; } if (logger.isDebugEnabled()) { logger.debug(mapType.getName() + " is not a " + LinkedHashMap.class.getSimpleName()); } // Detect Jakarta Commons Collections OrderedMap implementations. Class<?> type = mapType; while (type != null) { for (Class<?> i: type.getInterfaces()) { if (i.getName().endsWith("OrderedMap")) { if (logger.isDebugEnabled()) { logger.debug( mapType.getSimpleName() + " is an ordered map (guessed from that it " + " implements OrderedMap interface.)"); } return true; } } type = type.getSuperclass(); } if (logger.isDebugEnabled()) { logger.debug( mapType.getName() + " doesn't implement OrderedMap interface."); } // Last resort: try to create a new instance and test if it maintains // the insertion order. logger.debug( "Last resort; trying to create a new map instance with a " + "default constructor and test if insertion order is " + "maintained."); Map newMap; try { newMap = (Map) mapType.newInstance(); } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug( "Failed to create a new map instance of '" + mapType.getName() +"'.", e); } return false; } Random rand = new Random(); List<String> expectedNames = new ArrayList<String>(); IoFilter dummyFilter = new IoFilterAdapter(); for (int i = 0; i < 65536; i ++) { String filterName; do { filterName = String.valueOf(rand.nextInt()); } while (newMap.containsKey(filterName)); newMap.put(filterName, dummyFilter); expectedNames.add(filterName); Iterator<String> it = expectedNames.iterator(); for (Object key: newMap.keySet()) { if (!it.next().equals(key)) { if (logger.isDebugEnabled()) { logger.debug( "The specified map didn't pass the insertion " + "order test after " + (i + 1) + " tries."); } return false; } } } if (logger.isDebugEnabled()) { logger.debug( "The specified map passed the insertion order test."); } return true; } public void buildFilterChain(IoFilterChain chain) throws Exception { for (Entry e : entries) { chain.addLast(e.getName(), e.getFilter()); } } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("{ "); boolean empty = true; for (Entry e : entries) { if (!empty) { buf.append(", "); } else { empty = false; } buf.append('('); buf.append(e.getName()); buf.append(':'); buf.append(e.getFilter()); buf.append(')'); } if (empty) { buf.append("empty"); } buf.append(" }"); return buf.toString(); } private void checkBaseName(String baseName) { if (baseName == null) { throw new NullPointerException("baseName"); } if (!contains(baseName)) { throw new IllegalArgumentException("Unknown filter name: " + baseName); } } private void register(int index, Entry e) { if (contains(e.getName())) { throw new IllegalArgumentException( "Other filter is using the same name: " + e.getName()); } entries.add(index, e); } private class EntryImpl implements Entry { private final String name; private volatile IoFilter filter; private EntryImpl(String name, IoFilter filter) { if (name == null) { throw new NullPointerException("name"); } if (filter == null) { throw new NullPointerException("filter"); } this.name = name; this.filter = filter; } public String getName() { return name; } public IoFilter getFilter() { return filter; } private void setFilter(IoFilter filter) { this.filter = filter; } public NextFilter getNextFilter() { throw new IllegalStateException(); } @Override public String toString() { return "(" + getName() + ':' + filter + ')'; } public void addAfter(String name, IoFilter filter) { DefaultIoFilterChainBuilder.this.addAfter(getName(), name, filter); } public void addBefore(String name, IoFilter filter) { DefaultIoFilterChainBuilder.this.addBefore(getName(), name, filter); } public void remove() { DefaultIoFilterChainBuilder.this.remove(getName()); } public void replace(IoFilter newFilter) { DefaultIoFilterChainBuilder.this.replace(getName(), newFilter); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -