📄 abstractiofilterchain.java
字号:
try { entry.getFilter().exceptionCaught(entry.getNextFilter(), session, cause); } catch (Throwable e) { SessionLog.warn(session, "Unexpected exception from exceptionCaught handler.", e); } } public void fireFilterWrite(IoSession session, WriteRequest writeRequest) { Entry tail = this.tail; callPreviousFilterWrite(tail, session, writeRequest); } private void callPreviousFilterWrite(Entry entry, IoSession session, WriteRequest writeRequest) { try { entry.getFilter().filterWrite(entry.getNextFilter(), session, writeRequest); } catch (Throwable e) { fireExceptionCaught(session, e); } } public void fireFilterClose(IoSession session) { Entry tail = this.tail; callPreviousFilterClose(tail, session); } private void callPreviousFilterClose(Entry entry, IoSession session) { try { entry.getFilter().filterClose(entry.getNextFilter(), session); } catch (Throwable e) { fireExceptionCaught(session, e); } } public List<Entry> getAll() { List<Entry> list = new ArrayList<Entry>(); EntryImpl e = head.nextEntry; while (e != tail) { list.add(e); e = e.nextEntry; } return list; } public List<Entry> getAllReversed() { List<Entry> list = new ArrayList<Entry>(); EntryImpl e = tail.prevEntry; while (e != head) { list.add(e); e = e.prevEntry; } return list; } public boolean contains(String name) { return getEntry(name) != null; } public boolean contains(IoFilter filter) { EntryImpl e = head.nextEntry; while (e != tail) { if (e.getFilter() == filter) { return true; } e = e.nextEntry; } return false; } public boolean contains(Class<? extends IoFilter> filterType) { EntryImpl e = head.nextEntry; while (e != tail) { if (filterType.isAssignableFrom(e.getFilter().getClass())) { return true; } e = e.nextEntry; } return false; } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("{ "); boolean empty = true; EntryImpl e = head.nextEntry; while (e != tail) { if (!empty) { buf.append(", "); } else { empty = false; } buf.append('('); buf.append(e.getName()); buf.append(':'); buf.append(e.getFilter()); buf.append(')'); e = e.nextEntry; } if (empty) { buf.append("empty"); } buf.append(" }"); return buf.toString(); } protected void finalize() throws Throwable { try { this.clear(); } finally { super.finalize(); } } protected abstract void doWrite(IoSession session, WriteRequest writeRequest) throws Exception; protected abstract void doClose(IoSession session) throws Exception; private class HeadFilter extends IoFilterAdapter { public void sessionCreated(NextFilter nextFilter, IoSession session) { nextFilter.sessionCreated(session); } public void sessionOpened(NextFilter nextFilter, IoSession session) { nextFilter.sessionOpened(session); } public void sessionClosed(NextFilter nextFilter, IoSession session) { nextFilter.sessionClosed(session); } public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) { nextFilter.sessionIdle(session, status); } public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) { nextFilter.exceptionCaught(session, cause); } public void messageReceived(NextFilter nextFilter, IoSession session, Object message) { nextFilter.messageReceived(session, message); } public void messageSent(NextFilter nextFilter, IoSession session, Object message) { nextFilter.messageSent(session, message); } public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { if (session.getTransportType().getEnvelopeType().isAssignableFrom( writeRequest.getMessage().getClass())) { doWrite(session, writeRequest); } else { throw new IllegalStateException( "Write requests must be transformed to " + session.getTransportType().getEnvelopeType() + ": " + writeRequest); } } public void filterClose(NextFilter nextFilter, IoSession session) throws Exception { doClose(session); } } private static class TailFilter extends IoFilterAdapter { public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception { session.getHandler().sessionCreated(session); } public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { try { session.getHandler().sessionOpened(session); } finally { // Notify the related ConnectFuture // if the session is created from SocketConnector. ConnectFuture future = (ConnectFuture) session .removeAttribute(CONNECT_FUTURE); if (future != null) { future.setSession(session); } } } public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception { try { session.getHandler().sessionClosed(session); } finally { // Remove all filters. session.getFilterChain().clear(); } } public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception { session.getHandler().sessionIdle(session, status); } public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception { session.getHandler().exceptionCaught(session, cause); } public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { try { session.getHandler().messageReceived(session, message); } finally { ByteBufferUtil.releaseIfPossible(message); } } public void messageSent(NextFilter nextFilter, IoSession session, Object message) throws Exception { try { session.getHandler().messageSent(session, message); } finally { ByteBufferUtil.releaseIfPossible(message); } } public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { nextFilter.filterWrite(session, writeRequest); } public void filterClose(NextFilter nextFilter, IoSession session) throws Exception { nextFilter.filterClose(session); } } private class EntryImpl implements Entry { private EntryImpl prevEntry; private EntryImpl nextEntry; private final String name; private final IoFilter filter; private final NextFilter nextFilter; private EntryImpl(EntryImpl prevEntry, EntryImpl nextEntry, String name, IoFilter filter) { if (filter == null) { throw new NullPointerException("filter"); } if (name == null) { throw new NullPointerException("name"); } this.prevEntry = prevEntry; this.nextEntry = nextEntry; this.name = name; this.filter = filter; this.nextFilter = new NextFilter() { public void sessionCreated(IoSession session) { Entry nextEntry = EntryImpl.this.nextEntry; callNextSessionCreated(nextEntry, session); } public void sessionOpened(IoSession session) { Entry nextEntry = EntryImpl.this.nextEntry; callNextSessionOpened(nextEntry, session); } public void sessionClosed(IoSession session) { Entry nextEntry = EntryImpl.this.nextEntry; callNextSessionClosed(nextEntry, session); } public void sessionIdle(IoSession session, IdleStatus status) { Entry nextEntry = EntryImpl.this.nextEntry; callNextSessionIdle(nextEntry, session, status); } public void exceptionCaught(IoSession session, Throwable cause) { Entry nextEntry = EntryImpl.this.nextEntry; callNextExceptionCaught(nextEntry, session, cause); } public void messageReceived(IoSession session, Object message) { Entry nextEntry = EntryImpl.this.nextEntry; callNextMessageReceived(nextEntry, session, message); } public void messageSent(IoSession session, Object message) { Entry nextEntry = EntryImpl.this.nextEntry; callNextMessageSent(nextEntry, session, message); } public void filterWrite(IoSession session, WriteRequest writeRequest) { Entry nextEntry = EntryImpl.this.prevEntry; callPreviousFilterWrite(nextEntry, session, writeRequest); } public void filterClose(IoSession session) { Entry nextEntry = EntryImpl.this.prevEntry; callPreviousFilterClose(nextEntry, session); } }; } public String getName() { return name; } public IoFilter getFilter() { return filter; } public NextFilter getNextFilter() { return nextFilter; } public String toString() { return "(" + getName() + ':' + filter + ')'; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -