package org.limewire.swarm.impl;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.swarm.SwarmSource;
import org.limewire.swarm.SwarmSourceDownloader;
import org.limewire.swarm.SwarmSourceListener;
import org.limewire.swarm.SwarmStatus;
public class ReconnectingSwarmSourceListener implements SwarmSourceListener {
private static final Log LOG = LogFactory.getLog(ReconnectingSwarmSourceListener.class);
private SwarmStatus connectionStatus = null;
@Override
public void connected(SwarmSourceDownloader swarmSourceHandler, SwarmSource source) {
LOG.tracef("connected: {0}", source);
}
@Override
public void connectFailed(SwarmSourceDownloader swarmSourceHandler, SwarmSource source) {
LOG.tracef("connectFailed: {0}", source);
}
@Override
public void connectionClosed(SwarmSourceDownloader swarmSourceHandler, SwarmSource source) {
connectionClosed(swarmSourceHandler, source, connectionStatus);
}
private void connectionClosed(SwarmSourceDownloader swarmSourceHandler, SwarmSource source,
SwarmStatus status) {
// TODO we can be smarter about reconnecting
// check the explicit error and try reconnecting
// or allow a few errors before letting the connection close
if (status != null && status.isFinished() || swarmSourceHandler.isComplete()
|| source.isFinished()) {
LOG.tracef("finished, not reconnecting: {0} status: {1}", source, status);
} else if (status != null && status.isError()) {
LOG.tracef("error, not reconnecting: {0} status: {1}", source, status);
} else if (status == null || status.isOk()) {
LOG.tracef("reconnecting: {0} status: {1}", source, status);
// re-add this source back to the swarmer
swarmSourceHandler.addSource(source);
} else {
LOG.tracef("connectionClosed: {0} status: {1}", source, status);
}
}
@Override
public void responseProcessed(SwarmSourceDownloader swarmSourceHandler, SwarmSource source,
SwarmStatus status) {
connectionStatus = status;
LOG.tracef("responseProcessed: {0} status: {1}", source, status);
}
@Override
public void finished(SwarmSourceDownloader swarmSourceHandler, SwarmSource source) {
connectionStatus = new FinishedSwarmStatus();
LOG.tracef("finished: {0}", source);
}
}