/**
*
*/
package net.conselldemallorca.helium.webapp.v3.controller;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.conselldemallorca.helium.v3.core.api.dto.SeleccioOpcioDto;
import net.conselldemallorca.helium.v3.core.api.exception.SistemaExternException;
import net.conselldemallorca.helium.v3.core.api.service.TascaService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
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;
/**
* Controlador per a consultar els valors possibles d'un camp
* desplegable de l'expedient.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/v3/camp")
public class CampValorsController extends BaseExpedientController {
@Autowired
private TascaService tascaService;
@RequestMapping(value = "/{campId}/context/{processInstanceId}/{tascaId}/valors", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaAmbContext(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "processInstanceId") String processInstanceId,
@PathVariable(value = "tascaId") String tascaId,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model) {
return tascaService.findValorsPerCampDesplegable(
tascaId,
processInstanceId,
campId,
null,
textFiltre,
null,
null,
getMapDelsValors(valors));
}
@RequestMapping(value = "/{campId}/proces/{processInstanceId}/valors", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaAmbProces(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "processInstanceId") String processInstanceId,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model,
HttpServletResponse response) throws IOException {
List<SeleccioOpcioDto> resposta = null;
try {
resposta = tascaService.findValorsPerCampDesplegable(
null,
processInstanceId,
campId,
null,
textFiltre,
null,
null,
getMapDelsValors(valors));
} catch (SistemaExternException see) {
response.setStatus(500);
response.getWriter().write(see.getPublicMessage());
logger.error(see.getMessage());
} catch (Exception ex) {
response.setStatus(500);
String errorText = "Error en la comunicació amb el sistema extern per un error intern: ";
if (ex.getCause() != null && ex.getCause().getMessage() != null)
errorText += ex.getCause().getMessage();
else
errorText += ex.toString();
response.getWriter().write(errorText);
logger.error("Error en la comunicació amb el sistema extern per un error intern: ", ex);
}
return resposta;
}
@RequestMapping(value = "/{campId}/tasca/{tascaId}/valors", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaAmbTasca(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "tascaId") String tascaId,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model,
HttpServletResponse response) throws IOException {
List<SeleccioOpcioDto> resposta = null;
try {
resposta = tascaService.findValorsPerCampDesplegable(
tascaId,
null,
campId,
null,
textFiltre,
null,
null,
getMapDelsValors(valors));
} catch (SistemaExternException see) {
response.setStatus(500);
response.getWriter().write(see.getPublicMessage());
logger.error(see.getMessage());
} catch (Exception ex) {
response.setStatus(500);
String errorText = "Error en la comunicació amb el sistema extern per un error intern: ";
if (ex.getCause() != null && ex.getCause().getMessage() != null)
errorText += ex.getCause().getMessage();
else
errorText += ex.toString();
response.getWriter().write(errorText);
logger.error("Error en la comunicació amb el sistema extern per un error intern: ", ex);
}
return resposta;
}
@RequestMapping(value = "/{campId}/tasca/{tascaId}/valors/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaAmbTascaValor(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "tascaId") String tascaId,
@PathVariable(value = "valor") String textFiltre,
@RequestParam(value = "registreCampId", required = false) Long registreCampId,
@RequestParam(value = "registreIndex", required = false) Integer registreIndex,
ModelMap model) {
return tascaService.findValorsPerCampDesplegable(
tascaId,
null,
campId,
null,
textFiltre,
registreCampId,
registreIndex,
null);
}
@RequestMapping(value = "/{campId}/valors", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consulta(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model,
HttpServletResponse response) throws IOException {
List<SeleccioOpcioDto> resposta = null;
try {
return tascaService.findValorsPerCampDesplegable(
null,
null,
campId,
null,
textFiltre,
null,
null,
getMapDelsValors(valors));
} catch (SistemaExternException see) {
response.setStatus(500);
response.getWriter().write(see.getPublicMessage());
logger.error(see.getMessage());
} catch (Exception ex) {
response.setStatus(500);
String errorText = "Error en la comunicació amb el sistema extern per un error intern: ";
if (ex.getCause() != null && ex.getCause().getMessage() != null)
errorText += ex.getCause().getMessage();
else
errorText += ex.toString();
response.getWriter().write(errorText);
logger.error("Error en la comunicació amb el sistema extern per un error intern: ", ex);
}
return resposta;
}
@RequestMapping(value = "/{campId}/valors/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaValor(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "valor") String textFiltre,
ModelMap model) {
return tascaService.findValorsPerCampDesplegable(
null,
null,
campId,
null,
textFiltre,
null,
null,
null);
}
@RequestMapping(value = "/{campId}/context/{processInstanceId}/{tascaId}/valor/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaValorContext(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "processInstanceId") String processInstanceId,
@PathVariable(value = "tascaId") String tascaId,
@PathVariable(value = "valor") String valor,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "registreCampId", required = false) Long registreCampId,
@RequestParam(value = "registreIndex", required = false) Integer registreIndex,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model) {
return tascaService.findValorsPerCampDesplegable(
tascaId,
processInstanceId,
campId,
valor,
textFiltre,
registreCampId,
registreIndex,
getMapDelsValors(valors));
}
@RequestMapping(value = "/{campId}/proces/{processInstanceId}/valor/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaValorProces(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "processInstanceId") String processInstanceId,
@PathVariable(value = "valor") String valor,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model) {
return tascaService.findValorsPerCampDesplegable(
null,
processInstanceId,
campId,
valor,
textFiltre,
null,
null,
getMapDelsValors(valors));
}
@RequestMapping(value = "/{campId}/tasca/{tascaId}/valor/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaValorTasca(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "tascaId") String tascaId,
@PathVariable(value = "valor") String valor,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "registreCampId", required = false) Long registreCampId,
@RequestParam(value = "registreIndex", required = false) Integer registreIndex,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model) {
valor = decodeValor(request);
return tascaService.findValorsPerCampDesplegable(
tascaId,
null,
campId,
valor,
textFiltre,
registreCampId,
registreIndex,
getMapDelsValors(valors));
}
@RequestMapping(value = "/{campId}/valor/{valor}", method = RequestMethod.GET)
@ResponseBody
public List<SeleccioOpcioDto> consultaValor(
HttpServletRequest request,
@PathVariable(value = "campId") Long campId,
@PathVariable(value = "valor") String valor,
@RequestParam(value = "q", required = false) String textFiltre,
@RequestParam(value = "valors", required = false) String valors,
ModelMap model) {
valor = decodeValor(request);
return tascaService.findValorsPerCampDesplegable(
null,
null,
campId,
valor,
textFiltre,
null,
null,
getMapDelsValors(valors));
}
private Map<String, Object> getMapDelsValors(String valors) {
if (valors == null)
return null;
Map<String, Object> resposta = new HashMap<String, Object>();
String[] parelles = valors.split(",");
for (int i = 0; i < parelles.length; i++) {
String[] parts = parelles[i].split(":");
if (parts.length == 2)
resposta.put(parts[0], parts[1]);
}
return resposta;
}
private String decodeValor (HttpServletRequest request){
// Procedim a fer un split de la URL per tal d'agafar el darrer paràmetre que és el valor del camp. Ho hem de
// fer així perquè es pot donar el cas que un d'aquests valors sigui el codi d'un valor de SELECCIÓ en la pantalla de tramitació
// d'una tasca, i pot ser que aquest codi acabi amb un espai en blanc, cosa que causa problemes a l'hora de recuperar el valor per codi
String[] splitValor = request.getRequestURI().split("/");
String valorFinal = "";
try {
valorFinal = URLDecoder.decode(splitValor[splitValor.length - 1],"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return valorFinal;
}
private static final Logger logger = LoggerFactory.getLogger(CampValorsController.class);
}