View Javadoc

1   /*
2   Copyright (C) 2007 Dirk Huenniger
3   
4   This library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8   
9   This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  Lesser General Public License for more details.
13  
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17   */
18  
19  package org.indi.reactor;
20  
21  import java.io.IOException;
22  import java.net.InetSocketAddress;
23  import java.nio.channels.ClosedChannelException;
24  import java.nio.channels.SelectableChannel;
25  import java.nio.channels.SelectionKey;
26  import java.nio.channels.ServerSocketChannel;
27  
28  /**
29   * EventHandler for passive connection establishment. The Acceptor is registered
30   * with the reactor during construction. Whenever a new client connects, on the
31   * specified port a new EventHandler is created using the given
32   * EventHandlerFactory and associated with the newly created connection, as well
33   * as registered with the reactor.
34   * 
35   * @author Dirk Hünniger
36   */
37  public class Acceptor extends SimpleEventHandler {
38      /**
39       * The EventHandlerFactory used to produce new EventHandlers for new
40       * connections
41       */
42      protected EventHandlerFactory factory;
43  
44      /**
45       * Class Constructor
46       * 
47       * @param r
48       *                the reactor the Acceptor is to be registered with
49       * @param f
50       *                the EventHandlerFactory to be used for the creation of
51       *                new EventHandlers for new connections
52       * @param port
53       *                The port to listen for new connections
54       * @throws IOException
55       */
56      protected Acceptor(Reactor r, EventHandlerFactory f, int port)
57  	    throws IOException {
58  	super(r, ServerSocketChannel.open());
59  	ServerSocketChannel serverSocket = (ServerSocketChannel) this.channel;
60  	serverSocket.socket().bind(new InetSocketAddress(port));
61  	serverSocket.configureBlocking(false);
62  	this.factory = f;
63  	register(SelectionKey.OP_ACCEPT);
64      }
65  
66      /**
67       * Callback method called by the reactor when a new client is ready to
68       * be accepted. Implemented here.
69       */
70      @Override
71      final public void onAccept() throws java.io.IOException {
72  	SelectableChannel ch = ((ServerSocketChannel) this.channel).accept();
73  	EventHandler h = this.factory.produce(this.reactor, ch);
74  	ch.configureBlocking(false);
75  	onAccepted(h);
76      }
77  
78      /**
79       * Callbackmethod called after the connection has been established and a
80       * new EventHandler has been created and set up to interact with this
81       * new conenction
82       * 
83       * @param h
84       *                The newly created EventHandler
85       * @throws ClosedChannelException
86       * @throws IOException
87       */
88      public void onAccepted(EventHandler h) throws ClosedChannelException,
89  	    IOException {
90      }
91  }