package org.transgalactica.management.rest.logistics.restservice.impl;
import java.io.IOException;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Valid;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.transgalactica.management.business.logistics.exception.VaisseauInexistantException;
import org.transgalactica.management.business.logistics.service.VaisseauService;
import org.transgalactica.management.data.materiel.bo.VaisseauEntity;
import org.transgalactica.management.data.materiel.bo.VaisseauIntergalactiqueEntity;
import org.transgalactica.management.data.materiel.bo.VaisseauSearchCriteria;
import org.transgalactica.management.data.materiel.bo.VaisseauSummary;
import org.transgalactica.management.rest.logistics.data.VaisseauCommand;
import org.transgalactica.management.rest.logistics.data.VaisseauDetailDto;
import org.transgalactica.management.rest.logistics.data.VaisseauDtos;
import org.transgalactica.management.rest.logistics.mapper.VaisseauMapper;
import org.transgalactica.management.rest.logistics.restservice.VaisseauRestService;
/**
* Implementation par défaut de {@link SpringMVCVaisseauRestService}
*
* @author Thierry
*/
/**
* @author thierry
*
*/
@Controller
@RequestMapping("/vaisseaux")
public class SpringMVCVaisseauRestService implements VaisseauRestService {
@Inject
private BeanFactory beanFactory;
@Inject
private VaisseauService vaisseauService;
@Inject
private VaisseauMapper vaisseauMapper;
protected SpringMVCVaisseauRestService() {
}
/**
* Permet de définir un code retour http 404 en cas d'absence du vaisseau
*/
@ExceptionHandler(VaisseauInexistantException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "org.transgalactica.management.business.logistics.exception.VaisseauInexistantException")
public void vaisseauNotFound() {
}
@ExceptionHandler(ConstraintViolationException.class)
public void validationException(HttpServletResponse response, ConstraintViolationException exception)
throws IOException {
StringBuilder sb = new StringBuilder();
for (ConstraintViolation<?> violation : exception.getConstraintViolations()) {
sb.append(violation.getMessage()).append('\n');
}
response.sendError(HttpStatus.BAD_REQUEST.value(), sb.toString());
}
@Override
@RequestMapping(method = RequestMethod.GET, params = { "transit" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public VaisseauDtos getEnTransit() {
List<VaisseauSummary> projections = vaisseauService.rechercherVaisseauxEnTransit();
return vaisseauMapper.mapToVaisseauDtos(projections);
}
@Override
@RequestMapping(method = RequestMethod.GET, params = { "!transit" })
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public VaisseauDtos search(@RequestParam(required = false) String immatriculation,
@RequestParam(required = false) String modele, @RequestParam(required = false) boolean intergalactique) {
VaisseauSearchCriteria criteres = vaisseauMapper.mapToRechercheVaisseauCriteres(immatriculation, modele,
intergalactique);
List<VaisseauSummary> projections = vaisseauService.rechercherVaisseaux(criteres);
return vaisseauMapper.mapToVaisseauDtos(projections);
}
@Override
@RequestMapping(value = "/{immatriculation}", method = RequestMethod.HEAD)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public void exists(@PathVariable String immatriculation) {
// TODO : lors de la migration a spring data : utiliser la méthode
// exists, et gerer le header.
vaisseauService.chargerVaisseau(immatriculation);
}
@Override
@RequestMapping(value = "/{immatriculation}", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public VaisseauDetailDto getByImmatriculation(@PathVariable String immatriculation) {
VaisseauEntity entity = vaisseauService.chargerVaisseau(immatriculation);
return vaisseauMapper.mapToVaisseauDetailDto(entity);
}
@Override
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void create(@Valid @RequestBody VaisseauCommand command) {
VaisseauEntity entity;
if (command.getMultiplicateurHyperdrive() != null) {
entity = beanFactory.getBean(VaisseauIntergalactiqueEntity.class);
}
else {
entity = beanFactory.getBean(VaisseauEntity.class);
}
vaisseauMapper.mapVaisseauCommandToEntity(command, entity);
vaisseauService.enregistrerVaisseau(entity);
}
@Override
@RequestMapping(value = "/{immatriculation}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void save(@PathVariable String immatriculation, @Valid @RequestBody VaisseauCommand command) {
VaisseauEntity entity = vaisseauService.chargerVaisseau(immatriculation);
vaisseauMapper.mapVaisseauCommandToEntity(command, entity);
vaisseauService.enregistrerVaisseau(entity);
}
@Override
@RequestMapping(value = "/{immatriculation}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
public void delete(@PathVariable String immatriculation) {
VaisseauEntity entity = vaisseauService.chargerVaisseau(immatriculation);
vaisseauService.supprimerVaisseau(entity);
}
}