blob: f6299ee8716188f7da2b7fb0b5b7862d420cbcc8 [file] [log] [blame]
package org.apache.vysper.xmpp.server.s2s;
import java.io.IOException;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.ssl.SslEvent;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* handler for server-to-server connections
*/
public class ServerConnectorIoHandler extends IoHandlerAdapter {
private static final Logger LOG = LoggerFactory.getLogger(ServerConnectorIoHandler.class);
protected final Entity remoteServer;
protected final XMPPServerConnector serverConnector;
ServerConnectorIoHandler(Entity remoteServer, XMPPServerConnector serverConnector) {
this.remoteServer = remoteServer;
this.serverConnector = serverConnector;
}
/**
* {@inheritDoc}
*/
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
if (cause instanceof IOException) {
if (cause instanceof javax.net.ssl.SSLHandshakeException) {
LOG.warn("failed to complete SSL handshake with server {}: {}", remoteServer, cause.getMessage());
} else if (cause instanceof javax.net.ssl.SSLException) {
LOG.warn("failure in SSL with server {}: {}", remoteServer, cause.getMessage());
} else {
LOG.info("I/O exception with server {}: {}", remoteServer, cause.getMessage());
}
serverConnector.close();
} else {
LOG.warn("Exception {} thrown by XMPP server connector to " + remoteServer
+ ", probably a bug in Vysper: {}", cause.getClass().getName(), cause.getMessage());
}
}
/**
* {@inheritDoc}
*/
@Override
public void messageReceived(IoSession session, Object message) {
if (message == SslEvent.SECURED) {
serverConnector.handleSessionSecured();
} else if (message == SslEvent.UNSECURED) {
// unsecured, closing
serverConnector.close();
} else if (message instanceof Stanza) {
Stanza stanza = (Stanza) message;
serverConnector.handleReceivedStanza(stanza);
} else {
throw new RuntimeException("Only handles SSL events and stanzas, got: " + message.getClass());
}
}
/**
* {@inheritDoc}
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
// Socket was closed, make sure we close the connector
serverConnector.close();
}
/**
* {@inheritDoc}
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
serverConnector.handleSessionOpened(session);
}
}