1 | /* |
2 | * @(#) $Id: VmPipeAcceptor.java 332218 2005-11-10 03:52:42Z trustin $ |
3 | */ |
4 | package org.apache.mina.protocol.vmpipe; |
5 | |
6 | import java.io.IOException; |
7 | import java.net.SocketAddress; |
8 | import java.util.HashMap; |
9 | import java.util.Map; |
10 | |
11 | import org.apache.mina.common.BaseSessionManager; |
12 | import org.apache.mina.protocol.ProtocolAcceptor; |
13 | import org.apache.mina.protocol.ProtocolFilterChain; |
14 | import org.apache.mina.protocol.ProtocolHandler; |
15 | import org.apache.mina.protocol.ProtocolProvider; |
16 | import org.apache.mina.protocol.ProtocolSession; |
17 | |
18 | /** |
19 | * Binds the specified {@link ProtocolProvider} to the specified |
20 | * {@link VmPipeAddress}. |
21 | * |
22 | * @author The Apache Directory Project (dev@directory.apache.org) |
23 | * @version $Rev: 332218 $, $Date: 2005-11-10 12:52:42 +0900 $ |
24 | */ |
25 | public class VmPipeAcceptor extends BaseSessionManager implements ProtocolAcceptor |
26 | { |
27 | static final Map boundHandlers = new HashMap(); |
28 | |
29 | private final VmPipeSessionManagerFilterChain filterChain = |
30 | new VmPipeSessionManagerFilterChain( this ); |
31 | |
32 | /** |
33 | * Creates a new instance. |
34 | */ |
35 | public VmPipeAcceptor() |
36 | { |
37 | filterChain.addFirst( "VMPipe", new VmPipeFilter() ); |
38 | } |
39 | |
40 | public void bind( SocketAddress address, ProtocolProvider protocolProvider ) throws IOException |
41 | { |
42 | if( address == null ) |
43 | throw new NullPointerException( "address" ); |
44 | if( protocolProvider == null ) |
45 | throw new NullPointerException( "protocolProvider" ); |
46 | if( !( address instanceof VmPipeAddress ) ) |
47 | throw new IllegalArgumentException( |
48 | "address must be VmPipeAddress." ); |
49 | |
50 | synchronized( boundHandlers ) |
51 | { |
52 | if( boundHandlers.containsKey( address ) ) |
53 | { |
54 | throw new IOException( "Address already bound: " + address ); |
55 | } |
56 | |
57 | boundHandlers.put( address, |
58 | new Entry( this, |
59 | ( VmPipeAddress ) address, |
60 | filterChain, |
61 | protocolProvider.getHandler() ) ); |
62 | } |
63 | } |
64 | |
65 | public void unbind( SocketAddress address ) |
66 | { |
67 | if( address == null ) |
68 | throw new NullPointerException( "address" ); |
69 | |
70 | synchronized( boundHandlers ) |
71 | { |
72 | boundHandlers.remove( address ); |
73 | } |
74 | } |
75 | |
76 | public ProtocolFilterChain getFilterChain() |
77 | { |
78 | return filterChain; |
79 | } |
80 | |
81 | static class Entry |
82 | { |
83 | final VmPipeAcceptor acceptor; |
84 | |
85 | final VmPipeAddress address; |
86 | |
87 | final VmPipeSessionManagerFilterChain managerFilterChain; |
88 | |
89 | final ProtocolHandler handler; |
90 | |
91 | private Entry( VmPipeAcceptor acceptor, |
92 | VmPipeAddress address, |
93 | VmPipeSessionManagerFilterChain managerFilterChain, |
94 | ProtocolHandler handler ) |
95 | { |
96 | this.acceptor = acceptor; |
97 | this.address = address; |
98 | this.managerFilterChain = managerFilterChain; |
99 | this.handler = handler; |
100 | } |
101 | } |
102 | |
103 | public ProtocolSession newSession( SocketAddress remoteAddress, SocketAddress localAddress ) |
104 | { |
105 | throw new UnsupportedOperationException(); |
106 | } |
107 | } |