package org.limewire.net;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import org.limewire.io.IOUtils;
/**
* A ConnectionDispatcher that blocks while reading.
*/
public class BlockingConnectionDispatcher implements Runnable {
private final ConnectionDispatcher dispatcher;
private final Socket socket;
private final String allowedWord;
public BlockingConnectionDispatcher(ConnectionDispatcher dispatcher, Socket socket, String allowedWord) {
if (dispatcher == null) {
throw new IllegalArgumentException();
}
if (socket == null) {
throw new IllegalArgumentException();
}
this.dispatcher = dispatcher;
this.socket = socket;
this.allowedWord = allowedWord;
}
protected void shutdown() {
}
/** Reads a word and sends it off to the ConnectionDispatcher for dispatching. */
public void run() {
try {
//The try-catch below is a work-around for JDK bug 4091706.
InputStream in=null;
try {
in=socket.getInputStream();
} catch (IOException e) {
shutdown();
throw e;
} catch(NullPointerException e) {
// This should only happen extremely rarely.
// JDK bug 4091706
throw new IOException(e.getMessage());
}
String word = IOUtils.readLargestWord(in, dispatcher.getMaximumWordSize());
if(allowedWord != null && !allowedWord.equals(word))
throw new IOException("wrong word!");
dispatcher.dispatch(word, socket, false);
} catch (IOException iox) {
shutdown();
IOUtils.close(socket);
}
}
}