public synchronized int fillFrom(ByteChannel channel) throws IOException {
    if (buffer == null) {
      buffer = bufferFactory.newBuffer();
    }

    return channel.read(buffer);
  }