package org.icij.extract.spewer; import org.apache.commons.io.TaggedIOException; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPut; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.tika.metadata.Metadata; import org.icij.extract.document.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.Reader; import java.io.Serializable; import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class RESTSpewer extends Spewer implements Serializable { private static final Logger logger = LoggerFactory.getLogger(RESTSpewer.class); private static final long serialVersionUID = -1551290699012748766L; private final CloseableHttpClient client; private final URI uri; RESTSpewer(final FieldNames fields, final CloseableHttpClient client, final URI uri) { super(fields); this.client = client; this.uri = uri; } @Override public void write(final Document document, final Reader reader) throws IOException { final HttpPut put = new HttpPut(uri.resolve(document.getId())); final List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair(fields.forId(), document.getId())); params.add(new BasicNameValuePair(fields.forPath(), document.getPath().toString())); params.add(new BasicNameValuePair(fields.forText(), toString(reader))); if (outputMetadata) { parametrizeMetadata(document.getMetadata(), params); } put.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8)); put(put); } @Override public void writeMetadata(final Document document) throws IOException { final HttpPut put = new HttpPut(uri.resolve(document.getId())); final List<NameValuePair> params = new ArrayList<>(); parametrizeMetadata(document.getMetadata(), params); put.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8)); put(put); } @Override public void close() throws IOException { client.close(); } private void parametrizeMetadata(final Metadata metadata, final List<NameValuePair> params) throws IOException { new MetadataTransformer(metadata, fields).transform((name, value)-> params.add(new BasicNameValuePair(name, value)), (name, values)-> { for (String value: values) { params.add(new BasicNameValuePair(name, value)); } }); } private void put(final HttpPut put) throws IOException { logger.info(String.format("Writing to \"%s\".", put.getURI())); try (final CloseableHttpResponse response = client.execute(put)) { final int code = response.getStatusLine().getStatusCode(); if (code < 200 || code >= 300) { throw new TaggedIOException(new IOException(String.format("Unexpected response code: %d", code)), this); } } } }