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

📄 iohandlerchain.java

📁 mina是以Java实现的一个开源的网络程序框架
💻 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.handler.chain;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.session.IoSession;/** * A chain of {@link IoHandlerCommand}s. * * @author The Apache MINA Project (dev@mina.apache.org) * @version $Rev: 686610 $, $Date: 2008-08-17 15:31:25 +0200 (Sun, 17 Aug 2008) $ */public class IoHandlerChain implements IoHandlerCommand {    private static volatile int nextId = 0;    private final int id = nextId++;    private final String NEXT_COMMAND = IoHandlerChain.class.getName() + '.'            + id + ".nextCommand";    private final Map<String, Entry> name2entry = new HashMap<String, Entry>();    private final Entry head;    private final Entry tail;    /**     * Creates a new, empty chain of {@link IoHandlerCommand}s.     */    public IoHandlerChain() {        head = new Entry(null, null, "head", createHeadCommand());        tail = new Entry(head, null, "tail", createTailCommand());        head.nextEntry = tail;    }    private IoHandlerCommand createHeadCommand() {        return new IoHandlerCommand() {            public void execute(NextCommand next, IoSession session,                    Object message) throws Exception {                next.execute(session, message);            }        };    }    private IoHandlerCommand createTailCommand() {        return new IoHandlerCommand() {            public void execute(NextCommand next, IoSession session,                    Object message) throws Exception {                next = (NextCommand) session.getAttribute(NEXT_COMMAND);                if (next != null) {                    next.execute(session, message);                }            }        };    }    public Entry getEntry(String name) {        Entry e = name2entry.get(name);        if (e == null) {            return null;        }        return e;    }    public IoHandlerCommand get(String name) {        Entry e = getEntry(name);        if (e == null) {            return null;        }        return e.getCommand();    }    public NextCommand getNextCommand(String name) {        Entry e = getEntry(name);        if (e == null) {            return null;        }        return e.getNextCommand();    }    public synchronized void addFirst(String name, IoHandlerCommand command) {        checkAddable(name);        register(head, name, command);    }    public synchronized void addLast(String name, IoHandlerCommand command) {        checkAddable(name);        register(tail.prevEntry, name, command);    }    public synchronized void addBefore(String baseName, String name,            IoHandlerCommand command) {        Entry baseEntry = checkOldName(baseName);        checkAddable(name);        register(baseEntry.prevEntry, name, command);    }    public synchronized void addAfter(String baseName, String name,            IoHandlerCommand command) {        Entry baseEntry = checkOldName(baseName);        checkAddable(name);        register(baseEntry, name, command);    }    public synchronized IoHandlerCommand remove(String name) {        Entry entry = checkOldName(name);        deregister(entry);        return entry.getCommand();    }    public synchronized void clear() throws Exception {        Iterator<String> it = new ArrayList<String>(name2entry.keySet())                .iterator();        while (it.hasNext()) {            this.remove(it.next());        }    }    private void register(Entry prevEntry, String name, IoHandlerCommand command) {        Entry newEntry = new Entry(prevEntry, prevEntry.nextEntry, name,                command);        prevEntry.nextEntry.prevEntry = newEntry;        prevEntry.nextEntry = newEntry;        name2entry.put(name, newEntry);    }    private void deregister(Entry entry) {        Entry prevEntry = entry.prevEntry;        Entry 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 Entry checkOldName(String baseName) {        Entry e = name2entry.get(baseName);        if (e == null) {            throw new IllegalArgumentException("Unknown filter name:"                    + 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 execute(NextCommand next, IoSession session, Object message)            throws Exception {        if (next != null) {            session.setAttribute(NEXT_COMMAND, next);        }        try {            callNextCommand(head, session, message);        } finally {            session.removeAttribute(NEXT_COMMAND);        }    }    private void callNextCommand(Entry entry, IoSession session, Object message)            throws Exception {        entry.getCommand().execute(entry.getNextCommand(), session, message);    }    public List<Entry> getAll() {        List<Entry> list = new ArrayList<Entry>();        Entry e = head.nextEntry;        while (e != tail) {            list.add(e);            e = e.nextEntry;        }        return list;    }    public List<Entry> getAllReversed() {        List<Entry> list = new ArrayList<Entry>();        Entry 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(IoHandlerCommand command) {        Entry e = head.nextEntry;        while (e != tail) {            if (e.getCommand() == command) {                return true;            }            e = e.nextEntry;        }        return false;    }    public boolean contains(Class<? extends IoHandlerCommand> commandType) {        Entry e = head.nextEntry;        while (e != tail) {            if (commandType.isAssignableFrom(e.getCommand().getClass())) {                return true;            }            e = e.nextEntry;        }        return false;    }    @Override    public String toString() {        StringBuilder buf = new StringBuilder();        buf.append("{ ");        boolean empty = true;        Entry e = head.nextEntry;        while (e != tail) {            if (!empty) {                buf.append(", ");            } else {                empty = false;            }            buf.append('(');            buf.append(e.getName());            buf.append(':');            buf.append(e.getCommand());            buf.append(')');            e = e.nextEntry;        }        if (empty) {            buf.append("empty");        }        buf.append(" }");        return buf.toString();    }    /**     * Represents a name-command pair that an {@link IoHandlerChain} contains.     *     * @author The Apache MINA Project (dev@mina.apache.org)     * @version $Rev: 686610 $, $Date: 2008-08-17 15:31:25 +0200 (Sun, 17 Aug 2008) $     */    public class Entry {        private Entry prevEntry;        private Entry nextEntry;        private final String name;        private final IoHandlerCommand command;        private final NextCommand nextCommand;        private Entry(Entry prevEntry, Entry nextEntry, String name,                IoHandlerCommand command) {            if (command == null) {                throw new NullPointerException("command");            }            if (name == null) {                throw new NullPointerException("name");            }            this.prevEntry = prevEntry;            this.nextEntry = nextEntry;            this.name = name;            this.command = command;            this.nextCommand = new NextCommand() {                public void execute(IoSession session, Object message)                        throws Exception {                    Entry nextEntry = Entry.this.nextEntry;                    callNextCommand(nextEntry, session, message);                }            };        }        /**         * Returns the name of the command.         */        public String getName() {            return name;        }        /**         * Returns the command.         */        public IoHandlerCommand getCommand() {            return command;        }        /**         * Returns the {@link IoHandlerCommand.NextCommand} of the command.         */        public NextCommand getNextCommand() {            return nextCommand;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -