📄 defaultiofilterchain.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */package org.apache.mina.core.filterchain;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.filterchain.IoFilter.NextFilter;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.future.IoFuture;import org.apache.mina.core.session.AbstractIoSession;import org.apache.mina.core.session.AttributeKey;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import org.apache.mina.core.write.WriteRequest;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * A default implementation of {@link IoFilterChain} that provides * all operations for developers who want to implement their own * transport layer once used with {@link AbstractIoSession}. * * @author The Apache MINA Project (dev@mina.apache.org) * @version $Rev: 637741 $, $Date: 2008-03-17 07:39:20 +0100 (Mon, 17 Mar 2008) $ */public class DefaultIoFilterChain implements IoFilterChain { /** * A session attribute that stores an {@link IoFuture} related with * the {@link IoSession}. {@link DefaultIoFilterChain} clears this * attribute and notifies the future when {@link #fireSessionCreated()} * or {@link #fireExceptionCaught(Throwable)} is invoked. */ public static final AttributeKey SESSION_CREATED_FUTURE = new AttributeKey( DefaultIoFilterChain.class, "connectFuture"); /** The associated session */ private final AbstractIoSession session; private final Map<String, Entry> name2entry = new HashMap<String, Entry>(); /** The chain head */ private final EntryImpl head; /** The chain tail */ private final EntryImpl tail; /** The logger for this class */ private final Logger logger = LoggerFactory.getLogger(getClass()); /** * Create a new default chain, associated with a session. It will only contain a * HeadFilter and a TailFilter. * * @param session The session associated with the created filter chain */ public DefaultIoFilterChain(AbstractIoSession session) { if (session == null) { throw new NullPointerException("session"); } this.session = session; head = new EntryImpl(null, null, "head", new HeadFilter()); tail = new EntryImpl(head, null, "tail", new TailFilter()); head.nextEntry = tail; } public IoSession getSession() { return session; } public Entry getEntry(String name) { Entry e = name2entry.get(name); if (e == null) { return null; } return e; } public Entry getEntry(IoFilter filter) { EntryImpl e = head.nextEntry; while (e != tail) { if (e.getFilter() == filter) { return e; } e = e.nextEntry; } return null; } public Entry getEntry(Class<? extends IoFilter> filterType) { EntryImpl e = head.nextEntry; while (e != tail) { if (filterType.isAssignableFrom(e.getFilter().getClass())) { return e; } e = e.nextEntry; } return null; } public IoFilter get(String name) { Entry e = getEntry(name); if (e == null) { return null; } return e.getFilter(); } public IoFilter get(Class<? extends IoFilter> filterType) { Entry e = getEntry(filterType); if (e == null) { return null; } return e.getFilter(); } public NextFilter getNextFilter(String name) { Entry e = getEntry(name); if (e == null) { return null; } return e.getNextFilter(); } public NextFilter getNextFilter(IoFilter filter) { Entry e = getEntry(filter); if (e == null) { return null; } return e.getNextFilter(); } public NextFilter getNextFilter(Class<? extends IoFilter> filterType) { Entry e = getEntry(filterType); if (e == null) { return null; } return e.getNextFilter(); } public synchronized void addFirst(String name, IoFilter filter) { checkAddable(name); register(head, name, filter); } public synchronized void addLast(String name, IoFilter filter) { checkAddable(name); register(tail.prevEntry, name, filter); } public synchronized void addBefore(String baseName, String name, IoFilter filter) { EntryImpl baseEntry = checkOldName(baseName); checkAddable(name); register(baseEntry.prevEntry, name, filter); } public synchronized void addAfter(String baseName, String name, IoFilter filter) { EntryImpl baseEntry = checkOldName(baseName); checkAddable(name); register(baseEntry, name, filter); } public synchronized IoFilter remove(String name) { EntryImpl entry = checkOldName(name); deregister(entry); return entry.getFilter(); } public synchronized void remove(IoFilter filter) { EntryImpl e = head.nextEntry; while (e != tail) { if (e.getFilter() == filter) { deregister(e); return; } e = e.nextEntry; } throw new IllegalArgumentException("Filter not found: " + filter.getClass().getName()); } public synchronized IoFilter remove(Class<? extends IoFilter> filterType) { EntryImpl e = head.nextEntry; while (e != tail) { if (filterType.isAssignableFrom(e.getFilter().getClass())) { IoFilter oldFilter = e.getFilter(); deregister(e); return oldFilter; } e = e.nextEntry; } throw new IllegalArgumentException("Filter not found: " + filterType.getName()); } public synchronized IoFilter replace(String name, IoFilter newFilter) { EntryImpl entry = checkOldName(name); IoFilter oldFilter = entry.getFilter(); entry.setFilter(newFilter); return oldFilter; } public synchronized void replace(IoFilter oldFilter, IoFilter newFilter) { EntryImpl e = head.nextEntry; while (e != tail) { if (e.getFilter() == oldFilter) { e.setFilter(newFilter); return; } e = e.nextEntry; } throw new IllegalArgumentException("Filter not found: " + oldFilter.getClass().getName()); } public synchronized IoFilter replace( Class<? extends IoFilter> oldFilterType, IoFilter newFilter) { EntryImpl e = head.nextEntry; while (e != tail) { if (oldFilterType.isAssignableFrom(e.getFilter().getClass())) { IoFilter oldFilter = e.getFilter(); e.setFilter(newFilter); return oldFilter; } e = e.nextEntry; } throw new IllegalArgumentException("Filter not found: " + oldFilterType.getName()); } public synchronized void clear() throws Exception { Iterator<String> it = new ArrayList<String>(name2entry.keySet()) .iterator(); while (it.hasNext()) { String name = it.next(); if (contains(name)) { remove(name); } } } private void register(EntryImpl prevEntry, String name, IoFilter filter) { EntryImpl newEntry = new EntryImpl(prevEntry, prevEntry.nextEntry, name, filter); try { filter.onPreAdd(this, name, newEntry.getNextFilter()); } catch (Exception e) { throw new IoFilterLifeCycleException("onPreAdd(): " + name + ':' + filter + " in " + getSession(), e); } prevEntry.nextEntry.prevEntry = newEntry; prevEntry.nextEntry = newEntry; name2entry.put(name, newEntry); try { filter.onPostAdd(this, name, newEntry.getNextFilter()); } catch (Exception e) { deregister0(newEntry); throw new IoFilterLifeCycleException("onPostAdd(): " + name + ':' + filter + " in " + getSession(), e); } } private void deregister(EntryImpl entry) { IoFilter filter = entry.getFilter(); try { filter.onPreRemove(this, entry.getName(), entry.getNextFilter()); } catch (Exception e) { throw new IoFilterLifeCycleException("onPreRemove(): " + entry.getName() + ':' + filter + " in " + getSession(), e); } deregister0(entry); try { filter.onPostRemove(this, entry.getName(), entry.getNextFilter()); } catch (Exception e) { throw new IoFilterLifeCycleException("onPostRemove(): " + entry.getName() + ':' + filter + " in " + getSession(), e); } } private void deregister0(EntryImpl entry) { EntryImpl prevEntry = entry.prevEntry; EntryImpl nextEntry = entry.nextEntry; prevEntry.nextEntry = nextEntry; nextEntry.prevEntry = prevEntry; name2entry.remove(entry.name); } /** * Throws an exception when the specified filter name is not registered in this chain. * * @return An filter entry with the specified name. */ private EntryImpl checkOldName(String baseName) { EntryImpl e = (EntryImpl) name2entry.get(baseName); if (e == null) { throw new IllegalArgumentException("Filter not found:" + baseName); } return e; } /** * Checks the specified filter name is already taken and throws an exception if already taken. */ private void checkAddable(String name) { if (name2entry.containsKey(name)) { throw new IllegalArgumentException( "Other filter is using the same name '" + name + "'"); } } public void fireSessionCreated() { Entry head = this.head; callNextSessionCreated(head, session); } private void callNextSessionCreated(Entry entry, IoSession session) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.sessionCreated(nextFilter, session); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireSessionOpened() { Entry head = this.head; callNextSessionOpened(head, session); } private void callNextSessionOpened(Entry entry, IoSession session) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.sessionOpened(nextFilter, session); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireSessionClosed() { // Update future. try { session.getCloseFuture().setClosed(); } catch (Throwable t) { fireExceptionCaught(t); } // And start the chain. Entry head = this.head; callNextSessionClosed(head, session); } private void callNextSessionClosed(Entry entry, IoSession session) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.sessionClosed(nextFilter, session); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireSessionIdle(IdleStatus status) { session.increaseIdleCount(status, System.currentTimeMillis()); Entry head = this.head; callNextSessionIdle(head, session, status); } private void callNextSessionIdle(Entry entry, IoSession session, IdleStatus status) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.sessionIdle(nextFilter, session, status); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireMessageReceived(Object message) { if (message instanceof IoBuffer) { session.increaseReadBytes(((IoBuffer) message).remaining(), System .currentTimeMillis()); } Entry head = this.head; callNextMessageReceived(head, session, message); } private void callNextMessageReceived(Entry entry, IoSession session, Object message) { try { IoFilter filter = entry.getFilter(); NextFilter nextFilter = entry.getNextFilter(); filter.messageReceived(nextFilter, session, message); } catch (Throwable e) { fireExceptionCaught(e); } } public void fireMessageSent(WriteRequest request) { session.increaseWrittenMessages(request, System.currentTimeMillis()); try { request.getFuture().setWritten(); } catch (Throwable t) { fireExceptionCaught(t); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -