diff --git a/.settings/edu.umd.cs.findbugs.core.prefs b/.settings/edu.umd.cs.findbugs.core.prefs index 3859298be5bcb28e45aa0ee74a54927731d8e2fd..73ac78d870c97eac5872c26af03871bd22cd45fe 100644 --- a/.settings/edu.umd.cs.findbugs.core.prefs +++ b/.settings/edu.umd.cs.findbugs.core.prefs @@ -1,5 +1,5 @@ #FindBugs User Preferences -#Fri Dec 19 13:43:52 CET 2014 +#Wed Jan 28 07:11:46 CET 2015 detector_threshold=3 effort=max excludefilter0=.fbExcludeFilterFile|true diff --git a/src/main/java/teetime/stage/io/AbstractTcpReader.java b/src/main/java/teetime/util/io/network/AbstractTcpReader.java similarity index 68% rename from src/main/java/teetime/stage/io/AbstractTcpReader.java rename to src/main/java/teetime/util/io/network/AbstractTcpReader.java index 2b31e029caefce07a6a99eaa0aa37d22ae2c5d6e..6594777246f8893d3124ecb813be94fa7c31744c 100644 --- a/src/main/java/teetime/stage/io/AbstractTcpReader.java +++ b/src/main/java/teetime/util/io/network/AbstractTcpReader.java @@ -1,4 +1,4 @@ -package teetime.stage.io; +package teetime.util.io.network; import java.io.IOException; import java.net.InetSocketAddress; @@ -7,31 +7,38 @@ import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import teetime.framework.AbstractProducerStage; +import org.slf4j.Logger; -public abstract class AbstractTcpReader<T> extends AbstractProducerStage<T> { +public abstract class AbstractTcpReader implements Runnable { private final int port; private final int bufferCapacity; + @SuppressWarnings("PMD.LoggerIsNotStaticFinal") + protected final Logger logger; - public AbstractTcpReader(final int port, final int bufferCapacity) { + private volatile boolean terminated; + + public AbstractTcpReader(final int port, final int bufferCapacity, final Logger logger) { super(); this.port = port; this.bufferCapacity = bufferCapacity; + this.logger = logger; } @Override - protected void execute() { + public final void run() { ServerSocketChannel serversocket = null; try { serversocket = ServerSocketChannel.open(); serversocket.socket().bind(new InetSocketAddress(this.port)); - logger.debug("Listening on port " + this.port); + if (logger.isDebugEnabled()) { + logger.debug("Listening on port " + this.port); + } final SocketChannel socketChannel = serversocket.accept(); try { final ByteBuffer buffer = ByteBuffer.allocateDirect(bufferCapacity); - while (socketChannel.read(buffer) != -1) { + while (socketChannel.read(buffer) != -1 && !terminated) { process(buffer); } } finally { @@ -47,8 +54,6 @@ public abstract class AbstractTcpReader<T> extends AbstractProducerStage<T> { logger.debug("Failed to close TCP connection.", e); } } - - this.terminate(); } } @@ -57,7 +62,7 @@ public abstract class AbstractTcpReader<T> extends AbstractProducerStage<T> { try { while (buffer.hasRemaining()) { buffer.mark(); - boolean success = this.read(buffer); + boolean success = this.onBufferReceived(buffer); if (!success) { buffer.reset(); buffer.compact(); @@ -66,7 +71,7 @@ public abstract class AbstractTcpReader<T> extends AbstractProducerStage<T> { } buffer.clear(); } catch (final BufferUnderflowException ex) { - logger.warn("Unexpected exception. Resetting and compacting buffer.", ex); + logger.warn("Unexpected buffer underflow. Resetting and compacting buffer.", ex); buffer.reset(); buffer.compact(); } @@ -79,6 +84,13 @@ public abstract class AbstractTcpReader<T> extends AbstractProducerStage<T> { * <li><code>true</code> when there were enough bytes to perform the read operation * <li><code>false</code> otherwise. In this case, the buffer is reset, compacted, and filled with new content. */ - protected abstract boolean read(final ByteBuffer buffer); + protected abstract boolean onBufferReceived(final ByteBuffer buffer); + public void terminate() { + this.terminated = true; + } + + public int getPort() { + return port; + } } diff --git a/src/site/markdown/wiki b/src/site/markdown/wiki index a93581905ef7b0584d52eae1898148ffa6201a31..0e4474577e1f49bc96e734c286b2d9e0363895e8 160000 --- a/src/site/markdown/wiki +++ b/src/site/markdown/wiki @@ -1 +1 @@ -Subproject commit a93581905ef7b0584d52eae1898148ffa6201a31 +Subproject commit 0e4474577e1f49bc96e734c286b2d9e0363895e8