From 28b11920361b54080196f11ebc546bb9dd0c1678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garcia=20Nu=C3=B1ez?= Date: Wed, 11 Dec 2019 21:47:44 +0100 Subject: [PATCH] =?UTF-8?q?Multiples=20cambios=20para=20soportar=20la=20ut?= =?UTF-8?q?ilizaci=C3=B3n=20de=20c=C3=B3digos=20de=20usuario=20=C3=BAnicos?= =?UTF-8?q?=20para=20(Pacientes,=20medicos=20de=20familia,=20medicos=20esp?= =?UTF-8?q?ecialista=20y=20administradores).=20Nuevos=20m=C3=A9todos=20en?= =?UTF-8?q?=20EJB=20com=C3=BAn=20para=20consultar=20Entidades=20por=20Id?= =?UTF-8?q?=20y=20por=20c=C3=B3digo=20(Para=20el=20login).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docroot/profile/RegisterUser.xhtml | 2 +- .../docroot/profile/UpdateProfile.xhtml | 8 +- 1.sources/MyHealth/src/TO/FamilyDoctorTO.java | 11 +- 1.sources/MyHealth/src/TO/PatientTO.java | 10 +- .../MyHealth/src/TO/SpecialistDoctorTO.java | 11 +- 1.sources/MyHealth/src/common/Constants.java | 2 + .../src/ejb/common/CommonFacadeBean.java | 154 +++++++++++++----- .../src/ejb/common/CommonFacadeLocal.java | 16 +- .../src/ejb/common/CommonFacadeRemote.java | 16 +- .../src/ejb/profile/ProfileFacadeBean.java | 52 +++--- .../src/ejb/profile/ProfileFacadeRemote.java | 2 +- .../systemAdmin/SystemAdminFacadeBean.java | 110 ++++++++----- .../MyHealth/src/jpa/FamilyDoctorJPA.java | 13 +- 1.sources/MyHealth/src/jpa/PatientJPA.java | 13 +- .../MyHealth/src/jpa/SpecialistDoctorJPA.java | 13 +- .../profile/ChangeFamilyDoctorMBean.java | 2 +- .../ChangePrimaryHealthCareCenterMBean.java | 2 +- .../profile/RegisterUserMBean.java | 24 +-- .../profile/UpdateProfileMBean.java | 69 +++++--- 19 files changed, 366 insertions(+), 164 deletions(-) diff --git a/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml b/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml index a4fe8f3..9b60cd1 100644 --- a/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml +++ b/1.sources/MyHealth/docroot/profile/RegisterUser.xhtml @@ -28,7 +28,7 @@
- +
diff --git a/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml b/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml index c8a553d..95700b0 100644 --- a/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml +++ b/1.sources/MyHealth/docroot/profile/UpdateProfile.xhtml @@ -27,14 +27,14 @@
- - + +
- +
- +
diff --git a/1.sources/MyHealth/src/TO/FamilyDoctorTO.java b/1.sources/MyHealth/src/TO/FamilyDoctorTO.java index 258c3b8..dd91620 100644 --- a/1.sources/MyHealth/src/TO/FamilyDoctorTO.java +++ b/1.sources/MyHealth/src/TO/FamilyDoctorTO.java @@ -14,6 +14,7 @@ public class FamilyDoctorTO implements Serializable { private static final long serialVersionUID = 1L; private Integer id; + private String professionalNumber; private String nif; private String name; private String surname; @@ -25,8 +26,9 @@ public class FamilyDoctorTO implements Serializable { super(); } - public FamilyDoctorTO(Integer id, String nif, String name, String surname, String password, String email, PrimaryHealthCareCenterTO phc) { + public FamilyDoctorTO(Integer id, String pic, String nif, String name, String surname, String password, String email, PrimaryHealthCareCenterTO phc) { this.id = id; + this.professionalNumber = pic; this.nif = nif; this.name = name; this.surname = surname; @@ -95,4 +97,11 @@ public class FamilyDoctorTO implements Serializable { this.primaryHealthCareCenter = primaryHealthCareCenter; } + public String getProfessionalNumber() { + return professionalNumber; + } + + public void setProfessionalNumber(String professionalNumber) { + this.professionalNumber = professionalNumber; + } } diff --git a/1.sources/MyHealth/src/TO/PatientTO.java b/1.sources/MyHealth/src/TO/PatientTO.java index c31bfda..e694dcb 100644 --- a/1.sources/MyHealth/src/TO/PatientTO.java +++ b/1.sources/MyHealth/src/TO/PatientTO.java @@ -16,6 +16,7 @@ public class PatientTO implements Serializable { private static final long serialVersionUID = 1L; private Integer id; + private String personalIdentificationCode; private String nif; private String name; private String surname; @@ -30,8 +31,9 @@ public class PatientTO implements Serializable { super(); } - public PatientTO(Integer id, String nif, String name, String surname, String password, String email, FamilyDoctorTO familyDoc) { + public PatientTO(Integer id, String pic, String nif, String name, String surname, String password, String email, FamilyDoctorTO familyDoc) { this.id = id; + this.personalIdentificationCode = pic; this.nif = nif; this.name = name; this.surname = surname; @@ -96,5 +98,11 @@ public class PatientTO implements Serializable { this.familyDoctor = familyDoctor; } + public String getPersonalIdentificationCode() { + return personalIdentificationCode; + } + public void setPersonalIdentificationCode(String personalIdentificationCode) { + this.personalIdentificationCode = personalIdentificationCode; + } } diff --git a/1.sources/MyHealth/src/TO/SpecialistDoctorTO.java b/1.sources/MyHealth/src/TO/SpecialistDoctorTO.java index bee77c4..596745e 100644 --- a/1.sources/MyHealth/src/TO/SpecialistDoctorTO.java +++ b/1.sources/MyHealth/src/TO/SpecialistDoctorTO.java @@ -14,6 +14,7 @@ public class SpecialistDoctorTO implements Serializable { private static final long serialVersionUID = 1L; private Integer id; + private String professionalNumber; private String nif; private String name; private String surname; @@ -25,8 +26,9 @@ public class SpecialistDoctorTO implements Serializable { super(); } - public SpecialistDoctorTO(Integer id, String nif, String name, String surname, String password, String email, MedicalSpecialtyTO medicalSpec) { + public SpecialistDoctorTO(Integer id, String pic, String nif, String name, String surname, String password, String email, MedicalSpecialtyTO medicalSpec) { this.id = id; + this.professionalNumber = pic; this.nif = nif; this.name = name; this.surname = surname; @@ -91,4 +93,11 @@ public class SpecialistDoctorTO implements Serializable { this.medicalSpecialty = medicalSpecialty; } + public String getProfessionalNumber() { + return professionalNumber; + } + + public void setProfessionalNumber(String professionalNumber) { + this.professionalNumber = professionalNumber; + } } diff --git a/1.sources/MyHealth/src/common/Constants.java b/1.sources/MyHealth/src/common/Constants.java index a4ff4c0..cf8500d 100644 --- a/1.sources/MyHealth/src/common/Constants.java +++ b/1.sources/MyHealth/src/common/Constants.java @@ -2,4 +2,6 @@ package common; public class Constants { public static final int MAX_ITEMS_AUTOCOMPLETE_SEARCH = 200; + public static final String PROFESSIONAL_NUMBER_PREFIX= "PRO#"; + public static final String PERSONAL_IDENTIFICATION_CODE_PREFIX= "PAT#"; } diff --git a/1.sources/MyHealth/src/ejb/common/CommonFacadeBean.java b/1.sources/MyHealth/src/ejb/common/CommonFacadeBean.java index 67e1e22..4524e03 100644 --- a/1.sources/MyHealth/src/ejb/common/CommonFacadeBean.java +++ b/1.sources/MyHealth/src/ejb/common/CommonFacadeBean.java @@ -1,7 +1,6 @@ package ejb.common; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import javax.ejb.Stateless; @@ -10,6 +9,8 @@ import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; +import org.jboss.security.auth.spi.Users.User; + import TO.FamilyDoctorTO; import TO.MedicalSpecialtyTO; import TO.PatientTO; @@ -71,8 +72,8 @@ public class CommonFacadeBean implements CommonFacadeRemote, CommonFacadeLocal { List allJPA = query.getResultList(); List allSpecialities = new ArrayList(); - for (MedicalSpecialtyJPA cap : allJPA) { - allSpecialities.add(new MedicalSpecialtyTO(cap.getId(), cap.getName(), cap.getDescription())); + for (MedicalSpecialtyJPA item : allJPA) { + allSpecialities.add(this.getPOJOforMedicalSpecialtyJPA(item)); } return allSpecialities; @@ -111,8 +112,8 @@ public class CommonFacadeBean implements CommonFacadeRemote, CommonFacadeLocal { List allJPA = query.getResultList(); List allCAPs = new ArrayList(); - for (PrimaryHealthCareCenterJPA cap : allJPA) { - allCAPs.add(new PrimaryHealthCareCenterTO(cap.getId(), cap.getName(), cap.getLocation())); + for (PrimaryHealthCareCenterJPA item : allJPA) { + allCAPs.add(this.getPOJOforPrimaryHealthCareCenterJPA(item)); } return allCAPs; @@ -148,60 +149,127 @@ public class CommonFacadeBean implements CommonFacadeRemote, CommonFacadeLocal { query.setMaxResults(pageSize); } - @SuppressWarnings("unchecked") List allFDsJPA = query.getResultList(); List allFDTOs = new ArrayList(); for (FamilyDoctorJPA item : allFDsJPA) { - allFDTOs.add(new FamilyDoctorTO(item.getId(), item.getNif(), item.getName(), item.getSurname(), item.getPassword(), item.getEmail(), null)); + allFDTOs.add(this.getPOJOforFamilyDoctorJPA(item, 0)); } return allFDTOs; } - public PatientTO retrievePatient(int patientId) throws Exception { - PatientJPA pat = entman.find(PatientJPA.class, patientId); - - if (pat == null) { - throw new Exception("No se pueden actualizar los datos del paciente porque no se encuentra en la base de datos ningún registro con id: " + String.valueOf(patientId)); + private MedicalSpecialtyTO getPOJOforMedicalSpecialtyJPA(MedicalSpecialtyJPA ms) { + MedicalSpecialtyTO msTO = null; + + if (ms != null) { + msTO = new MedicalSpecialtyTO(ms.getId(), ms.getName(), ms.getDescription()); } - - FamilyDoctorTO fdTO = null; - if (pat.getFamilyDoctor() != null) { - FamilyDoctorJPA fd = pat.getFamilyDoctor(); - fdTO = new FamilyDoctorTO(fd.getId(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), null); - } - - PatientTO paTO = new PatientTO(pat.getId(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), fdTO); - return paTO; + + return msTO; } - public FamilyDoctorTO retrieveFamilyDoctor(int ProfessionalNumberId) throws Exception { - FamilyDoctorJPA fd = entman.find(FamilyDoctorJPA.class, ProfessionalNumberId); - if (fd == null) { - throw new Exception("No se encuentra en la base de datos ningún médico de familia con id: " + String.valueOf(ProfessionalNumberId)); + private PrimaryHealthCareCenterTO getPOJOforPrimaryHealthCareCenterJPA(PrimaryHealthCareCenterJPA phc) { + PrimaryHealthCareCenterTO phcTO = null; + + if (phc != null) { + phcTO = new PrimaryHealthCareCenterTO(phc.getId(), phc.getName(), phc.getLocation()); } - - PrimaryHealthCareCenterTO phc = null; - if (fd.getPrimaryHealthCareCenter() != null) - phc = new PrimaryHealthCareCenterTO(fd.getPrimaryHealthCareCenter().getId(), fd.getPrimaryHealthCareCenter().getName(), fd.getPrimaryHealthCareCenter().getLocation()); - - FamilyDoctorTO fdTO = new FamilyDoctorTO(fd.getId(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), phc); - return fdTO; + + return phcTO; } - public SpecialistDoctorTO retrieveSpecialistDoctor(int professionalId) throws Exception { - SpecialistDoctorJPA sd = entman.find(SpecialistDoctorJPA.class, professionalId); - if (sd == null) { - throw new Exception( - "No se pueden actualizar los datos del médico de familia porque no se encuentra en la base de datos ningún registro con id: " + String.valueOf(professionalId)); + private SpecialistDoctorTO getPOJOforSpecialistDoctorJPA(SpecialistDoctorJPA sd, int nestedProps) { + SpecialistDoctorTO sdTO = null; + + if (sd != null) { + MedicalSpecialtyJPA ms = null; + if (nestedProps > 0) + ms = sd.getMedicalSpecialty(); + + nestedProps--; + sdTO = new SpecialistDoctorTO(sd.getId(), sd.getProfessionalNumber(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), this.getPOJOforMedicalSpecialtyJPA(ms)); } - - MedicalSpecialtyTO ms = null; - if (sd.getMedicalSpecialty() != null) - ms = new MedicalSpecialtyTO(sd.getMedicalSpecialty().getId(), sd.getMedicalSpecialty().getName(), sd.getMedicalSpecialty().getDescription()); - - SpecialistDoctorTO sdTO = new SpecialistDoctorTO(sd.getId(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), ms); + return sdTO; } + + private FamilyDoctorTO getPOJOforFamilyDoctorJPA(FamilyDoctorJPA fd, int nestedProps) { + FamilyDoctorTO fdTO = null; + + if (fd != null) { + PrimaryHealthCareCenterJPA phc = null; + if (nestedProps > 0) + phc = fd.getPrimaryHealthCareCenter(); + + nestedProps--; + fdTO = new FamilyDoctorTO(fd.getId(), fd.getProfessionalNumber(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), this.getPOJOforPrimaryHealthCareCenterJPA(phc)); + } + + return fdTO; + } + + private PatientTO getPOJOforPatientJPA(PatientJPA pat, int nestedProps) { + PatientTO paTO = null; + + if (pat != null) { + FamilyDoctorJPA fd = null; + if (nestedProps > 0) + fd = pat.getFamilyDoctor(); + + nestedProps--; + paTO = new PatientTO(pat.getId(), pat.getPersonalIdentificationCode(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), this.getPOJOforFamilyDoctorJPA(fd, nestedProps)); + } + + return paTO; + } + + public PatientTO findPatientById(int patientId) { + // Recuperamos propiedades anidadas 1 nivel! + return this.getPOJOforPatientJPA(entman.find(PatientJPA.class, patientId), 1); + } + + + public PatientJPA findPatientByCode(String code) { + TypedQuery query = entman.createQuery("from PatientJPA pat where pat.personalIdentificationCode=:code", PatientJPA.class); + + query.setParameter("code", code); + + List results = query.getResultList(); + if (results.size() > 0) + return results.get(0); + else + return null; } + + public FamilyDoctorTO findFamilyDoctorById(int ProfessionalNumberId) { + return this.getPOJOforFamilyDoctorJPA(entman.find(FamilyDoctorJPA.class, ProfessionalNumberId), 1); + } + + public FamilyDoctorJPA findFamilyDoctorByCode(String code) { + TypedQuery query = entman.createQuery("from FamilyDoctorJPA d where d.professionalNumber=:code", FamilyDoctorJPA.class); + + query.setParameter("code", code); + + List results = query.getResultList(); + if (results.size() > 0) + return results.get(0); + else + return null; + } + + public SpecialistDoctorTO findSpecialistDoctorById(int ProfessionalNumberId) { + return this.getPOJOforSpecialistDoctorJPA(entman.find(SpecialistDoctorJPA.class, ProfessionalNumberId), 1); + } + + public SpecialistDoctorJPA findSpecialistDoctorByCode(String code) { + TypedQuery query = entman.createQuery("from SpecialistDoctorJPA d where d.professionalNumber=:code", SpecialistDoctorJPA.class); + + query.setParameter("code", code); + + List results = query.getResultList(); + if (results.size() > 0) + return results.get(0); + else + return null; + } } diff --git a/1.sources/MyHealth/src/ejb/common/CommonFacadeLocal.java b/1.sources/MyHealth/src/ejb/common/CommonFacadeLocal.java index cc71c0e..5cc75bd 100644 --- a/1.sources/MyHealth/src/ejb/common/CommonFacadeLocal.java +++ b/1.sources/MyHealth/src/ejb/common/CommonFacadeLocal.java @@ -10,6 +10,9 @@ import TO.MedicalSpecialtyTO; import TO.PatientTO; import TO.PrimaryHealthCareCenterTO; import TO.SpecialistDoctorTO; +import jpa.FamilyDoctorJPA; +import jpa.PatientJPA; +import jpa.SpecialistDoctorJPA; /** * @@ -37,9 +40,16 @@ public interface CommonFacadeLocal { public List listFamilyDoctorsFiltered(String searchTerm, int pageNumber, int pageSize); - public PatientTO retrievePatient(int patientId) throws Exception; + public PatientTO findPatientById(int patientId); - public FamilyDoctorTO retrieveFamilyDoctor(int ProfessionalNumberId) throws Exception; + public PatientJPA findPatientByCode(String code); + + public FamilyDoctorTO findFamilyDoctorById(int ProfessionalNumberId); + + public FamilyDoctorJPA findFamilyDoctorByCode(String code); + + public SpecialistDoctorTO findSpecialistDoctorById(int ProfessionalNumberId); + + public SpecialistDoctorJPA findSpecialistDoctorByCode(String code); - public SpecialistDoctorTO retrieveSpecialistDoctor(int ProfessionalNumberId) throws Exception; } diff --git a/1.sources/MyHealth/src/ejb/common/CommonFacadeRemote.java b/1.sources/MyHealth/src/ejb/common/CommonFacadeRemote.java index d62a870..44f38cc 100644 --- a/1.sources/MyHealth/src/ejb/common/CommonFacadeRemote.java +++ b/1.sources/MyHealth/src/ejb/common/CommonFacadeRemote.java @@ -10,6 +10,9 @@ import TO.MedicalSpecialtyTO; import TO.PatientTO; import TO.PrimaryHealthCareCenterTO; import TO.SpecialistDoctorTO; +import jpa.FamilyDoctorJPA; +import jpa.PatientJPA; +import jpa.SpecialistDoctorJPA; /** * @@ -37,9 +40,16 @@ public interface CommonFacadeRemote { public List listFamilyDoctorsFiltered(String searchTerm, int pageNumber, int pageSize); - public PatientTO retrievePatient(int patientId) throws Exception; + public PatientTO findPatientById(int patientId); - public FamilyDoctorTO retrieveFamilyDoctor(int ProfessionalNumberId) throws Exception; + public PatientJPA findPatientByCode(String code); + + public FamilyDoctorTO findFamilyDoctorById(int ProfessionalNumberId); + + public FamilyDoctorJPA findFamilyDoctorByCode(String code); + + public SpecialistDoctorTO findSpecialistDoctorById(int ProfessionalNumberId); + + public SpecialistDoctorJPA findSpecialistDoctorByCode(String code); - public SpecialistDoctorTO retrieveSpecialistDoctor(int ProfessionalNumberId) throws Exception; } diff --git a/1.sources/MyHealth/src/ejb/profile/ProfileFacadeBean.java b/1.sources/MyHealth/src/ejb/profile/ProfileFacadeBean.java index 8e28709..80ca931 100644 --- a/1.sources/MyHealth/src/ejb/profile/ProfileFacadeBean.java +++ b/1.sources/MyHealth/src/ejb/profile/ProfileFacadeBean.java @@ -4,16 +4,16 @@ import javax.ejb.EJB; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import javax.persistence.Query; import TO.FamilyDoctorTO; import TO.MedicalSpecialtyTO; import TO.PatientTO; import TO.PrimaryHealthCareCenterTO; import TO.SpecialistDoctorTO; +import common.Constants; import common.HashUtils; -import ejb.common.CommonFacadeBean; import ejb.common.CommonFacadeLocal; -import ejb.common.CommonFacadeRemote; import jpa.FamilyDoctorJPA; import jpa.MedicalSpecialtyJPA; import jpa.PatientJPA; @@ -31,36 +31,46 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { // Persistence Unit Context @PersistenceContext(unitName = "MyHealth") private EntityManager entman; - - @EJB - CommonFacadeLocal commonServices; - public PatientTO changeFamilyDoctor(int patientId, int ProfessionalNumberId) throws Exception { + @EJB + CommonFacadeLocal commonServices; + + private String getNextProfessionalNumber() { + Query q = entman.createNativeQuery("select nextval('myhealth.profesionalnumber')"); + return Constants.PROFESSIONAL_NUMBER_PREFIX.concat(String.valueOf(q.getSingleResult())); + } + + private String getNextPersonalIdentificationCode() { + Query q = entman.createNativeQuery("select nextval('myhealth.profesionalnumber')"); + return Constants.PERSONAL_IDENTIFICATION_CODE_PREFIX.concat(String.valueOf(q.getSingleResult())); + } + + public PatientTO changeFamilyDoctor(int patientId, int newDoctor) throws Exception { PatientJPA pat = entman.find(PatientJPA.class, patientId); if (pat == null) { throw new Exception("No se pueden actualizar los datos del paciente porque no se encuentra en la base de datos ningún registro con id: " + String.valueOf(patientId)); } - FamilyDoctorJPA fd = entman.find(FamilyDoctorJPA.class, ProfessionalNumberId); + FamilyDoctorJPA fd = entman.find(FamilyDoctorJPA.class, newDoctor); if (fd == null) { - throw new Exception("No se pueden actualizar los datos del médico de familia porque no se encuentra en la base de datos ningún registro con id: " - + String.valueOf(ProfessionalNumberId)); + throw new Exception( + "No se pueden actualizar los datos del médico de familia porque no se encuentra en la base de datos ningún registro con id: " + String.valueOf(newDoctor)); } PatientTO paTO = null; pat.setFamilyDoctor(fd); entman.persist(pat); - //CommonFacadeRemote common = new CommonFacadeBean(); - return commonServices.retrievePatient(pat.getId()); + // CommonFacadeRemote common = new CommonFacadeBean(); + return commonServices.findPatientById(pat.getId()); } public PatientTO registerPatient(int id, String nif, String name, String surname, String password, String email) { PatientTO paTO = null; - PatientJPA pat = new PatientJPA(nif, name, surname, HashUtils.hashMD5(password), email, null); + PatientJPA pat = new PatientJPA(this.getNextPersonalIdentificationCode(), nif, name, surname, HashUtils.hashMD5(password), email, null); entman.persist(pat); - paTO = new PatientTO(pat.getId(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), null); + paTO = new PatientTO(pat.getId(), this.getNextPersonalIdentificationCode(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), null); return paTO; } @@ -72,11 +82,11 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { throw new Exception("No se encuentra la especialidad médica con identificador: " + specialty.getName()); } - SpecialistDoctorJPA sd = new SpecialistDoctorJPA(nif, name, surname, HashUtils.hashMD5(password), email, ms); + SpecialistDoctorJPA sd = new SpecialistDoctorJPA(this.getNextProfessionalNumber(), nif, name, surname, HashUtils.hashMD5(password), email, ms); entman.persist(sd); SpecialistDoctorTO sdTO = null; - sdTO = new SpecialistDoctorTO(sd.getId(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), specialty); + sdTO = new SpecialistDoctorTO(sd.getId(), this.getNextProfessionalNumber(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), specialty); return sdTO; } @@ -89,10 +99,10 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { throw new Exception("No se encuentra el centro de atención primaria con identificador: " + cap.getName()); } - FamilyDoctorJPA fd = new FamilyDoctorJPA(nif, name, surname, HashUtils.hashMD5(password), email, phcC); + FamilyDoctorJPA fd = new FamilyDoctorJPA(this.getNextProfessionalNumber(), nif, name, surname, HashUtils.hashMD5(password), email, phcC); entman.persist(fd); - fdTO = new FamilyDoctorTO(fd.getId(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), cap); + fdTO = new FamilyDoctorTO(fd.getId(), this.getNextProfessionalNumber(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), cap); return fdTO; } @@ -115,7 +125,7 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { entman.persist(pat); PatientTO patTO = null; - patTO = new PatientTO(pat.getId(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), null); + patTO = new PatientTO(pat.getId(), pat.getPersonalIdentificationCode(), pat.getNif(), pat.getName(), pat.getSurname(), pat.getPassword(), pat.getEmail(), null); return patTO; } @@ -144,7 +154,7 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { entman.persist(sd); SpecialistDoctorTO sdTO = null; - sdTO = new SpecialistDoctorTO(sd.getId(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), specialty); + sdTO = new SpecialistDoctorTO(sd.getId(), sd.getProfessionalNumber(), sd.getNif(), sd.getName(), sd.getSurname(), sd.getPassword(), sd.getEmail(), specialty); return sdTO; } @@ -172,7 +182,7 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { entman.persist(fd); FamilyDoctorTO fdTO = null; - fdTO = new FamilyDoctorTO(fd.getId(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), phcTO); + fdTO = new FamilyDoctorTO(fd.getId(), fd.getProfessionalNumber(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), phcTO); return fdTO; } @@ -192,7 +202,7 @@ public class ProfileFacadeBean implements ProfileFacadeRemote { fd.setPrimaryHealthCareCenter(phcC); entman.persist(fd); - fdTO = new FamilyDoctorTO(fd.getId(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), newCenter); + fdTO = new FamilyDoctorTO(fd.getId(), fd.getProfessionalNumber(), fd.getNif(), fd.getName(), fd.getSurname(), fd.getPassword(), fd.getEmail(), newCenter); return fdTO; } diff --git a/1.sources/MyHealth/src/ejb/profile/ProfileFacadeRemote.java b/1.sources/MyHealth/src/ejb/profile/ProfileFacadeRemote.java index d75674c..5e1ed76 100644 --- a/1.sources/MyHealth/src/ejb/profile/ProfileFacadeRemote.java +++ b/1.sources/MyHealth/src/ejb/profile/ProfileFacadeRemote.java @@ -16,7 +16,7 @@ import TO.SpecialistDoctorTO; @Remote public interface ProfileFacadeRemote { - public PatientTO changeFamilyDoctor(int id, int ProfessionalNumberId) throws Exception; + public PatientTO changeFamilyDoctor(int id, int newDoctor) throws Exception; public PatientTO registerPatient(int id, String nif, String name, String surname, String password, String email); diff --git a/1.sources/MyHealth/src/ejb/systemAdmin/SystemAdminFacadeBean.java b/1.sources/MyHealth/src/ejb/systemAdmin/SystemAdminFacadeBean.java index ba4469c..ea2eccf 100644 --- a/1.sources/MyHealth/src/ejb/systemAdmin/SystemAdminFacadeBean.java +++ b/1.sources/MyHealth/src/ejb/systemAdmin/SystemAdminFacadeBean.java @@ -1,23 +1,18 @@ package ejb.systemAdmin; -import java.util.ArrayList; -import java.util.Collection; - +import javax.ejb.EJB; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import javax.persistence.Query; import TO.LoggedUserTO; -import TO.MedicalSpecialtyTO; -import TO.PrimaryHealthCareCenterTO; +import common.Constants; import common.HashUtils; import common.UserType; +import ejb.common.CommonFacadeLocal; import jpa.AdministratorJPA; import jpa.FamilyDoctorJPA; -import jpa.MedicalSpecialtyJPA; import jpa.PatientJPA; -import jpa.PrimaryHealthCareCenterJPA; import jpa.SpecialistDoctorJPA; /** @@ -32,49 +27,80 @@ public class SystemAdminFacadeBean implements SystemAdminFacadeRemote { @PersistenceContext(unitName = "MyHealth") private EntityManager entman; - public LoggedUserTO login(String id, String pwd) { + @EJB + CommonFacadeLocal commonServices; + + /** + * Si la autenticación no es correcgta devuelve null, sino devuelve un POJO con + * datos del usuario logeado. + * + * La autenticación se realiza en 2 pasos: + * + * Paso 1. Se intenta localizar un registro de usuario, por orden: + * + * a. Primero Paciente, si el identificador comienza por los caracteres + * correctos. + * + * b.Después médico de familia, si el identificador es de profesional + * + * c. Si no lo localizamos buscamos el identificador en la tabla de médicos + * especialistas (el identificador es de profesional) + * + * d. Si no hemos localizado aún al usuario, lo buscamos en la tabla de + * administradores, aún cuando el identificador comience por cualquier carácter + * (podría ser una dirección de email que comienza por caracteres del + * identificaodr de paciente o profesional) + * + * Paso 2. Si hemos localizado un registro de usuario, verificamos si el + * password recibido coincide con el de la base de datos, en tal caso la + * autenticación se compelta y es correcta. + */ + public LoggedUserTO login(String userCode, String pwd) { LoggedUserTO usr = null; - // First try to login as Admin - AdministratorJPA adm = entman.find(AdministratorJPA.class, id); - if (adm != null) { - usr = new LoggedUserTO(adm.getEmail(), adm.getEmail(), adm.getPassword(), UserType.ADMINISTRATOR); - } else { - try { - int iId = Integer.parseInt(id); - - // Try to login Patient, FamilyDoctor or SpecialistDoctor - // TODO: Si Patient, FamilyDoctor o Specialist Doctor tienen el mismo id, solo - // el paciente se puede logear. ¿Deberíamos cambiar esto permitiendo seleccionar - // el perfil a logearse? - PatientJPA pat = entman.find(PatientJPA.class, iId); - - if (pat != null) { - usr = new LoggedUserTO(String.valueOf(pat.getId()), pat.getName(), pat.getPassword(), UserType.PATIENT); - } else { - FamilyDoctorJPA fdoc = entman.find(FamilyDoctorJPA.class, iId); - - if (fdoc != null) { - usr = new LoggedUserTO(String.valueOf(fdoc.getId()), fdoc.getName(), fdoc.getPassword(), UserType.FAMILY_DOCTOR); - } else { - SpecialistDoctorJPA sdoc = entman.find(SpecialistDoctorJPA.class, iId); - - if (sdoc != null) { - usr = new LoggedUserTO(String.valueOf(sdoc.getId()), sdoc.getName(), sdoc.getPassword(), UserType.SPECIALIST_DOCTOR); - } - } - } - } catch (NumberFormatException nf) { - // id is not an intenger, so, login fails - usr = null; + if (userCode.startsWith(Constants.PERSONAL_IDENTIFICATION_CODE_PREFIX)) { + // Si el identificador de usuario es de tipo paciente, intentamos realizar el + // login. + PatientJPA pat = this.commonServices.findPatientByCode(userCode); + if (pat != null) { + usr = new LoggedUserTO(String.valueOf(pat.getId()), pat.getName(), pat.getPassword(), UserType.PATIENT); } + } else if (userCode.startsWith(Constants.PROFESSIONAL_NUMBER_PREFIX)) { + // Si el identificador de usuario es de tipo profesional, intentamos realizar el + // login, primero como médico de familia, después como especialista + FamilyDoctorJPA fd = this.commonServices.findFamilyDoctorByCode(userCode); + if (fd != null) { + usr = new LoggedUserTO(String.valueOf(fd.getId()), fd.getName(), fd.getPassword(), UserType.FAMILY_DOCTOR); + } else { + // No era un código de médico de familia, intenamos logearlo como especialista + SpecialistDoctorJPA sd = this.commonServices.findSpecialistDoctorByCode(userCode); + + if (sd != null) { + usr = new LoggedUserTO(String.valueOf(sd.getId()), sd.getName(), sd.getPassword(), UserType.SPECIALIST_DOCTOR); + } + } } + // Si todavía no hemos conseguido autenticar al usuario, podría tratarse de una + // dirección de email de un administrador que empiece por + // PERSONAL_IDENTIFICATION_CODE_PREFIX o por PROFESSIONAL_NUMBER_PREFIX, por lo + // cual intentamos login contra la tabla de administradores + if (usr == null) { + // Intentamos recuperar un registro de administrador + AdministratorJPA adm = entman.find(AdministratorJPA.class, userCode); + + if (adm != null) { + usr = new LoggedUserTO(adm.getEmail(), adm.getEmail(), adm.getPassword(), UserType.ADMINISTRATOR); + } + } + + // Si el objeto usr, es que hemos localizado un registro de usuario, verificamos + // la contraseña. if (usr != null) { // Comprobamos el password if (usr.getPassword().equals(HashUtils.hashMD5(pwd)) == false) { - // Bad Password, devolvemos null! + // Bad Password, devolvemos null! La autenticación falla. usr = null; } } diff --git a/1.sources/MyHealth/src/jpa/FamilyDoctorJPA.java b/1.sources/MyHealth/src/jpa/FamilyDoctorJPA.java index 3d36ead..0c77993 100644 --- a/1.sources/MyHealth/src/jpa/FamilyDoctorJPA.java +++ b/1.sources/MyHealth/src/jpa/FamilyDoctorJPA.java @@ -30,6 +30,8 @@ public class FamilyDoctorJPA implements Serializable { @Column(updatable = false) @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; + @Column(nullable = false, unique = true) + private String professionalNumber; private String nif; private String name; private String surname; @@ -49,7 +51,8 @@ public class FamilyDoctorJPA implements Serializable { super(); } - public FamilyDoctorJPA(String nif, String name, String surname, String password, String email, PrimaryHealthCareCenterJPA phc) { + public FamilyDoctorJPA(String pin, String nif, String name, String surname, String password, String email, PrimaryHealthCareCenterJPA phc) { + this.setProfessionalNumber(pin); this.nif = nif; this.name = name; this.surname = surname; @@ -124,4 +127,12 @@ public class FamilyDoctorJPA implements Serializable { public void setPrimaryHealthCareCenter(PrimaryHealthCareCenterJPA center) { this.primaryHealthCareCenter = center; } + + public String getProfessionalNumber() { + return professionalNumber; + } + + public void setProfessionalNumber(String professionalNumber) { + this.professionalNumber = professionalNumber; + } } \ No newline at end of file diff --git a/1.sources/MyHealth/src/jpa/PatientJPA.java b/1.sources/MyHealth/src/jpa/PatientJPA.java index fd4b069..764b444 100644 --- a/1.sources/MyHealth/src/jpa/PatientJPA.java +++ b/1.sources/MyHealth/src/jpa/PatientJPA.java @@ -26,6 +26,8 @@ public class PatientJPA implements Serializable { @Column(updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; + @Column(nullable = false, unique = true) + private String personalIdentificationCode; private String nif; private String name; private String surname; @@ -42,7 +44,8 @@ public class PatientJPA implements Serializable { super(); } - public PatientJPA(String nif, String name, String surname, String password, String email, FamilyDoctorJPA familyDoc) { + public PatientJPA(String pic, String nif, String name, String surname, String password, String email, FamilyDoctorJPA familyDoc) { + this.personalIdentificationCode = pic; this.nif = nif; this.name = name; this.surname = surname; @@ -106,4 +109,12 @@ public class PatientJPA implements Serializable { public void setFamilyDoctor(FamilyDoctorJPA familyDoc) { this.familyDoctor = familyDoc; } + + public String getPersonalIdentificationCode() { + return personalIdentificationCode; + } + + public void setPersonalIdentificationCode(String personalIdentificationCode) { + this.personalIdentificationCode = personalIdentificationCode; + } } diff --git a/1.sources/MyHealth/src/jpa/SpecialistDoctorJPA.java b/1.sources/MyHealth/src/jpa/SpecialistDoctorJPA.java index 6ffa8d4..c845966 100644 --- a/1.sources/MyHealth/src/jpa/SpecialistDoctorJPA.java +++ b/1.sources/MyHealth/src/jpa/SpecialistDoctorJPA.java @@ -26,6 +26,8 @@ public class SpecialistDoctorJPA implements Serializable { @Column(updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; + @Column(nullable = false, unique = true) + private String professionalNumber; private String nif; private String name; private String surname; @@ -42,7 +44,8 @@ public class SpecialistDoctorJPA implements Serializable { super(); } - public SpecialistDoctorJPA(String nif, String name, String surname, String password, String email, MedicalSpecialtyJPA ms) { + public SpecialistDoctorJPA(String pic, String nif, String name, String surname, String password, String email, MedicalSpecialtyJPA ms) { + this.setProfessionalNumber(pic); this.nif = nif; this.name = name; this.surname = surname; @@ -106,4 +109,12 @@ public class SpecialistDoctorJPA implements Serializable { public void setMedicalSpecialty(MedicalSpecialtyJPA specialty) { this.medicalSpecialty = specialty; } + + public String getProfessionalNumber() { + return professionalNumber; + } + + public void setProfessionalNumber(String professionalNumber) { + this.professionalNumber = professionalNumber; + } } diff --git a/1.sources/MyHealth/src/managedbean/profile/ChangeFamilyDoctorMBean.java b/1.sources/MyHealth/src/managedbean/profile/ChangeFamilyDoctorMBean.java index 2c1d72c..463af12 100644 --- a/1.sources/MyHealth/src/managedbean/profile/ChangeFamilyDoctorMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/ChangeFamilyDoctorMBean.java @@ -53,7 +53,7 @@ public class ChangeFamilyDoctorMBean extends ManagedBeanBase implements Serializ if (usr.getUserType() == UserType.PATIENT) { this.familyDoctorList = this.getRemoteManagerCommon().listFamilyDoctorsPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); - PatientTO pat = this.getRemoteManagerCommon().retrievePatient(this.id); + PatientTO pat = this.getRemoteManagerCommon().findPatientById(this.id); this.setCurrentFamilyDoctor(pat.getFamilyDoctor()); } } diff --git a/1.sources/MyHealth/src/managedbean/profile/ChangePrimaryHealthCareCenterMBean.java b/1.sources/MyHealth/src/managedbean/profile/ChangePrimaryHealthCareCenterMBean.java index 1b43f38..f0c6107 100644 --- a/1.sources/MyHealth/src/managedbean/profile/ChangePrimaryHealthCareCenterMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/ChangePrimaryHealthCareCenterMBean.java @@ -55,7 +55,7 @@ public class ChangePrimaryHealthCareCenterMBean extends ManagedBeanBase implemen if (usr.getUserType() == UserType.FAMILY_DOCTOR) { this.primaryHealthCareCentersList = this.getRemoteManagerCommon().listCAPsPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); - FamilyDoctorTO fd = this.getRemoteManagerCommon().retrieveFamilyDoctor(this.id); + FamilyDoctorTO fd = this.getRemoteManagerCommon().findFamilyDoctorById(this.id); this.setCurrentCenter(fd.getPrimaryHealthCareCenter()); } } diff --git a/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java b/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java index 158ac99..f2969b9 100644 --- a/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/RegisterUserMBean.java @@ -36,8 +36,8 @@ import managedbean.common.ValidationUtils; public class RegisterUserMBean extends ManagedBeanBase implements Serializable { private static final long serialVersionUID = 1L; - private int id; + private String cipCode; private String nif; private String name; private String surname; @@ -185,14 +185,6 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { this.nif = nif; } - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - public void addNewUser() { int error = 0; @@ -214,17 +206,17 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { switch (UserType.valueOf(this.userType)) { case PATIENT: PatientTO pat = this.getRemoteManagerProfile().registerPatient(id, nif, name, surname, password, email); - this.id = pat.getId(); + this.cipCode = pat.getPersonalIdentificationCode(); break; case FAMILY_DOCTOR: FamilyDoctorTO fd = this.getRemoteManagerProfile().registerFamilyDoctor(id, nif, name, surname, password, email, this.primaryHealthCareCenter); - this.id = fd.getId(); + this.cipCode = fd.getProfessionalNumber(); break; case SPECIALIST_DOCTOR: SpecialistDoctorTO sd = this.getRemoteManagerProfile().registerSpecialistDoctor(id, nif, name, surname, password, email, this.medicalSpecialty); - this.id = sd.getId(); + this.cipCode = sd.getProfessionalNumber(); break; case ADMINISTRATOR: @@ -268,4 +260,12 @@ public class RegisterUserMBean extends ManagedBeanBase implements Serializable { return registered; } + public String getCipCode() { + return cipCode; + } + + public void setCipCode(String cipCode) { + this.cipCode = cipCode; + } + } diff --git a/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java b/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java index 5cb372b..81b492f 100644 --- a/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java +++ b/1.sources/MyHealth/src/managedbean/profile/UpdateProfileMBean.java @@ -40,6 +40,7 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable private static final long serialVersionUID = 1L; private int id; + private String cipCode; private String nif; private String name; private String surname; @@ -88,35 +89,15 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable switch (usr.getUserType()) { case PATIENT: this.familyDoctorList = this.getRemoteManagerCommon().listFamilyDoctorsPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); - PatientTO pat = this.getRemoteManagerCommon().retrievePatient(this.id); - - this.name = pat.getName(); - this.surname = pat.getName(); - this.nif = pat.getNif(); - this.email = pat.getEmail(); - this.currentPassword = pat.getPassword(); + this.setPatientData(this.getRemoteManagerCommon().findPatientById(this.id)); break; case SPECIALIST_DOCTOR: this.medicalSpecialitiesList = this.getRemoteManagerCommon().listMedicalSpecialitiesPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); - SpecialistDoctorTO sd = this.getRemoteManagerCommon().retrieveSpecialistDoctor(this.id); - - this.name = sd.getName(); - this.surname = sd.getName(); - this.nif = sd.getNif(); - this.email = sd.getEmail(); - this.currentPassword = sd.getPassword(); - this.medicalSpecialty = sd.getMedicalSpecialty(); + this.setSpecialistDoctorData(this.getRemoteManagerCommon().findSpecialistDoctorById(this.id)); break; case FAMILY_DOCTOR: this.primaryHealthCareCentersList = this.getRemoteManagerCommon().listCAPsPaged(0, Constants.MAX_ITEMS_AUTOCOMPLETE_SEARCH); - FamilyDoctorTO fd = this.getRemoteManagerCommon().retrieveFamilyDoctor(this.id); - - this.name = fd.getName(); - this.surname = fd.getName(); - this.nif = fd.getNif(); - this.email = fd.getEmail(); - this.currentPassword = fd.getPassword(); - this.primaryHealthCareCenter = fd.getPrimaryHealthCareCenter(); + this.setFamilyDoctorData(this.getRemoteManagerCommon().findFamilyDoctorById(this.id)); break; case ADMINISTRATOR: // TODO: Recuperar usuario administrador para editar su perfil ¿? @@ -127,7 +108,39 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable } catch (Exception e) { this.manageException(e); } + } + private void setPatientData(PatientTO pat) { + this.id = pat.getId(); + this.cipCode = pat.getPersonalIdentificationCode(); + this.name = pat.getName(); + this.surname = pat.getName(); + this.nif = pat.getNif(); + this.email = pat.getEmail(); + this.currentPassword = pat.getPassword(); + this.familyDoctor = pat.getFamilyDoctor(); + } + + private void setFamilyDoctorData(FamilyDoctorTO fd) { + this.id = fd.getId(); + this.cipCode = fd.getProfessionalNumber(); + this.name = fd.getName(); + this.surname = fd.getName(); + this.nif = fd.getNif(); + this.email = fd.getEmail(); + this.currentPassword = fd.getPassword(); + this.primaryHealthCareCenter = fd.getPrimaryHealthCareCenter(); + } + + private void setSpecialistDoctorData(SpecialistDoctorTO sd) { + this.id = sd.getId(); + this.cipCode = sd.getProfessionalNumber(); + this.name = sd.getName(); + this.surname = sd.getName(); + this.nif = sd.getNif(); + this.email = sd.getEmail(); + this.currentPassword = sd.getPassword(); + this.medicalSpecialty = sd.getMedicalSpecialty(); } public List getUserTypes() { @@ -290,17 +303,17 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable switch (UserType.valueOf(this.userType)) { case PATIENT: PatientTO pat = this.getRemoteManagerProfile().updatePatientData(id, nif, name, surname, password, email); - this.id = pat.getId(); + this.setPatientData(pat); break; case FAMILY_DOCTOR: FamilyDoctorTO fd = this.getRemoteManagerProfile().updateFamilyDoctorData(id, nif, name, surname, password, email, this.primaryHealthCareCenter); - this.id = fd.getId(); + this.setFamilyDoctorData(fd); break; case SPECIALIST_DOCTOR: SpecialistDoctorTO sd = this.getRemoteManagerProfile().updateSpecialistDoctorData(id, nif, name, surname, password, email, this.medicalSpecialty); - this.id = sd.getId(); + this.setSpecialistDoctorData(sd); break; case ADMINISTRATOR: @@ -360,4 +373,8 @@ public class UpdateProfileMBean extends ManagedBeanBase implements Serializable this.familyDoctor = familyDoctor; } + public String getCipCode() { + return cipCode; + } + }