@Override
 public int hashCode() {
   int result = decoder != null ? decoder.hashCode() : 0;
   result = 31 * result + (encoder != null ? encoder.hashCode() : 0);
   result = 31 * result + (encodingFilter != null ? encodingFilter.hashCode() : 0);
   return result;
 }
  @Override
  public HttpContent encode(Connection connection, HttpContent httpContent) {

    final HttpHeader httpHeader = httpContent.getHttpHeader();
    final Buffer input = httpContent.getContent();

    if (httpContent.isLast() && !input.hasRemaining()) {
      return httpContent;
    }

    final TransformationResult<Buffer, Buffer> result =
        encoder.transform(httpContent.getHttpHeader(), input);

    input.tryDispose();

    try {
      switch (result.getStatus()) {
        case COMPLETE:
          encoder.finish(httpHeader);
        case INCOMPLETE:
          {
            Buffer encodedBuffer = result.getMessage();
            if (encodedBuffer != null) {
              httpContent.setContent(encodedBuffer);
              return httpContent;
            } else {
              return null;
            }
          }

        case ERROR:
          {
            throw new IllegalStateException(
                "LZMA encode error. Code: "
                    + result.getErrorCode()
                    + " Description: "
                    + result.getErrorDescription());
          }

        default:
          throw new IllegalStateException("Unexpected status: " + result.getStatus());
      }
    } finally {
      result.recycle();
    }
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    LZMAContentEncoding that = (LZMAContentEncoding) o;

    if (decoder != null ? !decoder.equals(that.decoder) : that.decoder != null) return false;
    if (encoder != null ? !encoder.equals(that.encoder) : that.encoder != null) return false;
    if (encodingFilter != null
        ? !encodingFilter.equals(that.encodingFilter)
        : that.encodingFilter != null) return false;

    return true;
  }