Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit e624650

Browse files
Merge branch 'development' into feature-2183-vaadin-productionmode
2 parents b727cd4 + 4294320 commit e624650

313 files changed

Lines changed: 7564 additions & 1343 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import javax.ejb.Remote;
2121

22+
import de.symeda.sormas.api.externaljournal.PatientDiaryConfig;
23+
import de.symeda.sormas.api.externaljournal.SymptomJournalConfig;
2224
import de.symeda.sormas.api.region.GeoLatLon;
2325

2426
@Remote
@@ -90,15 +92,9 @@ public interface ConfigFacade {
9092

9193
String getGeocodingOsgtsEndpoint();
9294

93-
String getSymptomJournalUrl();
95+
SymptomJournalConfig getSymptomJournalConfig();
9496

95-
String getSymptomJournalAuthUrl();
96-
97-
String getSymptomJournalClientId();
98-
99-
String getSymptomJournalSecret();
100-
101-
String getPatientDiaryUrl();
97+
PatientDiaryConfig getPatientDiaryConfig();
10298

10399
String getSormasToSormasUserPassword();
104100

@@ -109,4 +105,6 @@ public interface ConfigFacade {
109105
String getSurvnetGatewayUrl();
110106

111107
String getAuthenticationProvider();
108+
109+
public boolean isExternalJournalActive();
112110
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package de.symeda.sormas.api;
2+
3+
import java.lang.reflect.InvocationTargetException;
4+
import java.lang.reflect.Method;
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
import de.symeda.sormas.api.utils.DataHelper;
10+
11+
public class EntityDtoAccessHelper {
12+
13+
public static Object getPropertyValue(HasUuid entity, String propertyKey) throws InvocationTargetException, IllegalAccessException {
14+
if (entity == null) {
15+
return null;
16+
}
17+
Class<? extends HasUuid> entityClass = entity.getClass();
18+
while (entityClass != null) {
19+
Method[] declaredMethods = entityClass.getDeclaredMethods();
20+
for (Method method : declaredMethods) {
21+
String methodName = method.getName();
22+
if (methodName.startsWith("get") || methodName.startsWith("is")) {
23+
String propertyName = methodName.replaceAll("(^(is|get))|((Reference)?Dto$)", "").toUpperCase();
24+
if (propertyName.equals(propertyKey.toUpperCase())) {
25+
return method.invoke(entity);
26+
}
27+
}
28+
}
29+
Class<?> superclass = entityClass.getSuperclass();
30+
entityClass = HasUuid.class.isAssignableFrom(superclass) ? (Class<? extends HasUuid>) superclass : null;
31+
}
32+
throw new IllegalArgumentException("No property " + propertyKey + " in class " + entity.getClass().getSimpleName());
33+
}
34+
35+
public static Object getPropertyPathValue(HasUuid entity, String propertyPath) {
36+
return getPropertyPathValue(entity, propertyPath, null);
37+
}
38+
39+
public static Object getPropertyPathValue(HasUuid entity, String propertyPath, IReferenceDtoResolver referenceDtoResolver) {
40+
String[] propertyKeys = propertyPath.split("[.]");
41+
Object currentEntity = entity;
42+
for (int i = 0; i < propertyKeys.length; i++) {
43+
if (currentEntity == null) {
44+
return null;
45+
}
46+
boolean isResolvable = referenceDtoResolver != null && ReferenceDto.class.isAssignableFrom(currentEntity.getClass());
47+
48+
if (!HasUuid.class.isAssignableFrom(currentEntity.getClass())) {
49+
String errorPropertyPath = entity.getClass().getSimpleName() + "." + String.join(".", Arrays.copyOfRange(propertyKeys, 0, i));
50+
throw new IllegalArgumentException(errorPropertyPath + " is not an EntityDto or ReferenceDto");
51+
}
52+
Object propertyValue = null;
53+
try {
54+
propertyValue = getPropertyValue((HasUuid) currentEntity, propertyKeys[i]);
55+
} catch (InvocationTargetException | IllegalAccessException e) {
56+
throw new IllegalArgumentException(e);
57+
} catch (IllegalArgumentException e) {
58+
if (!isResolvable) {
59+
throw e;
60+
}
61+
}
62+
if (propertyValue != null) {
63+
currentEntity = propertyValue;
64+
} else {
65+
if (isResolvable) {
66+
try {
67+
currentEntity = getPropertyValue(referenceDtoResolver.resolve((ReferenceDto) currentEntity), propertyKeys[i]);
68+
} catch (InvocationTargetException | IllegalAccessException e) {
69+
throw new IllegalArgumentException(e);
70+
}
71+
} else {
72+
currentEntity = null;
73+
}
74+
}
75+
}
76+
return currentEntity;
77+
}
78+
79+
public static String getPropertyPathValueString(HasUuid entity, String propertyPath, IReferenceDtoResolver referenceDtoResolver) {
80+
return DataHelper.valueToString(getPropertyPathValue(entity, propertyPath, referenceDtoResolver));
81+
}
82+
83+
public interface IReferenceDtoResolver {
84+
85+
EntityDto resolve(ReferenceDto referenceDto);
86+
}
87+
88+
public static class CachedReferenceDtoResolver implements IReferenceDtoResolver {
89+
90+
private Map<String, EntityDto> referenceCache = new HashMap<>();
91+
private IReferenceDtoResolver referenceDtoResolver;
92+
93+
public CachedReferenceDtoResolver(IReferenceDtoResolver referenceDtoResolver) {
94+
this.referenceDtoResolver = referenceDtoResolver;
95+
}
96+
97+
public EntityDto resolve(ReferenceDto referenceDto) {
98+
if (referenceDto != null) {
99+
EntityDto entityDto = referenceCache.get(referenceDto.getUuid());
100+
if (entityDto != null) {
101+
return entityDto;
102+
}
103+
}
104+
if (referenceDtoResolver != null) {
105+
EntityDto resolvedEntity = referenceDtoResolver.resolve(referenceDto);
106+
addReference(referenceDto, resolvedEntity);
107+
return resolvedEntity;
108+
}
109+
return null;
110+
}
111+
112+
public void addReference(ReferenceDto referenceDto, EntityDto entityDto) {
113+
if (referenceDto != null && entityDto != null) {
114+
referenceCache.put(referenceDto.getUuid(), entityDto);
115+
}
116+
}
117+
}
118+
}

sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@
3636
import de.symeda.sormas.api.contact.ContactFacade;
3737
import de.symeda.sormas.api.disease.DiseaseConfigurationFacade;
3838
import de.symeda.sormas.api.disease.DiseaseFacade;
39+
import de.symeda.sormas.api.docgeneneration.QuarantineOrderFacade;
3940
import de.symeda.sormas.api.epidata.EpiDataFacade;
4041
import de.symeda.sormas.api.event.EventFacade;
4142
import de.symeda.sormas.api.event.EventParticipantFacade;
43+
import de.symeda.sormas.api.externaljournal.ExternalJournalFacade;
4244
import de.symeda.sormas.api.facility.FacilityFacade;
4345
import de.symeda.sormas.api.feature.FeatureConfigurationFacade;
4446
import de.symeda.sormas.api.geocoding.GeocodingFacade;
@@ -304,7 +306,15 @@ public static AreaFacade getAreaFacade() {
304306
return get().lookupEjbRemote(AreaFacade.class);
305307
}
306308

307-
@SuppressWarnings("unchecked")
309+
public static QuarantineOrderFacade getQuarantineOrderFacade() {
310+
return get().lookupEjbRemote(QuarantineOrderFacade.class);
311+
}
312+
313+
public static ExternalJournalFacade getExternalJournalFacade() {
314+
return get().lookupEjbRemote(ExternalJournalFacade.class);
315+
}
316+
317+
@SuppressWarnings("unchecked")
308318
public <P> P lookupEjbRemote(Class<P> clazz) {
309319
try {
310320
return (P) get().ic.lookup(buildJndiLookupName(clazz));
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.symeda.sormas.api;
2+
3+
import de.symeda.sormas.api.i18n.I18nProperties;
4+
5+
public enum VisitOrigin {
6+
USER,
7+
EXTERNAL_JOURNAL;
8+
9+
public String getName() {
10+
return this.name();
11+
}
12+
13+
public String toString() {
14+
return I18nProperties.getEnumCaption(this);
15+
}
16+
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package de.symeda.sormas.api.campaign;
22

3+
import java.util.Date;
34
import java.util.List;
45

56
import javax.ejb.Remote;
67

8+
import de.symeda.sormas.api.campaign.data.CampaignFormDataDto;
79
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
810
import de.symeda.sormas.api.utils.SortProperty;
911

@@ -33,4 +35,10 @@ public interface CampaignFacade {
3335
CampaignReferenceDto getReferenceByUuid(String uuid);
3436

3537
boolean exists(String uuid);
38+
39+
List<CampaignDto> getAllAfter(Date campaignChangeDate);
40+
41+
List<CampaignDto> getByUuids(List<String> uuids);
42+
43+
List<String> getAllActiveUuids();
3644
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataFacade.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import de.symeda.sormas.api.utils.SortProperty;
2727

2828
import javax.ejb.Remote;
29+
30+
import java.util.Date;
2931
import java.util.List;
3032

3133
@Remote
@@ -50,4 +52,8 @@ public interface CampaignFormDataFacade {
5052
long count(CampaignFormDataCriteria criteria);
5153

5254
List<CampaignDiagramDataDto> getDiagramData(List<CampaignDiagramSeries> diagramSeries, CampaignDiagramCriteria campaignDiagramCriteria);
55+
56+
List<String> getAllActiveUuids();
57+
58+
List<CampaignFormDataDto> getAllActiveAfter(Date date);
5359
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaFacade.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import javax.ejb.Remote;
44
import java.io.IOException;
5+
import java.util.Date;
56
import java.util.List;
67

8+
import de.symeda.sormas.api.campaign.data.CampaignFormDataDto;
9+
710
@Remote
811
public interface CampaignFormMetaFacade {
912

@@ -25,4 +28,9 @@ CampaignFormMetaDto buildCampaignFormMetaFromJson(String formId, String language
2528

2629
CampaignFormMetaDto getCampaignFormMetaByUuid(String campaignFormUuid);
2730

31+
List<CampaignFormMetaDto> getAllAfter(Date campaignFormMetaChangeDate);
32+
33+
List<String> getAllUuids();
34+
35+
List<CampaignFormMetaDto> getByUuids(List<String> uuids);
2836
}

sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFollowUpDto.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ public class CaseFollowUpDto extends FollowUpDto {
3131
private final CaseJurisdictionDto jurisdiction;
3232

3333
//@formatter:off
34-
public CaseFollowUpDto(String uuid, String personUuid, String personFirstName, String personLastName,
34+
public CaseFollowUpDto(String uuid, String personFirstName, String personLastName,
3535
Date reportDate, Date symptomsOnsetDate, Date followUpUntil, Disease disease,
3636
String caseReportingUserUuid, String caseRegionUuid, String caseDistrictUuid,
3737
String caseCommunityUud, String caseHealthFacilityUuid, String casePointOfEntryUuid
3838
) {
3939
//formatter:on
40-
super(uuid, personUuid, personFirstName, personLastName, reportDate, followUpUntil, disease);
40+
super(uuid, personFirstName, personLastName, reportDate, followUpUntil, disease);
4141
this.symptomsOnsetDate = symptomsOnsetDate;
4242
this.jurisdiction = new CaseJurisdictionDto(
4343
caseReportingUserUuid,

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactCriteria.java

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import de.symeda.sormas.api.caze.CaseClassification;
2727
import de.symeda.sormas.api.caze.CaseReferenceDto;
2828
import de.symeda.sormas.api.person.PersonReferenceDto;
29+
import de.symeda.sormas.api.person.SymptomJournalStatus;
2930
import de.symeda.sormas.api.region.CommunityReferenceDto;
3031
import de.symeda.sormas.api.region.DistrictReferenceDto;
3132
import de.symeda.sormas.api.region.RegionReferenceDto;
@@ -44,6 +45,7 @@ public class ContactCriteria extends BaseCriteria implements Serializable {
4445
public static final String CONTACT_OFFICER = "contactOfficer";
4546
public static final String REPORTING_USER_ROLE = "reportingUserRole";
4647
public static final String FOLLOW_UP_UNTIL_TO = "followUpUntilTo";
48+
public static final String SYMPTOM_JOURNAL_STATUS = "symptomJournalStatus";
4749
public static final String QUARANTINE_TYPE = "quarantineType";
4850
public static final String QUARANTINE_ORDERED_VERBALLY = "quarantineOrderedVerbally";
4951
public static final String QUARANTINE_ORDERED_OFFICIAL_DOCUMENT = "quarantineOrderedOfficialDocument";
@@ -56,6 +58,8 @@ public class ContactCriteria extends BaseCriteria implements Serializable {
5658
public static final String BIRTHDATE_MM = "birthdateMM";
5759
public static final String BIRTHDATE_DD = "birthdateDD";
5860
public static final String RETURNING_TRAVELER = "returningTraveler";
61+
public static final String EVENT_LIKE = "eventLike";
62+
public static final String ONLY_CONTACTS_WITH_SOURCE_CASE_IN_EVENT = "onlyContactsWithSourceCaseInEvent";
5963

6064
private static final long serialVersionUID = 5114202107622217837L;
6165

@@ -79,6 +83,7 @@ public class ContactCriteria extends BaseCriteria implements Serializable {
7983
* If yes, the followUpUntilTo filter will search for strict matches instead of a period,
8084
* even if a followUpUntilFrom is specified
8185
*/
86+
private SymptomJournalStatus symptomJournalStatus;
8287
private Boolean followUpUntilToPrecise;
8388
private Date lastContactDateFrom;
8489
private Date lastContactDateTo;
@@ -102,6 +107,9 @@ public class ContactCriteria extends BaseCriteria implements Serializable {
102107
private Integer birthdateMM;
103108
private Integer birthdateDD;
104109
private YesNoUnknown returningTraveler;
110+
private String eventLike;
111+
private String eventUuid;
112+
private Boolean onlyContactsWithSourceCaseInEvent;
105113

106114
public UserRole getReportingUserRole() {
107115
return reportingUserRole;
@@ -287,6 +295,14 @@ public Date getFollowUpUntilTo() {
287295
return followUpUntilTo;
288296
}
289297

298+
public SymptomJournalStatus getSymptomJournalStatus() {
299+
return symptomJournalStatus;
300+
}
301+
302+
public void setSymptomJournalStatus(SymptomJournalStatus symptomJournalStatus) {
303+
this.symptomJournalStatus = symptomJournalStatus;
304+
}
305+
290306
public Boolean getFollowUpUntilToPrecise() {
291307
return followUpUntilToPrecise;
292308
}
@@ -428,7 +444,7 @@ public PersonReferenceDto getPerson() {
428444
return person;
429445
}
430446

431-
public ContactCriteria person(PersonReferenceDto person) {
447+
public ContactCriteria setPerson(PersonReferenceDto person) {
432448
this.person = person;
433449
return this;
434450
}
@@ -464,4 +480,45 @@ public YesNoUnknown getReturningTraveler() {
464480
public void setReturningTraveler(YesNoUnknown returningTraveler) {
465481
this.returningTraveler = returningTraveler;
466482
}
483+
484+
public void setEventLike(String eventLike) {
485+
this.eventLike = eventLike;
486+
}
487+
488+
@IgnoreForUrl
489+
public String getEventLike() {
490+
return eventLike;
491+
}
492+
493+
public ContactCriteria eventLike(String eventLike) {
494+
setEventLike(eventLike);
495+
return this;
496+
}
497+
498+
public void setEventUuid(String eventUuid) {
499+
this.eventUuid = eventUuid;
500+
}
501+
502+
public String getEventUuid() {
503+
return eventUuid;
504+
}
505+
506+
public ContactCriteria eventUuid(String eventUuid) {
507+
setEventUuid(eventUuid);
508+
return this;
509+
}
510+
511+
public void setOnlyContactsWithSourceCaseInEvent(Boolean onlyContactsWithSourceCaseInEvent) {
512+
this.onlyContactsWithSourceCaseInEvent = onlyContactsWithSourceCaseInEvent;
513+
}
514+
515+
@IgnoreForUrl
516+
public Boolean getOnlyContactsWithSourceCaseInEvent() {
517+
return onlyContactsWithSourceCaseInEvent;
518+
}
519+
520+
public ContactCriteria onlyContactsWithSourceCaseInEvent(Boolean onlyContactsWithSourceCaseInEvent) {
521+
this.onlyContactsWithSourceCaseInEvent = onlyContactsWithSourceCaseInEvent;
522+
return this;
523+
}
467524
}

0 commit comments

Comments
 (0)