{
//process active listeners
for (Listener l = _driver.listener(); l != null; l = _driver.listener())
{
Connector c = l.accept();
Connection connection = new ConnectionImpl();
connection.setContainer(_name);
c.setConnection(connection);
//TODO: SSL and full SASL
Sasl sasl = c.sasl();
if (sasl != null)
{
sasl.server();
sasl.setMechanisms(new String[]{"ANONYMOUS"});
sasl.done(Sasl.SaslOutcome.PN_SASL_OK);
}
connection.open();
}
//process active connectors, handling opened & closed connections as needed
for (Connector c = _driver.connector(); c != null; c = _driver.connector())
{
_logger.log(Level.FINE, "Processing active connector " + c);
try
{
c.process();
} catch (IOException e) {
_logger.log(Level.SEVERE, "Error processing connection", e);
}
Connection connection = c.getConnection();
if (connection.getLocalState() == EndpointState.UNINITIALIZED)
{
connection.open();
}
Delivery delivery = connection.getWorkHead();
while (delivery != null)
{
if (delivery.getLink() instanceof Sender && delivery.isUpdated())
{
delivery.disposition(delivery.getRemoteState());
}
//TODO: delivery.clear(); What's the equivalent in java?
delivery = delivery.getWorkNext();
}
_outgoing.slide();
for (Session session : new Sessions(connection, UNINIT, ANY))
{
session.open();
_logger.log(Level.FINE, "Opened session " + session);
}
for (Link link : new Links(connection, UNINIT, ANY))
{
//TODO: the following is not correct; should only copy those properties that we understand
link.setSource(link.getRemoteSource());
link.setTarget(link.getRemoteTarget());
link.open();
_logger.log(Level.FINE, "Opened link " + link);
}
distributeCredit();
for (Link link : new Links(connection, ACTIVE, CLOSED))
{
link.close();
}
for (Session session : new Sessions(connection, ACTIVE, CLOSED))
{
session.close();
}
if (connection.getLocalState() == EndpointState.ACTIVE && connection.getRemoteState() == EndpointState.CLOSED)
{
connection.close();
}
if (c.isClosed())
{
reclaimCredit(connection);