/* tjws - SelectorAcceptor.java
* Copyright (C) 1999-2007 Dmitriy Rogatkin. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Visit http://tjws.sourceforge.net to get the latest information
* about Rogatkin's products.
* $Id: SelectorAcceptor.java,v 1.8 2008/01/18 10:05:23 dmitriy Exp $
* Created on Feb 21, 2007
* @author dmitriy
*/
package Acme.Serve;
import Acme.Serve.Serve.Acceptor;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.Iterator;
import java.util.Map;
/**
* @deprecated See resteasy-undertow module.
*/
@Deprecated
public class SelectorAcceptor implements Acceptor
{
private ServerSocketChannel channel;
private Selector selector;
private Iterator readyItor;
public Socket accept() throws IOException
{
do
{
if (readyItor == null)
{
if (selector.select() > 0)
readyItor = selector.selectedKeys().iterator();
else
throw new IOException();
}
if (readyItor.hasNext())
{
// Get key from set
SelectionKey key = (SelectionKey) readyItor.next();
// Remove current entry
readyItor.remove();
// TODO add processing CancelledKeyException
if (key.isValid() && key.isAcceptable())
{
// Get channel
ServerSocketChannel keyChannel = (ServerSocketChannel) key.channel();
// Get server socket
ServerSocket serverSocket = keyChannel.socket();
// Accept request
return serverSocket.accept();
}
}
else
readyItor = null;
} while (true);
}
public void destroy() throws IOException
{
String exceptions = "";
try
{
channel.close();
}
catch (IOException e)
{
exceptions += e.toString();
}
try
{
selector.close();
}
catch (IOException e)
{
exceptions += e.toString();
}
if (exceptions.length() > 0)
throw new IOException(exceptions);
}
@SuppressWarnings(value = "unchecked")
public void init(Map inProperties, Map outProperties) throws IOException
{
selector = Selector.open();
channel = ServerSocketChannel.open();
channel.configureBlocking(false);
int port = inProperties.get(Serve.ARG_PORT) != null ? ((Integer) inProperties.get(Serve.ARG_PORT)).intValue()
: Serve.DEF_PORT;
InetSocketAddress isa = null;
if (inProperties.get(Serve.ARG_BINDADDRESS) != null)
try
{
isa = new InetSocketAddress((String) inProperties.get(Serve.ARG_BINDADDRESS), port);
}
catch (Exception e)
{
}
if (isa == null)
isa = new InetSocketAddress(port);
// TODO add ARG_BACKLOG
channel.socket().bind(isa);
// Register interest in when connection
channel.register(selector, SelectionKey.OP_ACCEPT);
if (outProperties != null)
{
if (channel.socket().isBound())
outProperties.put(Serve.ARG_BINDADDRESS, channel.socket().getInetAddress().getHostName());
else
outProperties.put(Serve.ARG_BINDADDRESS, InetAddress.getLocalHost().getHostName());
}
}
public String toString()
{
return "SelectorAcceptor - " + (channel == null ? "unset" : "" + channel.socket());
}
}