/** * */ package net.conselldemallorca.helium.v3.core.service; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.Resource; import org.springframework.cache.annotation.Cacheable; import org.springframework.security.acls.model.Permission; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import edu.emory.mathcs.backport.java.util.Collections; import net.conselldemallorca.helium.core.extern.domini.FilaResultat; import net.conselldemallorca.helium.core.extern.domini.ParellaCodiValor; import net.conselldemallorca.helium.core.helper.ConversioTipusHelper; import net.conselldemallorca.helium.core.helper.DominiHelper; import net.conselldemallorca.helium.core.helper.ExpedientHelper; import net.conselldemallorca.helium.core.helper.ExpedientLoggerHelper; import net.conselldemallorca.helium.core.helper.MessageHelper; import net.conselldemallorca.helium.core.helper.PermisosHelper; import net.conselldemallorca.helium.core.helper.PermisosHelper.ObjectIdentifierExtractor; import net.conselldemallorca.helium.core.helperv26.MesuresTemporalsHelper; import net.conselldemallorca.helium.core.model.hibernate.Area; import net.conselldemallorca.helium.core.model.hibernate.CampTasca; import net.conselldemallorca.helium.core.model.hibernate.Consulta; import net.conselldemallorca.helium.core.model.hibernate.DefinicioProces; import net.conselldemallorca.helium.core.model.hibernate.Entorn; import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus; import net.conselldemallorca.helium.core.model.hibernate.Tasca; import net.conselldemallorca.helium.core.security.ExtendedPermission; import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper; import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessDefinition; import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessInstance; import net.conselldemallorca.helium.v3.core.api.dto.AreaDto; import net.conselldemallorca.helium.v3.core.api.dto.CampDto; import net.conselldemallorca.helium.v3.core.api.dto.ConsultaDto; import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesDto; import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesExpedientDto; import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesVersioDto; import net.conselldemallorca.helium.v3.core.api.dto.EntornDto; import net.conselldemallorca.helium.v3.core.api.dto.EstatDto; import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTipusDto; import net.conselldemallorca.helium.v3.core.api.dto.ParellaCodiValorDto; import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException; import net.conselldemallorca.helium.v3.core.api.exception.PermisDenegatException; import net.conselldemallorca.helium.v3.core.api.service.DissenyService; import net.conselldemallorca.helium.v3.core.repository.AccioRepository; import net.conselldemallorca.helium.v3.core.repository.AreaRepository; import net.conselldemallorca.helium.v3.core.repository.CampRepository; import net.conselldemallorca.helium.v3.core.repository.CampTascaRepository; import net.conselldemallorca.helium.v3.core.repository.ConsultaRepository; import net.conselldemallorca.helium.v3.core.repository.DefinicioProcesRepository; import net.conselldemallorca.helium.v3.core.repository.EntornRepository; import net.conselldemallorca.helium.v3.core.repository.EstatRepository; import net.conselldemallorca.helium.v3.core.repository.ExpedientTipusRepository; import net.conselldemallorca.helium.v3.core.repository.TascaRepository; import net.conselldemallorca.helium.v3.core.repository.TerminiIniciatRepository; /** * Servei per gestionar les tasques de disseny. * * @author Limit Tecnologies <limit@limit.es> */ @Service("dissenyServiceV3") public class DissenyServiceImpl implements DissenyService { @Resource private EntornRepository entornRepository; @Resource private ExpedientHelper expedientHelper; @Resource private MessageHelper messageHelper; @Resource private ExpedientLoggerHelper expedientLoggerHelper; @Resource private TerminiIniciatRepository terminiIniciatRepository; @Resource private JbpmHelper jbpmHelper; @Resource private DefinicioProcesRepository definicioProcesRepository; @Resource private MesuresTemporalsHelper mesuresTemporalsHelper; @Resource private CampRepository campRepository; @Resource private ExpedientTipusRepository expedientTipusRepository; @Resource private EstatRepository estatRepository; @Resource private ConsultaRepository consultaRepository; @Resource private ConversioTipusHelper conversioTipusHelper; @Resource(name = "permisosHelperV3") private PermisosHelper permisosHelper; @Resource private TascaRepository tascaRepository; @Resource private CampTascaRepository campTascaRepository; @Resource private AccioRepository accioRepository; @Resource private AreaRepository areaRepository; @Resource private DominiHelper dominiHelper; @Transactional(readOnly=true) @Override public AreaDto findAreaById(Long areaId) { Area area = areaRepository.findOne(areaId); if (area == null) throw new NoTrobatException(Area.class, areaId); return conversioTipusHelper.convertir( area, AreaDto.class); } @Transactional(readOnly=true) @Override public List<EstatDto> findEstatByExpedientTipus(Long expedientTipusId){ ExpedientTipus expedientTipus = expedientTipusRepository.findOne( expedientTipusId); if (expedientTipus == null) throw new NoTrobatException( ExpedientTipus.class, expedientTipusId); return conversioTipusHelper.convertirList( estatRepository.findByExpedientTipusOrderByOrdreAsc(expedientTipus), EstatDto.class); } private void getAllDefinicioProcesOrderByVersio (DefinicioProcesDto definicioProcesDto) { JbpmProcessDefinition jb = jbpmHelper.getProcessDefinition(definicioProcesDto.getJbpmId()); definicioProcesDto.setEtiqueta(jb.getProcessDefinition().getName()+" v."+jb.getVersion()); List<DefinicioProces> mateixaKeyIEntorn = definicioProcesRepository.findByEntornIdAndJbpmKeyOrderByVersioDesc( definicioProcesDto.getEntorn().getId(), definicioProcesDto.getJbpmKey()); definicioProcesDto.setIdsWithSameKey(new Long[mateixaKeyIEntorn.size()]); definicioProcesDto.setIdsMostrarWithSameKey(new String[mateixaKeyIEntorn.size()]); definicioProcesDto.setJbpmIdsWithSameKey(new String[mateixaKeyIEntorn.size()]); for (int i = 0; i < mateixaKeyIEntorn.size(); i++) { definicioProcesDto.getIdsWithSameKey()[i] = mateixaKeyIEntorn.get(i).getId(); definicioProcesDto.getIdsMostrarWithSameKey()[i] = mateixaKeyIEntorn.get(i).getIdPerMostrar(); definicioProcesDto.getJbpmIdsWithSameKey()[i] = mateixaKeyIEntorn.get(i).getJbpmId(); } } @Transactional(readOnly=true) @Override public DefinicioProcesVersioDto getByVersionsInstanciaProcesById(String processInstanceId) { JbpmProcessInstance pi = jbpmHelper.getProcessInstance(processInstanceId); if (pi == null) throw new NoTrobatException(JbpmProcessInstance.class, processInstanceId); DefinicioProces definicioProces = definicioProcesRepository.findByJbpmId(pi.getProcessDefinitionId()); if (definicioProces == null) throw new NoTrobatException(DefinicioProces.class, pi.getProcessDefinitionId()); DefinicioProcesVersioDto dto = new DefinicioProcesVersioDto(); dto.setId(definicioProces.getId()); dto.setVersio(definicioProces.getVersio()); List<DefinicioProces> listDefProces = definicioProcesRepository.findByEntornIdAndJbpmKeyOrderByVersioDesc(definicioProces.getEntorn().getId(), definicioProces.getJbpmKey()); for (DefinicioProces defProces : listDefProces) { dto.addVersioAmbEtiqueta(defProces.getVersio(), pi.getProcessInstance().getProcessDefinition().getName() + " v." + defProces.getVersio()); if (defProces.getVersio() == definicioProces.getVersio()) { dto.setEtiqueta(pi.getProcessInstance().getProcessDefinition().getName() + " v." + defProces.getVersio()); } } return dto; } @Transactional(readOnly=true) @Override public DefinicioProcesExpedientDto getDefinicioProcesByTipusExpedientById(Long expedientTipusId) { ExpedientTipus expedientTipus = expedientTipusRepository.findOne(expedientTipusId); if (expedientTipus != null && expedientTipus.getJbpmProcessDefinitionKey() != null) { DefinicioProces definicioProces = definicioProcesRepository.findDarreraVersioAmbEntornIJbpmKey( expedientTipus.getEntorn().getId(), expedientTipus.getJbpmProcessDefinitionKey()); if (definicioProces != null) { JbpmProcessDefinition jb = jbpmHelper.getProcessDefinition(definicioProces.getJbpmId()); return getDefinicioProcesByEntornIdAmbJbpmId( definicioProces.getEntorn().getId(), jb.getKey(), conversioTipusHelper.convertir( expedientTipus, ExpedientTipusDto.class)); } } return null; } @Transactional(readOnly=true) @Override public List<DefinicioProcesExpedientDto> getSubprocessosByProces(String jbpmId) { DefinicioProces definicioProces = definicioProcesRepository.findByJbpmId(jbpmId); if (definicioProces == null) throw new NoTrobatException(DefinicioProces.class, jbpmId); List<String> jbpmIds = new ArrayList<String>(); afegirJbpmIdProcesAmbSubprocessos(jbpmHelper.getProcessDefinition(jbpmId), jbpmIds, false); List<DefinicioProcesExpedientDto> subprocessos = new ArrayList<DefinicioProcesExpedientDto>(); for(String id: jbpmIds){ JbpmProcessDefinition jb = jbpmHelper.getProcessDefinition(id); subprocessos.add(getDefinicioProcesByEntornIdAmbJbpmId(definicioProces.getEntorn().getId(), jb.getKey(), null)); } return subprocessos; } private DefinicioProcesExpedientDto getDefinicioProcesByEntornIdAmbJbpmId(Long entornId, String jbpmKey, ExpedientTipusDto expedientTipus) { DefinicioProcesExpedientDto dto = new DefinicioProcesExpedientDto(); DefinicioProces definicioProces = definicioProcesRepository.findDarreraVersioAmbEntornIJbpmKey(entornId, jbpmKey); if (definicioProces != null) { JbpmProcessDefinition jb = jbpmHelper.getProcessDefinition(definicioProces.getJbpmId()); dto.setId(definicioProces.getId()); dto.setJbpmId(definicioProces.getJbpmId()); dto.setJbpmKey(definicioProces.getJbpmKey()); dto.setVersio(definicioProces.getVersio()); List<DefinicioProces> listDefProces = definicioProcesRepository.findByEntornIdAndJbpmKeyOrderByVersioDesc(definicioProces.getEntorn().getId(), definicioProces.getJbpmKey()); boolean demanaNumeroTitol = false; if (expedientTipus != null) demanaNumeroTitol = (expedientTipus.isTeNumero() && expedientTipus.isDemanaNumero()) || (expedientTipus.isTeTitol() && expedientTipus.isDemanaTitol()); for (DefinicioProces defProces : listDefProces) { Map<Long, Boolean> hasStartTask = new HashMap<Long, Boolean>(); dto.addIdAmbEtiquetaId( defProces.getId(), defProces.getJbpmId(), jb.getName() + " v." + defProces.getVersio(), hasStartTask(definicioProces, hasStartTask), demanaNumeroTitol); if (defProces.getVersio() == definicioProces.getVersio()) { dto.setEtiqueta(jb.getName() + " v." + defProces.getVersio()); } } return dto; } return null; } private void afegirJbpmIdProcesAmbSubprocessos( JbpmProcessDefinition jpd, List<String> jbpmIds, Boolean incloure) { if (jpd != null) { List<JbpmProcessDefinition> subPds = jbpmHelper.getSubProcessDefinitions(jpd.getId()); if (subPds != null) { for (JbpmProcessDefinition subPd: subPds) { afegirJbpmIdProcesAmbSubprocessos(subPd, jbpmIds, true); if (!jbpmIds.contains(subPd.getId())) jbpmIds.add(subPd.getId()); } } if (!jbpmIds.contains(jpd.getId()) && incloure) jbpmIds.add(jpd.getId()); } } @Transactional(readOnly=true) @Override public DefinicioProcesDto getById(Long id) { DefinicioProces definicioProces = definicioProcesRepository.findById(id); if (definicioProces != null) { return conversioTipusHelper.convertir(definicioProces, DefinicioProcesDto.class); } return null; } @Transactional(readOnly=true) @Override public DefinicioProcesDto findDarreraDefinicioProcesForExpedientTipus(Long expedientTipusId) { ExpedientTipusDto expedientTipus = getExpedientTipusById(expedientTipusId); if (expedientTipus.getJbpmProcessDefinitionKey() != null) { DefinicioProces definicioProces = definicioProcesRepository.findDarreraVersioAmbEntornIJbpmKey( expedientTipus.getEntorn().getId(), expedientTipus.getJbpmProcessDefinitionKey()); if (definicioProces != null) { DefinicioProcesDto dto = conversioTipusHelper.convertir(definicioProces, DefinicioProcesDto.class); Map<Long, Boolean> hasStartTask = new HashMap<Long, Boolean>(); dto.setHasStartTask(hasStartTask(definicioProces, hasStartTask)); getAllDefinicioProcesOrderByVersio(dto); return dto; } } return null; } private boolean hasStartTask(DefinicioProces definicioProces, Map<Long, Boolean> hasStartTask) { Long definicioProcesId = definicioProces.getId(); Boolean result = hasStartTask.get(definicioProcesId); if (result == null) { result = new Boolean(false); String startTaskName = jbpmHelper.getStartTaskName( definicioProces.getJbpmId()); if (startTaskName != null) { Tasca tasca = tascaRepository.findByJbpmNameAndDefinicioProcesJbpmId( startTaskName, definicioProces.getJbpmId()); if (tasca != null) { List<CampTasca> camps = campTascaRepository.findAmbTascaOrdenats(tasca.getId()); result = new Boolean(camps.size() > 0); } } hasStartTask.put(definicioProcesId, result); } return result.booleanValue(); } @Transactional(readOnly=true) @Override public ExpedientTipusDto getExpedientTipusById(Long id) { ExpedientTipus expedientTipus = expedientTipusRepository.findById(id); if (expedientTipus == null) throw new NoTrobatException(ExpedientTipus.class, id); return conversioTipusHelper.convertir( expedientTipus, ExpedientTipusDto.class); } @Transactional(readOnly=true) @Override public List<ExpedientTipusDto> findExpedientTipusAmbPermisReadUsuariActual( Long entornId){ return findExpedientTipusAmbPermisosUsuariActual( entornId, new Permission[] { ExtendedPermission.READ, ExtendedPermission.SUPERVISION, ExtendedPermission.ADMINISTRATION}); } @Transactional(readOnly=true) @Override public List<ExpedientTipusDto> findExpedientTipusAmbPermisDissenyUsuariActual( Long entornId) { return findExpedientTipusAmbPermisosUsuariActual( entornId, new Permission[] { ExtendedPermission.DESIGN, ExtendedPermission.ADMINISTRATION}); } @Transactional(readOnly=true) @Override public List<ExpedientTipusDto> findExpedientTipusAmbPermisGestioUsuariActual( Long entornId) { return findExpedientTipusAmbPermisosUsuariActual( entornId, new Permission[] { ExtendedPermission.MANAGE, ExtendedPermission.ADMINISTRATION}); } @Transactional(readOnly=true) @Override public List<ExpedientTipusDto> findExpedientTipusAmbPermisCrearUsuariActual( Long entornId) { return findExpedientTipusAmbPermisosUsuariActual( entornId, new Permission[] { ExtendedPermission.CREATE, ExtendedPermission.ADMINISTRATION}); } @Transactional(readOnly=true) @Override public ExpedientTipusDto findExpedientTipusAmbPermisReadUsuariActual( Long entornId, Long expedientTipusId) { Entorn entorn = entornRepository.findOne(entornId); if (entorn == null) { throw new NoTrobatException( Entorn.class, entornId); } Permission[] permisosRequerits= new Permission[] { ExtendedPermission.READ, ExtendedPermission.ADMINISTRATION}; boolean permes = permisosHelper.isGrantedAny( expedientTipusId, ExpedientTipus.class, permisosRequerits, SecurityContextHolder.getContext().getAuthentication()); if (!permes) { throw new PermisDenegatException( expedientTipusId, ExpedientTipus.class, permisosRequerits, null); } ExpedientTipus expedientTipus = expedientTipusRepository.findOne( expedientTipusId); if (expedientTipus.getEntorn() != entorn) { throw new NoTrobatException( ExpedientTipus.class, expedientTipusId); } List<ExpedientTipusDto> dtos = new ArrayList<ExpedientTipusDto>(); dtos.add(conversioTipusHelper.convertir( expedientTipus, ExpedientTipusDto.class)); expedientHelper.omplirPermisosExpedientsTipus(dtos); return dtos.get(0); } private List<ExpedientTipusDto> findExpedientTipusAmbPermisosUsuariActual( Long entornId, Permission[] permisos) { Entorn entorn = entornRepository.findOne(entornId); if (entorn == null) throw new NoTrobatException( Entorn.class, entornId); List<ExpedientTipus> expedientsTipus = expedientTipusRepository.findByEntornOrderByNomAsc(entorn); permisosHelper.filterGrantedAny( expedientsTipus, new ObjectIdentifierExtractor<ExpedientTipus>() { public Long getObjectIdentifier(ExpedientTipus expedientTipus) { return expedientTipus.getId(); } }, ExpedientTipus.class, permisos, SecurityContextHolder.getContext().getAuthentication()); List<ExpedientTipusDto> dtos = conversioTipusHelper.convertirList( expedientsTipus, ExpedientTipusDto.class); expedientHelper.omplirPermisosExpedientsTipus(dtos); return dtos; } @Transactional(readOnly=true) @Override @Cacheable(value="consultaCache", key="{#entornId, #expedientTipusId}") public List<ConsultaDto> findConsultesActivesAmbEntornIExpedientTipusOrdenat( Long entornId, Long expedientTipusId) throws NoTrobatException { Entorn entorn = entornRepository.findOne(entornId); if (entorn == null) throw new NoTrobatException( Entorn.class, entornId); ExpedientTipus expedientTipus = expedientTipusRepository.findOne( expedientTipusId); if (expedientTipus == null) throw new NoTrobatException( ExpedientTipus.class, expedientTipusId); return conversioTipusHelper.convertirList( consultaRepository.findConsultesActivesAmbEntornIExpedientTipusOrdenat(entornId, expedientTipusId), ConsultaDto.class); } @Transactional(readOnly=true) @Override public ConsultaDto findConsulteById( Long id) { Consulta consulta = consultaRepository.findOne(id); if (consulta == null) throw new NoTrobatException(Consulta.class, id); return conversioTipusHelper.convertir(consulta, ConsultaDto.class); } @Transactional(readOnly=true) @Override public byte[] getDeploymentResource( Long definicioProcesId, String resourceName) { DefinicioProces definicioProces = definicioProcesRepository.findById(definicioProcesId); if (definicioProces == null) throw new NoTrobatException(DefinicioProces.class, definicioProcesId); return jbpmHelper.getResourceBytes( definicioProces.getJbpmId(), resourceName); } @Transactional(readOnly=true) @Override public List<ExpedientTipusDto> findExpedientTipusAmbEntorn(EntornDto entornDto) { Entorn entorn = conversioTipusHelper.convertir(entornDto, Entorn.class); if (entorn == null) throw new NoTrobatException(Entorn.class, entornDto.getCodi()); return getExpedientTipusAmbEntorn(entorn); } @Transactional(readOnly=true) @Override public List<ParellaCodiValorDto> findTasquesAmbEntornIExpedientTipusPerSeleccio( Long entornId, Long expedientTipusId) { List<Long> ids = new ArrayList<Long>(); Set<Object[]> tasques = new HashSet<Object[]>(); if (expedientTipusId.equals(-1L)) { List<ExpedientTipusDto> tipusExpedient = findExpedientTipusAmbPermisReadUsuariActual(entornId); for (ExpedientTipusDto tipus : tipusExpedient) { ids.addAll(definicioProcesRepository.findIdsDarreraVersioAmbEntornIdIExpedientTipusId( tipus.getEntorn().getId(), tipus.getId())); } if (ids.size() > 0) tasques.addAll( tascaRepository.findIdNomByExpedientTipusOrderByExpedientTipusNomAndNomAsc(ids)); } ExpedientTipus expedientTipus = expedientTipusRepository.findOne(expedientTipusId); if (expedientTipus != null && expedientTipus.getJbpmProcessDefinitionKey() != null) { ids.addAll(definicioProcesRepository.findIdsDarreraVersioAmbEntornIdIExpedientTipusId( expedientTipus.getEntorn().getId(), expedientTipus.getId())); tasques.addAll(tascaRepository.findIdNomByDefinicioProcesIdsOrderByNomAsc(ids)); } List<ParellaCodiValorDto> lista = new ArrayList<ParellaCodiValorDto>(); for (Object[] tasca: tasques) { lista.add(new ParellaCodiValorDto(tasca[0].toString(), tasca[1])); } Collections.sort( lista, new Comparator<ParellaCodiValorDto>() { public int compare(ParellaCodiValorDto p1, ParellaCodiValorDto p2) { if (p1 != null && p2 == null) return -1; if (p1 == null && p2 == null) return 0; if (p1 == null && p2 != null) return 1; String val1 = p1.getValor() == null ? "" : (String)p1.getValor(); String val2 = p2.getValor() == null ? "" : (String)p2.getValor(); int result = val1.compareTo(val2); return result != 0 ? result : p1.getCodi().compareTo(p2.getCodi()); } }); return lista; } @Transactional(readOnly=true) private List<ExpedientTipusDto> getExpedientTipusAmbEntorn(Entorn entorn) { List<ExpedientTipusDto> tipus = conversioTipusHelper.convertirList(expedientTipusRepository.findByEntornOrderByCodiAsc(entorn), ExpedientTipusDto.class); permisosHelper.filterGrantedAny( tipus, new ObjectIdentifierExtractor<ExpedientTipusDto>() { public Long getObjectIdentifier(ExpedientTipusDto expedientTipus) { return expedientTipus.getId(); } }, ExpedientTipus.class, new Permission[] { ExtendedPermission.ADMINISTRATION, ExtendedPermission.CREATE }, SecurityContextHolder.getContext().getAuthentication()); return tipus; } @Transactional(readOnly=true) @Override public List<CampDto> findCampsAmbDefinicioProcesOrdenatsPerCodi(Long definicioProcesId) { DefinicioProces definicioProces = definicioProcesRepository.findOne(definicioProcesId); if (definicioProces == null) throw new NoTrobatException(DefinicioProces.class, definicioProcesId); return conversioTipusHelper.convertirList(campRepository.findByDefinicioProcesOrderByCodiAsc(definicioProces), CampDto.class); } @Transactional(readOnly=true) @Override public List<FilaResultat> consultaDominiIntern(String id, List<ParellaCodiValor> parametres) throws Exception { return dominiHelper.consultaDominiIntern(id, parametres); } }