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 package org.indi.reactor;
19
20 import java.io.IOException;
21 import java.net.InetSocketAddress;
22 import java.nio.channels.ClosedChannelException;
23 import java.nio.channels.SelectionKey;
24 import java.nio.channels.SocketChannel;
25
26 /**
27 * EventHandler for active connection estabishment. The Connector regesters with
28 * the reactor asking to estabish a connection to a particular server during
29 * construction. It called by the reactor and establishes the connection. It
30 * creates a new EventHandler using the given EventHandlerFactory and associates
31 * it with the newly created connection. After completing this work is
32 * unregisters with the reactor.
33 *
34 * @author Dirk Hünniger
35 */
36 public class Connector extends SimpleEventHandler {
37 /**
38 * The EventHandlerFactory used to create new EventHandlers to be
39 * associated with the newly created connection
40 */
41 protected EventHandlerFactory factory;
42
43 /**
44 * Class Constructor
45 *
46 * @param r
47 * The reactor to register with
48 * @param f
49 * The factory used to create a new EventHandler for the
50 * newly created connection
51 * @param host
52 * The host to connect to
53 * @param port
54 * The port to connect to
55 * @throws IOException
56 */
57 public Connector(Reactor r, EventHandlerFactory f, String host, int port)
58 throws IOException {
59 super(r, SocketChannel.open());
60 this.factory = f;
61 SocketChannel socket = (SocketChannel) channel();
62 socket.configureBlocking(false);
63 socket.connect(new InetSocketAddress(host, port));
64 register(SelectionKey.OP_CONNECT);
65 }
66
67 /**
68 * Callback method called by the reactor when the new connection is
69 * ready to be established.
70 */
71 @Override
72 final public void onConnect() throws java.io.IOException {
73 SocketChannel socket = (SocketChannel) channel();
74 socket.finishConnect();
75 EventHandler h = this.factory.produce(this.reactor, socket);
76 onConnected(h);
77 this.reactor.unregister(this);
78 }
79
80 /**
81 * Callback method called when the new connection has been established
82 * and a new EvendHandler has be created and associated with it
83 *
84 * @param h
85 * The new EventHandler associated with the new
86 * connection
87 * @throws ClosedChannelException
88 * @throws IOException
89 */
90 public void onConnected(EventHandler h) throws ClosedChannelException,
91 IOException {
92 }
93 }