blob: fefa995f1b6f3f575dfcbc254708f7f0e4c5e5a2 [file] [log] [blame]
/*
* 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.List;
import org.apache.mina.core.filterchain.IoFilter.NextFilter;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;
import org.apache.mina.filter.FilterEvent;
/**
* A container of {@link IoFilter}s that forwards {@link IoHandler} events
* to the consisting filters and terminal {@link IoHandler} sequentially.
* Every {@link IoSession} has its own {@link IoFilterChain} (1-to-1 relationship).
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public interface IoFilterChain {
/**
* @return the parent {@link IoSession} of this chain.
*/
IoSession getSession();
/**
* Returns the {@link Entry} with the specified <tt>name</tt> in this chain.
*
* @param name The filter's name we are looking for
* @return <tt>null</tt> if there's no such name in this chain
*/
Entry getEntry(String name);
/**
* Returns the {@link Entry} with the specified <tt>filter</tt> in this chain.
*
* @param filter The Filter we are looking for
* @return <tt>null</tt> if there's no such filter in this chain
*/
Entry getEntry(IoFilter filter);
/**
* Returns the {@link Entry} with the specified <tt>filterType</tt>
* in this chain. If there's more than one filter with the specified
* type, the first match will be chosen.
*
* @param filterType The filter class we are looking for
* @return <tt>null</tt> if there's no such name in this chain
*/
Entry getEntry(Class<? extends IoFilter> filterType);
/**
* Returns the {@link IoFilter} with the specified <tt>name</tt> in this chain.
*
* @param name the filter's name
* @return <tt>null</tt> if there's no such name in this chain
*/
IoFilter get(String name);
/**
* Returns the {@link IoFilter} with the specified <tt>filterType</tt>
* in this chain. If there's more than one filter with the specified
* type, the first match will be chosen.
*
* @param filterType The filter class
* @return <tt>null</tt> if there's no such name in this chain
*/
IoFilter get(Class<? extends IoFilter> filterType);
/**
* Returns the {@link NextFilter} of the {@link IoFilter} with the
* specified <tt>name</tt> in this chain.
*
* @param name The filter's name we want the next filter
* @return <tt>null</tt> if there's no such name in this chain
*/
NextFilter getNextFilter(String name);
/**
* Returns the {@link NextFilter} of the specified {@link IoFilter}
* in this chain.
*
* @param filter The filter for which we want the next filter
* @return <tt>null</tt> if there's no such name in this chain
*/
NextFilter getNextFilter(IoFilter filter);
/**
* Returns the {@link NextFilter} of the specified <tt>filterType</tt>
* in this chain. If there's more than one filter with the specified
* type, the first match will be chosen.
*
* @param filterType The Filter class for which we want the next filter
* @return <tt>null</tt> if there's no such name in this chain
*/
NextFilter getNextFilter(Class<? extends IoFilter> filterType);
/**
* @return The list of all {@link Entry}s this chain contains.
*/
List<Entry> getAll();
/**
* @return The reversed list of all {@link Entry}s this chain contains.
*/
List<Entry> getAllReversed();
/**
* @param name The filter's name we are looking for
*
* @return <tt>true</tt> if this chain contains an {@link IoFilter} with the
* specified <tt>name</tt>.
*/
boolean contains(String name);
/**
* @param filter The filter we are looking for
*
* @return <tt>true</tt> if this chain contains the specified <tt>filter</tt>.
*/
boolean contains(IoFilter filter);
/**
* @param filterType The filter's class we are looking for
*
* @return <tt>true</tt> if this chain contains an {@link IoFilter} of the
* specified <tt>filterType</tt>.
*/
boolean contains(Class<? extends IoFilter> filterType);
/**
* Adds the specified filter with the specified name at the beginning of this chain.
*
* @param name The filter's name
* @param filter The filter to add
*/
void addFirst(String name, IoFilter filter);
/**
* Adds the specified filter with the specified name at the end of this chain.
*
* @param name The filter's name
* @param filter The filter to add
*/
void addLast(String name, IoFilter filter);
/**
* Adds the specified filter with the specified name just before the filter whose name is
* <code>baseName</code> in this chain.
*
* @param baseName The targeted Filter's name
* @param name The filter's name
* @param filter The filter to add
*/
void addBefore(String baseName, String name, IoFilter filter);
/**
* Adds the specified filter with the specified name just after the filter whose name is
* <code>baseName</code> in this chain.
*
* @param baseName The targeted Filter's name
* @param name The filter's name
* @param filter The filter to add
*/
void addAfter(String baseName, String name, IoFilter filter);
/**
* Replace the filter with the specified name with the specified new
* filter.
*
* @param name The name of the filter we want to replace
* @param newFilter The new filter
* @return the old filter
*/
IoFilter replace(String name, IoFilter newFilter);
/**
* Replace the filter with the specified name with the specified new
* filter.
*
* @param oldFilter The filter we want to replace
* @param newFilter The new filter
*/
void replace(IoFilter oldFilter, IoFilter newFilter);
/**
* Replace the filter of the specified type with the specified new
* filter. If there's more than one filter with the specified type,
* the first match will be replaced.
*
* @param oldFilterType The filter class we want to replace
* @param newFilter The new filter
* @return The replaced IoFilter
*/
IoFilter replace(Class<? extends IoFilter> oldFilterType, IoFilter newFilter);
/**
* Removes the filter with the specified name from this chain.
*
* @param name The name of the filter to remove
* @return The removed filter
*/
IoFilter remove(String name);
/**
* Replace the filter with the specified name with the specified new filter.
*
* @param filter The filter to remove
*/
void remove(IoFilter filter);
/**
* Replace the filter of the specified type with the specified new filter.
* If there's more than one filter with the specified type, the first match
* will be replaced.
*
* @param filterType The filter class to remove
* @return The removed filter
*/
IoFilter remove(Class<? extends IoFilter> filterType);
/**
* Removes all filters added to this chain.
*
* @throws Exception If we weren't able to clear the filters
*/
void clear() throws Exception;
/**
* Fires a {@link IoHandler#sessionCreated(IoSession)} event. Most users don't need to
* call this method at all. Please use this method only when you implement a new transport
* or fire a virtual event.
*/
void fireSessionCreated();
/**
* Fires a {@link IoHandler#sessionOpened(IoSession)} event. Most users don't need to call
* this method at all. Please use this method only when you implement a new transport or
* fire a virtual event.
*/
void fireSessionOpened();
/**
* Fires a {@link IoHandler#sessionClosed(IoSession)} event. Most users don't need to call
* this method at all. Please use this method only when you implement a new transport or
* fire a virtual event.
*/
void fireSessionClosed();
/**
* Fires a {@link IoHandler#sessionIdle(IoSession, IdleStatus)} event. Most users don't
* need to call this method at all. Please use this method only when you implement a new
* transport or fire a virtual event.
*
* @param status The current status to propagate
*/
void fireSessionIdle(IdleStatus status);
/**
* Fires a {@link IoHandler#messageReceived(IoSession, Object)} event. Most
* users don't need to call this method at all. Please use this method only
* when you implement a new transport or fire a virtual event.
*
* @param message The received message
*/
void fireMessageReceived(Object message);
/**
* Fires a {@link IoHandler#messageSent(IoSession, Object)} event. Most
* users don't need to call this method at all. Please use this method only
* when you implement a new transport or fire a virtual event.
*
* @param request The sent request
*/
void fireMessageSent(WriteRequest request);
/**
* Fires a {@link IoHandler#exceptionCaught(IoSession, Throwable)} event. Most users don't
* need to call this method at all. Please use this method only when you implement a new
* transport or fire a virtual event.
*
* @param cause The exception cause
*/
void fireExceptionCaught(Throwable cause);
/**
* Fires a {@link IoHandler#inputClosed(IoSession)} event. Most users don't
* need to call this method at all. Please use this method only when you
* implement a new transport or fire a virtual event.
*/
void fireInputClosed();
/**
* Fires a {@link IoSession#write(Object)} event. Most users don't need to
* call this method at all. Please use this method only when you implement a
* new transport or fire a virtual event.
*
* @param writeRequest The message to write
*/
void fireFilterWrite(WriteRequest writeRequest);
/**
* Fires a {@link IoSession#closeNow()} or a {@link IoSession#closeOnFlush()} event. Most users don't need to call this method at
* all. Please use this method only when you implement a new transport or fire a virtual
* event.
*/
void fireFilterClose();
/**
* Fires a {@link IoHandler#event(IoSession, FilterEvent)} event. Most users don't need to call this method at
* all. Please use this method only when you implement a new transport or fire a virtual
* event.
*
* @param event The specific event being fired
*/
void fireEvent(FilterEvent event);
/**
* Represents a name-filter pair that an {@link IoFilterChain} contains.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
interface Entry {
/**
* @return the name of the filter.
*/
String getName();
/**
* @return the filter.
*/
IoFilter getFilter();
/**
* @return The {@link NextFilter} of the filter.
*/
NextFilter getNextFilter();
/**
* Adds the specified filter with the specified name just before this entry.
*
* @param name The Filter's name
* @param filter The added Filter
*/
void addBefore(String name, IoFilter filter);
/**
* Adds the specified filter with the specified name just after this entry.
*
* @param name The Filter's name
* @param filter The added Filter
*/
void addAfter(String name, IoFilter filter);
/**
* Replace the filter of this entry with the specified new filter.
*
* @param newFilter The new filter that will be put in the chain
*/
void replace(IoFilter newFilter);
/**
* Removes this entry from the chain it belongs to.
*/
void remove();
}
}