All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.pincette.rs.encoders.Inflate Maven / Gradle / Ivy

There is a newer version: 3.7.1
Show newest version
package net.pincette.rs.encoders;

import static java.nio.ByteBuffer.allocate;
import static java.util.Collections.emptyList;
import static net.pincette.util.Util.tryToGetRethrow;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;
import net.pincette.rs.Encoder;

/**
 * An encoder that inflates a ByteBuffer stream.
 *
 * @author Werner Donn\u00e9
 * @since 3.0
 */
public class Inflate implements Encoder {
  private final Inflater inflater;

  public Inflate() {
    this(new Inflater());
  }

  public Inflate(final Inflater inflater) {
    this.inflater = inflater;
  }

  public static Encoder inflate() {
    return new Inflate();
  }

  public static Encoder inflate(final Inflater inflater) {
    return new Inflate(inflater);
  }

  private void inflate(final List result, final int capacity) {
    final ByteBuffer b = allocate(capacity);
    final int uncompressed = tryToGetRethrow(() -> inflater.inflate(b)).orElse(0);

    if (uncompressed > 0) {
      result.add(b.position(0).limit(uncompressed));
    }
  }

  public List complete() {
    inflater.end();

    return emptyList();
  }

  public List encode(final ByteBuffer buffer) {
    final List result = new ArrayList<>();

    if (!inflater.finished()) {
      inflater.setInput(buffer);

      while (!inflater.needsInput() && !inflater.finished()) {
        inflate(result, buffer.capacity() * 10);
      }
    }

    return result;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy