/**
*
*/
package net.conselldemallorca.helium.core.model.service;
import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import net.conselldemallorca.helium.core.common.JbpmVars;
import net.conselldemallorca.helium.core.helperv26.DocumentHelper;
import net.conselldemallorca.helium.core.model.dao.DefinicioProcesDao;
import net.conselldemallorca.helium.core.model.dao.DocumentDao;
import net.conselldemallorca.helium.core.model.dao.DocumentStoreDao;
import net.conselldemallorca.helium.core.model.dao.ExpedientDao;
import net.conselldemallorca.helium.core.model.dao.PlantillaDocumentDao;
import net.conselldemallorca.helium.core.model.dao.RegistreDao;
import net.conselldemallorca.helium.core.model.dto.ArxiuDto;
import net.conselldemallorca.helium.core.model.dto.DocumentDto;
import net.conselldemallorca.helium.core.model.dto.ExpedientDto;
import net.conselldemallorca.helium.core.model.dto.InstanciaProcesDto;
import net.conselldemallorca.helium.core.model.dto.TascaDto;
import net.conselldemallorca.helium.core.model.exception.IllegalArgumentsException;
import net.conselldemallorca.helium.core.model.exception.TemplateException;
import net.conselldemallorca.helium.core.model.hibernate.DefinicioProces;
import net.conselldemallorca.helium.core.model.hibernate.Document;
import net.conselldemallorca.helium.core.model.hibernate.DocumentStore;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientLog.ExpedientLogAccioTipus;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.core.util.OpenOfficeUtils;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessInstance;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmTask;
/**
* Servei per a gestionar les descàrregues d'arxius
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class DocumentService {
private ExpedientDao expedientDao;
private DocumentDao documentDao;
private DefinicioProcesDao definicioProcesDao;
private PlantillaDocumentDao plantillaDocumentDao;
private DocumentStoreDao documentStoreDao;
private RegistreDao registreDao;
private JbpmHelper jbpmDao;
private DtoConverter dtoConverter;
private DocumentHelper documentHelper;
private ExpedientLogHelper expedientLogHelper;
private MessageSource messageSource;
private OpenOfficeUtils openOfficeUtils;
public Long guardarDocumentTasca(
Long entornId,
String taskInstanceId,
String documentCodi,
Date documentData,
String arxiuNom,
byte[] arxiuContingut) {
return guardarDocumentTasca(entornId, taskInstanceId, documentCodi, documentData, arxiuNom, arxiuContingut, null);
}
public Long guardarDocumentTasca(
Long entornId,
String taskInstanceId,
String documentCodi,
Date documentData,
String arxiuNom,
byte[] arxiuContingut,
String user) {
JbpmTask task = jbpmDao.getTaskById(taskInstanceId);
DocumentStore documentStore = documentHelper.getDocumentStore(
taskInstanceId,
task.getProcessInstanceId(),
documentCodi);
Expedient expedient = expedientDao.findAmbProcessInstanceId(
jbpmDao.getRootProcessInstance(task.getProcessInstanceId()).getId());
boolean creat = (documentStore == null);
if (creat) {
expedientLogHelper.afegirLogExpedientPerTasca(
taskInstanceId,
ExpedientLogAccioTipus.TASCA_DOCUMENT_AFEGIR,
documentCodi);
} else {
expedientLogHelper.afegirLogExpedientPerTasca(
taskInstanceId,
ExpedientLogAccioTipus.TASCA_DOCUMENT_MODIFICAR,
documentCodi);
}
String arxiuNomAntic = (documentStore != null) ? documentStore.getArxiuNom() : null;
Long documentStoreId = documentHelper.actualitzarDocument(
taskInstanceId,
task.getProcessInstanceId(),
documentCodi,
null,
documentData,
arxiuNom,
arxiuContingut,
false);
// Registra l'acció
if (user == null) user = SecurityContextHolder.getContext().getAuthentication().getName();
if (creat) {
registreDao.crearRegistreCrearDocumentTasca(
expedient.getId(),
taskInstanceId,
user,
documentCodi,
arxiuNom);
} else {
registreDao.crearRegistreModificarDocumentTasca(
expedient.getId(),
taskInstanceId,
user,
documentCodi,
arxiuNomAntic,
arxiuNom);
}
return documentStoreId;
}
public Long guardarDocumentProces(
String processInstanceId,
String documentCodi,
String adjuntTitol,
Date documentData,
String arxiuNom,
byte[] arxiuContingut,
boolean isAdjunt) {
return guardarDocumentProces(
processInstanceId,
documentCodi,
adjuntTitol,
documentData,
arxiuNom,
arxiuContingut,
isAdjunt,
null);
}
public Long guardarDocumentProces(
String processInstanceId,
String documentCodi,
String adjuntTitol,
Date documentData,
String arxiuNom,
byte[] arxiuContingut,
boolean isAdjunt,
String user) {
DocumentStore documentStore = documentHelper.getDocumentStore(
null,
processInstanceId,
documentCodi);
Expedient expedient = expedientDao.findAmbProcessInstanceId(
jbpmDao.getRootProcessInstance(processInstanceId).getId());
boolean creat = (documentStore == null);
if (!isAdjunt) {
if (creat) {
expedientLogHelper.afegirLogExpedientPerProces(
processInstanceId,
ExpedientLogAccioTipus.PROCES_DOCUMENT_AFEGIR,
documentCodi);
} else {
expedientLogHelper.afegirLogExpedientPerProces(
processInstanceId,
ExpedientLogAccioTipus.PROCES_DOCUMENT_MODIFICAR,
documentCodi);
}
}
String arxiuNomAntic = (documentStore != null) ? documentStore.getArxiuNom() : null;
Long documentStoreId = documentHelper.actualitzarDocument(
null,
processInstanceId,
documentCodi,
adjuntTitol,
documentData,
arxiuNom,
arxiuContingut,
isAdjunt);
if (user == null) {
user = SecurityContextHolder.getContext().getAuthentication().getName();
}
// Registra l'acció
if (creat) {
registreDao.crearRegistreCrearDocumentInstanciaProces(
expedient.getId(),
processInstanceId,
user,
documentCodi,
arxiuNom);
} else {
registreDao.crearRegistreModificarDocumentInstanciaProces(
expedient.getId(),
processInstanceId,
user,
documentCodi,
arxiuNomAntic,
arxiuNom);
}
return documentStoreId;
}
public Long guardarAdjunt(
String processInstanceId,
String adjuntId,
String adjuntTitol,
Date data,
String arxiuNom,
byte[] arxiuContingut) {
return guardarAdjunt(
processInstanceId,
adjuntId,
adjuntTitol,
data,
arxiuNom,
arxiuContingut,
null);
}
public Long guardarAdjunt(
String processInstanceId,
String adjuntId,
String adjuntTitol,
Date data,
String arxiuNom,
byte[] arxiuContingut,
String user) {
expedientLogHelper.afegirLogExpedientPerProces(
processInstanceId,
ExpedientLogAccioTipus.PROCES_DOCUMENT_ADJUNTAR,
adjuntTitol);
String documentCodi = (adjuntId == null) ? new Long(new Date().getTime()).toString() : adjuntId;
return guardarDocumentProces(
processInstanceId,
documentCodi,
adjuntTitol,
data,
arxiuNom,
arxiuContingut,
true,
user);
}
public void guardarDadesRegistre(
Long documentStoreId,
String registreNumero,
Date registreData,
String registreOficinaCodi,
String registreOficinaNom,
boolean registreEntrada) {
DocumentStore documentStore = documentStoreDao.getById(documentStoreId, false);
documentStore.setRegistreNumero(registreNumero);
documentStore.setRegistreData(registreData);
documentStore.setRegistreOficinaCodi(registreOficinaCodi);
documentStore.setRegistreOficinaNom(registreOficinaNom);
documentStore.setRegistreEntrada(registreEntrada);
}
public void esborrarDocument(
String taskInstanceId,
String processInstanceId,
String documentCodi) {
esborrarDocument(taskInstanceId, processInstanceId, documentCodi, null);
}
public void esborrarDocument(
String taskInstanceId,
String processInstanceId,
String documentCodi,
String user) {
String piid = processInstanceId;
if (piid == null && taskInstanceId != null) {
JbpmTask task = jbpmDao.getTaskById(taskInstanceId);
piid = task.getProcessInstanceId();
}
Expedient expedient = expedientDao.findAmbProcessInstanceId(
jbpmDao.getRootProcessInstance(piid).getId());
if (taskInstanceId != null) {
expedientLogHelper.afegirLogExpedientPerTasca(
taskInstanceId,
ExpedientLogAccioTipus.TASCA_DOCUMENT_ESBORRAR,
documentCodi);
} else {
expedientLogHelper.afegirLogExpedientPerProces(
piid,
ExpedientLogAccioTipus.PROCES_DOCUMENT_ESBORRAR,
documentCodi);
}
documentHelper.esborrarDocument(
taskInstanceId,
piid,
documentCodi);
if (user == null) {
user = SecurityContextHolder.getContext().getAuthentication().getName();
}
if (taskInstanceId != null) {
registreDao.crearRegistreEsborrarDocumentTasca(
expedient.getId(),
taskInstanceId,
user,
documentCodi);
} else {
registreDao.crearRegistreEsborrarDocumentInstanciaProces(
expedient.getId(),
piid,
user,
documentCodi);
}
}
public void esborrarDocumentAdjunt(
String processInstanceId,
Long docStoreId,
String adjuntId,
String adjuntTitol) {
Expedient expedient = expedientDao.findAmbProcessInstanceId(
jbpmDao.getRootProcessInstance(processInstanceId).getId());
expedientLogHelper.afegirLogExpedientPerProces(
processInstanceId,
ExpedientLogAccioTipus.PROCES_DOCUMENT_ESBORRAR,
adjuntTitol);
documentHelper.esborrarDocumentAdjunt(
docStoreId,
processInstanceId,
adjuntId);
String user = SecurityContextHolder.getContext().getAuthentication().getName();
registreDao.crearRegistreEsborrarDocumentInstanciaProces(
expedient.getId(),
processInstanceId,
user,
adjuntTitol);
}
public DocumentDto documentInfo(Long documentStoreId) {
return getDocumentInfo(documentStoreId);
}
public DocumentDto documentInfoPerToken(String token) {
try {
return getDocumentInfo(token);
} catch (Exception ex) {
logger.error("Error al obtenir el document amb token " + token, ex);
throw new IllegalArgumentsException(getMessage("error.document.obtenir"));
}
}
public DocumentDto documentPerTasca(
String taskInstanceId,
String documentCodi,
boolean ambContingut) {
return documentHelper.getDocumentOriginal(
taskInstanceId,
null,
documentCodi,
ambContingut);
}
public DocumentDto documentPerProces(
String procesInstanceId,
Long documentId,
boolean ambContingut) {
DocumentDto dto = null;
Document doc = documentDao.getById(documentId, false);
if (doc != null) {
dto = documentHelper.getDocumentOriginal(
null,
procesInstanceId,
doc.getCodi(),
ambContingut);
}
return dto;
}
public ArxiuDto arxiuDocumentPerMostrar(String token) throws Exception {
DocumentDto document = getDocumentInfo(token);
if (document == null)
return null;
if (document.isSignat() || document.isRegistrat()) {
return getArxiuDocumentVista(token);
} else {
return getArxiuDocumentOriginal(token);
}
}
public ArxiuDto arxiuDocumentPerMostrar(Long documentStoreId) throws Exception {
DocumentDto document = getDocumentInfo(documentStoreId);
if (document == null)
return null;
if (document.isSignat() || document.isRegistrat()) {
return getArxiuDocumentVista(documentStoreId);
} else {
return getArxiuDocumentOriginal(documentStoreId);
}
}
public ArxiuDto arxiuDocumentPerSignar(String token, boolean ambSegellSignatura) throws Exception {
DocumentDto dto = documentHelper.getDocumentVistaPerToken(token, true, ambSegellSignatura);
if (dto != null)
return new ArxiuDto(
dto.getVistaNom(),
dto.getVistaContingut());
else
return null;
}
public boolean signarDocumentTascaAmbToken(
String token,
byte[] signatura) throws Exception {
boolean signat = documentHelper.signarDocumentTascaAmbToken(token, signatura);
if (signat) {
DocumentDto dto = documentHelper.getDocumentOriginalPerToken(token, false);
JbpmProcessInstance rootProcessInstance = jbpmDao.getRootProcessInstance(dto.getProcessInstanceId());
Expedient expedient = expedientDao.findAmbProcessInstanceId(rootProcessInstance.getId());
registreDao.crearRegistreSignarDocument(
expedient.getId(),
dto.getProcessInstanceId(),
SecurityContextHolder.getContext().getAuthentication().getName(),
dto.getDocumentCodi());
}
return signat;
}
public DocumentDto generarDocumentPlantilla(
Long entornId,
Long documentId,
String taskInstanceId,
String processInstanceId,
Date dataDocument,
boolean forsarAdjuntarAuto) {
return generarDocumentPlantilla(
entornId,
documentId,
taskInstanceId,
processInstanceId,
dataDocument,
forsarAdjuntarAuto,
true,
null);
}
public DocumentDto generarDocumentPlantilla(
Long entornId,
Long documentId,
String taskInstanceId,
String processInstanceId,
Date dataDocument,
boolean forsarAdjuntarAuto,
String user) {
return generarDocumentPlantilla(
entornId,
documentId,
taskInstanceId,
processInstanceId,
dataDocument,
forsarAdjuntarAuto,
true,
user);
}
public DocumentDto generarDocumentPlantilla(
Long entornId,
Long documentId,
String taskInstanceId,
String processInstanceId,
Date dataDocument,
boolean forsarAdjuntarAuto,
boolean adjuntarAuto,
String user) {
Document document = documentDao.getById(documentId, false);
DocumentDto resposta = new DocumentDto();
resposta.setDataCreacio(new Date());
resposta.setDataDocument(new Date());
resposta.setArxiuNom(document.getNom() + ".odt");
resposta.setAdjuntarAuto(document.isAdjuntarAuto());
if (document.isPlantilla()) {
ExpedientDto expedient;
TascaDto tasca = null;
Map<String, Object> model = new HashMap<String, Object>();
String responsableCodi;
if (taskInstanceId != null) {
JbpmTask task = jbpmDao.getTaskById(taskInstanceId);
JbpmProcessInstance rootProcessInstance = jbpmDao.getRootProcessInstance(task.getProcessInstanceId());
expedient = dtoConverter.toExpedientDto(
expedientDao.findAmbProcessInstanceId(rootProcessInstance.getId()),
false);
String numExpedient="";
if(expedient.getNumero() == null){
numExpedient = "";
}else{
numExpedient = expedient.getNumero() + "-";
}
String titol = numExpedient + document.getNom()+".odt";
String carRemp ="\\/:*?\"<>|";
titol.replaceAll(carRemp, "_");
resposta.setArxiuNom(titol);
tasca = dtoConverter.toTascaDto(
task,
null,
true,
true,
true,
true,
false);
InstanciaProcesDto instanciaProces = dtoConverter.toInstanciaProcesDto(
task.getProcessInstanceId(),
true,
true,
true);
model.putAll(instanciaProces.getVarsComText());
model.putAll(tasca.getVarsComText());
responsableCodi = task.getAssignee();
} else {
JbpmProcessInstance rootProcessInstance = jbpmDao.getRootProcessInstance(processInstanceId);
expedient = dtoConverter.toExpedientDto(
expedientDao.findAmbProcessInstanceId(rootProcessInstance.getId()),
false);
responsableCodi = user == null ? SecurityContextHolder.getContext().getAuthentication().getName() : user;
InstanciaProcesDto instanciaProces = dtoConverter.toInstanciaProcesDto(
processInstanceId,
true,
true,
true);
model.putAll(instanciaProces.getVarsComText());
}
try {
byte[] resultat = plantillaDocumentDao.generarDocumentAmbPlantilla(
entornId,
document,
responsableCodi,
expedient,
(tasca != null) ? tasca.getProcessInstanceId() : processInstanceId,
tasca,
dataDocument,
model);
if (isActiuConversioVista()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
getOpenOfficeUtils().convertir(
resposta.getArxiuNom(),
resultat,
getExtensioVista(document),
baos);
resposta.setArxiuNom(
nomArxiuAmbExtensio(
resposta.getArxiuNom(),
getExtensioVista(document)));
resposta.setArxiuContingut(baos.toByteArray());
} else {
resposta.setArxiuContingut(resultat);
}
if (adjuntarAuto && (forsarAdjuntarAuto || document.isAdjuntarAuto())) {
documentHelper.actualitzarDocument(
taskInstanceId,
(processInstanceId != null) ? processInstanceId : tasca.getProcessInstanceId(),
document.getCodi(),
null,
dataDocument,
resposta.getArxiuNom(),
resposta.getArxiuContingut(),
false);
}
} catch (Exception ex) {
throw new TemplateException(
getMessage("error.tascaService.generarDocument"), ex);
}
} else {
resposta.setArxiuContingut(document.getArxiuContingut());
}
return resposta;
}
public boolean isExtensioDocumentPermesa(
String taskInstanceId,
String documentCodi,
String extensio) {
JbpmTask task = jbpmDao.getTaskById(taskInstanceId);
DefinicioProces definicioProces = definicioProcesDao.findAmbJbpmId(
task.getProcessDefinitionId());
Document document = documentDao.findAmbDefinicioProcesICodi(
definicioProces.getId(),
documentCodi);
return document.isExtensioPermesa(extensio);
}
public String getDocumentCodiPerDocumentStoreId(Long documentStoreId) {
DocumentStore documentStore = documentStoreDao.getById(documentStoreId, false);
String varJbpm = documentStore.getJbpmVariable();
if (documentStore.isAdjunt())
return varJbpm.substring(JbpmVars.PREFIX_ADJUNT.length());
else
return varJbpm.substring(JbpmVars.PREFIX_DOCUMENT.length());
}
@Autowired
public void setExpedientDao(ExpedientDao expedientDao) {
this.expedientDao = expedientDao;
}
@Autowired
public void setDocumentDao(DocumentDao documentDao) {
this.documentDao = documentDao;
}
@Autowired
public void setDefinicioProcesDao(DefinicioProcesDao definicioProcesDao) {
this.definicioProcesDao = definicioProcesDao;
}
@Autowired
public void setPlantillaDocumentDao(PlantillaDocumentDao plantillaDocumentDao) {
this.plantillaDocumentDao = plantillaDocumentDao;
}
@Autowired
public void setDocumentStoreDao(DocumentStoreDao documentStoreDao) {
this.documentStoreDao = documentStoreDao;
}
@Autowired
public void setRegistreDao(RegistreDao registreDao) {
this.registreDao = registreDao;
}
@Autowired
public void setJbpmHelper(JbpmHelper jbpmDao) {
this.jbpmDao = jbpmDao;
}
@Autowired
public void setDtoConverter(DtoConverter dtoConverter) {
this.dtoConverter = dtoConverter;
}
@Autowired
public void setDocumentHelper(DocumentHelper documentHelper) {
this.documentHelper = documentHelper;
}
@Autowired
public void setExpedientLogHelper(ExpedientLogHelper expedientLogHelper) {
this.expedientLogHelper = expedientLogHelper;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
private DocumentDto getDocumentInfo(String token) {
return documentHelper.getDocumentOriginalPerToken(token, false);
}
private DocumentDto getDocumentInfo(Long documentStoreId) {
return documentHelper.getDocumentOriginal(documentStoreId, false);
}
private ArxiuDto getArxiuDocumentOriginal(String token) {
DocumentDto dto = documentHelper.getDocumentOriginalPerToken(token, true);
if (dto == null)
return null;
return new ArxiuDto(
dto.getArxiuNom(),
dto.getArxiuContingut());
}
private ArxiuDto getArxiuDocumentOriginal(Long documentStoreId) {
DocumentDto dto = documentHelper.getDocumentOriginal(documentStoreId, true);
if (dto == null)
return null;
return new ArxiuDto(
dto.getArxiuNom(),
dto.getArxiuContingut());
}
private ArxiuDto getArxiuDocumentVista(String token) throws Exception {
DocumentDto dto = documentHelper.getDocumentVistaPerToken(token, false, false);
if (dto == null)
return null;
return new ArxiuDto(
dto.getVistaNom(),
dto.getVistaContingut());
}
private ArxiuDto getArxiuDocumentVista(Long documentStoreId) throws Exception {
DocumentDto dto = documentHelper.getDocumentVista(documentStoreId, false, false);
if (dto == null)
return null;
return new ArxiuDto(
dto.getVistaNom(),
dto.getVistaContingut());
}
private boolean isActiuConversioVista() {
String actiuConversio = (String)GlobalProperties.getInstance().get("app.conversio.actiu");
if (!"true".equalsIgnoreCase(actiuConversio))
return false;
String actiuConversioVista = (String)GlobalProperties.getInstance().get("app.conversio.vista.actiu");
if (actiuConversioVista == null)
actiuConversioVista = (String)GlobalProperties.getInstance().get("app.conversio.gentasca.actiu");
return "true".equalsIgnoreCase(actiuConversioVista);
}
private String getExtensioVista(Document document) {
String extensioVista = null;
if (isActiuConversioVista()) {
if (document.getConvertirExtensio() != null && document.getConvertirExtensio().length() > 0) {
extensioVista = document.getConvertirExtensio();
} else {
extensioVista = (String)GlobalProperties.getInstance().get("app.conversio.vista.extension");
if (extensioVista == null)
extensioVista = (String)GlobalProperties.getInstance().get("app.conversio.gentasca.extension");
}
}
return extensioVista;
}
private String nomArxiuAmbExtensio(String fileName, String extensio) {
if (extensio == null || extensio.length() == 0)
return fileName;
int indexPunt = fileName.lastIndexOf(".");
if (indexPunt != -1) {
String nom = fileName.substring(0, indexPunt);
return nom + "." + extensio;
} else {
return fileName + "." + extensio;
}
}
private OpenOfficeUtils getOpenOfficeUtils() {
if (openOfficeUtils == null)
openOfficeUtils = new OpenOfficeUtils();
return openOfficeUtils;
}
protected String getMessage(String key, Object[] vars) {
try {
return messageSource.getMessage(
key,
vars,
null);
} catch (NoSuchMessageException ex) {
return "???" + key + "???";
}
}
protected String getMessage(String key) {
return getMessage(key, null);
}
private static final Log logger = LogFactory.getLog(DocumentService.class);
public void esborrarVariableInstance(String processInstanceId, String adjuntId) {
documentHelper.esborrarVariableInstance(
processInstanceId,
adjuntId);
}
}