JsonHttpEntity.java

package org.wikimedia.eventutilities.core.http;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.Header;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonHttpEntity extends AbstractHttpEntity {

    private final ObjectMapper objectMapper;
    private final JsonNode node;

    public JsonHttpEntity(ObjectMapper objectMapper, JsonNode node) {
        this.objectMapper = objectMapper;
        this.node = node;
    }

    @Override
    public Header getContentType() {
        return new BasicHeader(HTTP.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
    }

    @Override
    public boolean isRepeatable() {
        return false;
    }

    @Override
    public long getContentLength() {
        return -1;
    }

    @Override
    public InputStream getContent() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void writeTo(OutputStream outStream) throws IOException {
        try {
            objectMapper.writeValue(outStream, node);
            outStream.flush();
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException(
                    "Encountered JsonProcessingException when attempting to POST canary events", e
            );
        }
    }

    @Override
    public boolean isStreaming() {
        return false;
    }
}