package org.glassfish.grizzly.utils;
import org.glassfish.grizzly.AbstractTransformer;
import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.Grizzly;
import org.glassfish.grizzly.TransformationException;
import org.glassfish.grizzly.TransformationResult;
import org.glassfish.grizzly.attributes.AttributeStorage;
import org.glassfish.grizzly.filterchain.AbstractCodecFilter;
import org.glassfish.grizzly.filterchain.FilterChain;
import org.glassfish.grizzly.memory.Buffers;
import java.util.logging.Logger;
public class ChunkingFilter extends AbstractCodecFilter<Buffer, Buffer> {
private static final Logger LOGGER = Grizzly.logger(ChunkingFilter.class);
private final int chunkSize;
public ChunkingFilter(int chunkSize) {
super(new ChunkingDecoder(chunkSize),
new ChunkingEncoder(chunkSize));
this.chunkSize = chunkSize;
}
public int getChunkSize() {
return chunkSize;
}
public static final class ChunkingDecoder extends ChunkingTransformer {
public ChunkingDecoder(int chunk) {
super(chunk);
}
}
public static final class ChunkingEncoder extends ChunkingTransformer {
public ChunkingEncoder(int chunk) {
super(chunk);
}
}
public static abstract class ChunkingTransformer
extends AbstractTransformer<Buffer, Buffer> {
private final int chunk;
public ChunkingTransformer(int chunk) {
this.chunk = chunk;
}
@Override
public String getName() {
return "ChunkingTransformer";
}
@Override
protected TransformationResult<Buffer, Buffer> transformImpl(
AttributeStorage storage, Buffer input)
throws TransformationException {
if (!input.hasRemaining()) {
return TransformationResult.createIncompletedResult(input);
}
final int chunkSize = Math.min(chunk, input.remaining());
final int oldInputPos = input.position();
final int oldInputLimit = input.limit();
Buffers.setPositionLimit(input, oldInputPos, oldInputPos + chunkSize);
final Buffer output = obtainMemoryManager(storage).allocate(chunkSize);
output.put(input).flip();
Buffers.setPositionLimit(input, oldInputPos + chunkSize, oldInputLimit);
return TransformationResult.createCompletedResult(
output, input);
}
@Override
public boolean hasInputRemaining(AttributeStorage storage, Buffer input) {
return input != null && input.hasRemaining();
}
}
}