1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.beep4j.transport.mina;
17
18 import java.io.IOException;
19 import java.net.SocketAddress;
20
21 import net.sf.beep4j.ChannelFilterChainBuilder;
22 import net.sf.beep4j.Listener;
23 import net.sf.beep4j.SessionHandler;
24 import net.sf.beep4j.SessionHandlerFactory;
25 import net.sf.beep4j.internal.util.Assert;
26
27 import org.apache.mina.common.IoAcceptor;
28 import org.apache.mina.common.IoHandler;
29 import org.apache.mina.common.IoHandlerAdapter;
30 import org.apache.mina.common.IoSession;
31
32 public class MinaListener extends AbstractMinaPeer implements Listener {
33
34 private static final String KEY = "beep.transport";
35
36 private final IoAcceptor acceptor;
37
38 public MinaListener(IoAcceptor acceptor) {
39 Assert.notNull("acceptor", acceptor);
40 this.acceptor = acceptor;
41 }
42
43 public void bind(SocketAddress address, SessionHandlerFactory factory) throws IOException {
44 Assert.notNull("factory", factory);
45 IoHandler handler = new BEEPIoHandler(factory, filterChainBuilder);
46 acceptor.bind(address, handler);
47 }
48
49 public void unbind(SocketAddress address) {
50 acceptor.unbind(address);
51 }
52
53 public static class BEEPIoHandler extends IoHandlerAdapter {
54
55 private final SessionHandlerFactory factory;
56
57 private final ChannelFilterChainBuilder filterChainBuilder;
58
59 public BEEPIoHandler(SessionHandlerFactory factory, ChannelFilterChainBuilder builder) {
60 this.factory = factory;
61 this.filterChainBuilder = builder;
62 }
63
64 @Override
65 public void sessionOpened(IoSession session) throws Exception {
66 SessionHandler handler = factory.createSessionHandler();
67 MinaTransport transport = new MinaTransport(false, handler, filterChainBuilder);
68 session.setAttribute(KEY, transport);
69 transport.sessionOpened(session);
70 }
71
72 @Override
73 public void messageReceived(IoSession session, Object message) throws Exception {
74 MinaTransport transport = (MinaTransport) session.getAttribute(KEY);
75 transport.messageReceived(session, message);
76 }
77
78 @Override
79 public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
80 MinaTransport transport = (MinaTransport) session.getAttribute(KEY);
81 if (transport != null) {
82 transport.exceptionCaught(session, cause);
83 } else {
84 cause.printStackTrace();
85 }
86 }
87
88 @Override
89 public void sessionClosed(IoSession session) throws Exception {
90 MinaTransport transport = (MinaTransport) session.removeAttribute(KEY);
91 transport.sessionClosed(session);
92 }
93
94 }
95
96 }