package com.jds.nio.core;
import java.io.IOException;
import java.nio.channels.SelectionKey;
import java.util.Iterator;
import java.util.Set;
import com.jds.nio.NioSession;
/**
* Author: VISTALL
* Company: J Develop Station
* Date: 02.09.2009
* Time: 19:28:04
*/
public class Acceptor extends Thread
{
private NioService _service;
private boolean _shutdown = false;
public Acceptor(NioService service)
{
_service = service;
}
@Override
public void run()
{
while (!_shutdown)
{
int size = 0;
try
{
size = _service.getSelector().select();
}
catch (IOException e)
{
_service.fireCatchException(e);
}
if (size > 0)
{
Set<SelectionKey> keys = _service.getSelector().selectedKeys();
Iterator<SelectionKey> $i = keys.iterator();
while ($i.hasNext())
{
SelectionKey key = $i.next();
$i.remove();
if (!key.isValid())
{
continue;
}
switch (key.readyOps())
{
case SelectionKey.OP_CONNECT:
break;
case SelectionKey.OP_ACCEPT:
_service.getProcessor().accept(key);
break;
case SelectionKey.OP_READ:
_service.getProcessor().read(key);
break;
case SelectionKey.OP_WRITE:
_service.getProcessor().write(key);
break;
case SelectionKey.OP_READ | SelectionKey.OP_WRITE:
_service.getProcessor().read(key);
if (key.isValid())
{
_service.getProcessor().write(key);
}
break;
}
}
}
pendingClose();
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
_service.fireCatchException(e);
}
}
}
public void pendingClose()
{
synchronized (_service.getProcessor().pendingClose())
{
while (!_service.getProcessor().pendingClose().isEmpty())
{
NioSession session = _service.getProcessor().pendingClose().poll();
if(session != null)
{
_service.fireSessionClose(session, session.getCloseType());
closeSessionImpl(session);
}
}
}
}
public void closeSessionImpl(NioSession session)
{
try
{
session.clear();
}
catch (IOException e)
{
//IGNORED
}
finally
{
session.getSelectionKey().attach(null);
session.getSelectionKey().cancel();
_service.getSessions().remove(session);
}
}
public void shutdown()
{
_shutdown = true;
}
}