/**
*
*/
package net.conselldemallorca.helium.core.model.service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.conselldemallorca.helium.core.model.dao.CarrecJbpmIdDao;
import net.conselldemallorca.helium.core.model.dao.PermisDao;
import net.conselldemallorca.helium.core.model.dao.PersonaDao;
import net.conselldemallorca.helium.core.model.dao.PluginPersonaDao;
import net.conselldemallorca.helium.core.model.dao.UsuariDao;
import net.conselldemallorca.helium.core.model.dao.UsuariPreferenciesDao;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.dto.PersonaUsuariDto;
import net.conselldemallorca.helium.core.model.exception.NotFoundException;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
import net.conselldemallorca.helium.core.model.hibernate.Permis;
import net.conselldemallorca.helium.core.model.hibernate.Persona;
import net.conselldemallorca.helium.core.model.hibernate.Usuari;
import net.conselldemallorca.helium.core.model.hibernate.UsuariPreferencies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.acls.domain.GrantedAuthoritySid;
import org.springframework.security.acls.domain.PrincipalSid;
import org.springframework.security.acls.model.AccessControlEntry;
import org.springframework.security.acls.model.Sid;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
/**
* Servei per gestionar les persones
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class PersonaService {
private PersonaDao personaDao;
private UsuariDao usuariDao;
private PermisDao permisDao;
private UsuariPreferenciesDao usuariPreferenciesDao;
private PermissionService permissionService;
private CarrecJbpmIdDao carrecJbpmIdDao;
private PluginPersonaDao pluginPersonaDao;
private MessageSource messageSource;
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public Persona getPerfilInfo(Long id) {
return personaDao.getById(id, false);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public Persona updatePerfil(Persona persona) {
return personaDao.merge(persona);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public void canviContrasenyaPerfil(Long id, String contrasenya) throws Exception {
canviContrasenya(id, contrasenya);
}
@Secured({"ROLE_ADMIN"})
public PersonaUsuariDto getPersonaUsuariById(Long id) {
return toPersonaUsuariDto(personaDao.getById(id, false));
}
@Secured({"ROLE_ADMIN"})
public PersonaUsuariDto createPersonaUsuari(PersonaUsuariDto entity) {
// Guarda les dades de la persona
Persona personaSaved = personaDao.saveOrUpdate(personaFromEntity(entity));
// Crea l'usuari si hi ha login
createUsuariSiLogin(entity);
return toPersonaUsuariDto(personaSaved);
}
@Secured({"ROLE_ADMIN"})
public PersonaUsuariDto updatePersonaUsuari(PersonaUsuariDto entity) {
// Si hi ha un canvi de codi de persona esborra l'usuari
if (entity.getId() != null) {
Persona personaVella = personaDao.getById(entity.getId(), false);
if (personaVella != null) {
Usuari usuariVell = usuariDao.getById(personaVella.getCodi(), false);
if (usuariVell != null) {
if (!personaVella.getCodi().equals(usuariVell.getId()) || !entity.isLogin())
usuariDao.delete(personaVella.getCodi());
}
personaDao.evict(personaVella);
}
}
// Guarda les dades de la persona
Persona personaSaved = personaDao.saveOrUpdate(personaFromEntity(entity));
// Crea l'usuari si hi ha login
createUsuariSiLogin(entity);
return toPersonaUsuariDto(personaSaved);
}
@Secured({"ROLE_ADMIN"})
public void deletePersona(Long id) {
Persona persona = personaDao.getById(id, false);
if (persona != null) {
Usuari usuari = usuariDao.getById(persona.getCodi(), false);
if (usuari != null)
usuariDao.delete(usuari);
personaDao.delete(persona);
}
}
@Secured({"ROLE_ADMIN"})
public void canviContrasenya(Long id, String contrasenya) throws Exception {
Persona persona = personaDao.getById(id, false);
if (persona!= null) {
Usuari usuari = usuariDao.getById(persona.getCodi(), false);
if (usuari != null)
usuariDao.canviContrasenya(usuari.getId(), contrasenya);
else
throw new NotFoundException( getMessage("error.personaService.noLogin", new Object[]{id}) );
} else {
throw new NotFoundException( getMessage("error.personaService.noExisteix", new Object[]{id}) );
}
}
@Secured({"ROLE_ADMIN"})
public List<PersonaUsuariDto> findPersonaUsuariAll() {
return toPersonaUsuariDto(personaDao.findAll());
}
@Secured({"ROLE_ADMIN"})
public List<PersonaUsuariDto> findPersonaUsuariOrderedAll(String sort, boolean asc) {
return toPersonaUsuariDto(
personaDao.findOrderedAll(
new String[] {sort},
asc));
}
@Secured({"ROLE_ADMIN"})
public List<PersonaUsuariDto> findPersonaUsuariPagedAndOrderedAll(
String sort,
boolean asc,
int firstRow,
int maxResults) {
return toPersonaUsuariDto(personaDao.findPagedAndOrderedAll(
new String[] {sort},
asc,
firstRow,
maxResults));
}
@Secured({"ROLE_ADMIN"})
public int countPersonaUsuariAll() {
return personaDao.findAll().size();
}
@Secured({"ROLE_ADMIN"})
public List<PersonaUsuariDto> findPersonaUsuariPagedAndOrderedFiltre(
String sort,
boolean asc,
int firstRow,
int maxResults,
String codi,
String nomLike,
String emailLike) {
return toPersonaUsuariDto(
personaDao.findPagedAndOrderedFiltre(
sort,
asc,
firstRow,
maxResults,
codi,
nomLike,
emailLike));
}
@Secured({"ROLE_ADMIN"})
public int countPersonaUsuariFiltre(
String codi,
String nomLike,
String emailLike) {
return personaDao.getCountFiltre(
codi,
nomLike,
emailLike);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public Persona findPersonaAmbCodi(String codi) {
return personaDao.findAmbCodi(codi);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public List<Permis> findPermisosAll() {
return permisDao.findAll();
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public UsuariPreferencies getUsuariPreferencies() {
return usuariPreferenciesDao.getById(
SecurityContextHolder.getContext().getAuthentication().getName(),
false);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public void savePrefDefaultEntorn(String entornCodi) {
UsuariPreferencies preferencies = getUsuariPreferencies();
if (preferencies == null) {
preferencies = new UsuariPreferencies(
SecurityContextHolder.getContext().getAuthentication().getName());
usuariPreferenciesDao.saveOrUpdate(preferencies);
}
preferencies.setDefaultEntornCodi(entornCodi);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public void savePrefIdioma(String idioma) {
UsuariPreferencies preferencies = getUsuariPreferencies();
if (preferencies == null) {
preferencies = new UsuariPreferencies(
SecurityContextHolder.getContext().getAuthentication().getName());
usuariPreferenciesDao.saveOrUpdate(preferencies);
}
preferencies.setIdioma(idioma);
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public Set<PersonaDto> findPersonesAmbPermisosPerExpedientTipus(Long expedientTipusId) {
Set<PersonaDto> resposta = new HashSet<PersonaDto>();
Map<Sid, List<AccessControlEntry>> permisos = permissionService.getAclEntriesGroupedBySid(
expedientTipusId,
ExpedientTipus.class);
for (Sid sid: permisos.keySet()) {
// TODO verificar permisos de lectura i/o administració
if (sid instanceof PrincipalSid) {
PrincipalSid psid = (PrincipalSid)sid;
String userName = psid.getPrincipal();
resposta.add(pluginPersonaDao.findAmbCodiPlugin(userName));
} else {
GrantedAuthoritySid gsid = (GrantedAuthoritySid)sid;
String groupName = gsid.getGrantedAuthority();
List<String> personesPerGrup = carrecJbpmIdDao.findPersonesAmbGrup(groupName);
if (personesPerGrup != null) {
for (String userName: personesPerGrup)
resposta.add(pluginPersonaDao.findAmbCodiPlugin(userName));
}
}
}
return resposta;
}
@Autowired
public void setPersonaDao(PersonaDao personaDao) {
this.personaDao = personaDao;
}
@Autowired
public void setUsuariDao(UsuariDao usuariDao) {
this.usuariDao = usuariDao;
}
@Autowired
public void setPermisDao(PermisDao permisDao) {
this.permisDao = permisDao;
}
@Autowired
public void setPermissionService(PermissionService permissionService) {
this.permissionService = permissionService;
}
@Autowired
public void setCarrecJbpmIdDao(CarrecJbpmIdDao carrecJbpmIdDao) {
this.carrecJbpmIdDao = carrecJbpmIdDao;
}
@Autowired
public void setPluginPersonaDao(PluginPersonaDao pluginPersonaDao) {
this.pluginPersonaDao = pluginPersonaDao;
}
@Autowired
public void setUsuariPreferenciesDao(UsuariPreferenciesDao usuariPreferenciesDao) {
this.usuariPreferenciesDao = usuariPreferenciesDao;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
private Persona personaFromEntity(PersonaUsuariDto entity) {
Persona persona = new Persona();
persona.setId(entity.getId());
persona.setCodi(entity.getCodi());
persona.setNom(entity.getNom());
persona.setLlinatge1(entity.getLlinatge1());
persona.setLlinatge2(entity.getLlinatge2());
persona.setDataNaixement(entity.getDataNaixement());
persona.setDni(entity.getDni());
persona.setEmail(entity.getEmail());
persona.setSexe(entity.getSexe());
persona.setAvisCorreu(entity.getAvisCorreu());
persona.setFont(entity.getFont());
persona.setRelleu(entity.getRelleu());
return persona;
}
private void createUsuariSiLogin(PersonaUsuariDto entity) {
if (entity.isLogin()) {
// Si la persona té permís per entrar a l'aplicació crea també l'usuari associat
Usuari usuari = usuariDao.getById(entity.getCodi(), false);
if (usuari == null) {
usuari = new Usuari();
usuari.setCodi(entity.getCodi());
usuari.setContrasenya(entity.getContrasenya());
usuari.setPermisos(entity.getPermisos());
} else {
usuari.setPermisos(entity.getPermisos());
}
usuariDao.saveOrUpdate(usuari);
}
}
private List<PersonaUsuariDto> toPersonaUsuariDto(List<Persona> persones) {
List<PersonaUsuariDto> resposta = new ArrayList<PersonaUsuariDto>();
for (Persona persona: persones)
resposta.add(toPersonaUsuariDto(persona));
return resposta;
}
private PersonaUsuariDto toPersonaUsuariDto(Persona persona) {
if (persona == null)
return null;
PersonaUsuariDto dto = new PersonaUsuariDto();
dto.setId(persona.getId());
dto.setCodi(persona.getCodi());
dto.setNom(persona.getNom());
dto.setLlinatge1(persona.getLlinatge1());
dto.setLlinatge2(persona.getLlinatge2());
dto.setDni(persona.getDni());
dto.setDataNaixement(persona.getDataNaixement());
dto.setEmail(persona.getEmail());
dto.setSexe(persona.getSexe());
dto.setAvisCorreu(persona.getAvisCorreu());
dto.setFont(persona.getFont());
dto.setRelleu(persona.getRelleu());
Usuari usuari = usuariDao.getById(persona.getCodi(), false);
if (usuari != null) {
dto.setLogin(true);
dto.setContrasenya(usuari.getContrasenya());
dto.setPermisos(usuari.getPermisos());
}
return dto;
}
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);
}
}