project.latex.balloon.writer.HttpDataWriter.java Source code

Java tutorial

Introduction

Here is the source code for project.latex.balloon.writer.HttpDataWriter.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package project.latex.balloon.writer;

import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;
import project.latex.writer.DataWriter;

/**
 * This is a class for use during testing, until we have our radio comms working.
 * Until that point, we'll use http comms to do end-to-end testing of the rest
 * of the system.
 * @author dgorst
 */
public class HttpDataWriter implements DataWriter {

    private final DataModelConverter converter;
    private final List<String> dataKeys;
    private final String receiverUrl;

    private static final Logger logger = Logger.getLogger(HttpDataWriter.class);

    public HttpDataWriter(List<String> dataKeys, DataModelConverter converter, String receiverUrl) {
        this.converter = converter;
        this.dataKeys = dataKeys;
        this.receiverUrl = receiverUrl;
    }

    String getJsonStringFromRawData(String rawString) {
        if (rawString == null) {
            throw new IllegalArgumentException("Cannot convert null string");
        }

        byte[] encodedBytes = Base64.encodeBase64(rawString.getBytes());
        String base64String = new String(encodedBytes);

        Map<String, Object> data = new HashMap<>();
        data.put("_raw", base64String);

        Map<String, Object> body = new HashMap<>();
        body.put("data", data);
        Gson gson = new Gson();
        return gson.toJson(body);
    }

    void sendPostRequest(String rawString) throws IOException {
        String jsonString = getJsonStringFromRawData(rawString);

        CloseableHttpClient httpclient = HttpClients.createDefault();
        StringEntity entity = new StringEntity(jsonString, ContentType.create("plain/text", Consts.UTF_8));
        HttpPost httppost = new HttpPost(receiverUrl);
        httppost.addHeader("content-type", "application/json");
        httppost.setEntity(entity);

        ResponseHandler<String> responseHandler = new ResponseHandler<String>() {

            @Override
            public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                StatusLine statusLine = response.getStatusLine();
                HttpEntity entity = response.getEntity();
                if (statusLine.getStatusCode() >= 300) {
                    throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
                }
                if (entity == null) {
                    throw new ClientProtocolException("Response contains no content");
                }
                ContentType contentType = ContentType.getOrDefault(entity);
                Charset charset = contentType.getCharset();
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), charset));
                StringBuilder stringBuilder = new StringBuilder();
                String line = reader.readLine();
                while (line != null) {
                    stringBuilder.append(line);
                    line = reader.readLine();
                }
                return stringBuilder.toString();
            }
        };

        String responseString = httpclient.execute(httppost, responseHandler);
        logger.info(responseString);
    }

    @Override
    public void writeData(Map<String, Object> dataModel) {
        if (dataModel == null) {
            throw new IllegalArgumentException("Cannot write null data object");
        }

        String csvString = this.converter.convertDataToCsvString(dataKeys, dataModel);

        try {
            sendPostRequest(csvString);
        } catch (IOException ex) {
            logger.error(ex);
        }
    }

}