1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 * 19 */ 20 package org.apache.mina.core.filterchain; 21 22 import java.util.List; 23 24 import org.apache.mina.core.filterchain.IoFilter.NextFilter; 25 import org.apache.mina.core.service.IoHandler; 26 import org.apache.mina.core.session.IdleStatus; 27 import org.apache.mina.core.session.IoSession; 28 import org.apache.mina.core.write.WriteRequest; 29 30 /** 31 * A container of {@link IoFilter}s that forwards {@link IoHandler} events 32 * to the consisting filters and terminal {@link IoHandler} sequentially. 33 * Every {@link IoSession} has its own {@link IoFilterChain} (1-to-1 relationship). 34 * 35 * @author The Apache MINA Project (dev@mina.apache.org) 36 */ 37 public interface IoFilterChain { 38 /** 39 * Returns the parent {@link IoSession} of this chain. 40 * @return {@link IoSession} 41 */ 42 IoSession getSession(); 43 44 /** 45 * Returns the {@link Entry} with the specified <tt>name</tt> in this chain. 46 * @return <tt>null</tt> if there's no such name in this chain 47 */ 48 Entry getEntry(String name); 49 50 /** 51 * Returns the {@link Entry} with the specified <tt>filter</tt> in this chain. 52 * @return <tt>null</tt> if there's no such filter in this chain 53 */ 54 Entry getEntry(IoFilter filter); 55 56 /** 57 * Returns the {@link Entry} with the specified <tt>filterType</tt> 58 * in this chain. If there's more than one filter with the specified 59 * type, the first match will be chosen. 60 * @return <tt>null</tt> if there's no such name in this chain 61 */ 62 Entry getEntry(Class<? extends IoFilter> filterType); 63 64 /** 65 * Returns the {@link IoFilter} with the specified <tt>name</tt> in this chain. 66 * @return <tt>null</tt> if there's no such name in this chain 67 */ 68 IoFilter get(String name); 69 70 /** 71 * Returns the {@link IoFilter} with the specified <tt>filterType</tt> 72 * in this chain. If there's more than one filter with the specified 73 * type, the first match will be chosen. 74 * @return <tt>null</tt> if there's no such name in this chain 75 */ 76 IoFilter get(Class<? extends IoFilter> filterType); 77 78 /** 79 * Returns the {@link NextFilter} of the {@link IoFilter} with the 80 * specified <tt>name</tt> in this chain. 81 * @return <tt>null</tt> if there's no such name in this chain 82 */ 83 NextFilter getNextFilter(String name); 84 85 /** 86 * Returns the {@link NextFilter} of the specified {@link IoFilter} 87 * in this chain. 88 * @return <tt>null</tt> if there's no such name in this chain 89 */ 90 NextFilter getNextFilter(IoFilter filter); 91 92 /** 93 * Returns the {@link NextFilter} of the specified <tt>filterType</tt> 94 * in this chain. If there's more than one filter with the specified 95 * type, the first match will be chosen. 96 * @return <tt>null</tt> if there's no such name in this chain 97 */ 98 NextFilter getNextFilter(Class<? extends IoFilter> filterType); 99 100 /** 101 * Returns the list of all {@link Entry}s this chain contains. 102 */ 103 List<Entry> getAll(); 104 105 /** 106 * Returns the reversed list of all {@link Entry}s this chain contains. 107 */ 108 List<Entry> getAllReversed(); 109 110 /** 111 * Returns <tt>true</tt> if this chain contains an {@link IoFilter} with the 112 * specified <tt>name</tt>. 113 */ 114 boolean contains(String name); 115 116 /** 117 * Returns <tt>true</tt> if this chain contains the specified <tt>filter</tt>. 118 */ 119 boolean contains(IoFilter filter); 120 121 /** 122 * Returns <tt>true</tt> if this chain contains an {@link IoFilter} of the 123 * specified <tt>filterType</tt>. 124 */ 125 boolean contains(Class<? extends IoFilter> filterType); 126 127 /** 128 * Adds the specified filter with the specified name at the beginning of this chain. 129 * @throws IoFilterLifeCycleException 130 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 131 * {@link IoFilter#init()} throws an exception. 132 */ 133 void addFirst(String name, IoFilter filter); 134 135 /** 136 * Adds the specified filter with the specified name at the end of this chain. 137 * @throws IoFilterLifeCycleException 138 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 139 * {@link IoFilter#init()} throws an exception. 140 */ 141 void addLast(String name, IoFilter filter); 142 143 /** 144 * Adds the specified filter with the specified name just before the filter whose name is 145 * <code>baseName</code> in this chain. 146 * @throws IoFilterLifeCycleException 147 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 148 * {@link IoFilter#init()} throws an exception. 149 */ 150 void addBefore(String baseName, String name, IoFilter filter); 151 152 /** 153 * Adds the specified filter with the specified name just after the filter whose name is 154 * <code>baseName</code> in this chain. 155 * @throws IoFilterLifeCycleException 156 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 157 * {@link IoFilter#init()} throws an exception. 158 */ 159 void addAfter(String baseName, String name, IoFilter filter); 160 161 /** 162 * Replace the filter with the specified name with the specified new 163 * filter. 164 * 165 * @return the old filter 166 * @throws IllegalArgumentException if there's no such filter 167 */ 168 IoFilter replace(String name, IoFilter newFilter); 169 170 /** 171 * Replace the filter with the specified name with the specified new 172 * filter. 173 * 174 * @throws IllegalArgumentException if there's no such filter 175 */ 176 void replace(IoFilter oldFilter, IoFilter newFilter); 177 178 /** 179 * Replace the filter of the specified type with the specified new 180 * filter. If there's more than one filter with the specified type, 181 * the first match will be replaced. 182 * 183 * @throws IllegalArgumentException if there's no such filter 184 */ 185 IoFilter replace(Class<? extends IoFilter> oldFilterType, IoFilter newFilter); 186 187 /** 188 * Removes the filter with the specified name from this chain. 189 * @throws IoFilterLifeCycleException 190 * if {@link IoFilter#onPostRemove(IoFilterChain, String, NextFilter)} or 191 * {@link IoFilter#destroy()} throws an exception. 192 */ 193 IoFilter remove(String name); 194 195 /** 196 * Replace the filter with the specified name with the specified new 197 * filter. 198 * 199 * @throws IllegalArgumentException if there's no such filter 200 */ 201 void remove(IoFilter filter); 202 203 /** 204 * Replace the filter of the specified type with the specified new 205 * filter. If there's more than one filter with the specified type, 206 * the first match will be replaced. 207 * 208 * @throws IllegalArgumentException if there's no such filter 209 */ 210 IoFilter remove(Class<? extends IoFilter> filterType); 211 212 /** 213 * Removes all filters added to this chain. 214 * @throws Exception if {@link IoFilter#onPostRemove(IoFilterChain, String, NextFilter)} thrown an exception. 215 */ 216 void clear() throws Exception; 217 218 /** 219 * Fires a {@link IoHandler#sessionCreated(IoSession)} event. Most users don't need to 220 * call this method at all. Please use this method only when you implement a new transport 221 * or fire a virtual event. 222 */ 223 public void fireSessionCreated(); 224 225 /** 226 * Fires a {@link IoHandler#sessionOpened(IoSession)} event. Most users don't need to call 227 * this method at all. Please use this method only when you implement a new transport or 228 * fire a virtual event. 229 */ 230 public void fireSessionOpened(); 231 232 /** 233 * Fires a {@link IoHandler#sessionClosed(IoSession)} event. Most users don't need to call 234 * this method at all. Please use this method only when you implement a new transport or 235 * fire a virtual event. 236 */ 237 public void fireSessionClosed(); 238 239 /** 240 * Fires a {@link IoHandler#sessionIdle(IoSession, IdleStatus)} event. Most users don't 241 * need to call this method at all. Please use this method only when you implement a new 242 * transport or fire a virtual event. 243 */ 244 public void fireSessionIdle(IdleStatus status); 245 246 /** 247 * Fires a {@link #fireMessageReceived(Object)} event. Most users don't need to 248 * call this method at all. Please use this method only when you implement a new transport 249 * or fire a virtual event. 250 */ 251 public void fireMessageReceived(Object message); 252 253 /** 254 * Fires a {@link IoHandler#sessionOpened(IoSession)} event. Most users don't need to call 255 * this method at all. Please use this method only when you implement a new transport or 256 * fire a virtual event. 257 */ 258 public void fireMessageSent(WriteRequest request); 259 260 /** 261 * Fires a {@link IoHandler#exceptionCaught(IoSession, Throwable)} event. Most users don't 262 * need to call this method at all. Please use this method only when you implement a new 263 * transport or fire a virtual event. 264 */ 265 public void fireExceptionCaught(Throwable cause); 266 267 /** 268 * Fires a {@link IoSession#write(Object)} event. Most users don't need to call this 269 * method at all. Please use this method only when you implement a new transport or fire a 270 * virtual event. 271 */ 272 public void fireFilterWrite(WriteRequest writeRequest); 273 274 /** 275 * Fires a {@link IoSession#close()} event. Most users don't need to call this method at 276 * all. Please use this method only when you implement a new transport or fire a virtual 277 * event. 278 */ 279 public void fireFilterClose(); 280 281 /** 282 * Represents a name-filter pair that an {@link IoFilterChain} contains. 283 * 284 * @author The Apache MINA Project (dev@mina.apache.org) 285 */ 286 public interface Entry { 287 /** 288 * Returns the name of the filter. 289 */ 290 String getName(); 291 292 /** 293 * Returns the filter. 294 */ 295 IoFilter getFilter(); 296 297 /** 298 * Returns the {@link NextFilter} of the filter. 299 * 300 * @throws IllegalStateException if the {@link NextFilter} is not available 301 */ 302 NextFilter getNextFilter(); 303 304 /** 305 * Adds the specified filter with the specified name just before this entry. 306 * @throws IoFilterLifeCycleException 307 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 308 * {@link IoFilter#init()} throws an exception. 309 */ 310 void addBefore(String name, IoFilter filter); 311 312 /** 313 * Adds the specified filter with the specified name just after this entry. 314 * @throws IoFilterLifeCycleException 315 * if {@link IoFilter#onPostAdd(IoFilterChain, String, NextFilter)} or 316 * {@link IoFilter#init()} throws an exception. 317 */ 318 void addAfter(String name, IoFilter filter); 319 320 /** 321 * Replace the filter of this entry with the specified new filter. 322 * 323 * @throws IllegalArgumentException if there's no such filter 324 */ 325 void replace(IoFilter newFilter); 326 327 /** 328 * Removes this entry from the chain it belongs to. 329 */ 330 void remove(); 331 } 332 }