package it.demo.twitterlike.rest.api.impl;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.hateoas.Link;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
public abstract class AbstractTemplate {
protected final RestTemplate restTemplate;
private final String baseUrl;
public AbstractTemplate(String baseUrl, RestTemplate restTemplate) {
this.baseUrl = baseUrl;
this.restTemplate = restTemplate;
}
public String getBaseUrl() {
return baseUrl;
}
public String buildUrl(String path) {
if (path.startsWith("http")) {
return path;
}
if (!path.startsWith("/")) {
path = "/" + path;
}
return getBaseUrl() + path;
}
protected <T> T getByLink(ParameterizedTypeReference<T> type, Link link) {
T item = restTemplate.exchange(link.getHref(), HttpMethod.GET, null,
type).getBody();
return item;
}
protected <T> T getById(ParameterizedTypeReference<T> type, Serializable id) {
return getSingleResult(buildUrl(getBaseContext() + "/{id}"), type, id);
}
protected <T> T getSingleResult(String url,
ParameterizedTypeReference<T> type, Object... parameters) {
T item = restTemplate.exchange(url, HttpMethod.GET, null, type,
parameters).getBody();
return item;
}
protected <T> T doFind(ParameterizedTypeReference<T> type, Link url) {
return doFind(type, null, null, null, url.getHref());
}
protected <T> T doFind(ParameterizedTypeReference<T> type, Integer page,
Integer size, String sort, String url) {
Map<String, Object> parameters = new HashMap<String, Object>();
if (page != null) {
parameters.put("page", page);
}
if (size != null) {
parameters.put("size", size);
}
if (sort != null) {
parameters.put("sort", sort);
}
T result = restTemplate.exchange(url, HttpMethod.GET, null, type,
parameters).getBody();
return result;
}
protected abstract String getBaseContext();
}