/**
*
*/
package net.conselldemallorca.helium.v3.core.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import net.conselldemallorca.helium.core.helper.ConversioTipusHelper;
import net.conselldemallorca.helium.core.helper.ExpedientHelper;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.Registre;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmToken;
import net.conselldemallorca.helium.v3.core.api.dto.TokenDto;
import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException;
import net.conselldemallorca.helium.v3.core.api.service.TokenService;
import net.conselldemallorca.helium.v3.core.repository.ExpedientRepository;
import net.conselldemallorca.helium.v3.core.repository.RegistreRepository;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* Servei per gestionar els tokens dels expedients
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class TokenServiceImpl implements TokenService{
@Resource
private JbpmHelper jbpmHelper;
@Resource
private ConversioTipusHelper conversioTipusHelper;
@Resource
private ExpedientRepository expedientRepository;
@Resource
private RegistreRepository registreRepository;
@Resource
private ExpedientHelper expedientHelper;
@Transactional(readOnly=true)
@Override
public List<TokenDto> findTokensPerExpedient(Long expedientId, String processInstanceId) {
List<JbpmToken> jbpmTokens = new ArrayList<JbpmToken>();
Expedient expedient = expedientHelper.getExpedientComprovantPermisos(
expedientId,
false,
false,
false,
true);
if (expedient != null){
Map<String, JbpmToken> tokens = jbpmHelper.getAllTokens(processInstanceId);
for (String tokenName: tokens.keySet()) {
jbpmTokens.add(tokens.get(tokenName));
}
Collections.sort(jbpmTokens,new TokenComparator());
}
return conversioTipusHelper.convertirList(jbpmTokens, TokenDto.class);
}
private class TokenComparator implements Comparator<JbpmToken> {
@Override
public int compare(JbpmToken o1, JbpmToken o2) {
return o1.getId().compareTo(o2.getId());
}
}
@Transactional
@Override
public boolean activar(Long expedientId, Long tokenId, boolean activar) {
Expedient expedient = expedientHelper.getExpedientComprovantPermisos(
expedientId,
false,
false,
false,
true);
if( expedient!= null)
return jbpmHelper.tokenActivar(tokenId, activar);
else
return false;
}
@Transactional(readOnly=true)
@Override
public List<String> findArrivingNodeNames(Long expedientId, String tokenId) {
Expedient expedient = expedientHelper.getExpedientComprovantPermisos(
expedientId,
false,
false,
false,
true);
if( expedient!= null)
return jbpmHelper.findArrivingNodeNames(tokenId);
else
return null;
}
@Transactional(readOnly=true)
@Override
public TokenDto findById(Long expedientId, String tokenId) {
Expedient expedient = expedientHelper.getExpedientComprovantPermisos(
expedientId,
false,
false,
false,
true);
if( expedient != null)
return conversioTipusHelper.convertir(jbpmHelper.getTokenById(tokenId), TokenDto.class);
else
return null;
}
@Transactional
@Override
public void tokenRetrocedir(Long expedientId, String tokenId,String nodeName,boolean cancelTasks) {
Expedient expedient = expedientHelper.getExpedientComprovantPermisos(
expedientId,
false,
false,
false,
true);
if( expedient != null){
JbpmToken token = jbpmHelper.getTokenById(tokenId);
if (token == null)
throw new NoTrobatException(JbpmToken.class, tokenId);
String nodeNameVell = token.getNodeName();
jbpmHelper.tokenRedirect(new Long(tokenId).longValue(), nodeName, cancelTasks, true, false);
crearRegistreRetrocedirToken(
expedientId,
token.getProcessInstanceId(),
SecurityContextHolder.getContext().getAuthentication().getName(),
token.getFullName(),
nodeNameVell,
nodeName);
}
}
private Registre crearRegistreRetrocedirToken(
Long expedientId,
String processInstanceId,
String responsableCodi,
String tokenName,
String nodeOrigen,
String nodeDesti) {
Registre registre = new Registre(
new Date(),
expedientId,
responsableCodi,
Registre.Accio.MODIFICAR,
Registre.Entitat.INSTANCIA_PROCES,
processInstanceId);
registre.setMissatge("Redirecció del token \"" + tokenName + "\": " + nodeOrigen + "->" + nodeDesti);
return registreRepository.save(registre);
}
}