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;
}
}