@Override public void requestOutput() { channel.requestOutput(); }
@Override public void endStream(final List<? extends Header> trailers) throws IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": end of request data"); } channel.endStream(trailers); }
@Override public void writeCompleted() throws IOException { if (endStream) { return; } lock.lock(); try { if (!endStream) { endStream = true; if (dataStreamChannel != null) { setOutputMode(); if (buffer().hasRemaining()) { dataStreamChannel.requestOutput(); } else { dataStreamChannel.endStream(); } } } } finally { lock.unlock(); } }
@Override public int write(final ByteBuffer src) throws IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": produce request data, len " + src.remaining() + " bytes"); } return channel.write(src); }
@Override public void endStream() throws IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": end of request data"); } channel.endStream(); }
@Override public void writeCompleted() throws IOException { if (endStream) { return; } lock.lock(); try { if (!endStream) { endStream = true; if (dataStreamChannel != null) { setOutputMode(); if (buffer().hasRemaining()) { dataStreamChannel.requestOutput(); } else { dataStreamChannel.endStream(); } } } } finally { lock.unlock(); } }
@Override public int write(final ByteBuffer src) throws IOException { final ByteBuffer dup = src.duplicate(); final int writtenBytes = channel.write(src); if (writtenBytes > 0) { dup.limit(dup.position() + writtenBytes); digester.update(dup); } return writtenBytes; }
@Override public void produce(final DataStreamChannel channel) throws IOException { if (outputTerminated.get()) { channel.endStream(); return; } requestProducer.produce(channel); }
@Override public void requestOutput() { channel.requestOutput(); }
@Override public int write(final ByteBuffer src) throws IOException { final ByteBuffer dup = src.duplicate(); final int writtenBytes = channel.write(src); if (writtenBytes > 0) { dup.limit(dup.position() + writtenBytes); digester.update(dup); } return writtenBytes; }
@Override public void produce(final DataStreamChannel channel) throws IOException { @SuppressWarnings("resource") RandomAccessFile accessFile = accessFileRef.get(); if (accessFile == null) { accessFile = new RandomAccessFile(file, "r"); Asserts.check(accessFileRef.getAndSet(accessFile) == null, "Illegal producer state"); } if (!eof) { final int bytesRead = accessFile.getChannel().read(byteBuffer); if (bytesRead < 0) { eof = true; } } if (byteBuffer.position() > 0) { byteBuffer.flip(); channel.write(byteBuffer); byteBuffer.compact(); } if (eof && byteBuffer.position() == 0) { channel.endStream(); releaseResources(); } }
@Override public void produce(final DataStreamChannel channel) throws IOException { if (outputTerminated.get()) { channel.endStream(); return; } requestProducer.produce(channel); }
@Override public void requestOutput() { channel.requestOutput(); }
@Override public int write(final ByteBuffer src) throws IOException { Args.notNull(src, "Buffer"); final int chunk = src.remaining(); if (chunk == 0) { return 0; } if (bytebuf.remaining() >= chunk) { bytebuf.put(src); return chunk; } int totalBytesWritten = 0; if (!bytebuf.hasRemaining() || bytebuf.position() >= fragmentSizeHint) { bytebuf.flip(); final int bytesWritten = channel.write(bytebuf); bytebuf.compact(); totalBytesWritten += bytesWritten; } if (bytebuf.position() == 0) { final int bytesWritten = channel.write(src); totalBytesWritten += bytesWritten; } return totalBytesWritten; }
@Override public void produce(final DataStreamChannel channel) throws IOException { @SuppressWarnings("resource") RandomAccessFile accessFile = accessFileRef.get(); if (accessFile == null) { accessFile = new RandomAccessFile(file, "r"); Asserts.check(accessFileRef.getAndSet(accessFile) == null, "Illegal producer state"); } if (!eof) { final int bytesRead = accessFile.getChannel().read(byteBuffer); if (bytesRead < 0) { eof = true; } } if (byteBuffer.position() > 0) { byteBuffer.flip(); channel.write(byteBuffer); byteBuffer.compact(); } if (eof && byteBuffer.position() == 0) { channel.endStream(); releaseResources(); } }
@Override public void endStream(final List<? extends Header> trailers) throws IOException { digest = digester.digest(); final List<Header> allTrailers = new ArrayList<>(); if (trailers != null) { allTrailers.addAll(trailers); } allTrailers.add(new BasicHeader("digest-algo", digester.getAlgorithm())); allTrailers.add(new BasicHeader("digest", TextUtils.toHexString(digest))); channel.endStream(allTrailers); }
private void signalReadiness() { final DataStreamChannel channel = requestChannel.get(); if (channel == null) { throw new IllegalStateException("Output channel is not set"); } channel.requestOutput(); }
@Override public void write(final byte[] b, final int off, final int len) throws IOException { final ByteBuffer src = ByteBuffer.wrap(b, off, len); lock.lock(); try { ensureNotAborted(); setInputMode(); while (src.hasRemaining()) { // always buffer small chunks if (src.remaining() < 1024 && buffer().remaining() > src.remaining()) { buffer().put(src); } else { if (buffer().position() > 0 || dataStreamChannel == null) { waitFlush(); } if (buffer().position() == 0 && dataStreamChannel != null) { final int bytesWritten = dataStreamChannel.write(src); if (bytesWritten == 0) { hasCapacity = false; waitFlush(); } } } } } finally { lock.unlock(); } }