View Javadoc

1   /*
2    *  Copyright 2006 Simon Raess
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
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  }