⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 defaultiofilterchain.java

📁 mina是以Java实现的一个开源的网络程序框架
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* *  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 + -