org.intermine.app.net.request.JsonPostRequest.java Source code

Java tutorial

Introduction

Here is the source code for org.intermine.app.net.request.JsonPostRequest.java

Source

package org.intermine.app.net.request;

/*
 * Copyright (C) 2015 InterMine
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  See the LICENSE file for more
 * information or http://www.gnu.org/copyleft/lesser.html.
 *
 */

import android.content.Context;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import org.intermine.app.util.Strs;
import org.intermine.app.util.Uris;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

import static org.springframework.http.HttpMethod.POST;

public class JsonPostRequest<T, V> extends BaseRequest<T> {
    public final static String CONTENT_TYPE = "application";
    public final static String CONTENT_SUBTYPE = "json";

    public final static String DEFAULT_ROOT = "params";

    private V mObject;
    private String mInWrapper;
    private String mOutWrapper;

    public JsonPostRequest(Class<T> clazz, Context ctx, String url, Map<String, ?> params, V obj) {
        super(clazz, ctx, url, params);
        mObject = obj;
    }

    public Gson getMapper() {
        return new Gson();
    }

    @Override
    public HttpHeaders getHeaders() {
        HttpHeaders headers = super.getHeaders();
        headers.setContentType(new MediaType(CONTENT_TYPE, "x-www-form-urlencoded"));

        return headers;
    }

    protected String post(String uriString, Map<String, ?> params, String obj) {
        RestTemplate rtp = getRestTemplate();
        HttpHeaders headers = getHeaders();

        HttpEntity<String> req;
        if (Strs.isNullOrEmpty(obj)) {
            req = new HttpEntity<>(headers);
        } else {
            req = new HttpEntity<>(obj, headers);
        }

        ResponseEntity<String> res;

        String uri = Uris.expandQuery(uriString, params);

        res = rtp.exchange(uri, POST, req, String.class);

        return res.getBody();
    }

    @Override
    @SuppressWarnings("unchecked")
    public T loadDataFromNetwork() throws Exception {
        Gson mapper = getMapper();

        V obj = getObject();
        String json = null;

        if (null != obj) {
            if (!Strs.isNullOrEmpty(mInWrapper)) {
                JsonElement root = mapper.toJsonTree(getObject());
                JsonObject jo = new JsonObject();
                jo.add(mInWrapper, root);

                json = mapper.toJson(jo);
            } else {
                json = mapper.toJson(getObject());
            }
        }

        String res = post(getUrl(), getUrlParams(), json);

        if (Strs.isNullOrEmpty(res)) {
            return null;
        }

        if (Strs.isNullOrEmpty(mOutWrapper)) {
            Map<String, Object> rooted = mapper.fromJson(res, Map.class);
            String inner = mapper.toJson(rooted.get(mOutWrapper));

            return mapper.fromJson(inner, getResultType());
        } else {
            return mapper.fromJson(res, getResultType());
        }
    }

    public String getInWrapper() {
        return mInWrapper;
    }

    public void setInWrapper(String wrapper) {
        mInWrapper = wrapper;
    }

    public String getOutWrapper() {
        return mOutWrapper;
    }

    public void setOutWrapper(String wrapper) {
        mOutWrapper = wrapper;
    }

    public V getObject() {
        return mObject;
    }

    public void setObject(V object) {
        mObject = object;
    }
}