From 1d80e45626d6b187f1b4b95007a0ccfc1ccdca36 Mon Sep 17 00:00:00 2001 From: Martin Wahnschaffe Date: Wed, 29 Jun 2016 15:04:00 +0200 Subject: [PATCH] #3 added property-files replaced EJB-singleton annotations with stateless --- .../de/symeda/sormas/api/FacadeProvider.java | 12 ++- .../de/symeda/sormas/api/ReferenceDto.java | 25 +++++++ .../symeda/sormas/api/caze/CaseDataDto.java | 59 ++++++++++----- .../sormas/api/facility/FacilityFacade.java | 13 ++++ .../{PersonDto.java => CasePersonDto.java} | 4 +- .../sormas/api/person/PersonFacade.java | 6 +- .../de/symeda/sormas/api/user/UserFacade.java | 13 ++++ .../de/symeda/sormas/backend/caze/Case.java | 10 +++ .../sormas/backend/caze/CaseFacadeEjb.java | 54 ++++++++----- .../sormas/backend/caze/CaseService.java | 2 - .../backend/common/AbstractAdoService.java | 5 -- .../sormas/backend/common/AdoService.java | 19 +---- .../sormas/backend/facility/Facility.java | 11 +++ .../backend/facility/FacilityFacadeEjb.java | 25 +++++++ .../backend/person/PersonFacadeEjb.java | 18 ++--- .../sormas/backend/user/UserFacadeEjb.java | 25 +++++++ .../sormas/backend/user/UserService.java | 15 ++++ .../symeda/sormas/backend/util/DtoHelper.java | 18 +++++ .../de/symeda/sormas/rest/CaseResource.java | 2 +- .../ui/surveillance/caze/CaseController.java | 12 +-- .../ui/surveillance/caze/CaseDataForm.java | 62 +++++++-------- .../sormas/ui/surveillance/caze/CaseGrid.java | 12 +-- ...formationForm.java => CasePersonForm.java} | 20 ++--- .../caze/PatientInformationView.java | 2 +- .../sormas/ui/utils/AbstractEditForm.java | 51 ++++++++++++- .../symeda/sormas/ui/utils/FieldHelper.java | 7 ++ .../sormas/ui/utils/I18nProperties.java | 75 +++++++++++++++++++ .../de/symeda/sormas/ui/utils/LayoutUtil.java | 6 +- .../main/resources/fieldCaptions.properties | 13 ++++ .../resources/fieldDescriptions.properties | 0 30 files changed, 461 insertions(+), 135 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java rename sormas-api/src/main/java/de/symeda/sormas/api/person/{PersonDto.java => CasePersonDto.java} (81%) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java rename sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/{PatientInformationForm.java => CasePersonForm.java} (65%) create mode 100644 sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/FieldHelper.java create mode 100644 sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/I18nProperties.java create mode 100644 sormas-surveillance-ui/src/main/resources/fieldCaptions.properties create mode 100644 sormas-surveillance-ui/src/main/resources/fieldDescriptions.properties diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java index 0ce1827c09f..08016e83c73 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java @@ -4,7 +4,9 @@ import javax.naming.NamingException; import de.symeda.sormas.api.caze.CaseFacade; +import de.symeda.sormas.api.facility.FacilityFacade; import de.symeda.sormas.api.person.PersonFacade; +import de.symeda.sormas.api.user.UserFacade; public class FacadeProvider { @@ -36,7 +38,15 @@ public static CaseFacade getCaseFacade() { public static PersonFacade getPersonFacade() { return get().lookupEjbRemote(PersonFacade.class); } - + + public static FacilityFacade getFacilityFacade() { + return get().lookupEjbRemote(FacilityFacade.class); + } + + public static UserFacade getUserFacade() { + return get().lookupEjbRemote(UserFacade.class); + } + @SuppressWarnings("unchecked") public

P lookupEjbRemote(Class

clazz) { try { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java new file mode 100644 index 00000000000..12b428ec1ef --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java @@ -0,0 +1,25 @@ +package de.symeda.sormas.api; + +import de.symeda.sormas.api.DataTransferObject; + +public class ReferenceDto extends DataTransferObject { + + private static final long serialVersionUID = 4500877980734738141L; + + public static final String CAPTION = "caption"; + + private String caption; + + @Override + public String toString() { + return getCaption(); + } + + public String getCaption() { + return caption; + } + + public void setCaption(String caption) { + this.caption = caption; + } +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java index 186af429b82..741414fbe27 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java @@ -1,22 +1,31 @@ package de.symeda.sormas.api.caze; +import java.util.Date; + import de.symeda.sormas.api.DataTransferObject; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.person.CasePersonDto; public class CaseDataDto extends DataTransferObject { private static final long serialVersionUID = 5007131477733638086L; + public static final String I18N_PREFIX = "CaseData"; + public static final String CASE_STATUS = "caseStatus"; - public static final String DESCRIPTION = "description"; - public static final String PERSON = "personDto"; + public static final String PERSON = "person"; public static final String DISEASE = "disease"; + public static final String HEALTH_FACILITY = "healthFacility"; + public static final String REPORTER = "reporter"; + public static final String REPORT_DATE = "reportDate"; + private CasePersonDto person; private CaseStatus caseStatus; - private String description; - private PersonDto personDto; private Disease disease; + private ReferenceDto healthFacility; + private ReferenceDto reporter; + private Date reportDate; public CaseStatus getCaseStatus() { return caseStatus; @@ -26,20 +35,12 @@ public void setCaseStatus(CaseStatus caseStatus) { this.caseStatus = caseStatus; } - public String getDescription() { - return description; + public CasePersonDto getPerson() { + return person; } - public void setDescription(String description) { - this.description = description; - } - - public PersonDto getPerson() { - return personDto; - } - - public void setPersonDto(PersonDto personDto) { - this.personDto = personDto; + public void setPerson(CasePersonDto personDto) { + this.person = personDto; } public Disease getDisease() { @@ -49,4 +50,28 @@ public Disease getDisease() { public void setDisease(Disease disease) { this.disease = disease; } + + public ReferenceDto getReporter() { + return reporter; + } + + public void setReporter(ReferenceDto reporter) { + this.reporter = reporter; + } + + public ReferenceDto getHealthFacility() { + return healthFacility; + } + + public void setHealthFacility(ReferenceDto healthFacility) { + this.healthFacility = healthFacility; + } + + public Date getReportDate() { + return reportDate; + } + + public void setReportDate(Date reportDate) { + this.reportDate = reportDate; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java new file mode 100644 index 00000000000..a5d747ba12d --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java @@ -0,0 +1,13 @@ +package de.symeda.sormas.api.facility; + +import java.util.List; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.ReferenceDto; + +@Remote +public interface FacilityFacade { + + public abstract List getAllAsReference(); +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/CasePersonDto.java similarity index 81% rename from sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java rename to sormas-api/src/main/java/de/symeda/sormas/api/person/CasePersonDto.java index 4267f324cdb..3138c2fadc6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/CasePersonDto.java @@ -2,10 +2,12 @@ import de.symeda.sormas.api.DataTransferObject; -public class PersonDto extends DataTransferObject { +public class CasePersonDto extends DataTransferObject { private static final long serialVersionUID = -8558187171374254398L; + public static final String I18N_PREFIX = "CasePerson"; + public static final String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java index 5f718a8de50..d8e2d6d22d8 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java @@ -7,9 +7,9 @@ @Remote public interface PersonFacade { - public abstract List getAllPerson(); + public abstract List getAllPerson(); - public abstract PersonDto getByUuid(String uuid); + public abstract CasePersonDto getByUuid(String uuid); - public abstract PersonDto savePerson(PersonDto dto); + public abstract CasePersonDto savePerson(CasePersonDto dto); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java new file mode 100644 index 00000000000..d9805bca3d8 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -0,0 +1,13 @@ +package de.symeda.sormas.api.user; + +import java.util.List; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.ReferenceDto; + +@Remote +public interface UserFacade { + + public abstract List getAllAsReference(); +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java index 62bc236b191..edb67a1e31e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/Case.java @@ -16,6 +16,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseStatus; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.facility.Facility; import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.user.User; @@ -31,6 +32,7 @@ public class Case extends AbstractDomainObject { private String description; private Disease disease; private CaseStatus caseStatus; + private Facility healthFacility; private User reporter; private Date reportDate; @@ -176,4 +178,12 @@ public void setSurveillanceSupervisor(User surveillanceSupervisor) { this.surveillanceSupervisor = surveillanceSupervisor; } + @ManyToOne(cascade = {}) + public Facility getHealthFacility() { + return healthFacility; + } + public void setHealthFacility(Facility healthFacility) { + this.healthFacility = healthFacility; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 172fb92aedd..7a0c4b9d91f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -1,47 +1,48 @@ package de.symeda.sormas.backend.caze; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import javax.ejb.EJB; -import javax.ejb.Singleton; +import javax.ejb.Stateless; import javax.validation.constraints.NotNull; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseFacade; +import de.symeda.sormas.backend.facility.Facility; +import de.symeda.sormas.backend.facility.FacilityService; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.person.PersonFacadeEjb; import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.util.DtoHelper; -@Singleton(name = "CaseFacade") +@Stateless(name = "CaseFacade") public class CaseFacadeEjb implements CaseFacade { @EJB - private CaseService cs; + private CaseService caseService; @EJB - private PersonService ps; + private PersonService personService; + @EJB + private FacilityService facilityService; @Override public List getAllCases() { - return cs.getAll().stream() + return caseService.getAll().stream() .map(c -> toCaseDataDto(c)) .collect(Collectors.toList()); } @Override public CaseDataDto getCaseDataByUuid(String uuid) { - return Optional.of(uuid) - .map(u -> cs.getByUuid(u)) - .map(c -> toCaseDataDto(c)) - .orElse(null); + return toCaseDataDto(caseService.getByUuid(uuid)); } @Override public CaseDataDto saveCase(CaseDataDto dto) { Case caze = fromCaseDataDto(dto); - cs.ensurePersisted(caze); + caseService.ensurePersisted(caze); return toCaseDataDto(caze); @@ -49,36 +50,49 @@ public CaseDataDto saveCase(CaseDataDto dto) { @Override public CaseDataDto createCase(String personUuid, CaseDataDto caseDto) { - Person person = ps.getByUuid(personUuid); + Person person = personService.getByUuid(personUuid); Case caze = fromCaseDataDto(caseDto); caze.setPerson(person); - cs.ensurePersisted(caze); + caseService.ensurePersisted(caze); return toCaseDataDto(caze); - } public Case fromCaseDataDto(@NotNull CaseDataDto dto) { - boolean createCase = dto.getChangeDate() == null; - Case caze = createCase ? new Case() : cs.getByUuid(dto.getUuid()); + + Case caze; + if (dto.getChangeDate() == null) { + caze = new Case(); + } else { + caze = caseService.getByUuid(dto.getUuid()); + } + caze.setUuid(dto.getUuid()); caze.setDisease(dto.getDisease()); - caze.setDescription(dto.getDescription()); caze.setCaseStatus(dto.getCaseStatus()); + if (dto.getHealthFacility() != null) { + Facility facility = facilityService.getByUuid(dto.getHealthFacility().getUuid()); + caze.setHealthFacility(facility); + } else { + caze.setHealthFacility(null); + } return caze; } public static CaseDataDto toCaseDataDto(Case caze) { + if (caze == null) { + return null; + } CaseDataDto dto = new CaseDataDto(); dto.setChangeDate(caze.getChangeDate()); dto.setUuid(caze.getUuid()); dto.setDisease(caze.getDisease()); dto.setCaseStatus(caze.getCaseStatus()); - dto.setDescription(caze.getDescription()); - - dto.setPersonDto(PersonFacadeEjb.toDto(caze.getPerson())); + dto.setPerson(PersonFacadeEjb.toDto(caze.getPerson())); + dto.setHealthFacility(DtoHelper.toReferenceDto(caze.getHealthFacility())); + dto.setReporter(DtoHelper.toReferenceDto(caze.getReporter())); return dto; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 7c43511ccde..c5481c39036 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -6,8 +6,6 @@ import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.person.Person; - - @Stateless @LocalBean public class CaseService extends AbstractAdoService { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java index fb408a39ea9..447e1766634 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java @@ -103,11 +103,6 @@ public void delete(ADO deleteme) { em.flush(); } - @Override - public ADO merge(ADO mergeme) { - return em.merge(mergeme); - } - @Override public void doFlush() { em.flush(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java index 17169456043..d8daca939c6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java @@ -15,13 +15,6 @@ public interface AdoService { ADO getByUuid(@NotNull String uuid); -// /** -// * @deprecated Das ist ein Hibernate-spezifisches Feature -// * @param saveme -// */ -// @Deprecated -// void saveOrUpdate(ADO saveme); - /** * DELETES an entity from the database! * @@ -29,14 +22,6 @@ public interface AdoService { */ void delete(ADO deleteme); - /** - * @deprecated re-attachen eines detachten Entities ist eher die Ausnahme - * @param mergeme - * @return - */ - @Deprecated - ADO merge(ADO mergeme); - /** * Speichert ein neues Objekt in der Datenbank. * Es darf vorher keine id haben und ist danch attacht. @@ -51,8 +36,7 @@ public interface AdoService { * Das ado ist nach dem Aufruf attacht. * * @param ado - * @throws EntityExistsException - * wenn das ado detacht ist + * @throws EntityExistsException wenn das ado detacht ist */ void ensurePersisted(ADO ado) throws EntityExistsException; @@ -60,5 +44,4 @@ public interface AdoService { * JPA-Session flushen */ void doFlush(); - } \ No newline at end of file diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/Facility.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/Facility.java index 287965a5815..7ab08597dc7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/Facility.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/Facility.java @@ -53,4 +53,15 @@ public void setPublicOwnership(boolean publicOwnership) { this.publicOwnership = publicOwnership; } + @Override + public String toString() { + StringBuilder caption = new StringBuilder(); + caption.append(name); + if (location != null) { + if (location.getCommunity() != null) { + caption.append(" (").append(location.getCommunity().getName()).append(")"); + } + } + return caption.toString(); + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityFacadeEjb.java new file mode 100644 index 00000000000..277631fd783 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityFacadeEjb.java @@ -0,0 +1,25 @@ +package de.symeda.sormas.backend.facility; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.ejb.EJB; +import javax.ejb.Stateless; + +import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.facility.FacilityFacade; +import de.symeda.sormas.backend.util.DtoHelper; + +@Stateless(name = "FacilityFacade") +public class FacilityFacadeEjb implements FacilityFacade { + + @EJB + private FacilityService fs; + + @Override + public List getAllAsReference() { + return fs.getAll().stream() + .map(f -> DtoHelper.toReferenceDto(f)) + .collect(Collectors.toList()); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java index 35467111767..9c3b74a7125 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java @@ -5,20 +5,20 @@ import java.util.stream.Collectors; import javax.ejb.EJB; -import javax.ejb.Singleton; +import javax.ejb.Stateless; import javax.validation.constraints.NotNull; -import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.CasePersonDto; import de.symeda.sormas.api.person.PersonFacade; -@Singleton(name = "PersonFacade") +@Stateless(name = "PersonFacade") public class PersonFacadeEjb implements PersonFacade { @EJB private PersonService ps; @Override - public List getAllPerson() { + public List getAllPerson() { return ps.getAll().stream() .map(c -> toDto(c)) @@ -26,7 +26,7 @@ public List getAllPerson() { } @Override - public PersonDto getByUuid(String uuid) { + public CasePersonDto getByUuid(String uuid) { return Optional.of(uuid) .map(u -> ps.getByUuid(u)) .map(c -> toDto(c)) @@ -34,7 +34,7 @@ public PersonDto getByUuid(String uuid) { } @Override - public PersonDto savePerson(PersonDto dto) { + public CasePersonDto savePerson(CasePersonDto dto) { Person person = toPerson(dto); ps.ensurePersisted(person); @@ -42,7 +42,7 @@ public PersonDto savePerson(PersonDto dto) { } - public Person toPerson(@NotNull PersonDto dto) { + public Person toPerson(@NotNull CasePersonDto dto) { Person bo = ps.getByUuid(dto.getUuid()); if(bo==null) { bo = ps.createPerson(); @@ -53,8 +53,8 @@ public Person toPerson(@NotNull PersonDto dto) { return bo; } - public static PersonDto toDto(Person person) { - PersonDto dto = new PersonDto(); + public static CasePersonDto toDto(Person person) { + CasePersonDto dto = new CasePersonDto(); dto.setChangeDate(person.getChangeDate()); dto.setUuid(person.getUuid()); dto.setFirstName(person.getFirstName()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java new file mode 100644 index 00000000000..c5b75aba990 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -0,0 +1,25 @@ +package de.symeda.sormas.backend.user; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.ejb.EJB; +import javax.ejb.Stateless; + +import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.api.user.UserFacade; +import de.symeda.sormas.backend.util.DtoHelper; + +@Stateless(name = "UserFacade") +public class UserFacadeEjb implements UserFacade { + + @EJB + private UserService us; + + @Override + public List getAllAsReference() { + return us.getAll().stream() + .map(f -> DtoHelper.toReferenceDto(f)) + .collect(Collectors.toList()); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java new file mode 100644 index 00000000000..df5fc613857 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserService.java @@ -0,0 +1,15 @@ +package de.symeda.sormas.backend.user; + +import javax.ejb.LocalBean; +import javax.ejb.Stateless; + +import de.symeda.sormas.backend.common.AbstractAdoService; + +@Stateless +@LocalBean +public class UserService extends AbstractAdoService { + + public UserService() { + super(User.class); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java new file mode 100644 index 00000000000..ff067facb78 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/DtoHelper.java @@ -0,0 +1,18 @@ +package de.symeda.sormas.backend.util; + +import de.symeda.sormas.api.ReferenceDto; +import de.symeda.sormas.backend.common.AbstractDomainObject; + +public final class DtoHelper { + + public static ReferenceDto toReferenceDto(AbstractDomainObject entity) { + if (entity == null) { + return null; + } + ReferenceDto dto = new ReferenceDto(); + dto.setUuid(entity.getUuid()); + dto.setChangeDate(entity.getChangeDate()); + dto.setCaption(entity.toString()); + return dto; + } +} diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java index 3c3bbe5cdb6..dd272aa205c 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java @@ -11,7 +11,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseFacade; -import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.CasePersonDto; /** * @see https://jersey.java.net/documentation/latest/ diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseController.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseController.java index c93d8ea6661..3379bc483f6 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseController.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseController.java @@ -10,7 +10,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseFacade; -import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.CasePersonDto; import de.symeda.sormas.api.person.PersonFacade; import de.symeda.sormas.ui.surveillance.SurveillanceUI; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; @@ -153,27 +153,27 @@ public void onCommit() { return editView; } - public CommitDiscardWrapperComponent getPatientInformationEditComponent(String caseUuid) { + public CommitDiscardWrapperComponent getPatientInformationEditComponent(String caseUuid) { VerticalLayout formLayout = new VerticalLayout(); - PatientInformationForm caseEditForm = new PatientInformationForm(); + CasePersonForm caseEditForm = new CasePersonForm(); formLayout.addComponent(caseEditForm); formLayout.setSizeFull(); formLayout.setExpandRatio(caseEditForm, 1); CaseDataDto caseDataDto = findCase(caseUuid); - PersonDto personDto = pf.getByUuid(caseDataDto.getPerson().getUuid()); + CasePersonDto personDto = pf.getByUuid(caseDataDto.getPerson().getUuid()); caseEditForm.setDto(personDto); - final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent(caseEditForm, caseEditForm.getFieldGroup()); + final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent(caseEditForm, caseEditForm.getFieldGroup()); editView.addCommitListener(new CommitListener() { @Override public void onCommit() { if (caseEditForm.getFieldGroup().isValid()) { - PersonDto dto = caseEditForm.getDto(); + CasePersonDto dto = caseEditForm.getDto(); pf.savePerson(dto); overview(null); } diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseDataForm.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseDataForm.java index ac31742b59c..4addc44be33 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseDataForm.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseDataForm.java @@ -1,12 +1,11 @@ package de.symeda.sormas.ui.surveillance.caze; -import java.util.HashMap; -import java.util.Map; - -import com.vaadin.ui.Field; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.DateField; import com.vaadin.ui.NativeSelect; import com.vaadin.ui.TextField; +import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.ui.utils.AbstractEditForm; import de.symeda.sormas.ui.utils.CssStyles; @@ -17,43 +16,38 @@ public class CaseDataForm extends AbstractEditForm { private static final String HTML_LAYOUT = LayoutUtil.h3(CssStyles.VSPACE3, "Case data")+ - LayoutUtil.div( - LayoutUtil.fluidRowCss( - CssStyles.VSPACE4, - LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CaseDataDto.UUID)), - LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CaseDataDto.CASE_STATUS)) - ), - LayoutUtil.fluidRowCss( - CssStyles.VSPACE4, - LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CaseDataDto.DISEASE)) - ) - ); + LayoutUtil.fluidRow( + LayoutUtil.fluidColumn(8, 0, LayoutUtil.div( + LayoutUtil.fluidRowLocs(CaseDataDto.UUID, CaseDataDto.CASE_STATUS), + LayoutUtil.fluidRowLocs(CaseDataDto.REPORTER, CaseDataDto.REPORT_DATE), + LayoutUtil.fluidRowLocs(CaseDataDto.DISEASE, CaseDataDto.HEALTH_FACILITY) + )), + LayoutUtil.fluidColumn(4, 0, LayoutUtil.div( + "" + )) + ); public CaseDataForm() { - super(CaseDataDto.class); + super(CaseDataDto.class, CaseDataDto.I18N_PREFIX); } @Override protected void addFields() { - Map>> formProperties = new HashMap>>(); - formProperties.put(CaseDataDto.UUID, TextField.class); - formProperties.put(CaseDataDto.CASE_STATUS, NativeSelect.class); - formProperties.put(CaseDataDto.DISEASE, NativeSelect.class); - - // @TODO: put this in i18n properties - Map captions = new HashMap(); - captions.put(CaseDataDto.UUID, "ID"); - captions.put(CaseDataDto.CASE_STATUS, "Status"); - captions.put(CaseDataDto.DISEASE, "Disease"); - - for (String propertyId : formProperties.keySet()) { - Field field = getFieldGroup().buildAndBind(captions.get(propertyId), propertyId, formProperties.get(propertyId)); -// field.setReadOnly(true); - field.setSizeFull(); - addComponent(field, propertyId); - } + addField(CaseDataDto.UUID, TextField.class); + addField(CaseDataDto.CASE_STATUS, NativeSelect.class); + TextField reporter = addField(CaseDataDto.REPORTER, TextField.class); + reporter.setNullRepresentation(""); + addField(CaseDataDto.REPORT_DATE, DateField.class); + addField(CaseDataDto.DISEASE, NativeSelect.class); + + // TODO use only facilities from own region or district?! + addField(CaseDataDto.HEALTH_FACILITY, ComboBox.class) + .addItems(FacadeProvider.getFacilityFacade().getAllAsReference()); + + setReadOnly(true, CaseDataDto.UUID, CaseDataDto.CASE_STATUS, CaseDataDto.REPORTER, + CaseDataDto.REPORT_DATE, CaseDataDto.DISEASE); } - + @Override protected void setLayout() { setTemplateContents(HTML_LAYOUT); diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseGrid.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseGrid.java index 85b27ed66b8..7453dadeee7 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseGrid.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CaseGrid.java @@ -15,6 +15,7 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseStatus; import de.symeda.sormas.ui.utils.CaseHelper; +import de.symeda.sormas.ui.utils.I18nProperties; import elemental.json.JsonValue; public class CaseGrid extends Grid { @@ -30,7 +31,11 @@ public CaseGrid() { setContainerDataSource(container); setColumnOrder(CaseDataDto.UUID, CaseDataDto.CASE_STATUS, CaseDataDto.DISEASE); getColumn(CaseDataDto.UUID).setRenderer(new UuidRenderer()); - getColumn(CaseDataDto.UUID).setHeaderCaption("ID"); + + for (Column column : getColumns()) { + column.setHeaderCaption(I18nProperties.getFieldCaption( + CaseDataDto.I18N_PREFIX, column.getPropertyId().toString(), column.getHeaderCaption())); + } } /** @@ -42,18 +47,15 @@ public CaseGrid() { */ public void setFilter(String filterString) { getContainer().removeContainerFilters(CaseDataDto.PERSON); - getContainer().removeContainerFilters(CaseDataDto.DESCRIPTION); // getContainer().removeContainerFilters(CaseDataDto.CASE_STATUS); if (filterString.length() > 0) { SimpleStringFilter nameFilter = new SimpleStringFilter( CaseDataDto.PERSON, filterString, true, false); - SimpleStringFilter descFilter = new SimpleStringFilter( - CaseDataDto.DESCRIPTION, filterString, true, false); // SimpleStringFilter statusFilter = new SimpleStringFilter( // CaseDataDto.CASE_STATUS, filterString, true, false); getContainer().addContainerFilter( // new Or(nameFilter, descFilter, statusFilter)); - new Or(nameFilter, descFilter)); + new Or(nameFilter)); } } diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationForm.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CasePersonForm.java similarity index 65% rename from sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationForm.java rename to sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CasePersonForm.java index c9b0f77875d..dca01fce861 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationForm.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/CasePersonForm.java @@ -6,12 +6,12 @@ import com.vaadin.ui.Field; import com.vaadin.ui.TextField; -import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.CasePersonDto; import de.symeda.sormas.ui.utils.AbstractEditForm; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.LayoutUtil; -public class PatientInformationForm extends AbstractEditForm { +public class CasePersonForm extends AbstractEditForm { private static final long serialVersionUID = -1L; @@ -20,26 +20,26 @@ public class PatientInformationForm extends AbstractEditForm { LayoutUtil.div( LayoutUtil.fluidRowCss( CssStyles.VSPACE4, - LayoutUtil.oneOfThreeCol(LayoutUtil.loc(PersonDto.FIRST_NAME)), - LayoutUtil.oneOfThreeCol(LayoutUtil.loc(PersonDto.LAST_NAME)) + LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CasePersonDto.FIRST_NAME)), + LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CasePersonDto.LAST_NAME)) // LayoutUtil.oneOfThreeCol(LayoutUtil.loc(CaseDto.DESCRIPTION)) ) ); - public PatientInformationForm() { - super(PersonDto.class); + public CasePersonForm() { + super(CasePersonDto.class, CasePersonDto.I18N_PREFIX); } @Override protected void addFields() { Map>> formProperties = new HashMap>>(); - formProperties.put(PersonDto.FIRST_NAME, TextField.class); - formProperties.put(PersonDto.LAST_NAME, TextField.class); + formProperties.put(CasePersonDto.FIRST_NAME, TextField.class); + formProperties.put(CasePersonDto.LAST_NAME, TextField.class); // @TODO: put this in i18n properties Map captions = new HashMap(); - captions.put(PersonDto.FIRST_NAME, "First name"); - captions.put(PersonDto.LAST_NAME, "Last name"); + captions.put(CasePersonDto.FIRST_NAME, "First name"); + captions.put(CasePersonDto.LAST_NAME, "Last name"); for (String propertyId : formProperties.keySet()) { diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationView.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationView.java index f5897d503bd..d8959260dea 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationView.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/surveillance/caze/PatientInformationView.java @@ -6,7 +6,7 @@ /** * View for reading and editing the patient information fields. - * Contains the {@link PatientInformationForm}. + * Contains the {@link CasePersonForm}. * @author Stefan Szczesny * */ diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java index c5d8deb8428..9d2c3c32b64 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java @@ -1,7 +1,10 @@ package de.symeda.sormas.ui.utils; import com.vaadin.data.fieldgroup.BeanFieldGroup; +import com.vaadin.data.fieldgroup.DefaultFieldGroupFieldFactory; import com.vaadin.data.util.BeanItem; +import com.vaadin.ui.AbstractField; +import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.CustomLayout; import com.vaadin.ui.Field; @@ -12,7 +15,11 @@ public abstract class AbstractEditForm extends private final BeanFieldGroup fieldGroup; - protected AbstractEditForm(Class type) { + private final String propertyI18nPrefix; + + protected AbstractEditForm(Class type, String propertyI18nPrefix) { + + this.propertyI18nPrefix = propertyI18nPrefix; fieldGroup = new BeanFieldGroup(type) { @@ -29,6 +36,23 @@ protected void configureField(Field field) { } } }; + + fieldGroup.setFieldFactory(new DefaultFieldGroupFieldFactory() { + @SuppressWarnings("unchecked") + @Override + public T createField(Class type, Class fieldType) { + T field = super.createField(type, fieldType); + if (field != null) { + return field; + } + + if (AbstractSelect.class.isAssignableFrom(fieldType)) { + return (T) createCompatibleSelect((Class) fieldType); + } + + return null; + } + }); initLayout(); } @@ -64,4 +88,29 @@ public BeanFieldGroup getFieldGroup() { return this.fieldGroup; } + protected T addField(String propertyId, Class fieldType) { + T field = getFieldGroup().buildAndBind(propertyId, (Object)propertyId, fieldType); + + field.setCaption(I18nProperties.getFieldCaption(getPropertyI18nPrefix(), propertyId, field.getCaption())); + if (field instanceof AbstractField) { + AbstractField abstractField = (AbstractField)field; + abstractField.setDescription(I18nProperties.getFieldDescription( + getPropertyI18nPrefix(), propertyId, abstractField.getDescription())); + } + + field.setWidth(100, Unit.PERCENTAGE); + + addComponent(field, propertyId); + return field; + } + + protected void setReadOnly(boolean readOnly, String ...propertyIds) { + for (String propertyId : propertyIds) { + getFieldGroup().getField(propertyId).setReadOnly(readOnly); + } + } + + protected String getPropertyI18nPrefix() { + return propertyI18nPrefix; + } } diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/FieldHelper.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/FieldHelper.java new file mode 100644 index 00000000000..8ebf13db0a2 --- /dev/null +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/FieldHelper.java @@ -0,0 +1,7 @@ +package de.symeda.sormas.ui.utils; + +public final class FieldHelper { + + + +} diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/I18nProperties.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/I18nProperties.java new file mode 100644 index 00000000000..c7a6e90c005 --- /dev/null +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/I18nProperties.java @@ -0,0 +1,75 @@ +package de.symeda.sormas.ui.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class I18nProperties { + + private static I18nProperties instance = null; + + private final Properties fieldCaptionProperties; + private final Properties fieldDescriptionProperties; + + private static I18nProperties getInstance() { + if (instance == null) + instance = new I18nProperties(); + return instance; + } + + public static String getFieldCaption(String key) { + return getInstance().fieldCaptionProperties.getProperty(key); + } + + public static String getFieldCaption(String key, String defaultValue) { + return getInstance().fieldCaptionProperties.getProperty(key, defaultValue); + } + + public static String getFieldCaption(String prefix, String key, String defaultValue) { + String result = null; + if (prefix != null) { + result = getFieldCaption(prefix + "." + key); + } + if (result == null) { + result = getFieldCaption(key, defaultValue); + } + return result; + } + + public static String getFieldDescription(String key) { + return getInstance().fieldDescriptionProperties.getProperty(key); + } + + public static String getFieldDescription(String key, String defaultValue) { + return getInstance().fieldDescriptionProperties.getProperty(key, defaultValue); + } + + public static String getFieldDescription(String prefix, String key, String defaultValue) { + String result = null; + if (prefix != null) { + result = getFieldDescription(prefix + "." + key); + } + if (result == null) { + result = getFieldDescription(key, defaultValue); + } + return result; + } + + + private I18nProperties() { + fieldCaptionProperties = loadProperties("/fieldCaptions.properties"); + fieldDescriptionProperties = loadProperties("/fieldDescriptions.properties"); + } + + public static Properties loadProperties(String fileName) { + try (InputStream inputStream = I18nProperties.class.getResourceAsStream(fileName)) { + Properties properties = new Properties(); + properties.load(inputStream); + return properties; + } catch (IOException e) { + throw new RuntimeException(e); + //logger.error("Could not read file " + fileName, e); + } + //return null; + } +} diff --git a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/LayoutUtil.java b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/LayoutUtil.java index 1b1d96f3cc0..7d7a79fbede 100644 --- a/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/LayoutUtil.java +++ b/sormas-surveillance-ui/src/main/java/de/symeda/sormas/ui/utils/LayoutUtil.java @@ -129,7 +129,7 @@ private static int calcFluidColWidth(FluidColumn[] cols) { return w; } - public static String fluidRowLocs(String cssClasses, String... locs) { + public static String fluidRowLocs(String... locs) { return fluidRowLocsCss(null, locs); } @@ -184,6 +184,10 @@ public static FluidColumn fluidColumnCss(String cssClasses, int span, int offset return new FluidColumn(cssClasses, span, offset, content); } + public static FluidColumn fluidColumn(int span, int offset, String content) { + return new FluidColumn(null, span, offset, content); + } + public static String div(String... contents) { return divCss(null, contents); } diff --git a/sormas-surveillance-ui/src/main/resources/fieldCaptions.properties b/sormas-surveillance-ui/src/main/resources/fieldCaptions.properties new file mode 100644 index 00000000000..f0ce4e4f6b2 --- /dev/null +++ b/sormas-surveillance-ui/src/main/resources/fieldCaptions.properties @@ -0,0 +1,13 @@ + +uuid=ID +changeDate=Modification date + +CaseData.person=Person +CaseData.caseStatus=Status of case +CaseData.disease=Disease +CaseData.healthFacility=Health facility +CaseData.reporter=Reporting user +CaseData.reportDate=Date of report + +CasePerson.firstName = First name +CasePerson.lastName = Last name \ No newline at end of file diff --git a/sormas-surveillance-ui/src/main/resources/fieldDescriptions.properties b/sormas-surveillance-ui/src/main/resources/fieldDescriptions.properties new file mode 100644 index 00000000000..e69de29bb2d