/**
*
*/
package net.conselldemallorca.helium.webapp.mvc;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.List;
import java.util.Set;
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.exportacio.DefinicioProcesExportacio;
import net.conselldemallorca.helium.core.model.hibernate.Consulta;
import net.conselldemallorca.helium.core.model.hibernate.ConsultaCamp;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
/**
* Controlador per la gestió de definicions de procés
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/definicioProces")
public class DefinicioProcesController extends BaseController {
private DissenyService dissenyService;
private ExpedientService expedientService;
private PermissionService permissionService;
@Autowired
public DefinicioProcesController(
DissenyService dissenyService,
ExpedientService expedientService,
PermissionService permissionService) {
this.dissenyService = dissenyService;
this.expedientService = expedientService;
this.permissionService = permissionService;
}
@RequestMapping(value = "llistat", method = RequestMethod.GET)
public String llistat(
HttpServletRequest request,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
if (potDissenyarEntorn(entorn)) {
model.addAttribute("llistat", dissenyService.findDarreresAmbEntorn(entorn.getId()));
return "definicioProces/llistat";
} else {
missatgeError(request, getMessage("error.permisos.disseny.entorn") );
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "info", method = RequestMethod.GET)
public String info(
HttpServletRequest request,
ModelMap model,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
DefinicioProcesDto definicioProces = dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId);
if (potDissenyarDefinicioProces(entorn, definicioProces)) {
model.addAttribute("command", new DeployCommand());
model.addAttribute("definicioProces", dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId));
model.addAttribute("subDefinicionsProces", dissenyService.findSubDefinicionsProces(definicioProcesId));
return "definicioProces/info";
} else {
missatgeError(request, getMessage("error.permisos.disseny.defproc") );
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "delete")
public String delete(
HttpServletRequest request,
ModelMap model,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
DefinicioProcesDto definicioProces = dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId);
if (potDissenyarDefinicioProces(entorn, definicioProces)) {
try {
List<ExpedientDto> expedients = expedientService.findAmbDefinicioProcesId(definicioProcesId);
List<Consulta> consultes = dissenyService.findConsultesAmbEntorn(entorn.getId());
boolean esborrar = true;
if (expedients.size() == 0) {
for(Consulta consulta: consultes){
Set<ConsultaCamp> llistat = consulta.getCamps();
for(ConsultaCamp c: llistat){
if((definicioProces.getVersio() == c.getDefprocVersio()) && (definicioProces.getJbpmKey().equals(c.getDefprocJbpmKey()))){
esborrar = false;
}
}
}
if(!esborrar){
missatgeError(request, getMessage("error.exist.cons") );
} else {
dissenyService.undeploy(entorn.getId(), null, definicioProcesId);
missatgeInfo(request, getMessage("info.defproc.esborrat") );
}
} else {
missatgeError(request, getMessage("error.exist.exp.defproc") );
}
} catch (Exception ex) {
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
logger.error("No s'ha pogut esborrar la definició de procés", ex);
return "redirect:/definicioProces/info.html?definicioProcesId=" + definicioProcesId;
}
return "redirect:/definicioProces/llistat.html";
} else {
missatgeError(request, getMessage("error.permisos.disseny.defproc"));
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "export")
public String export(
HttpServletRequest request,
ModelMap model,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
DefinicioProcesDto definicioProces = dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId);
if (potDissenyarDefinicioProces(entorn, definicioProces)) {
String filename = definicioProces.getJbpmKey();
if (definicioProces.getEtiqueta() != null)
filename = filename + "_" + definicioProces.getEtiqueta() + ".exp";
else
filename = filename + "_v" + definicioProces.getVersio() + ".exp";
model.addAttribute("filename", filename);
model.addAttribute("data", dissenyService.exportar(definicioProcesId));
return "serialitzarView";
} else {
missatgeError(request, getMessage("error.permisos.disseny.defproc"));
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "configurar")
public String configurar(
HttpServletRequest request,
@RequestParam(value = "submit", required = false) String submit,
@RequestParam("arxiu") final MultipartFile multipartFile,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
try {
InputStream is = new ByteArrayInputStream(multipartFile.getBytes());
ObjectInputStream input = new ObjectInputStream(is);
Object deserialitzat = input.readObject();
if (deserialitzat instanceof DefinicioProcesExportacio) {
DefinicioProcesExportacio exportacio = (DefinicioProcesExportacio)deserialitzat;
dissenyService.configurarAmbExportacio(
entorn.getId(),
definicioProcesId,
exportacio);
missatgeInfo(request, getMessage("info.dades.importat") );
return "redirect:/definicioProces/llistat.html";
} else {
missatgeError(request, getMessage("error.arxiu.no.valid") );
}
} catch (IOException ex) {
logger.error("Error llegint l'arxiu a importar", ex);
missatgeError(request, getMessage("error.arxiu.importar") );
} catch (ClassNotFoundException ex) {
logger.error("Error llegint l'arxiu a importar", ex);
missatgeError(request, getMessage("error.arxiu.importar") );
} catch (Exception ex) {
logger.error("Error al importar les dades", ex);
if (ex.getMessage() != null)
missatgeError(request, getMessage("error.import.dades") + ex.getMessage());
else
missatgeError(request, getMessage("error.import.dades"));
}
return "redirect:/definicioProces/info.html?definicioProcesId=" + definicioProcesId;
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "recursLlistat")
public String resources(
HttpServletRequest request,
ModelMap model,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
DefinicioProcesDto definicioProces = dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId);
if (potDissenyarDefinicioProces(entorn, definicioProces)) {
model.addAttribute("definicioProces", dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId));
model.addAttribute("recursos", dissenyService.findDeploymentResources(definicioProcesId));
return "definicioProces/recursLlistat";
} else {
missatgeError(request, getMessage("error.permisos.disseny.defproc"));
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "recursDescarregar")
public String resource(
HttpServletRequest request,
ModelMap model,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId,
@RequestParam(value = "resourceName", required = true) String resourceName) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
DefinicioProcesDto definicioProces = dissenyService.getByIdAmbComprovacio(entorn.getId(), definicioProcesId);
if (potDissenyarDefinicioProces(entorn, definicioProces)) {
model.addAttribute(
ArxiuView.MODEL_ATTRIBUTE_FILENAME,
resourceName);
model.addAttribute(
ArxiuView.MODEL_ATTRIBUTE_DATA,
dissenyService.getDeploymentResource(definicioProcesId, resourceName));
return "arxiuView";
} else {
missatgeError(request, getMessage("error.permisos.disseny.defproc"));
return "redirect:/index.html";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
private boolean potDissenyarDefinicioProces(Entorn entorn, DefinicioProcesDto definicioProces) {
if (potDissenyarEntorn(entorn))
return true;
if (definicioProces.getExpedientTipus() != null) {
return permissionService.filterAllowed(
definicioProces.getExpedientTipus(),
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.DESIGN}) != null;
}
return false;
}
private boolean potDissenyarEntorn(Entorn entorn) {
return permissionService.filterAllowed(
entorn,
Entorn.class,
new Permission[] {
ExtendedPermission.ADMINISTRATION,
ExtendedPermission.DESIGN}) != null;
}
public class DeployCommand {
private Long definicioProcesId;
private byte[] arxiu;
public Long getDefinicioProcesId() {
return definicioProcesId;
}
public void setDefinicioProcesId(Long definicioProcesId) {
this.definicioProcesId = definicioProcesId;
}
public byte[] getArxiu() {
return arxiu;
}
public void setArxiu(byte[] arxiu) {
this.arxiu = arxiu;
}
}
private static final Log logger = LogFactory.getLog(DefinicioProcesController.class);
}