package ejb.systemAdmin; import java.util.ArrayList; import java.util.Collection; 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.HashUtils; import common.UserType; import jpa.AdministratorJPA; import jpa.FamilyDoctorJPA; import jpa.MedicalSpecialtyJPA; import jpa.PatientJPA; import jpa.PrimaryHealthCareCenterJPA; import jpa.SpecialistDoctorJPA; /** * * @author Marcos García Núñez (mgarcianun@uoc.edu) * */ @Stateless public class SystemAdminFacadeBean implements SystemAdminFacadeRemote { // Persistence Unit Context @PersistenceContext(unitName = "MyHealth") private EntityManager entman; /** * Metodo que devuelve todas las especialidades medicas */ public Collection listAllMedicalSpecialities() { return this.listPagedMedicalSpecialities(0, 0); } /** * Metodo que devuelve las especialidades médicas de forma paginada * * Acepta como parametro la página (comenzando en 0) y el número de elementos de * cada página * */ public Collection listPagedMedicalSpecialities(int pageNumber, int pageSize) { Query query = entman.createQuery("from MedicalSpecialtyJPA order by name"); if (pageSize > 0) { query.setFirstResult(pageNumber * pageSize); query.setMaxResults(pageSize); } @SuppressWarnings("unchecked") Collection allJPA = query.getResultList(); Collection allSpecialities = new ArrayList(); for (MedicalSpecialtyJPA ms : allJPA) { allSpecialities.add(new MedicalSpecialtyTO(ms.getName(), ms.getDescription())); } return allSpecialities; } public Collection listAllCAPs() { return this.listPagedAllCAPs(0, 0); } public Collection listPagedAllCAPs(int pageNumber, int pageSize) { Query query = entman.createQuery("from PrimaryHealthCareCenterJPA order by name"); if (pageSize > 0) { query.setFirstResult(pageNumber * pageSize); query.setMaxResults(pageSize); } @SuppressWarnings("unchecked") Collection allJPA = query.getResultList(); Collection allCAPs = new ArrayList(); for (PrimaryHealthCareCenterJPA cap : allJPA) { allCAPs.add(new PrimaryHealthCareCenterTO(cap.getName(), cap.getLocation())); } return allCAPs; } public LoggedUserTO login(String id, 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 (usr != null) { // Comprobamos el password if (usr.getPassword().equals(HashUtils.hashMD5(pwd)) == false) { // Bad Password, devolvemos null! usr = null; } } return usr; } }