@Override
 public void updateUtente(UtenteDTO udto) throws ParseException {
   Utente utente = utenteRepository.getOne(udto.getId());
   Utente u = new Utente();
   u.setId(utente.getId());
   u.setCapDomicilio(udto.getCapDomicilio());
   u.setCapResidenza(udto.getCapResidenza());
   u.setCellulare(udto.getCellulare());
   u.setCf(udto.getCf());
   u.setCittaDomicilio(udto.getCittaDomicilio());
   u.setCittaNascita(udto.getCittaDomicilio());
   u.setCittaResidenza(udto.getCittaResidenza());
   u.setCognome(udto.getCognome());
   u.setDataAssunzione(DateConverter.convertFromStringToDate(udto.getDataAssunzione()));
   u.setDataNascita(DateConverter.convertFromStringToDate(udto.getDataNascita()));
   u.setIndirizzoDomicilio(udto.getIndirizzoDomicilio());
   u.setIndirizzoResidenza(udto.getIndirizzoResidenza());
   u.setMail(udto.getMail());
   u.setNome(udto.getNome());
   u.setProvinciaDomicilio(udto.getProvinciaDomicilio());
   u.setProvinciaNascita(udto.getProvinciaNascita());
   u.setProvinciaResidenza(udto.getProvinciaResidenza());
   u.setTbMansione(utente.getTbMansione());
   utenteRepository.save(u);
 }
  @Transactional
  @Override
  public void addUpdateUtente(UtenteInsertJobDTO dto)
      throws DuplicatedEmailException, DuplicatedUsernameException, ParseException {
    UtenteDTO udto = dto.getUtenteDTO();
    Utente u = null;
    if (udto.getId() == null) {
      Mansione m = mansioneRepository.findOne(dto.getIdMansione());
      u = UtenteConverter.convertToEntity(dto.getUtenteDTO());
      u.setTbMansione(m);
    } else {
      u = utenteRepository.getOne(udto.getId());
      u.setCapDomicilio(udto.getCapDomicilio());
      u.setCapResidenza(udto.getCapResidenza());
      u.setCellulare(udto.getCellulare());
      u.setCf(udto.getCf());
      u.setCittaDomicilio(udto.getCittaDomicilio());
      u.setCittaNascita(udto.getCittaDomicilio());
      u.setCittaResidenza(udto.getCittaResidenza());
      u.setCognome(udto.getCognome());
      u.setDataAssunzione(DateConverter.convertFromStringToDate(udto.getDataAssunzione()));
      u.setDataNascita(DateConverter.convertFromStringToDate(udto.getDataNascita()));
      u.setIndirizzoDomicilio(udto.getIndirizzoDomicilio());
      u.setIndirizzoResidenza(udto.getIndirizzoResidenza());
      u.setMail(udto.getMail());
      u.setNome(udto.getNome());
      u.setProvinciaDomicilio(udto.getProvinciaDomicilio());
      u.setProvinciaNascita(udto.getProvinciaNascita());
      u.setProvinciaResidenza(udto.getProvinciaResidenza());
      u.setTbMansione(mansioneRepository.findOne(dto.getIdMansione()));
    }
    utenteRepository.save(u);
    Utente temp = utenteRepository.getByEmail(u.getMail());
    if (temp != null && temp.getId().longValue() != u.getId().longValue()) {
      throw new DuplicatedEmailException("User modified some values on JSON object");
    }

    // E' necessario ricercare l'insieme delle skills già presenti, se siamo
    // in update
    List<UtenteHasSkill> skills = u.getTbUtenteHasTbSkills();
    List<Long> skillsPresenti = new ArrayList<Long>();
    skillsPresenti.addAll(dto.getSkill());
    List<Integer> skillsLivelli = new ArrayList<Integer>();
    skillsLivelli.addAll(dto.getLivello());
    if (skills != null) {
      // A partire da queste tre liste è necessario iterare per ogni skill
      // esistente
      for (int p = 0; p < skills.size(); p++) {
        UtenteHasSkill skill = skills.get(p);
        boolean presente = false;
        // Innanzitutto controlliamo la presenza della skill in esame
        // (presente mappa o meno la presenza)
        for (int i = 0; i < skillsPresenti.size(); i++) {
          Long l = skillsPresenti.get(i);
          if (skill.getTbSkill().getId().longValue() == l) {
            if (skill.getLivello() != skillsLivelli.get(i).intValue()) {
              skill.setLivello(skillsLivelli.get(i));
              utenteSkillRepository.save(skill);
            }
            skillsPresenti.remove(i);
            skillsLivelli.remove(i);
            presente = true;
            break;
          }
        }
        if (!presente) {
          utenteSkillRepository.delete(skill);
        }
      }
    }
    // Una volta arrivati qui, la lista skillsPresenti ha al suo interno
    // solo le skills non ancora collegate, per cui passiamo all'aggiunta
    // delle rimanenti
    for (int i = 0; i < skillsPresenti.size(); i++) {
      Long l = skillsPresenti.get(i);
      Skill skill = skillRepJpa.findOne(l);
      UtenteHasSkill uhs = new UtenteHasSkill();
      uhs.setLivello(skillsLivelli.get(i));
      uhs.setTbSkill(skill);
      uhs.setTbUtente(u);
      utenteSkillRepository.save(uhs);
    }

    // Controlliamo l'esistenza di un utente con la stessa mail aziendale
    DatiLogin datiLogin = datiLoginRepository.getByUsername(dto.getUsername());
    if (datiLogin != null && datiLogin.getTbUtente().getId().longValue() != u.getId().longValue()) {
      throw new DuplicatedUsernameException("Username già presente nel DB per un altro utente");
    }

    if (datiLogin == null) {
      DatiLogin dL = new DatiLogin();
      dL.setAttivo(!dto.getDisabled());
      dL.setPassword(Utility.md5(dto.getPassword()));
      dL.setUsername(dto.getUsername());
      dL.setTbUtente(u);
      Profilo p = profiloRepository.findOne(dto.getIdProfilo());
      dL.setTbProfilo(p);
      datiLoginRepository.save(dL);
    } else {
      if (!dto.getPassword().equals("vecchiapw")) {
        datiLogin.setPassword(Utility.md5(dto.getPassword()));
      }
      datiLogin.setUsername(dto.getUsername());
      datiLogin.setAttivo(!dto.getDisabled());
      datiLogin.setTbProfilo(profiloRepository.findOne(dto.getIdProfilo()));
      datiLoginRepository.save(datiLogin);
    }
    LOG.warn("Insert or update ");
    if (curriculumRepository.getByUtente(u) == null) {
      Curriculum curriculum = new Curriculum();
      curriculum.setUtente(u);
      curriculum.setEsperienze(new String());
      curriculum.setFormazione(new String());
      curriculum.setLingue(new String());
      curriculumRepository.save(curriculum);
    }
  }