/**
*
*/
package net.conselldemallorca.helium.webapp.mvc;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.conselldemallorca.helium.core.model.dto.DefinicioProcesDto;
import net.conselldemallorca.helium.core.model.dto.ExpedientDto;
import net.conselldemallorca.helium.core.model.exception.ExpedientRepetitException;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.Expedient.IniciadorTipus;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
import net.conselldemallorca.helium.core.model.service.DissenyService;
import net.conselldemallorca.helium.core.model.service.ExpedientService;
import net.conselldemallorca.helium.core.model.service.PermissionService;
import net.conselldemallorca.helium.core.security.ExtendedPermission;
import net.conselldemallorca.helium.webapp.mvc.util.BaseController;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.acls.model.Permission;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
* Controlador per iniciar un expedient
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
public class ExpedientIniciarController extends BaseController {
public static final String CLAU_SESSIO_TASKID = "iniciexp_taskId";
public static final String CLAU_SESSIO_TITOL = "iniciexp_titol";
public static final String CLAU_SESSIO_NUMERO = "iniciexp_numero";
public static final String CLAU_SESSIO_ANY = "iniciexp_any";
public static final String CLAU_SESSIO_FORM_VALIDAT = "iniciexp_form_validat";
public static final String CLAU_SESSIO_FORM_COMMAND = "iniciexp_form_command";
public static final String CLAU_SESSIO_FORM_VALORS = "iniciexp_form_registres";
public static final String CLAU_SESSIO_PREFIX_REGISTRE = "ExpedientIniciarController_reg_";
private DissenyService dissenyService;
private ExpedientService expedientService;
private PermissionService permissionService;
@Autowired
public ExpedientIniciarController(
DissenyService dissenyService,
ExpedientService expedientService,
PermissionService permissionService) {
this.dissenyService = dissenyService;
this.expedientService = expedientService;
this.permissionService = permissionService;
}
@ModelAttribute("command")
public ExpedientIniciarPasTitolCommand populateCommand(
@RequestParam(value = "expedientTipusId", required = false) Long expedientTipusId) {
if (expedientTipusId != null) {
ExpedientIniciarPasTitolCommand command = new ExpedientIniciarPasTitolCommand();
command.setExpedientTipusId(expedientTipusId);
return command;
}
return null;
}
@RequestMapping(value = "/expedient/iniciar", method = RequestMethod.GET)
public String iniciarGet(
HttpServletRequest request,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<ExpedientTipus> tipus = dissenyService.findExpedientTipusAmbEntorn(entorn.getId());
permissionService.filterAllowed(
tipus,
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.CREATE});
Map<Long, DefinicioProcesDto> definicionsProces = new HashMap<Long, DefinicioProcesDto>();
Iterator<ExpedientTipus> it = tipus.iterator();
while (it.hasNext()) {
ExpedientTipus expedientTipus = it.next();
DefinicioProcesDto darrera = dissenyService.findDarreraDefinicioProcesForExpedientTipus(expedientTipus.getId(), true);
if (darrera != null)
definicionsProces.put(expedientTipus.getId(), darrera);
else
it.remove();
}
model.addAttribute("expedientTipus", tipus);
model.addAttribute("definicionsProces", definicionsProces);
return "expedient/iniciar";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/expedient/iniciar", method = RequestMethod.POST)
public String iniciarPost(
HttpServletRequest request,
@RequestParam(value = "expedientTipusId", required = true) Long expedientTipusId,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
ExpedientTipus tipus = dissenyService.getExpedientTipusById(expedientTipusId);
if (potIniciarExpedientTipus(tipus)) {
netejarSessio(request);
generarTaskIdSessio(request);
// Si l'expedient requereix dades inicials redirigeix al pas per demanar
// aquestes dades
DefinicioProcesDto definicioProces = null;
if (definicioProcesId != null)
definicioProces = dissenyService.getById(definicioProcesId, true);
else
definicioProces = dissenyService.findDarreraDefinicioProcesForExpedientTipus(expedientTipusId, true);
if (definicioProces.isHasStartTask()) {
if (definicioProcesId != null)
return "redirect:/expedient/iniciarPasForm.html?expedientTipusId=" + expedientTipusId + "&definicioProcesId=" + definicioProcesId;
else
return "redirect:/expedient/iniciarPasForm.html?expedientTipusId=" + expedientTipusId;
}
// Si l'expedient no requereix dades inicials però ha de demanar titol i/o número
// redirigeix al pas per demanar aquestes dades
if (tipus.getDemanaNumero().booleanValue() || tipus.getDemanaTitol().booleanValue() || tipus.isSeleccionarAny()) {
if (definicioProcesId != null)
return "redirect:/expedient/iniciarPasTitol.html?expedientTipusId=" + expedientTipusId + "&definicioProcesId=" + definicioProcesId;
else
return "redirect:/expedient/iniciarPasTitol.html?expedientTipusId=" + expedientTipusId;
}
// Si no requereix cap pas addicional inicia l'expedient directament
try {
ExpedientDto iniciat = iniciarExpedient(
entorn.getId(),
expedientTipusId,
definicioProcesId);
missatgeInfo(
request,
getMessage(
"info.expedient.iniciat",
new Object[] {iniciat.getIdentificador()}));
} catch (ExpedientRepetitException ex) {
missatgeError(
request,
getMessage("error.exist.exp.mateix.numero"));
} catch (Exception ex) {
missatgeError(
request,
getMessage("error.iniciar.expedient"),
(ex.getCause() != null) ? ex.getCause().getMessage() : ex.getMessage());
logger.error("No s'ha pogut iniciar l'expedient", ex);
}
} else {
missatgeError(request, getMessage("error.permisos.iniciar.tipus.exp") );
}
return "redirect:/expedient/iniciar.html";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@SuppressWarnings("unchecked")
public static void netejarSessio(HttpServletRequest request) {
Enumeration<String> atributs = request.getSession().getAttributeNames();
while (atributs.hasMoreElements()) {
String atribut = atributs.nextElement();
if (atribut.startsWith(ExpedientIniciarController.CLAU_SESSIO_PREFIX_REGISTRE))
request.getSession().removeAttribute(atribut);
}
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_TASKID);
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_NUMERO);
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_TITOL);
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_FORM_VALIDAT);
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_FORM_COMMAND);
request.getSession().removeAttribute(ExpedientIniciarController.CLAU_SESSIO_FORM_VALORS);
}
public static String getClauSessioCampRegistre(String campCodi) {
return ExpedientIniciarController.CLAU_SESSIO_PREFIX_REGISTRE + campCodi;
}
private boolean potIniciarExpedientTipus(ExpedientTipus expedientTipus) {
return permissionService.filterAllowed(
expedientTipus,
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.CREATE}) != null;
}
private void generarTaskIdSessio(HttpServletRequest request) {
request.getSession().setAttribute(
ExpedientIniciarController.CLAU_SESSIO_TASKID,
"TIE_" + System.currentTimeMillis());
}
private synchronized ExpedientDto iniciarExpedient(
Long entornId,
Long expedientTipusId,
Long definicioProcesId) {
return expedientService.iniciar(
entornId,
null,
expedientTipusId,
definicioProcesId,
null,
null,
null,
null,
null,
null,
null,
false,
null,
null,
null,
null,
null,
null,
false,
null,
null,
false,
null,
null,
IniciadorTipus.INTERN,
null,
null,
null,
null);
}
private static final Log logger = LogFactory.getLog(ExpedientIniciarController.class);
}