SORMAS-Project icon indicating copy to clipboard operation
SORMAS-Project copied to clipboard

DateHelper: No sneaky conversion from `null` to `now`

Open StefanKock opened this issue 2 years ago • 0 comments

Problem Description

In #6700 (PR #9942) it was found that many methods of DateHelper (getStartOf/getEndOf/add/substract) relied on joda-time to convert null to now.

Proposed Change

  1. Let all getStartOf/getEndOf/add/substract pass null through.
  2. Handle null values properly where tests fail.

Acceptance Criteria

  • [ ] Conversion from null to now is removed.

Implementation Details

DateHelper.handleNull marks where it was needed to convert null to now.

Additional Information

Just don't allow or pass through null does not work. At least 4 places in tests uncovered that logic relies on current null to now conversion.

NullPointerExceptions happening when null is not allowed
// CaseService
	public void updateFollowUpDetails(Case caze, boolean followUpStatusChangedByUser) {
//...
                                    // NPE happens here
			if (DateHelper.getStartOfDay(currentFollowUpUntil).before(DateHelper.getStartOfDay(untilDate))) {
				caze.setOverwriteFollowUpUntil(false);
			}
// ContactService
	public void updateFollowUpDetails(Contact contact, boolean followUpStatusChangedByUser) {
//...
                                    // NPE happens here
			if (DateHelper.getStartOfDay(currentFollowUpUntil).before(DateHelper.getStartOfDay(untilDate))) {
				contact.setOverwriteFollowUpUntil(false);
			}
// VisitService
	public Predicate buildRelevantVisitsFilter(Person person, Disease disease, Date startDate, Date endDate, CriteriaBuilder cb, Root<Visit> from) {
 
                                      // NPE happens here
		startDate = DateHelper.getStartOfDay(startDate);
		endDate = DateHelper.getEndOfDay(endDate);
		Predicate filter = cb.and(cb.equal(from.get(Visit.PERSON), person), cb.equal(from.get(Visit.DISEASE), disease));

		filter = CriteriaBuilderHelper.and(
			cb,
			filter,
			cb.greaterThanOrEqualTo(from.get(Visit.VISIT_DATE_TIME), DateHelper.subtractDays(startDate, FollowUpLogic.ALLOWED_DATE_OFFSET)),
			cb.lessThanOrEqualTo(from.get(Visit.VISIT_DATE_TIME), DateHelper.addDays(endDate, FollowUpLogic.ALLOWED_DATE_OFFSET)));
# CaseFacadeEjb.getIndexList: H2Function.timestamp_subtract_days fails with null Date

Caused by: java.lang.NullPointerException
	at de.symeda.sormas.api.utils.DateHelper.subtractDays(DateHelper.java:549)
	at de.symeda.sormas.backend.H2Function.timestamp_subtract_days(H2Function.java:49)

StefanKock avatar Aug 04 '22 09:08 StefanKock