package org.transgalactica.management.data.rest.dao.impl;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Repository;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;
import org.transgalactica.management.data.rest.bo.VaisseauSearchCriteria;
import org.transgalactica.management.data.rest.bo.VaisseauSummaryTo;
import org.transgalactica.management.data.rest.bo.VaisseauTo;
import org.transgalactica.management.data.rest.dao.VaisseauDao;
import org.transgalactica.management.data.rest.mapper.LogisticsMapper;
import org.transgalactica.management.flux.rest.VaisseauCommand;
import org.transgalactica.management.flux.rest.VaisseauDetailDto;
import org.transgalactica.management.flux.rest.VaisseauDtos;
@Repository
public class RestVaisseauDao implements VaisseauDao {
private static final String VAISSEAUX = "/vaisseaux";
private static final String SEARCH = VAISSEAUX + "/search?";
private static final String BY_IMMATRICULATION = VAISSEAUX + "/{immatriculation}";
@Value("${rest.url}")
private String restServiceUrl;
@Inject
private RestTemplate restTemplate;
@Inject
private LogisticsMapper mapper;
protected RestVaisseauDao() {
}
@Override
public List<VaisseauSummaryTo> searchByCriteria(VaisseauSearchCriteria criteres) {
StringBuilder url = new StringBuilder(restServiceUrl);
List<Object> params = new ArrayList<>(3);
url.append(SEARCH);
if (StringUtils.isNotBlank(criteres.getImmatriculation())) {
url.append("immatriculation={immatriculation}&");
params.add(criteres.getImmatriculation());
}
if (StringUtils.isNotBlank(criteres.getModele())) {
url.append("modele={modele}&");
params.add(criteres.getModele());
}
if (criteres.isIntergalactique()) {
url.append("intergalactique={intergalactique}");
params.add(criteres.isIntergalactique());
}
VaisseauDtos vaisseaux = restTemplate.getForObject(url.toString(), VaisseauDtos.class, params.toArray());
return mapper.mapToVaisseauSummaryTo(vaisseaux.getVaisseau());
}
@Override
public VaisseauTo getByImmatriculation(String immatriculation) {
VaisseauDetailDto vaisseau = restTemplate.getForObject(restServiceUrl + BY_IMMATRICULATION,
VaisseauDetailDto.class, immatriculation);
return mapper.mapToVaisseauTo(vaisseau);
}
@Override
public void persist(VaisseauTo vaisseau) {
String immatriculation = vaisseau.getImmatriculation();
VaisseauCommand command = mapper.mapToVaisseauCommand(vaisseau);
try {
restTemplate.headForHeaders(restServiceUrl + BY_IMMATRICULATION, immatriculation);
restTemplate.put(restServiceUrl + BY_IMMATRICULATION, command, immatriculation);
}
catch (HttpStatusCodeException e) {
if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
restTemplate.postForLocation(restServiceUrl + VAISSEAUX, command);
}
else {
throw e;
}
}
}
@Override
public void remove(String immatriculation) {
restTemplate.delete(restServiceUrl + BY_IMMATRICULATION, immatriculation);
}
}