📄 defaultiofilterchain.java
字号:
Entry head = this.head; callNextMessageSent(head, session, request); } private void callNextMessageSent(Entry entry, IoSession session, WriteRequest writeRequest) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.messageSent(nextFilter, session, writeRequest); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireExceptionCaught(Throwable cause) { Entry head = this.head; callNextExceptionCaught(head, session, cause); } private void callNextExceptionCaught(Entry entry, IoSession session, Throwable cause) { // Notify the related future. ConnectFuture future = (ConnectFuture) session .removeAttribute(SESSION_CREATED_FUTURE); if (future == null) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.exceptionCaught(nextFilter, session, cause); } catch (Throwable e) { logger .warn( "Unexpected exception from exceptionCaught handler.", e); } } else { // Please note that this place is not the only place that // calls ConnectFuture.setException(). session.close(true); future.setException(cause); } } public void fireFilterWrite(WriteRequest writeRequest) { Entry tail = this.tail; callPreviousFilterWrite(tail, session, writeRequest); } private void callPreviousFilterWrite(Entry entry, IoSession session, WriteRequest writeRequest) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.filterWrite(nextFilter, session, writeRequest); } catch (Throwable e) { writeRequest.getFuture().setException(e); fireExceptionCaught(e); } } public void fireFilterClose() { Entry tail = this.tail; callPreviousFilterClose(tail, session); } private void callPreviousFilterClose(Entry entry, IoSession session) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.filterClose(nextFilter, session); } catch (Throwable e) { fireExceptionCaught(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) { return getEntry(filter) != null; } public boolean contains(Class<? extends IoFilter> filterType) { return getEntry(filterType) != null; } @Override public String toString() { StringBuilder buf = new StringBuilder(); 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(); } @Override protected void finalize() throws Throwable { try { this.clear(); } finally { super.finalize(); } } private class HeadFilter extends IoFilterAdapter { @SuppressWarnings("unchecked") @Override public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { AbstractIoSession s = (AbstractIoSession) session; // Maintain counters. if (writeRequest.getMessage() instanceof IoBuffer) { IoBuffer buffer = (IoBuffer) writeRequest.getMessage(); // I/O processor implementation will call buffer.reset() // it after the write operation is finished, because // the buffer will be specified with messageSent event. buffer.mark(); int remaining = buffer.remaining(); if (remaining == 0) { // Zero-sized buffer means the internal message // delimiter. s.increaseScheduledWriteMessages(); } else { s.increaseScheduledWriteBytes(remaining); } } else { s.increaseScheduledWriteMessages(); } s.getWriteRequestQueue().offer(s, writeRequest); if (!s.isWriteSuspended()) { s.getProcessor().flush(s); } } @SuppressWarnings("unchecked") @Override public void filterClose(NextFilter nextFilter, IoSession session) throws Exception { ((AbstractIoSession) session).getProcessor().remove(((AbstractIoSession) session)); } } private static class TailFilter extends IoFilterAdapter { @Override public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception { try { session.getHandler().sessionCreated(session); } finally { // Notify the related future. ConnectFuture future = (ConnectFuture) session .removeAttribute(SESSION_CREATED_FUTURE); if (future != null) { future.setSession(session); } } } @Override public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { session.getHandler().sessionOpened(session); } @Override public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception { AbstractIoSession s = (AbstractIoSession) session; try { s.getHandler().sessionClosed(session); } finally { try { s.getWriteRequestQueue().dispose(session); } finally { try { s.getAttributeMap().dispose(session); } finally { try { // Remove all filters. session.getFilterChain().clear(); } finally { if (s.getConfig().isUseReadOperation()) { s.offerClosedReadFuture(); } } } } } } @Override public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception { session.getHandler().sessionIdle(session, status); } @Override public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception { AbstractIoSession s = (AbstractIoSession) session; try { s.getHandler().exceptionCaught(s, cause); } finally { if (s.getConfig().isUseReadOperation()) { s.offerFailedReadFuture(cause); } } } @Override public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception { AbstractIoSession s = (AbstractIoSession) session; if (!(message instanceof IoBuffer)) { s.increaseReadMessages(System.currentTimeMillis()); } else if (!((IoBuffer) message).hasRemaining()) { s.increaseReadMessages(System.currentTimeMillis()); } try { session.getHandler().messageReceived(s, message); } finally { if (s.getConfig().isUseReadOperation()) { s.offerReadFuture(message); } } } @Override public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { session.getHandler() .messageSent(session, writeRequest.getMessage()); } @Override public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception { nextFilter.filterWrite(session, writeRequest); } @Override 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 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, WriteRequest writeRequest) { Entry nextEntry = EntryImpl.this.nextEntry; callNextMessageSent(nextEntry, session, writeRequest); } 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 toString() { return EntryImpl.this.nextEntry.name; } }; } public String getName() { return name; } public IoFilter getFilter() { return filter; } private void setFilter(IoFilter filter) { if (filter == null) { throw new NullPointerException("filter"); } this.filter = filter; } public NextFilter getNextFilter() { return nextFilter; } @Override public String toString() { StringBuilder sb = new StringBuilder(); // Add the current filter sb.append("('").append(getName()).append('\''); // Add the previous filter sb.append(", prev: '"); if (prevEntry != null) { sb.append(prevEntry.name); sb.append(':'); sb.append(prevEntry.getFilter().getClass().getSimpleName()); } else { sb.append("null"); } // Add the next filter sb.append("', next: '"); if (nextEntry != null) { sb.append(nextEntry.name); sb.append(':'); sb.append(nextEntry.getFilter().getClass().getSimpleName()); } else { sb.append("null"); } sb.append("')"); return sb.toString(); } public void addAfter(String name, IoFilter filter) { DefaultIoFilterChain.this.addAfter(getName(), name, filter); } public void addBefore(String name, IoFilter filter) { DefaultIoFilterChain.this.addBefore(getName(), name, filter); } public void remove() { DefaultIoFilterChain.this.remove(getName()); } public void replace(IoFilter newFilter) { DefaultIoFilterChain.this.replace(getName(), newFilter); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -